From e1d43ee831990352dd57c3ec93e0eea26b11e1a7 Mon Sep 17 00:00:00 2001 From: yangdx Date: Wed, 26 Mar 2025 10:31:18 +0800 Subject: [PATCH 01/23] fix: add missing `t` dependency in ClearDocumentsDialog useCallback --- .../src/components/documents/ClearDocumentsDialog.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lightrag_webui/src/components/documents/ClearDocumentsDialog.tsx b/lightrag_webui/src/components/documents/ClearDocumentsDialog.tsx index 58841ff6..cc11ac5d 100644 --- a/lightrag_webui/src/components/documents/ClearDocumentsDialog.tsx +++ b/lightrag_webui/src/components/documents/ClearDocumentsDialog.tsx @@ -31,7 +31,7 @@ export default function ClearDocumentsDialog() { } catch (err) { toast.error(t('documentPanel.clearDocuments.error', { error: errorMessage(err) })) } - }, [setOpen]) + }, [setOpen, t]) return ( @@ -46,7 +46,7 @@ export default function ClearDocumentsDialog() { {t('documentPanel.clearDocuments.confirm')} From d7c0b420b9b9df7013323465cea3a4b23315e2e8 Mon Sep 17 00:00:00 2001 From: yangdx Date: Wed, 26 Mar 2025 12:05:54 +0800 Subject: [PATCH 02/23] feat: add pipeline status monitoring dialog - Add pipeline status API and types - Create PipelineStatusDialog component with position control - Unify modal overlay style across components --- lightrag_webui/src/api/lightrag.ts | 19 ++ lightrag_webui/src/components/ApiKeyAlert.tsx | 4 +- .../documents/PipelineStatusDialog.tsx | 196 ++++++++++++++++++ .../src/components/ui/AlertDialog.tsx | 1 - .../src/features/DocumentManager.tsx | 37 +++- 5 files changed, 245 insertions(+), 12 deletions(-) create mode 100644 lightrag_webui/src/components/documents/PipelineStatusDialog.tsx diff --git a/lightrag_webui/src/api/lightrag.ts b/lightrag_webui/src/api/lightrag.ts index e647285e..b55a62a3 100644 --- a/lightrag_webui/src/api/lightrag.ts +++ b/lightrag_webui/src/api/lightrag.ts @@ -141,6 +141,20 @@ export type AuthStatusResponse = { api_version?: string } +export type PipelineStatusResponse = { + autoscanned: boolean + busy: boolean + job_name: string + job_start?: string + docs: number + batchs: number + cur_batch: number + request_pending: boolean + latest_message: string + history_messages?: string[] + update_status?: Record +} + export type LoginResponse = { access_token: string token_type: string @@ -424,6 +438,11 @@ export const getAuthStatus = async (): Promise => { } } +export const getPipelineStatus = async (): Promise => { + const response = await axiosInstance.get('/documents/pipeline_status') + return response.data +} + export const loginToServer = async (username: string, password: string): Promise => { const formData = new FormData(); formData.append('username', username); diff --git a/lightrag_webui/src/components/ApiKeyAlert.tsx b/lightrag_webui/src/components/ApiKeyAlert.tsx index bbbce1bb..07b3230e 100644 --- a/lightrag_webui/src/components/ApiKeyAlert.tsx +++ b/lightrag_webui/src/components/ApiKeyAlert.tsx @@ -5,7 +5,8 @@ import { AlertDialogContent, AlertDialogDescription, AlertDialogHeader, - AlertDialogTitle + AlertDialogTitle, + AlertDialogOverlay } from '@/components/ui/AlertDialog' import Button from '@/components/ui/Button' import Input from '@/components/ui/Input' @@ -50,6 +51,7 @@ const ApiKeyAlert = ({ open: opened, onOpenChange: setOpened }: ApiKeyAlertProps return ( + {t('apiKeyAlert.title')} diff --git a/lightrag_webui/src/components/documents/PipelineStatusDialog.tsx b/lightrag_webui/src/components/documents/PipelineStatusDialog.tsx new file mode 100644 index 00000000..a8807592 --- /dev/null +++ b/lightrag_webui/src/components/documents/PipelineStatusDialog.tsx @@ -0,0 +1,196 @@ +import { useState, useEffect, useRef } from 'react' +import { useTranslation } from 'react-i18next' +import { toast } from 'sonner' +import { X, AlignLeft, AlignCenter, AlignRight } from 'lucide-react' + +import { + AlertDialog, + AlertDialogContent, + AlertDialogHeader, + AlertDialogTitle, + AlertDialogOverlay +} from '@/components/ui/AlertDialog' +import Button from '@/components/ui/Button' +import { getPipelineStatus, PipelineStatusResponse } from '@/api/lightrag' +import { errorMessage } from '@/lib/utils' +import { cn } from '@/lib/utils' + +type DialogPosition = 'left' | 'center' | 'right' + +interface PipelineStatusDialogProps { + open: boolean + onOpenChange: (open: boolean) => void +} + +export default function PipelineStatusDialog({ + open, + onOpenChange +}: PipelineStatusDialogProps) { + const { t } = useTranslation() + const [status, setStatus] = useState(null) + const [position, setPosition] = useState('center') + const [isUserScrolled, setIsUserScrolled] = useState(false) + const historyRef = useRef(null) + + // Reset position when dialog opens + useEffect(() => { + if (open) { + setPosition('center') + setIsUserScrolled(false) + } + }, [open]) + + // Handle scroll position + useEffect(() => { + const container = historyRef.current + if (!container || isUserScrolled) return + + container.scrollTop = container.scrollHeight + }, [status?.history_messages, isUserScrolled]) + + const handleScroll = () => { + const container = historyRef.current + if (!container) return + + const isAtBottom = Math.abs( + (container.scrollHeight - container.scrollTop) - container.clientHeight + ) < 1 + + if (isAtBottom) { + setIsUserScrolled(false) + } else { + setIsUserScrolled(true) + } + } + + // Refresh status every 2 seconds + useEffect(() => { + if (!open) return + + const fetchStatus = async () => { + try { + const data = await getPipelineStatus() + setStatus(data) + } catch (err) { + toast.error(t('documentPanel.pipelineStatus.errors.fetchFailed', { error: errorMessage(err) })) + } + } + + fetchStatus() + const interval = setInterval(fetchStatus, 2000) + return () => clearInterval(interval) + }, [open, t]) + + return ( + + + + + + {t('documentPanel.pipelineStatus.title')} + + + {/* Position control buttons and close button */} +
+
+ + + +
+ +
+
+ + {/* Status Content */} +
+ {/* Pipeline Status */} +
+
+
Busy:
+
+
+
+
Request Pending:
+
+
+
+ + {/* Job Information */} +
+
Job Name: {status?.job_name || '-'}
+
+ Start Time: {status?.job_start ? new Date(status.job_start).toLocaleString() : '-'} + Progress: {status ? `${status.cur_batch}/${status.batchs}` : '-'} +
+
+ + {/* Latest Message */} +
+
Latest Message:
+
+ {status?.latest_message || '-'} +
+
+ + {/* History Messages */} +
+
History Messages:
+
+ {status?.history_messages?.map((msg, idx) => ( +
{msg}
+ )) || '-'} +
+
+
+ + + ) +} diff --git a/lightrag_webui/src/components/ui/AlertDialog.tsx b/lightrag_webui/src/components/ui/AlertDialog.tsx index 36868fcb..072bdff7 100644 --- a/lightrag_webui/src/components/ui/AlertDialog.tsx +++ b/lightrag_webui/src/components/ui/AlertDialog.tsx @@ -30,7 +30,6 @@ const AlertDialogContent = React.forwardRef< React.ComponentPropsWithoutRef >(({ className, ...props }, ref) => ( - { // Check if file_path exists and is a non-empty string @@ -45,6 +46,7 @@ const getDisplayFileName = (doc: DocStatusResponse, maxLength: number = 20): str }; export default function DocumentManager() { + const [showPipelineStatus, setShowPipelineStatus] = useState(false) const { t } = useTranslation() const health = useBackendState.use.health() const [docs, setDocs] = useState(null) @@ -114,18 +116,33 @@ export default function DocumentManager() {
- +
+ + +
+
From 57143fedcc2766675f1929631732517b315a262d Mon Sep 17 00:00:00 2001 From: yangdx Date: Wed, 26 Mar 2025 12:32:52 +0800 Subject: [PATCH 03/23] feat(lightrag): improve job name display with file path and count Replace generic "indexing files" with dynamic job name showing truncated file path and total file count. --- lightrag/lightrag.py | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/lightrag/lightrag.py b/lightrag/lightrag.py index d404bffa..a2e345a5 100644 --- a/lightrag/lightrag.py +++ b/lightrag/lightrag.py @@ -842,10 +842,17 @@ class LightRAG: logger.info("No documents to process") return + # Get first document's file path and total count for job name + first_doc_id, first_doc = next(iter(to_process_docs.items())) + first_doc_path = first_doc.file_path + path_prefix = first_doc_path[:20] + ("..." if len(first_doc_path) > 20 else "") + total_files = len(to_process_docs) + job_name = f"{path_prefix}[{total_files} files]" + pipeline_status.update( { "busy": True, - "job_name": "indexing files", + "job_name": job_name, "job_start": datetime.now().isoformat(), "docs": 0, "batchs": 0, From 103006845971a248e2e6e04c8c7c374dbec23d99 Mon Sep 17 00:00:00 2001 From: yangdx Date: Wed, 26 Mar 2025 12:41:49 +0800 Subject: [PATCH 04/23] feat(health-check): add pipeline busy status to health endpoint --- lightrag/api/lightrag_server.py | 67 ++++++++++++++++++--------------- 1 file changed, 37 insertions(+), 30 deletions(-) diff --git a/lightrag/api/lightrag_server.py b/lightrag/api/lightrag_server.py index 4477352b..27901fb5 100644 --- a/lightrag/api/lightrag_server.py +++ b/lightrag/api/lightrag_server.py @@ -421,37 +421,44 @@ def create_app(args): @app.get("/health", dependencies=[Depends(combined_auth)]) async def get_status(): """Get current system status""" - username = os.getenv("AUTH_USERNAME") - password = os.getenv("AUTH_PASSWORD") - if not (username and password): - auth_mode = "disabled" - else: - auth_mode = "enabled" + try: + pipeline_status = await get_namespace_data("pipeline_status") + + username = os.getenv("AUTH_USERNAME") + password = os.getenv("AUTH_PASSWORD") + if not (username and password): + auth_mode = "disabled" + else: + auth_mode = "enabled" - return { - "status": "healthy", - "working_directory": str(args.working_dir), - "input_directory": str(args.input_dir), - "configuration": { - # LLM configuration binding/host address (if applicable)/model (if applicable) - "llm_binding": args.llm_binding, - "llm_binding_host": args.llm_binding_host, - "llm_model": args.llm_model, - # embedding model configuration binding/host address (if applicable)/model (if applicable) - "embedding_binding": args.embedding_binding, - "embedding_binding_host": args.embedding_binding_host, - "embedding_model": args.embedding_model, - "max_tokens": args.max_tokens, - "kv_storage": args.kv_storage, - "doc_status_storage": args.doc_status_storage, - "graph_storage": args.graph_storage, - "vector_storage": args.vector_storage, - "enable_llm_cache_for_extract": args.enable_llm_cache_for_extract, - }, - "core_version": core_version, - "api_version": __api_version__, - "auth_mode": auth_mode, - } + return { + "status": "healthy", + "working_directory": str(args.working_dir), + "input_directory": str(args.input_dir), + "configuration": { + # LLM configuration binding/host address (if applicable)/model (if applicable) + "llm_binding": args.llm_binding, + "llm_binding_host": args.llm_binding_host, + "llm_model": args.llm_model, + # embedding model configuration binding/host address (if applicable)/model (if applicable) + "embedding_binding": args.embedding_binding, + "embedding_binding_host": args.embedding_binding_host, + "embedding_model": args.embedding_model, + "max_tokens": args.max_tokens, + "kv_storage": args.kv_storage, + "doc_status_storage": args.doc_status_storage, + "graph_storage": args.graph_storage, + "vector_storage": args.vector_storage, + "enable_llm_cache_for_extract": args.enable_llm_cache_for_extract, + }, + "core_version": core_version, + "api_version": __api_version__, + "auth_mode": auth_mode, + "pipeline_busy": pipeline_status.get("busy", False) + } + except Exception as e: + logger.error(f"Error getting health status: {str(e)}") + raise HTTPException(status_code=500, detail=str(e)) # Custom StaticFiles class to prevent caching of HTML files class NoCacheStaticFiles(StaticFiles): From 51be3fcfa5e3672e27e4935aacc19a7fa36789a3 Mon Sep 17 00:00:00 2001 From: yangdx Date: Wed, 26 Mar 2025 12:50:33 +0800 Subject: [PATCH 05/23] feat(i18n): add translations for pipeline status UI --- .../components/documents/PipelineStatusDialog.tsx | 14 +++++++------- lightrag_webui/src/features/DocumentManager.tsx | 4 ++-- lightrag_webui/src/locales/ar.json | 15 +++++++++++++++ lightrag_webui/src/locales/fr.json | 15 +++++++++++++++ lightrag_webui/src/locales/zh.json | 15 +++++++++++++++ 5 files changed, 54 insertions(+), 9 deletions(-) diff --git a/lightrag_webui/src/components/documents/PipelineStatusDialog.tsx b/lightrag_webui/src/components/documents/PipelineStatusDialog.tsx index a8807592..50e1d842 100644 --- a/lightrag_webui/src/components/documents/PipelineStatusDialog.tsx +++ b/lightrag_webui/src/components/documents/PipelineStatusDialog.tsx @@ -150,27 +150,27 @@ export default function PipelineStatusDialog({ {/* Pipeline Status */}
-
Busy:
+
{t('documentPanel.pipelineStatus.busy')}:
-
Request Pending:
+
{t('documentPanel.pipelineStatus.requestPending')}:
{/* Job Information */}
-
Job Name: {status?.job_name || '-'}
+
{t('documentPanel.pipelineStatus.jobName')}: {status?.job_name || '-'}
- Start Time: {status?.job_start ? new Date(status.job_start).toLocaleString() : '-'} - Progress: {status ? `${status.cur_batch}/${status.batchs}` : '-'} + {t('documentPanel.pipelineStatus.startTime')}: {status?.job_start ? new Date(status.job_start).toLocaleString() : '-'} + {t('documentPanel.pipelineStatus.progress')}: {status ? `${status.cur_batch}/${status.batchs}` : '-'}
{/* Latest Message */}
-
Latest Message:
+
{t('documentPanel.pipelineStatus.latestMessage')}:
{status?.latest_message || '-'}
@@ -178,7 +178,7 @@ export default function PipelineStatusDialog({ {/* History Messages */}
-
History Messages:
+
{t('documentPanel.pipelineStatus.historyMessages')}:
setShowPipelineStatus(true)} side="bottom" - tooltip="View pipeline status" + tooltip={t('documentPanel.documentManager.pipelineStatusTooltip')} size="sm" > - Pipeline Status + {t('documentPanel.documentManager.pipelineStatusButton')}
diff --git a/lightrag_webui/src/locales/ar.json b/lightrag_webui/src/locales/ar.json index c6cdb9a2..92f1f80f 100644 --- a/lightrag_webui/src/locales/ar.json +++ b/lightrag_webui/src/locales/ar.json @@ -59,6 +59,8 @@ "title": "إدارة المستندات", "scanButton": "مسح ضوئي", "scanTooltip": "مسح المستندات ضوئيًا", + "pipelineStatusButton": "حالة خط المعالجة", + "pipelineStatusTooltip": "عرض حالة خط المعالجة", "uploadedTitle": "المستندات المرفوعة", "uploadedDescription": "قائمة المستندات المرفوعة وحالاتها.", "emptyTitle": "لا توجد مستندات", @@ -89,6 +91,19 @@ "hideButton": "إخفاء", "showFileNameTooltip": "عرض اسم الملف", "hideFileNameTooltip": "إخفاء اسم الملف" + }, + "pipelineStatus": { + "title": "حالة خط المعالجة", + "busy": "مشغول", + "requestPending": "الطلب معلق", + "jobName": "اسم المهمة", + "startTime": "وقت البدء", + "progress": "التقدم", + "latestMessage": "آخر رسالة", + "historyMessages": "سجل الرسائل", + "errors": { + "fetchFailed": "فشل في جلب حالة خط المعالجة\n{{error}}" + } } }, "graphPanel": { diff --git a/lightrag_webui/src/locales/fr.json b/lightrag_webui/src/locales/fr.json index 91fba43b..25237cf2 100644 --- a/lightrag_webui/src/locales/fr.json +++ b/lightrag_webui/src/locales/fr.json @@ -59,6 +59,8 @@ "title": "Gestion des documents", "scanButton": "Scanner", "scanTooltip": "Scanner les documents", + "pipelineStatusButton": "État du Pipeline", + "pipelineStatusTooltip": "Voir l'état du pipeline", "uploadedTitle": "Documents téléchargés", "uploadedDescription": "Liste des documents téléchargés et leurs statuts.", "emptyTitle": "Aucun document", @@ -84,6 +86,19 @@ "scanFailed": "Échec de la numérisation des documents\n{{error}}", "scanProgressFailed": "Échec de l'obtention de la progression de la numérisation\n{{error}}" } + }, + "pipelineStatus": { + "title": "État du Pipeline", + "busy": "Occupé", + "requestPending": "Requête en attente", + "jobName": "Nom du travail", + "startTime": "Heure de début", + "progress": "Progression", + "latestMessage": "Dernier message", + "historyMessages": "Historique des messages", + "errors": { + "fetchFailed": "Échec de la récupération de l'état du pipeline\n{{error}}" + } } }, "graphPanel": { diff --git a/lightrag_webui/src/locales/zh.json b/lightrag_webui/src/locales/zh.json index 386501df..2379863c 100644 --- a/lightrag_webui/src/locales/zh.json +++ b/lightrag_webui/src/locales/zh.json @@ -59,6 +59,8 @@ "title": "文档管理", "scanButton": "扫描", "scanTooltip": "扫描文档", + "pipelineStatusButton": "流水线状态", + "pipelineStatusTooltip": "查看流水线状态", "uploadedTitle": "已上传文档", "uploadedDescription": "已上传文档列表及其状态", "emptyTitle": "无文档", @@ -89,6 +91,19 @@ "hideButton": "隐藏", "showFileNameTooltip": "显示文件名", "hideFileNameTooltip": "隐藏文件名" + }, + "pipelineStatus": { + "title": "流水线状态", + "busy": "忙碌", + "requestPending": "请求等待中", + "jobName": "作业名称", + "startTime": "开始时间", + "progress": "进度", + "latestMessage": "最新消息", + "historyMessages": "历史消息", + "errors": { + "fetchFailed": "获取流水线状态失败\n{{error}}" + } } }, "graphPanel": { From 814f3b3308eeadc92db74a66fd7c8a7ef598808a Mon Sep 17 00:00:00 2001 From: yangdx Date: Wed, 26 Mar 2025 13:11:53 +0800 Subject: [PATCH 06/23] feat: add pipeline busy status indicator with breathing effect - Add pipeline_busy field to health check response - Track pipeline busy state in frontend store - Add breathing animation for pipeline status button - Enhance dark mode visibility with stronger contrast --- lightrag_webui/src/api/lightrag.ts | 1 + .../src/features/DocumentManager.tsx | 56 +++++++++++++++++++ lightrag_webui/src/stores/state.ts | 12 +++- 3 files changed, 66 insertions(+), 3 deletions(-) diff --git a/lightrag_webui/src/api/lightrag.ts b/lightrag_webui/src/api/lightrag.ts index b55a62a3..8b59ccbf 100644 --- a/lightrag_webui/src/api/lightrag.ts +++ b/lightrag_webui/src/api/lightrag.ts @@ -45,6 +45,7 @@ export type LightragStatus = { core_version?: string api_version?: string auth_mode?: 'enabled' | 'disabled' + pipeline_busy: boolean } export type LightragDocumentsScanProgress = { diff --git a/lightrag_webui/src/features/DocumentManager.tsx b/lightrag_webui/src/features/DocumentManager.tsx index dd24ca9c..cee5add3 100644 --- a/lightrag_webui/src/features/DocumentManager.tsx +++ b/lightrag_webui/src/features/DocumentManager.tsx @@ -2,6 +2,7 @@ import { useState, useEffect, useCallback } from 'react' import { useTranslation } from 'react-i18next' import { useSettingsStore } from '@/stores/settings' import Button from '@/components/ui/Button' +import { cn } from '@/lib/utils' import { Table, TableBody, @@ -45,15 +46,67 @@ const getDisplayFileName = (doc: DocStatusResponse, maxLength: number = 20): str : fileName; }; +const pulseStyle = ` +@keyframes pulse { + 0% { + background-color: rgb(255 0 0 / 0.1); + border-color: rgb(255 0 0 / 0.2); + } + 50% { + background-color: rgb(255 0 0 / 0.2); + border-color: rgb(255 0 0 / 0.4); + } + 100% { + background-color: rgb(255 0 0 / 0.1); + border-color: rgb(255 0 0 / 0.2); + } +} + +.dark .pipeline-busy { + animation: dark-pulse 2s infinite; +} + +@keyframes dark-pulse { + 0% { + background-color: rgb(255 0 0 / 0.2); + border-color: rgb(255 0 0 / 0.4); + } + 50% { + background-color: rgb(255 0 0 / 0.3); + border-color: rgb(255 0 0 / 0.6); + } + 100% { + background-color: rgb(255 0 0 / 0.2); + border-color: rgb(255 0 0 / 0.4); + } +} + +.pipeline-busy { + animation: pulse 2s infinite; + border: 1px solid; +} +`; + export default function DocumentManager() { const [showPipelineStatus, setShowPipelineStatus] = useState(false) const { t } = useTranslation() const health = useBackendState.use.health() + const pipelineBusy = useBackendState.use.pipelineBusy() const [docs, setDocs] = useState(null) const currentTab = useSettingsStore.use.currentTab() const showFileName = useSettingsStore.use.showFileName() const setShowFileName = useSettingsStore.use.setShowFileName() + // Add pulse style to document + useEffect(() => { + const style = document.createElement('style') + style.textContent = pulseStyle + document.head.appendChild(style) + return () => { + document.head.removeChild(style) + } + }, []) + const fetchDocuments = useCallback(async () => { try { const docs = await getDocuments() @@ -132,6 +185,9 @@ export default function DocumentManager() { side="bottom" tooltip={t('documentPanel.documentManager.pipelineStatusTooltip')} size="sm" + className={cn( + pipelineBusy && 'pipeline-busy' + )} > {t('documentPanel.documentManager.pipelineStatusButton')} diff --git a/lightrag_webui/src/stores/state.ts b/lightrag_webui/src/stores/state.ts index 20b5ff27..a860f84d 100644 --- a/lightrag_webui/src/stores/state.ts +++ b/lightrag_webui/src/stores/state.ts @@ -6,14 +6,14 @@ interface BackendState { health: boolean message: string | null messageTitle: string | null - status: LightragStatus | null - lastCheckTime: number + pipelineBusy: boolean check: () => Promise clear: () => void setErrorMessage: (message: string, messageTitle: string) => void + setPipelineBusy: (busy: boolean) => void } interface AuthState { @@ -34,6 +34,7 @@ const useBackendStateStoreBase = create()((set) => ({ messageTitle: null, lastCheckTime: Date.now(), status: null, + pipelineBusy: false, check: async () => { const health = await checkHealth() @@ -51,7 +52,8 @@ const useBackendStateStoreBase = create()((set) => ({ message: null, messageTitle: null, lastCheckTime: Date.now(), - status: health + status: health, + pipelineBusy: health.pipeline_busy }) return true } @@ -71,6 +73,10 @@ const useBackendStateStoreBase = create()((set) => ({ setErrorMessage: (message: string, messageTitle: string) => { set({ health: false, message, messageTitle }) + }, + + setPipelineBusy: (busy: boolean) => { + set({ pipelineBusy: busy }) } })) From 43ccb7d113bd723182e83a4579271c66682fd154 Mon Sep 17 00:00:00 2001 From: yangdx Date: Wed, 26 Mar 2025 14:02:20 +0800 Subject: [PATCH 07/23] feat(DocumentManager): optimize document status monitoring - Improve document status change detection by caching previous counts and properly handling null states. - This ensures more accurate pipeline status updates. --- .../documents/PipelineStatusDialog.tsx | 7 +++- .../src/features/DocumentManager.tsx | 34 +++++++++++++++++-- 2 files changed, 38 insertions(+), 3 deletions(-) diff --git a/lightrag_webui/src/components/documents/PipelineStatusDialog.tsx b/lightrag_webui/src/components/documents/PipelineStatusDialog.tsx index 50e1d842..83ec369b 100644 --- a/lightrag_webui/src/components/documents/PipelineStatusDialog.tsx +++ b/lightrag_webui/src/components/documents/PipelineStatusDialog.tsx @@ -8,7 +8,8 @@ import { AlertDialogContent, AlertDialogHeader, AlertDialogTitle, - AlertDialogOverlay + AlertDialogOverlay, + AlertDialogDescription } from '@/components/ui/AlertDialog' import Button from '@/components/ui/Button' import { getPipelineStatus, PipelineStatusResponse } from '@/api/lightrag' @@ -144,6 +145,10 @@ export default function PipelineStatusDialog({
+ + + {t('documentPanel.pipelineStatus.description')} + {/* Status Content */}
diff --git a/lightrag_webui/src/features/DocumentManager.tsx b/lightrag_webui/src/features/DocumentManager.tsx index cee5add3..2f8264ac 100644 --- a/lightrag_webui/src/features/DocumentManager.tsx +++ b/lightrag_webui/src/features/DocumentManager.tsx @@ -1,4 +1,4 @@ -import { useState, useEffect, useCallback } from 'react' +import { useState, useEffect, useCallback, useRef } from 'react' import { useTranslation } from 'react-i18next' import { useSettingsStore } from '@/stores/settings' import Button from '@/components/ui/Button' @@ -97,6 +97,14 @@ export default function DocumentManager() { const showFileName = useSettingsStore.use.showFileName() const setShowFileName = useSettingsStore.use.setShowFileName() + // Store previous status counts + const prevStatusCounts = useRef({ + processed: 0, + processing: 0, + pending: 0, + failed: 0 + }) + // Add pulse style to document useEffect(() => { const style = document.createElement('style') @@ -110,8 +118,30 @@ export default function DocumentManager() { const fetchDocuments = useCallback(async () => { try { const docs = await getDocuments() + + // Get new status counts (treat null as all zeros) + const newStatusCounts = { + processed: docs?.statuses?.processed?.length || 0, + processing: docs?.statuses?.processing?.length || 0, + pending: docs?.statuses?.pending?.length || 0, + failed: docs?.statuses?.failed?.length || 0 + } + + // Check if any status count has changed + const hasStatusCountChange = (Object.keys(newStatusCounts) as Array).some( + status => newStatusCounts[status] !== prevStatusCounts.current[status] + ) + + // Trigger health check if changes detected + if (hasStatusCountChange) { + useBackendState.getState().check() + } + + // Update previous status counts + prevStatusCounts.current = newStatusCounts + + // Update docs state if (docs && docs.statuses) { - // compose all documents count const numDocuments = Object.values(docs.statuses).reduce( (acc, status) => acc + status.length, 0 From af3c9f30dc465763f7731855d4aecaa8ce177f4f Mon Sep 17 00:00:00 2001 From: yangdx Date: Wed, 26 Mar 2025 14:14:29 +0800 Subject: [PATCH 08/23] feat(PipelineStatusDialog): add responsive height adjustment with minimum height guarantee --- .../documents/PipelineStatusDialog.tsx | 41 +++++++++++++++---- 1 file changed, 33 insertions(+), 8 deletions(-) diff --git a/lightrag_webui/src/components/documents/PipelineStatusDialog.tsx b/lightrag_webui/src/components/documents/PipelineStatusDialog.tsx index 83ec369b..1d4074e8 100644 --- a/lightrag_webui/src/components/documents/PipelineStatusDialog.tsx +++ b/lightrag_webui/src/components/documents/PipelineStatusDialog.tsx @@ -1,4 +1,4 @@ -import { useState, useEffect, useRef } from 'react' +import { useState, useEffect, useRef, useCallback } from 'react' import { useTranslation } from 'react-i18next' import { toast } from 'sonner' import { X, AlignLeft, AlignCenter, AlignRight } from 'lucide-react' @@ -9,7 +9,6 @@ import { AlertDialogHeader, AlertDialogTitle, AlertDialogOverlay, - AlertDialogDescription } from '@/components/ui/AlertDialog' import Button from '@/components/ui/Button' import { getPipelineStatus, PipelineStatusResponse } from '@/api/lightrag' @@ -31,15 +30,44 @@ export default function PipelineStatusDialog({ const [status, setStatus] = useState(null) const [position, setPosition] = useState('center') const [isUserScrolled, setIsUserScrolled] = useState(false) + const [historyHeight, setHistoryHeight] = useState('20em') const historyRef = useRef(null) + const resizeObserverRef = useRef(null) + + // Calculate history height based on window height + const updateHistoryHeight = useCallback(() => { + const minHeight = 7.5 // 5 lines * 1.5em line height + const windowHeight = window.innerHeight + const pixelsPerEm = parseFloat(getComputedStyle(document.documentElement).fontSize) + const maxHeightInEm = Math.max(Math.floor((windowHeight * 0.4) / pixelsPerEm), minHeight) + setHistoryHeight(`${maxHeightInEm}em`) + }, []) // Reset position when dialog opens useEffect(() => { if (open) { setPosition('center') setIsUserScrolled(false) + updateHistoryHeight() } - }, [open]) + }, [open, updateHistoryHeight]) + + // Setup resize observer + useEffect(() => { + if (!open) return + + resizeObserverRef.current = new ResizeObserver((entries) => { + if (entries[0]) { + updateHistoryHeight() + } + }) + + resizeObserverRef.current.observe(document.body) + + return () => { + resizeObserverRef.current?.disconnect() + } + }, [open, updateHistoryHeight]) // Handle scroll position useEffect(() => { @@ -145,10 +173,6 @@ export default function PipelineStatusDialog({
- - - {t('documentPanel.pipelineStatus.description')} - {/* Status Content */}
@@ -187,7 +211,8 @@ export default function PipelineStatusDialog({
{status?.history_messages?.map((msg, idx) => (
{msg}
From 4adfcdc8fea9719e773e261145f8757f7b8f99b0 Mon Sep 17 00:00:00 2001 From: yangdx Date: Wed, 26 Mar 2025 14:40:54 +0800 Subject: [PATCH 09/23] feat(accessibility): add screen reader text for pipeline status dialog --- .../src/components/documents/PipelineStatusDialog.tsx | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/lightrag_webui/src/components/documents/PipelineStatusDialog.tsx b/lightrag_webui/src/components/documents/PipelineStatusDialog.tsx index 1d4074e8..8b83132b 100644 --- a/lightrag_webui/src/components/documents/PipelineStatusDialog.tsx +++ b/lightrag_webui/src/components/documents/PipelineStatusDialog.tsx @@ -8,6 +8,7 @@ import { AlertDialogContent, AlertDialogHeader, AlertDialogTitle, + AlertDialogDescription, AlertDialogOverlay, } from '@/components/ui/AlertDialog' import Button from '@/components/ui/Button' @@ -121,6 +122,12 @@ export default function PipelineStatusDialog({ position === 'right' && '!right-4 !left-auto !translate-x-0' )} > + + {status?.job_name + ? `${t('documentPanel.pipelineStatus.jobName')}: ${status.job_name}, ${t('documentPanel.pipelineStatus.progress')}: ${status.cur_batch}/${status.batchs}` + : t('documentPanel.pipelineStatus.noActiveJob') + } + {t('documentPanel.pipelineStatus.title')} From 03934b138529298ca34ee081d2c4157594ad9ceb Mon Sep 17 00:00:00 2001 From: yangdx Date: Wed, 26 Mar 2025 16:24:38 +0800 Subject: [PATCH 10/23] fix(ui): improve pipeline status dialog layout and styling - Switch from AlertDialog to Dialog component for better modal behavior - Adjust dialog positioning and alignment controls - Remove custom close button to avoid duplication - Add proper spacing between alignment buttons and close button - Simplify history container height with min/max height - Reduce overlay opacity for better visibility --- .../documents/PipelineStatusDialog.tsx | 148 +++++++----------- lightrag_webui/src/components/ui/Dialog.tsx | 2 +- 2 files changed, 54 insertions(+), 96 deletions(-) diff --git a/lightrag_webui/src/components/documents/PipelineStatusDialog.tsx b/lightrag_webui/src/components/documents/PipelineStatusDialog.tsx index 8b83132b..cdf29ca0 100644 --- a/lightrag_webui/src/components/documents/PipelineStatusDialog.tsx +++ b/lightrag_webui/src/components/documents/PipelineStatusDialog.tsx @@ -1,16 +1,15 @@ -import { useState, useEffect, useRef, useCallback } from 'react' +import { useState, useEffect, useRef } from 'react' import { useTranslation } from 'react-i18next' import { toast } from 'sonner' -import { X, AlignLeft, AlignCenter, AlignRight } from 'lucide-react' +import { AlignLeft, AlignCenter, AlignRight } from 'lucide-react' import { - AlertDialog, - AlertDialogContent, - AlertDialogHeader, - AlertDialogTitle, - AlertDialogDescription, - AlertDialogOverlay, -} from '@/components/ui/AlertDialog' + Dialog, + DialogContent, + DialogHeader, + DialogTitle, + DialogDescription +} from '@/components/ui/Dialog' import Button from '@/components/ui/Button' import { getPipelineStatus, PipelineStatusResponse } from '@/api/lightrag' import { errorMessage } from '@/lib/utils' @@ -31,44 +30,15 @@ export default function PipelineStatusDialog({ const [status, setStatus] = useState(null) const [position, setPosition] = useState('center') const [isUserScrolled, setIsUserScrolled] = useState(false) - const [historyHeight, setHistoryHeight] = useState('20em') const historyRef = useRef(null) - const resizeObserverRef = useRef(null) - - // Calculate history height based on window height - const updateHistoryHeight = useCallback(() => { - const minHeight = 7.5 // 5 lines * 1.5em line height - const windowHeight = window.innerHeight - const pixelsPerEm = parseFloat(getComputedStyle(document.documentElement).fontSize) - const maxHeightInEm = Math.max(Math.floor((windowHeight * 0.4) / pixelsPerEm), minHeight) - setHistoryHeight(`${maxHeightInEm}em`) - }, []) // Reset position when dialog opens useEffect(() => { if (open) { setPosition('center') setIsUserScrolled(false) - updateHistoryHeight() } - }, [open, updateHistoryHeight]) - - // Setup resize observer - useEffect(() => { - if (!open) return - - resizeObserverRef.current = new ResizeObserver((entries) => { - if (entries[0]) { - updateHistoryHeight() - } - }) - - resizeObserverRef.current.observe(document.body) - - return () => { - resizeObserverRef.current?.disconnect() - } - }, [open, updateHistoryHeight]) + }, [open]) // Handle scroll position useEffect(() => { @@ -112,74 +82,63 @@ export default function PipelineStatusDialog({ }, [open, t]) return ( - - - + - + {status?.job_name ? `${t('documentPanel.pipelineStatus.jobName')}: ${status.job_name}, ${t('documentPanel.pipelineStatus.progress')}: ${status.cur_batch}/${status.batchs}` : t('documentPanel.pipelineStatus.noActiveJob') } - - - + + + {t('documentPanel.pipelineStatus.title')} - + - {/* Position control buttons and close button */} -
-
- - - -
+ {/* Position control buttons */} +
+ +
- + {/* Status Content */}
@@ -218,8 +177,7 @@ export default function PipelineStatusDialog({
{status?.history_messages?.map((msg, idx) => (
{msg}
@@ -227,7 +185,7 @@ export default function PipelineStatusDialog({
-
-
+ + ) } diff --git a/lightrag_webui/src/components/ui/Dialog.tsx b/lightrag_webui/src/components/ui/Dialog.tsx index a45f1e32..75d806f5 100644 --- a/lightrag_webui/src/components/ui/Dialog.tsx +++ b/lightrag_webui/src/components/ui/Dialog.tsx @@ -19,7 +19,7 @@ const DialogOverlay = React.forwardRef< Date: Wed, 26 Mar 2025 16:58:31 +0800 Subject: [PATCH 11/23] fix: optimize job name handling in document processing pipeline - Move job name setting to before batch processing - Fix document and batch counter accumulation --- lightrag/lightrag.py | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/lightrag/lightrag.py b/lightrag/lightrag.py index a2e345a5..718cf576 100644 --- a/lightrag/lightrag.py +++ b/lightrag/lightrag.py @@ -842,17 +842,10 @@ class LightRAG: logger.info("No documents to process") return - # Get first document's file path and total count for job name - first_doc_id, first_doc = next(iter(to_process_docs.items())) - first_doc_path = first_doc.file_path - path_prefix = first_doc_path[:20] + ("..." if len(first_doc_path) > 20 else "") - total_files = len(to_process_docs) - job_name = f"{path_prefix}[{total_files} files]" - pipeline_status.update( { "busy": True, - "job_name": job_name, + "job_name": "Default Job", "job_start": datetime.now().isoformat(), "docs": 0, "batchs": 0, @@ -891,11 +884,19 @@ class LightRAG: logger.info(log_message) # Update pipeline status with current batch information - pipeline_status["docs"] += len(to_process_docs) - pipeline_status["batchs"] += len(docs_batches) + pipeline_status["docs"] = len(to_process_docs) + pipeline_status["batchs"] = len(docs_batches) pipeline_status["latest_message"] = log_message pipeline_status["history_messages"].append(log_message) + # Get first document's file path and total count for job name + first_doc_id, first_doc = next(iter(to_process_docs.items())) + first_doc_path = first_doc.file_path + path_prefix = first_doc_path[:20] + ("..." if len(first_doc_path) > 20 else "") + total_files = len(to_process_docs) + job_name = f"{path_prefix}[{total_files} files]" + pipeline_status["job_name"] = job_name + async def process_document( doc_id: str, status_doc: DocProcessingStatus, From f7928263c00b37edcfd99f4f2b6ce013f96fdf2b Mon Sep 17 00:00:00 2001 From: yangdx Date: Wed, 26 Mar 2025 17:29:09 +0800 Subject: [PATCH 12/23] Fix i18n translation --- lightrag_webui/src/locales/ar.json | 2 +- lightrag_webui/src/locales/en.json | 30 +++++++++++++++--------------- lightrag_webui/src/locales/fr.json | 9 +++++++-- lightrag_webui/src/locales/zh.json | 4 ++-- 4 files changed, 25 insertions(+), 20 deletions(-) diff --git a/lightrag_webui/src/locales/ar.json b/lightrag_webui/src/locales/ar.json index 92f1f80f..7c99739c 100644 --- a/lightrag_webui/src/locales/ar.json +++ b/lightrag_webui/src/locales/ar.json @@ -94,7 +94,7 @@ }, "pipelineStatus": { "title": "حالة خط المعالجة", - "busy": "مشغول", + "busy": "خط المعالجة مشغول", "requestPending": "الطلب معلق", "jobName": "اسم المهمة", "startTime": "وقت البدء", diff --git a/lightrag_webui/src/locales/en.json b/lightrag_webui/src/locales/en.json index 2123c26f..5ec6624c 100644 --- a/lightrag_webui/src/locales/en.json +++ b/lightrag_webui/src/locales/en.json @@ -59,6 +59,8 @@ "title": "Document Management", "scanButton": "Scan", "scanTooltip": "Scan documents", + "pipelineStatusButton": "Pipeline Status", + "pipelineStatusTooltip": "View pipeline status", "uploadedTitle": "Uploaded Documents", "uploadedDescription": "List of uploaded documents and their statuses.", "emptyTitle": "No Documents", @@ -89,6 +91,19 @@ "hideButton": "Hide", "showFileNameTooltip": "Show file name", "hideFileNameTooltip": "Hide file name" + }, + "pipelineStatus": { + "title": "Pipeline Status", + "busy": "Pipeline Busy", + "requestPending": "Reques Pending", + "jobName": "Job Name", + "startTime": "Start Time", + "progress": "Progress", + "latestMessage": "Latest Message", + "historyMessages": "History Message", + "errors": { + "fetchFailed": "Fail to get pipeline status\n{{error}}" + } } }, "graphPanel": { @@ -113,7 +128,6 @@ "save": "Save", "refreshLayout": "Refresh Layout" }, - "zoomControl": { "zoomIn": "Zoom In", "zoomOut": "Zoom Out", @@ -121,7 +135,6 @@ "rotateCamera": "Clockwise Rotate", "rotateCameraCounterClockwise": "Counter-Clockwise Rotate" }, - "layoutsControl": { "startAnimation": "Continue layout animation", "stopAnimation": "Stop layout animation", @@ -135,7 +148,6 @@ "Force Atlas": "Force Atlas" } }, - "fullScreenControl": { "fullScreen": "Full Screen", "windowed": "Windowed" @@ -224,7 +236,6 @@ "querySettings": { "parametersTitle": "Parameters", "parametersDescription": "Configure your query parameters", - "queryMode": "Query Mode", "queryModeTooltip": "Select the retrieval strategy:\n• Naive: Basic search without advanced techniques\n• Local: Context-dependent information retrieval\n• Global: Utilizes global knowledge base\n• Hybrid: Combines local and global retrieval\n• Mix: Integrates knowledge graph with vector retrieval", "queryModeOptions": { @@ -234,7 +245,6 @@ "hybrid": "Hybrid", "mix": "Mix" }, - "responseFormat": "Response Format", "responseFormatTooltip": "Defines the response format. Examples:\n• Multiple Paragraphs\n• Single Paragraph\n• Bullet Points", "responseFormatOptions": { @@ -242,37 +252,27 @@ "singleParagraph": "Single Paragraph", "bulletPoints": "Bullet Points" }, - "topK": "Top K Results", "topKTooltip": "Number of top items to retrieve. Represents entities in 'local' mode and relationships in 'global' mode", "topKPlaceholder": "Number of results", - "maxTokensTextUnit": "Max Tokens for Text Unit", "maxTokensTextUnitTooltip": "Maximum number of tokens allowed for each retrieved text chunk", - "maxTokensGlobalContext": "Max Tokens for Global Context", "maxTokensGlobalContextTooltip": "Maximum number of tokens allocated for relationship descriptions in global retrieval", - "maxTokensLocalContext": "Max Tokens for Local Context", "maxTokensLocalContextTooltip": "Maximum number of tokens allocated for entity descriptions in local retrieval", - "historyTurns": "History Turns", "historyTurnsTooltip": "Number of complete conversation turns (user-assistant pairs) to consider in the response context", "historyTurnsPlaceholder": "Number of history turns", - "hlKeywords": "High-Level Keywords", "hlKeywordsTooltip": "List of high-level keywords to prioritize in retrieval. Separate with commas", "hlkeywordsPlaceHolder": "Enter keywords", - "llKeywords": "Low-Level Keywords", "llKeywordsTooltip": "List of low-level keywords to refine retrieval focus. Separate with commas", - "onlyNeedContext": "Only Need Context", "onlyNeedContextTooltip": "If True, only returns the retrieved context without generating a response", - "onlyNeedPrompt": "Only Need Prompt", "onlyNeedPromptTooltip": "If True, only returns the generated prompt without producing a response", - "streamResponse": "Stream Response", "streamResponseTooltip": "If True, enables streaming output for real-time responses" } diff --git a/lightrag_webui/src/locales/fr.json b/lightrag_webui/src/locales/fr.json index 25237cf2..5c9975de 100644 --- a/lightrag_webui/src/locales/fr.json +++ b/lightrag_webui/src/locales/fr.json @@ -85,11 +85,16 @@ "loadFailed": "Échec du chargement des documents\n{{error}}", "scanFailed": "Échec de la numérisation des documents\n{{error}}", "scanProgressFailed": "Échec de l'obtention de la progression de la numérisation\n{{error}}" - } + }, + "fileNameLabel": "Nom du fichier", + "showButton": "Afficher", + "hideButton": "Masquer", + "showFileNameTooltip": "Afficher le nom du fichier", + "hideFileNameTooltip": "Masquer le nom du fichier" }, "pipelineStatus": { "title": "État du Pipeline", - "busy": "Occupé", + "busy": "Pipeline occupé", "requestPending": "Requête en attente", "jobName": "Nom du travail", "startTime": "Heure de début", diff --git a/lightrag_webui/src/locales/zh.json b/lightrag_webui/src/locales/zh.json index 2379863c..e356404c 100644 --- a/lightrag_webui/src/locales/zh.json +++ b/lightrag_webui/src/locales/zh.json @@ -94,8 +94,8 @@ }, "pipelineStatus": { "title": "流水线状态", - "busy": "忙碌", - "requestPending": "请求等待中", + "busy": "流水线忙碌", + "requestPending": "待处理请求", "jobName": "作业名称", "startTime": "开始时间", "progress": "进度", From 46f5c5b47fb06914786e409a41f5504b06c18668 Mon Sep 17 00:00:00 2001 From: yangdx Date: Wed, 26 Mar 2025 17:30:06 +0800 Subject: [PATCH 13/23] Fix linting --- lightrag/api/lightrag_server.py | 4 ++-- lightrag/lightrag.py | 4 +++- .../src/components/documents/PipelineStatusDialog.tsx | 8 ++++---- lightrag_webui/src/features/DocumentManager.tsx | 2 +- 4 files changed, 10 insertions(+), 8 deletions(-) diff --git a/lightrag/api/lightrag_server.py b/lightrag/api/lightrag_server.py index 27901fb5..030a73d8 100644 --- a/lightrag/api/lightrag_server.py +++ b/lightrag/api/lightrag_server.py @@ -423,7 +423,7 @@ def create_app(args): """Get current system status""" try: pipeline_status = await get_namespace_data("pipeline_status") - + username = os.getenv("AUTH_USERNAME") password = os.getenv("AUTH_PASSWORD") if not (username and password): @@ -454,7 +454,7 @@ def create_app(args): "core_version": core_version, "api_version": __api_version__, "auth_mode": auth_mode, - "pipeline_busy": pipeline_status.get("busy", False) + "pipeline_busy": pipeline_status.get("busy", False), } except Exception as e: logger.error(f"Error getting health status: {str(e)}") diff --git a/lightrag/lightrag.py b/lightrag/lightrag.py index 718cf576..7ebcebc7 100644 --- a/lightrag/lightrag.py +++ b/lightrag/lightrag.py @@ -892,7 +892,9 @@ class LightRAG: # Get first document's file path and total count for job name first_doc_id, first_doc = next(iter(to_process_docs.items())) first_doc_path = first_doc.file_path - path_prefix = first_doc_path[:20] + ("..." if len(first_doc_path) > 20 else "") + path_prefix = first_doc_path[:20] + ( + "..." if len(first_doc_path) > 20 else "" + ) total_files = len(to_process_docs) job_name = f"{path_prefix}[{total_files} files]" pipeline_status["job_name"] = job_name diff --git a/lightrag_webui/src/components/documents/PipelineStatusDialog.tsx b/lightrag_webui/src/components/documents/PipelineStatusDialog.tsx index cdf29ca0..43687f47 100644 --- a/lightrag_webui/src/components/documents/PipelineStatusDialog.tsx +++ b/lightrag_webui/src/components/documents/PipelineStatusDialog.tsx @@ -55,7 +55,7 @@ export default function PipelineStatusDialog({ const isAtBottom = Math.abs( (container.scrollHeight - container.scrollTop) - container.clientHeight ) < 1 - + if (isAtBottom) { setIsUserScrolled(false) } else { @@ -92,7 +92,7 @@ export default function PipelineStatusDialog({ )} > - {status?.job_name + {status?.job_name ? `${t('documentPanel.pipelineStatus.jobName')}: ${status.job_name}, ${t('documentPanel.pipelineStatus.progress')}: ${status.cur_batch}/${status.batchs}` : t('documentPanel.pipelineStatus.noActiveJob') } @@ -101,7 +101,7 @@ export default function PipelineStatusDialog({ {t('documentPanel.pipelineStatus.title')} - + {/* Position control buttons */}
From f29b6f3a8b6d2a765f92749024c3c76706c974e9 Mon Sep 17 00:00:00 2001 From: yangdx Date: Wed, 26 Mar 2025 17:40:33 +0800 Subject: [PATCH 16/23] Update webui assets --- .../api/webui/assets/{index-uJ5sfwNq.js => index-IDR-_K-N.js} | 2 +- lightrag/api/webui/index.html | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) rename lightrag/api/webui/assets/{index-uJ5sfwNq.js => index-IDR-_K-N.js} (99%) diff --git a/lightrag/api/webui/assets/index-uJ5sfwNq.js b/lightrag/api/webui/assets/index-IDR-_K-N.js similarity index 99% rename from lightrag/api/webui/assets/index-uJ5sfwNq.js rename to lightrag/api/webui/assets/index-IDR-_K-N.js index ff6ed240..8ce93f0a 100644 --- a/lightrag/api/webui/assets/index-uJ5sfwNq.js +++ b/lightrag/api/webui/assets/index-IDR-_K-N.js @@ -1093,7 +1093,7 @@ In order to be iterable, non-array objects must have a [Symbol.iterator]() metho - \`null\` or \`undefined\` if the progress is indeterminate. Defaulting to \`null\`.`}var Z5=W5,Sie=K5;const Q5=w.forwardRef(({className:e,value:t,...n},r)=>E.jsx(Z5,{ref:r,className:Me("bg-secondary relative h-4 w-full overflow-hidden rounded-full",e),...n,children:E.jsx(Sie,{className:"bg-primary h-full w-full flex-1 transition-all",style:{transform:`translateX(-${100-(t||0)}%)`}})}));Q5.displayName=Z5.displayName;function Eie(e,t){return w.useReducer((n,r)=>t[n][r]??n,e)}var BT="ScrollArea",[J5,cke]=wr(BT),[wie,Tr]=J5(BT),eG=w.forwardRef((e,t)=>{const{__scopeScrollArea:n,type:r="hover",dir:a,scrollHideDelay:o=600,...s}=e,[u,c]=w.useState(null),[d,p]=w.useState(null),[g,m]=w.useState(null),[b,y]=w.useState(null),[v,k]=w.useState(null),[A,x]=w.useState(0),[R,O]=w.useState(0),[_,C]=w.useState(!1),[N,M]=w.useState(!1),I=mt(t,H=>c(H)),D=pp(a);return E.jsx(wie,{scope:n,type:r,dir:D,scrollHideDelay:o,scrollArea:u,viewport:d,onViewportChange:p,content:g,onContentChange:m,scrollbarX:b,onScrollbarXChange:y,scrollbarXEnabled:_,onScrollbarXEnabledChange:C,scrollbarY:v,onScrollbarYChange:k,scrollbarYEnabled:N,onScrollbarYEnabledChange:M,onCornerWidthChange:x,onCornerHeightChange:O,children:E.jsx(Ze.div,{dir:D,...s,ref:I,style:{position:"relative","--radix-scroll-area-corner-width":A+"px","--radix-scroll-area-corner-height":R+"px",...e.style}})})});eG.displayName=BT;var tG="ScrollAreaViewport",nG=w.forwardRef((e,t)=>{const{__scopeScrollArea:n,children:r,nonce:a,...o}=e,s=Tr(tG,n),u=w.useRef(null),c=mt(t,u,s.onViewportChange);return E.jsxs(E.Fragment,{children:[E.jsx("style",{dangerouslySetInnerHTML:{__html:"[data-radix-scroll-area-viewport]{scrollbar-width:none;-ms-overflow-style:none;-webkit-overflow-scrolling:touch;}[data-radix-scroll-area-viewport]::-webkit-scrollbar{display:none}"},nonce:a}),E.jsx(Ze.div,{"data-radix-scroll-area-viewport":"",...o,ref:c,style:{overflowX:s.scrollbarXEnabled?"scroll":"hidden",overflowY:s.scrollbarYEnabled?"scroll":"hidden",...e.style},children:E.jsx("div",{ref:s.onContentChange,style:{minWidth:"100%",display:"table"},children:r})})]})});nG.displayName=tG;var ca="ScrollAreaScrollbar",UT=w.forwardRef((e,t)=>{const{forceMount:n,...r}=e,a=Tr(ca,e.__scopeScrollArea),{onScrollbarXEnabledChange:o,onScrollbarYEnabledChange:s}=a,u=e.orientation==="horizontal";return w.useEffect(()=>(u?o(!0):s(!0),()=>{u?o(!1):s(!1)}),[u,o,s]),a.type==="hover"?E.jsx(xie,{...r,ref:t,forceMount:n}):a.type==="scroll"?E.jsx(kie,{...r,ref:t,forceMount:n}):a.type==="auto"?E.jsx(rG,{...r,ref:t,forceMount:n}):a.type==="always"?E.jsx(jT,{...r,ref:t}):null});UT.displayName=ca;var xie=w.forwardRef((e,t)=>{const{forceMount:n,...r}=e,a=Tr(ca,e.__scopeScrollArea),[o,s]=w.useState(!1);return w.useEffect(()=>{const u=a.scrollArea;let c=0;if(u){const d=()=>{window.clearTimeout(c),s(!0)},p=()=>{c=window.setTimeout(()=>s(!1),a.scrollHideDelay)};return u.addEventListener("pointerenter",d),u.addEventListener("pointerleave",p),()=>{window.clearTimeout(c),u.removeEventListener("pointerenter",d),u.removeEventListener("pointerleave",p)}}},[a.scrollArea,a.scrollHideDelay]),E.jsx(xr,{present:n||o,children:E.jsx(rG,{"data-state":o?"visible":"hidden",...r,ref:t})})}),kie=w.forwardRef((e,t)=>{const{forceMount:n,...r}=e,a=Tr(ca,e.__scopeScrollArea),o=e.orientation==="horizontal",s=Np(()=>c("SCROLL_END"),100),[u,c]=Eie("hidden",{hidden:{SCROLL:"scrolling"},scrolling:{SCROLL_END:"idle",POINTER_ENTER:"interacting"},interacting:{SCROLL:"interacting",POINTER_LEAVE:"idle"},idle:{HIDE:"hidden",SCROLL:"scrolling",POINTER_ENTER:"interacting"}});return w.useEffect(()=>{if(u==="idle"){const d=window.setTimeout(()=>c("HIDE"),a.scrollHideDelay);return()=>window.clearTimeout(d)}},[u,a.scrollHideDelay,c]),w.useEffect(()=>{const d=a.viewport,p=o?"scrollLeft":"scrollTop";if(d){let g=d[p];const m=()=>{const b=d[p];g!==b&&(c("SCROLL"),s()),g=b};return d.addEventListener("scroll",m),()=>d.removeEventListener("scroll",m)}},[a.viewport,o,c,s]),E.jsx(xr,{present:n||u!=="hidden",children:E.jsx(jT,{"data-state":u==="hidden"?"hidden":"visible",...r,ref:t,onPointerEnter:Ke(e.onPointerEnter,()=>c("POINTER_ENTER")),onPointerLeave:Ke(e.onPointerLeave,()=>c("POINTER_LEAVE"))})})}),rG=w.forwardRef((e,t)=>{const n=Tr(ca,e.__scopeScrollArea),{forceMount:r,...a}=e,[o,s]=w.useState(!1),u=e.orientation==="horizontal",c=Np(()=>{if(n.viewport){const d=n.viewport.offsetWidth{const{orientation:n="vertical",...r}=e,a=Tr(ca,e.__scopeScrollArea),o=w.useRef(null),s=w.useRef(0),[u,c]=w.useState({content:0,viewport:0,scrollbar:{size:0,paddingStart:0,paddingEnd:0}}),d=lG(u.viewport,u.content),p={...r,sizes:u,onSizesChange:c,hasThumb:d>0&&d<1,onThumbChange:m=>o.current=m,onThumbPointerUp:()=>s.current=0,onThumbPointerDown:m=>s.current=m};function g(m,b){return Nie(m,s.current,u,b)}return n==="horizontal"?E.jsx(Tie,{...p,ref:t,onThumbPositionChange:()=>{if(a.viewport&&o.current){const m=a.viewport.scrollLeft,b=ZO(m,u,a.dir);o.current.style.transform=`translate3d(${b}px, 0, 0)`}},onWheelScroll:m=>{a.viewport&&(a.viewport.scrollLeft=m)},onDragScroll:m=>{a.viewport&&(a.viewport.scrollLeft=g(m,a.dir))}}):n==="vertical"?E.jsx(Aie,{...p,ref:t,onThumbPositionChange:()=>{if(a.viewport&&o.current){const m=a.viewport.scrollTop,b=ZO(m,u);o.current.style.transform=`translate3d(0, ${b}px, 0)`}},onWheelScroll:m=>{a.viewport&&(a.viewport.scrollTop=m)},onDragScroll:m=>{a.viewport&&(a.viewport.scrollTop=g(m))}}):null}),Tie=w.forwardRef((e,t)=>{const{sizes:n,onSizesChange:r,...a}=e,o=Tr(ca,e.__scopeScrollArea),[s,u]=w.useState(),c=w.useRef(null),d=mt(t,c,o.onScrollbarXChange);return w.useEffect(()=>{c.current&&u(getComputedStyle(c.current))},[c]),E.jsx(oG,{"data-orientation":"horizontal",...a,ref:d,sizes:n,style:{bottom:0,left:o.dir==="rtl"?"var(--radix-scroll-area-corner-width)":0,right:o.dir==="ltr"?"var(--radix-scroll-area-corner-width)":0,"--radix-scroll-area-thumb-width":_p(n)+"px",...e.style},onThumbPointerDown:p=>e.onThumbPointerDown(p.x),onDragScroll:p=>e.onDragScroll(p.x),onWheelScroll:(p,g)=>{if(o.viewport){const m=o.viewport.scrollLeft+p.deltaX;e.onWheelScroll(m),cG(m,g)&&p.preventDefault()}},onResize:()=>{c.current&&o.viewport&&s&&r({content:o.viewport.scrollWidth,viewport:o.viewport.offsetWidth,scrollbar:{size:c.current.clientWidth,paddingStart:Mf(s.paddingLeft),paddingEnd:Mf(s.paddingRight)}})}})}),Aie=w.forwardRef((e,t)=>{const{sizes:n,onSizesChange:r,...a}=e,o=Tr(ca,e.__scopeScrollArea),[s,u]=w.useState(),c=w.useRef(null),d=mt(t,c,o.onScrollbarYChange);return w.useEffect(()=>{c.current&&u(getComputedStyle(c.current))},[c]),E.jsx(oG,{"data-orientation":"vertical",...a,ref:d,sizes:n,style:{top:0,right:o.dir==="ltr"?0:void 0,left:o.dir==="rtl"?0:void 0,bottom:"var(--radix-scroll-area-corner-height)","--radix-scroll-area-thumb-height":_p(n)+"px",...e.style},onThumbPointerDown:p=>e.onThumbPointerDown(p.y),onDragScroll:p=>e.onDragScroll(p.y),onWheelScroll:(p,g)=>{if(o.viewport){const m=o.viewport.scrollTop+p.deltaY;e.onWheelScroll(m),cG(m,g)&&p.preventDefault()}},onResize:()=>{c.current&&o.viewport&&s&&r({content:o.viewport.scrollHeight,viewport:o.viewport.offsetHeight,scrollbar:{size:c.current.clientHeight,paddingStart:Mf(s.paddingTop),paddingEnd:Mf(s.paddingBottom)}})}})}),[Rie,aG]=J5(ca),oG=w.forwardRef((e,t)=>{const{__scopeScrollArea:n,sizes:r,hasThumb:a,onThumbChange:o,onThumbPointerUp:s,onThumbPointerDown:u,onThumbPositionChange:c,onDragScroll:d,onWheelScroll:p,onResize:g,...m}=e,b=Tr(ca,n),[y,v]=w.useState(null),k=mt(t,I=>v(I)),A=w.useRef(null),x=w.useRef(""),R=b.viewport,O=r.content-r.viewport,_=yn(p),C=yn(c),N=Np(g,10);function M(I){if(A.current){const D=I.clientX-A.current.left,H=I.clientY-A.current.top;d({x:D,y:H})}}return w.useEffect(()=>{const I=D=>{const H=D.target;(y==null?void 0:y.contains(H))&&_(D,O)};return document.addEventListener("wheel",I,{passive:!1}),()=>document.removeEventListener("wheel",I,{passive:!1})},[R,y,O,_]),w.useEffect(C,[r,C]),zs(y,N),zs(b.content,N),E.jsx(Rie,{scope:n,scrollbar:y,hasThumb:a,onThumbChange:yn(o),onThumbPointerUp:yn(s),onThumbPositionChange:C,onThumbPointerDown:yn(u),children:E.jsx(Ze.div,{...m,ref:k,style:{position:"absolute",...m.style},onPointerDown:Ke(e.onPointerDown,I=>{I.button===0&&(I.target.setPointerCapture(I.pointerId),A.current=y.getBoundingClientRect(),x.current=document.body.style.webkitUserSelect,document.body.style.webkitUserSelect="none",b.viewport&&(b.viewport.style.scrollBehavior="auto"),M(I))}),onPointerMove:Ke(e.onPointerMove,M),onPointerUp:Ke(e.onPointerUp,I=>{const D=I.target;D.hasPointerCapture(I.pointerId)&&D.releasePointerCapture(I.pointerId),document.body.style.webkitUserSelect=x.current,b.viewport&&(b.viewport.style.scrollBehavior=""),A.current=null})})})}),Lf="ScrollAreaThumb",iG=w.forwardRef((e,t)=>{const{forceMount:n,...r}=e,a=aG(Lf,e.__scopeScrollArea);return E.jsx(xr,{present:n||a.hasThumb,children:E.jsx(Cie,{ref:t,...r})})}),Cie=w.forwardRef((e,t)=>{const{__scopeScrollArea:n,style:r,...a}=e,o=Tr(Lf,n),s=aG(Lf,n),{onThumbPositionChange:u}=s,c=mt(t,g=>s.onThumbChange(g)),d=w.useRef(void 0),p=Np(()=>{d.current&&(d.current(),d.current=void 0)},100);return w.useEffect(()=>{const g=o.viewport;if(g){const m=()=>{if(p(),!d.current){const b=Oie(g,u);d.current=b,u()}};return u(),g.addEventListener("scroll",m),()=>g.removeEventListener("scroll",m)}},[o.viewport,p,u]),E.jsx(Ze.div,{"data-state":s.hasThumb?"visible":"hidden",...a,ref:c,style:{width:"var(--radix-scroll-area-thumb-width)",height:"var(--radix-scroll-area-thumb-height)",...r},onPointerDownCapture:Ke(e.onPointerDownCapture,g=>{const b=g.target.getBoundingClientRect(),y=g.clientX-b.left,v=g.clientY-b.top;s.onThumbPointerDown({x:y,y:v})}),onPointerUp:Ke(e.onPointerUp,s.onThumbPointerUp)})});iG.displayName=Lf;var GT="ScrollAreaCorner",sG=w.forwardRef((e,t)=>{const n=Tr(GT,e.__scopeScrollArea),r=!!(n.scrollbarX&&n.scrollbarY);return n.type!=="scroll"&&r?E.jsx(_ie,{...e,ref:t}):null});sG.displayName=GT;var _ie=w.forwardRef((e,t)=>{const{__scopeScrollArea:n,...r}=e,a=Tr(GT,n),[o,s]=w.useState(0),[u,c]=w.useState(0),d=!!(o&&u);return zs(a.scrollbarX,()=>{var g;const p=((g=a.scrollbarX)==null?void 0:g.offsetHeight)||0;a.onCornerHeightChange(p),c(p)}),zs(a.scrollbarY,()=>{var g;const p=((g=a.scrollbarY)==null?void 0:g.offsetWidth)||0;a.onCornerWidthChange(p),s(p)}),d?E.jsx(Ze.div,{...r,ref:t,style:{width:o,height:u,position:"absolute",right:a.dir==="ltr"?0:void 0,left:a.dir==="rtl"?0:void 0,bottom:0,...e.style}}):null});function Mf(e){return e?parseInt(e,10):0}function lG(e,t){const n=e/t;return isNaN(n)?0:n}function _p(e){const t=lG(e.viewport,e.content),n=e.scrollbar.paddingStart+e.scrollbar.paddingEnd,r=(e.scrollbar.size-n)*t;return Math.max(r,18)}function Nie(e,t,n,r="ltr"){const a=_p(n),o=a/2,s=t||o,u=a-s,c=n.scrollbar.paddingStart+s,d=n.scrollbar.size-n.scrollbar.paddingEnd-u,p=n.content-n.viewport,g=r==="ltr"?[0,p]:[p*-1,0];return uG([c,d],g)(e)}function ZO(e,t,n="ltr"){const r=_p(t),a=t.scrollbar.paddingStart+t.scrollbar.paddingEnd,o=t.scrollbar.size-a,s=t.content-t.viewport,u=o-r,c=n==="ltr"?[0,s]:[s*-1,0],d=Ik(e,c);return uG([0,s],[0,u])(d)}function uG(e,t){return n=>{if(e[0]===e[1]||t[0]===t[1])return t[0];const r=(t[1]-t[0])/(e[1]-e[0]);return t[0]+r*(n-e[0])}}function cG(e,t){return e>0&&e{})=>{let n={left:e.scrollLeft,top:e.scrollTop},r=0;return function a(){const o={left:e.scrollLeft,top:e.scrollTop},s=n.left!==o.left,u=n.top!==o.top;(s||u)&&t(),n=o,r=window.requestAnimationFrame(a)}(),()=>window.cancelAnimationFrame(r)};function Np(e,t){const n=yn(e),r=w.useRef(0);return w.useEffect(()=>()=>window.clearTimeout(r.current),[]),w.useCallback(()=>{window.clearTimeout(r.current),r.current=window.setTimeout(n,t)},[n,t])}function zs(e,t){const n=yn(t);Rn(()=>{let r=0;if(e){const a=new ResizeObserver(()=>{cancelAnimationFrame(r),r=window.requestAnimationFrame(n)});return a.observe(e),()=>{window.cancelAnimationFrame(r),a.unobserve(e)}}},[e,n])}var dG=eG,Iie=nG,Die=sG;const fG=w.forwardRef(({className:e,children:t,...n},r)=>E.jsxs(dG,{ref:r,className:Me("relative overflow-hidden",e),...n,children:[E.jsx(Iie,{className:"h-full w-full rounded-[inherit]",children:t}),E.jsx(pG,{}),E.jsx(Die,{})]}));fG.displayName=dG.displayName;const pG=w.forwardRef(({className:e,orientation:t="vertical",...n},r)=>E.jsx(UT,{ref:r,orientation:t,className:Me("flex touch-none transition-colors select-none",t==="vertical"&&"h-full w-2.5 border-l border-l-transparent p-[1px]",t==="horizontal"&&"h-2.5 flex-col border-t border-t-transparent p-[1px]",e),...n,children:E.jsx(iG,{className:"bg-border relative flex-1 rounded-full"})}));pG.displayName=UT.displayName;function l0(e,t={}){const{decimals:n=0,sizeType:r="normal"}=t,a=["Bytes","KB","MB","GB","TB"],o=["Bytes","KiB","MiB","GiB","TiB"];if(e===0)return"0 Byte";const s=Math.floor(Math.log(e)/Math.log(1024));return`${(e/Math.pow(1024,s)).toFixed(n)} ${r==="accurate"?o[s]??"Bytes":a[s]??"Bytes"}`}function Lie(e){const{value:t,onValueChange:n,onUpload:r,progresses:a,accept:o=mV,maxSize:s=1024*1024*200,maxFileCount:u=1,multiple:c=!1,disabled:d=!1,description:p,className:g,...m}=e,[b,y]=Ba({prop:t,onChange:n}),v=w.useCallback((x,R)=>{if(!c&&u===1&&x.length>1){Ft.error("Cannot upload more than 1 file at a time");return}if(((b==null?void 0:b.length)??0)+x.length>u){Ft.error(`Cannot upload more than ${u} files`);return}const O=x.map(C=>Object.assign(C,{preview:URL.createObjectURL(C)})),_=b?[...b,...O]:O;if(y(_),R.length>0&&R.forEach(({file:C})=>{Ft.error(`File ${C.name} was rejected`)}),r&&_.length>0&&_.length<=u){const C=_.length>0?`${_.length} files`:"file";Ft.promise(r(_),{loading:`Uploading ${C}...`,success:()=>(y([]),`${C} uploaded`),error:`Failed to upload ${C}`})}},[b,u,c,r,y]);function k(x){if(!b)return;const R=b.filter((O,_)=>_!==x);y(R),n==null||n(R)}w.useEffect(()=>()=>{b&&b.forEach(x=>{gG(x)&&URL.revokeObjectURL(x.preview)})},[]);const A=d||((b==null?void 0:b.length)??0)>=u;return E.jsxs("div",{className:"relative flex flex-col gap-6 overflow-hidden",children:[E.jsx(Cp,{onDrop:v,accept:o,maxSize:s,maxFiles:u,multiple:u>1||c,disabled:A,children:({getRootProps:x,getInputProps:R,isDragActive:O})=>E.jsxs("div",{...x(),className:Me("group border-muted-foreground/25 hover:bg-muted/25 relative grid h-52 w-full cursor-pointer place-items-center rounded-lg border-2 border-dashed px-5 py-2.5 text-center transition","ring-offset-background focus-visible:ring-ring focus-visible:ring-2 focus-visible:ring-offset-2 focus-visible:outline-none",O&&"border-muted-foreground/50",A&&"pointer-events-none opacity-60",g),...m,children:[E.jsx("input",{...R()}),O?E.jsxs("div",{className:"flex flex-col items-center justify-center gap-4 sm:px-5",children:[E.jsx("div",{className:"rounded-full border border-dashed p-3",children:E.jsx(zk,{className:"text-muted-foreground size-7","aria-hidden":"true"})}),E.jsx("p",{className:"text-muted-foreground font-medium",children:"Drop the files here"})]}):E.jsxs("div",{className:"flex flex-col items-center justify-center gap-4 sm:px-5",children:[E.jsx("div",{className:"rounded-full border border-dashed p-3",children:E.jsx(zk,{className:"text-muted-foreground size-7","aria-hidden":"true"})}),E.jsxs("div",{className:"flex flex-col gap-px",children:[E.jsx("p",{className:"text-muted-foreground font-medium",children:"Drag and drop files here, or click to select files"}),p?E.jsx("p",{className:"text-muted-foreground/70 text-sm",children:p}):E.jsxs("p",{className:"text-muted-foreground/70 text-sm",children:["You can upload",u>1?` ${u===1/0?"multiple":u} - files (up to ${l0(s)} each)`:` a file with ${l0(s)}`,"Supported formats: TXT, MD, DOCX, PDF, PPTX, RTF, ODT, EPUB, HTML, HTM, TEX, JSON, XML, YAML, YML, CSV, LOG, CONF, INI, PROPERTIES, SQL, BAT, SH, C, CPP, PY, JAVA, JS, TS, SWIFT, GO, RB, PHP, CSS, SCSS, LESS"]})]})]})]})}),b!=null&&b.length?E.jsx(fG,{className:"h-fit w-full px-3",children:E.jsx("div",{className:"flex max-h-48 flex-col gap-4",children:b==null?void 0:b.map((x,R)=>E.jsx(Mie,{file:x,onRemove:()=>k(R),progress:a==null?void 0:a[x.name]},R))})}):null]})}function Mie({file:e,progress:t,onRemove:n}){return E.jsxs("div",{className:"relative flex items-center gap-2.5",children:[E.jsxs("div",{className:"flex flex-1 gap-2.5",children:[gG(e)?E.jsx(Pie,{file:e}):null,E.jsxs("div",{className:"flex w-full flex-col gap-2",children:[E.jsxs("div",{className:"flex flex-col gap-px",children:[E.jsx("p",{className:"text-foreground/80 line-clamp-1 text-sm font-medium",children:e.name}),E.jsx("p",{className:"text-muted-foreground text-xs",children:l0(e.size)})]}),t?E.jsx(Q5,{value:t}):null]})]}),E.jsx("div",{className:"flex items-center gap-2",children:E.jsxs(pt,{type:"button",variant:"outline",size:"icon",className:"size-7",onClick:n,children:[E.jsx(N3,{className:"size-4","aria-hidden":"true"}),E.jsx("span",{className:"sr-only",children:"Remove file"})]})})]})}function gG(e){return"preview"in e&&typeof e.preview=="string"}function Pie({file:e}){return e.type.startsWith("image/")?E.jsx("div",{className:"aspect-square shrink-0 rounded-md object-cover"}):E.jsx(KZ,{className:"text-muted-foreground size-10","aria-hidden":"true"})}function Fie(){const{t:e}=Dt(),[t,n]=w.useState(!1),[r,a]=w.useState(!1),[o,s]=w.useState({}),u=w.useCallback(async c=>{a(!0);try{await Promise.all(c.map(async d=>{try{const p=await IV(d,g=>{console.debug(e("documentPanel.uploadDocuments.uploading",{name:d.name,percent:g})),s(m=>({...m,[d.name]:g}))});p.status==="success"?Ft.success(e("documentPanel.uploadDocuments.success",{name:d.name})):Ft.error(e("documentPanel.uploadDocuments.failed",{name:d.name,message:p.message}))}catch(p){Ft.error(e("documentPanel.uploadDocuments.error",{name:d.name,error:tr(p)}))}}))}catch(d){Ft.error(e("documentPanel.uploadDocuments.generalError",{error:tr(d)}))}finally{a(!1)}},[a,s]);return E.jsxs(NT,{open:t,onOpenChange:c=>{r&&!c||n(c)},children:[E.jsx(b5,{asChild:!0,children:E.jsxs(pt,{variant:"default",side:"bottom",tooltip:e("documentPanel.uploadDocuments.tooltip"),size:"sm",children:[E.jsx(zk,{})," ",e("documentPanel.uploadDocuments.button")]})}),E.jsxs(Ep,{className:"sm:max-w-xl",onCloseAutoFocus:c=>c.preventDefault(),children:[E.jsxs(wp,{children:[E.jsx(xp,{children:e("documentPanel.uploadDocuments.title")}),E.jsx(kp,{children:e("documentPanel.uploadDocuments.description")})]}),E.jsx(Lie,{maxFileCount:1/0,maxSize:200*1024*1024,description:e("documentPanel.uploadDocuments.fileTypes"),onUpload:u,progresses:o,disabled:r})]})]})}function zie(){const{t:e}=Dt(),[t,n]=w.useState(!1),r=w.useCallback(async()=>{try{const a=await DV();a.status==="success"?(Ft.success(e("documentPanel.clearDocuments.success")),n(!1)):Ft.error(e("documentPanel.clearDocuments.failed",{message:a.message}))}catch(a){Ft.error(e("documentPanel.clearDocuments.error",{error:tr(a)}))}},[n,e]);return E.jsxs(NT,{open:t,onOpenChange:n,children:[E.jsx(b5,{asChild:!0,children:E.jsxs(pt,{variant:"outline",side:"bottom",tooltip:e("documentPanel.clearDocuments.tooltip"),size:"sm",children:[E.jsx(R3,{})," ",e("documentPanel.clearDocuments.button")]})}),E.jsxs(Ep,{className:"sm:max-w-xl",onCloseAutoFocus:a=>a.preventDefault(),children:[E.jsxs(wp,{children:[E.jsx(xp,{children:e("documentPanel.clearDocuments.title")}),E.jsx(kp,{children:e("documentPanel.clearDocuments.confirm")})]}),E.jsx(pt,{variant:"destructive",onClick:r,children:e("documentPanel.clearDocuments.confirmButton")})]})]})}function Bie({open:e,onOpenChange:t}){var g;const{t:n}=Dt(),[r,a]=w.useState(null),[o,s]=w.useState("center"),[u,c]=w.useState(!1),d=w.useRef(null);w.useEffect(()=>{e&&(s("center"),c(!1))},[e]),w.useEffect(()=>{const m=d.current;!m||u||(m.scrollTop=m.scrollHeight)},[r==null?void 0:r.history_messages,u]);const p=()=>{const m=d.current;if(!m)return;const b=Math.abs(m.scrollHeight-m.scrollTop-m.clientHeight)<1;c(!b)};return w.useEffect(()=>{if(!e)return;const m=async()=>{try{const y=await LV();a(y)}catch(y){Ft.error(n("documentPanel.pipelineStatus.errors.fetchFailed",{error:tr(y)}))}};m();const b=setInterval(m,2e3);return()=>clearInterval(b)},[e,n]),E.jsx(NT,{open:e,onOpenChange:t,children:E.jsxs(Ep,{className:Me("sm:max-w-[600px] transition-all duration-200 fixed",o==="left"&&"!left-[25%] !translate-x-[-50%] !mx-4",o==="center"&&"!left-1/2 !-translate-x-1/2",o==="right"&&"!left-[75%] !translate-x-[-50%] !mx-4"),children:[E.jsx(kp,{className:"sr-only",children:r!=null&&r.job_name?`${n("documentPanel.pipelineStatus.jobName")}: ${r.job_name}, ${n("documentPanel.pipelineStatus.progress")}: ${r.cur_batch}/${r.batchs}`:n("documentPanel.pipelineStatus.noActiveJob")}),E.jsxs(wp,{className:"flex flex-row items-center",children:[E.jsx(xp,{className:"flex-1",children:n("documentPanel.pipelineStatus.title")}),E.jsxs("div",{className:"flex items-center gap-2 mr-8",children:[E.jsx(pt,{variant:"ghost",size:"icon",className:Me("h-6 w-6",o==="left"&&"bg-zinc-200 text-zinc-800 hover:bg-zinc-300 dark:bg-zinc-700 dark:text-zinc-200 dark:hover:bg-zinc-600"),onClick:()=>s("left"),children:E.jsx(FZ,{className:"h-4 w-4"})}),E.jsx(pt,{variant:"ghost",size:"icon",className:Me("h-6 w-6",o==="center"&&"bg-zinc-200 text-zinc-800 hover:bg-zinc-300 dark:bg-zinc-700 dark:text-zinc-200 dark:hover:bg-zinc-600"),onClick:()=>s("center"),children:E.jsx(MZ,{className:"h-4 w-4"})}),E.jsx(pt,{variant:"ghost",size:"icon",className:Me("h-6 w-6",o==="right"&&"bg-zinc-200 text-zinc-800 hover:bg-zinc-300 dark:bg-zinc-700 dark:text-zinc-200 dark:hover:bg-zinc-600"),onClick:()=>s("right"),children:E.jsx(BZ,{className:"h-4 w-4"})})]})]}),E.jsxs("div",{className:"space-y-4 pt-4",children:[E.jsxs("div",{className:"flex items-center gap-4",children:[E.jsxs("div",{className:"flex items-center gap-2",children:[E.jsxs("div",{className:"text-sm font-medium",children:[n("documentPanel.pipelineStatus.busy"),":"]}),E.jsx("div",{className:`h-2 w-2 rounded-full ${r!=null&&r.busy?"bg-green-500":"bg-gray-300"}`})]}),E.jsxs("div",{className:"flex items-center gap-2",children:[E.jsxs("div",{className:"text-sm font-medium",children:[n("documentPanel.pipelineStatus.requestPending"),":"]}),E.jsx("div",{className:`h-2 w-2 rounded-full ${r!=null&&r.request_pending?"bg-green-500":"bg-gray-300"}`})]})]}),E.jsxs("div",{className:"rounded-md border p-3 space-y-2",children:[E.jsxs("div",{children:[n("documentPanel.pipelineStatus.jobName"),": ",(r==null?void 0:r.job_name)||"-"]}),E.jsxs("div",{className:"flex justify-between",children:[E.jsxs("span",{children:[n("documentPanel.pipelineStatus.startTime"),": ",r!=null&&r.job_start?new Date(r.job_start).toLocaleString():"-"]}),E.jsxs("span",{children:[n("documentPanel.pipelineStatus.progress"),": ",r?`${r.cur_batch}/${r.batchs}`:"-"]})]})]}),E.jsxs("div",{className:"space-y-2",children:[E.jsxs("div",{className:"text-sm font-medium",children:[n("documentPanel.pipelineStatus.latestMessage"),":"]}),E.jsx("div",{className:"font-mono text-sm rounded-md bg-zinc-800 text-zinc-100 p-3",children:(r==null?void 0:r.latest_message)||"-"})]}),E.jsxs("div",{className:"space-y-2",children:[E.jsxs("div",{className:"text-sm font-medium",children:[n("documentPanel.pipelineStatus.historyMessages"),":"]}),E.jsx("div",{ref:d,onScroll:p,className:"font-mono text-sm rounded-md bg-zinc-800 text-zinc-100 p-3 overflow-y-auto min-h-[7.5em] max-h-[40vh]",children:((g=r==null?void 0:r.history_messages)==null?void 0:g.map((m,b)=>E.jsx("div",{children:m},b)))||"-"})]})]})]})})}const Uie=(e,t=20)=>{if(!e.file_path||typeof e.file_path!="string"||e.file_path.trim()==="")return e.id;const n=e.file_path.split("/"),r=n[n.length-1];return!r||r.trim()===""?e.id:r.length>t?r.slice(0,t)+"...":r},jie=` + files (up to ${l0(s)} each)`:` a file with ${l0(s)}`,"Supported formats: TXT, MD, DOCX, PDF, PPTX, RTF, ODT, EPUB, HTML, HTM, TEX, JSON, XML, YAML, YML, CSV, LOG, CONF, INI, PROPERTIES, SQL, BAT, SH, C, CPP, PY, JAVA, JS, TS, SWIFT, GO, RB, PHP, CSS, SCSS, LESS"]})]})]})]})}),b!=null&&b.length?E.jsx(fG,{className:"h-fit w-full px-3",children:E.jsx("div",{className:"flex max-h-48 flex-col gap-4",children:b==null?void 0:b.map((x,R)=>E.jsx(Mie,{file:x,onRemove:()=>k(R),progress:a==null?void 0:a[x.name]},R))})}):null]})}function Mie({file:e,progress:t,onRemove:n}){return E.jsxs("div",{className:"relative flex items-center gap-2.5",children:[E.jsxs("div",{className:"flex flex-1 gap-2.5",children:[gG(e)?E.jsx(Pie,{file:e}):null,E.jsxs("div",{className:"flex w-full flex-col gap-2",children:[E.jsxs("div",{className:"flex flex-col gap-px",children:[E.jsx("p",{className:"text-foreground/80 line-clamp-1 text-sm font-medium",children:e.name}),E.jsx("p",{className:"text-muted-foreground text-xs",children:l0(e.size)})]}),t?E.jsx(Q5,{value:t}):null]})]}),E.jsx("div",{className:"flex items-center gap-2",children:E.jsxs(pt,{type:"button",variant:"outline",size:"icon",className:"size-7",onClick:n,children:[E.jsx(N3,{className:"size-4","aria-hidden":"true"}),E.jsx("span",{className:"sr-only",children:"Remove file"})]})})]})}function gG(e){return"preview"in e&&typeof e.preview=="string"}function Pie({file:e}){return e.type.startsWith("image/")?E.jsx("div",{className:"aspect-square shrink-0 rounded-md object-cover"}):E.jsx(KZ,{className:"text-muted-foreground size-10","aria-hidden":"true"})}function Fie(){const{t:e}=Dt(),[t,n]=w.useState(!1),[r,a]=w.useState(!1),[o,s]=w.useState({}),u=w.useCallback(async c=>{a(!0);try{await Promise.all(c.map(async d=>{try{const p=await IV(d,g=>{console.debug(e("documentPanel.uploadDocuments.uploading",{name:d.name,percent:g})),s(m=>({...m,[d.name]:g}))});p.status==="success"?Ft.success(e("documentPanel.uploadDocuments.success",{name:d.name})):Ft.error(e("documentPanel.uploadDocuments.failed",{name:d.name,message:p.message}))}catch(p){Ft.error(e("documentPanel.uploadDocuments.error",{name:d.name,error:tr(p)}))}}))}catch(d){Ft.error(e("documentPanel.uploadDocuments.generalError",{error:tr(d)}))}finally{a(!1)}},[a,s]);return E.jsxs(NT,{open:t,onOpenChange:c=>{r&&!c||n(c)},children:[E.jsx(b5,{asChild:!0,children:E.jsxs(pt,{variant:"default",side:"bottom",tooltip:e("documentPanel.uploadDocuments.tooltip"),size:"sm",children:[E.jsx(zk,{})," ",e("documentPanel.uploadDocuments.button")]})}),E.jsxs(Ep,{className:"sm:max-w-xl",onCloseAutoFocus:c=>c.preventDefault(),children:[E.jsxs(wp,{children:[E.jsx(xp,{children:e("documentPanel.uploadDocuments.title")}),E.jsx(kp,{children:e("documentPanel.uploadDocuments.description")})]}),E.jsx(Lie,{maxFileCount:1/0,maxSize:200*1024*1024,description:e("documentPanel.uploadDocuments.fileTypes"),onUpload:u,progresses:o,disabled:r})]})]})}function zie(){const{t:e}=Dt(),[t,n]=w.useState(!1),r=w.useCallback(async()=>{try{const a=await DV();a.status==="success"?(Ft.success(e("documentPanel.clearDocuments.success")),n(!1)):Ft.error(e("documentPanel.clearDocuments.failed",{message:a.message}))}catch(a){Ft.error(e("documentPanel.clearDocuments.error",{error:tr(a)}))}},[n,e]);return E.jsxs(NT,{open:t,onOpenChange:n,children:[E.jsx(b5,{asChild:!0,children:E.jsxs(pt,{variant:"outline",side:"bottom",tooltip:e("documentPanel.clearDocuments.tooltip"),size:"sm",children:[E.jsx(R3,{})," ",e("documentPanel.clearDocuments.button")]})}),E.jsxs(Ep,{className:"sm:max-w-xl",onCloseAutoFocus:a=>a.preventDefault(),children:[E.jsxs(wp,{children:[E.jsx(xp,{children:e("documentPanel.clearDocuments.title")}),E.jsx(kp,{children:e("documentPanel.clearDocuments.confirm")})]}),E.jsx(pt,{variant:"destructive",onClick:r,children:e("documentPanel.clearDocuments.confirmButton")})]})]})}function Bie({open:e,onOpenChange:t}){var g;const{t:n}=Dt(),[r,a]=w.useState(null),[o,s]=w.useState("center"),[u,c]=w.useState(!1),d=w.useRef(null);w.useEffect(()=>{e&&(s("center"),c(!1))},[e]),w.useEffect(()=>{const m=d.current;!m||u||(m.scrollTop=m.scrollHeight)},[r==null?void 0:r.history_messages,u]);const p=()=>{const m=d.current;if(!m)return;const b=Math.abs(m.scrollHeight-m.scrollTop-m.clientHeight)<1;c(!b)};return w.useEffect(()=>{if(!e)return;const m=async()=>{try{const y=await LV();a(y)}catch(y){Ft.error(n("documentPanel.pipelineStatus.errors.fetchFailed",{error:tr(y)}))}};m();const b=setInterval(m,2e3);return()=>clearInterval(b)},[e,n]),E.jsx(NT,{open:e,onOpenChange:t,children:E.jsxs(Ep,{className:Me("sm:max-w-[600px] transition-all duration-200 fixed",o==="left"&&"!left-[25%] !translate-x-[-50%] !mx-4",o==="center"&&"!left-1/2 !-translate-x-1/2",o==="right"&&"!left-[75%] !translate-x-[-50%] !mx-4"),children:[E.jsx(kp,{className:"sr-only",children:r!=null&&r.job_name?`${n("documentPanel.pipelineStatus.jobName")}: ${r.job_name}, ${n("documentPanel.pipelineStatus.progress")}: ${r.cur_batch}/${r.batchs}`:n("documentPanel.pipelineStatus.noActiveJob")}),E.jsxs(wp,{className:"flex flex-row items-center",children:[E.jsx(xp,{className:"flex-1",children:n("documentPanel.pipelineStatus.title")}),E.jsxs("div",{className:"flex items-center gap-2 mr-8",children:[E.jsx(pt,{variant:"ghost",size:"icon",className:Me("h-6 w-6",o==="left"&&"bg-zinc-200 text-zinc-800 hover:bg-zinc-300 dark:bg-zinc-700 dark:text-zinc-200 dark:hover:bg-zinc-600"),onClick:()=>s("left"),children:E.jsx(FZ,{className:"h-4 w-4"})}),E.jsx(pt,{variant:"ghost",size:"icon",className:Me("h-6 w-6",o==="center"&&"bg-zinc-200 text-zinc-800 hover:bg-zinc-300 dark:bg-zinc-700 dark:text-zinc-200 dark:hover:bg-zinc-600"),onClick:()=>s("center"),children:E.jsx(MZ,{className:"h-4 w-4"})}),E.jsx(pt,{variant:"ghost",size:"icon",className:Me("h-6 w-6",o==="right"&&"bg-zinc-200 text-zinc-800 hover:bg-zinc-300 dark:bg-zinc-700 dark:text-zinc-200 dark:hover:bg-zinc-600"),onClick:()=>s("right"),children:E.jsx(BZ,{className:"h-4 w-4"})})]})]}),E.jsxs("div",{className:"space-y-4 pt-4",children:[E.jsxs("div",{className:"flex items-center gap-4",children:[E.jsxs("div",{className:"flex items-center gap-2",children:[E.jsxs("div",{className:"text-sm font-medium",children:[n("documentPanel.pipelineStatus.busy"),":"]}),E.jsx("div",{className:`h-2 w-2 rounded-full ${r!=null&&r.busy?"bg-green-500":"bg-gray-300"}`})]}),E.jsxs("div",{className:"flex items-center gap-2",children:[E.jsxs("div",{className:"text-sm font-medium",children:[n("documentPanel.pipelineStatus.requestPending"),":"]}),E.jsx("div",{className:`h-2 w-2 rounded-full ${r!=null&&r.request_pending?"bg-green-500":"bg-gray-300"}`})]})]}),E.jsxs("div",{className:"rounded-md border p-3 space-y-2",children:[E.jsxs("div",{children:[n("documentPanel.pipelineStatus.jobName"),": ",(r==null?void 0:r.job_name)||"-"]}),E.jsxs("div",{className:"flex justify-between",children:[E.jsxs("span",{children:[n("documentPanel.pipelineStatus.startTime"),": ",r!=null&&r.job_start?new Date(r.job_start).toLocaleString():"-"]}),E.jsxs("span",{children:[n("documentPanel.pipelineStatus.progress"),": ",r?`${r.cur_batch}/${r.batchs}`:"-"]})]})]}),E.jsxs("div",{className:"space-y-2",children:[E.jsxs("div",{className:"text-sm font-medium",children:[n("documentPanel.pipelineStatus.latestMessage"),":"]}),E.jsx("div",{className:"font-mono text-sm rounded-md bg-zinc-800 text-zinc-100 p-3",children:(r==null?void 0:r.latest_message)||"-"})]}),E.jsxs("div",{className:"space-y-2",children:[E.jsxs("div",{className:"text-sm font-medium",children:[n("documentPanel.pipelineStatus.historyMessages"),":"]}),E.jsx("div",{ref:d,onScroll:p,className:"font-mono text-sm rounded-md bg-zinc-800 text-zinc-100 p-3 overflow-y-auto min-h-[7.5em] max-h-[40vh]",children:(g=r==null?void 0:r.history_messages)!=null&&g.length?r.history_messages.map((m,b)=>E.jsx("div",{children:m},b)):"-"})]})]})]})})}const Uie=(e,t=20)=>{if(!e.file_path||typeof e.file_path!="string"||e.file_path.trim()==="")return e.id;const n=e.file_path.split("/"),r=n[n.length-1];return!r||r.trim()===""?e.id:r.length>t?r.slice(0,t)+"...":r},jie=` @keyframes pulse { 0% { background-color: rgb(255 0 0 / 0.1); diff --git a/lightrag/api/webui/index.html b/lightrag/api/webui/index.html index 96568f4d..dd711bb3 100644 --- a/lightrag/api/webui/index.html +++ b/lightrag/api/webui/index.html @@ -8,7 +8,7 @@ Lightrag - + From ebb8b7799cc1e6f00d3beb3d54fccb2f5cda397a Mon Sep 17 00:00:00 2001 From: yangdx Date: Wed, 26 Mar 2025 17:41:57 +0800 Subject: [PATCH 17/23] Bump API version to 1.2.7 --- lightrag/api/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lightrag/api/__init__.py b/lightrag/api/__init__.py index eccf8422..5dd9d398 100644 --- a/lightrag/api/__init__.py +++ b/lightrag/api/__init__.py @@ -1 +1 @@ -__api_version__ = "1.2.6" +__api_version__ = "1.2.7" From 922fc914be6f48e1b7bceda2694ed294bcb5cf10 Mon Sep 17 00:00:00 2001 From: yangdx Date: Wed, 26 Mar 2025 17:48:00 +0800 Subject: [PATCH 18/23] Change empty pipeline job name --- lightrag/kg/shared_storage.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lightrag/kg/shared_storage.py b/lightrag/kg/shared_storage.py index 4bdbce99..1ba73812 100644 --- a/lightrag/kg/shared_storage.py +++ b/lightrag/kg/shared_storage.py @@ -377,7 +377,7 @@ async def initialize_pipeline_status(): { "autoscanned": False, # Auto-scan started "busy": False, # Control concurrent processes - "job_name": "Default Job", # Current job name (indexing files/indexing texts) + "job_name": "-", # Current job name (indexing files/indexing texts) "job_start": None, # Job start time "docs": 0, # Total number of documents to be indexed "batchs": 0, # Number of batches for processing documents From 10245462f193a10b07f2076b946c3bfd8fbdf0db Mon Sep 17 00:00:00 2001 From: yangdx Date: Wed, 26 Mar 2025 18:09:42 +0800 Subject: [PATCH 19/23] Remove unused get_api_key_dependency function --- lightrag/api/utils_api.py | 55 --------------------------------------- 1 file changed, 55 deletions(-) diff --git a/lightrag/api/utils_api.py b/lightrag/api/utils_api.py index 7e74aeed..5c2ca26d 100644 --- a/lightrag/api/utils_api.py +++ b/lightrag/api/utils_api.py @@ -164,61 +164,6 @@ def get_combined_auth_dependency(api_key: Optional[str] = None): return combined_dependency -def get_api_key_dependency(api_key: Optional[str]): - """ - Create an API key dependency for route protection. - - Args: - api_key (Optional[str]): The API key to validate against. - If None, no authentication is required. - - Returns: - Callable: A dependency function that validates the API key. - """ - # Use global whitelist_patterns and auth_configured variables - # whitelist_patterns and auth_configured are already initialized at module level - - # Only calculate api_key_configured as it depends on the function parameter - api_key_configured = bool(api_key) - - if not api_key_configured: - # If no API key is configured, return a dummy dependency that always succeeds - async def no_auth(request: Request = None, **kwargs): - return None - - return no_auth - - # If API key is configured, use proper authentication with Security for Swagger UI - api_key_header = APIKeyHeader(name="X-API-Key", auto_error=False) - - async def api_key_auth( - request: Request, - api_key_header_value: Optional[str] = Security( - api_key_header, description="API Key for authentication" - ), - ): - # Check if request path is in whitelist - path = request.url.path - for pattern, is_prefix in whitelist_patterns: - if (is_prefix and path.startswith(pattern)) or ( - not is_prefix and path == pattern - ): - return # Whitelist path, allow access - - # Non-whitelist path, validate API key - if not api_key_header_value: - raise HTTPException( - status_code=HTTP_403_FORBIDDEN, detail="API Key required" - ) - if api_key_header_value != api_key: - raise HTTPException( - status_code=HTTP_403_FORBIDDEN, detail="Invalid API Key" - ) - return api_key_header_value - - return api_key_auth - - class DefaultRAGStorageConfig: KV_STORAGE = "JsonKVStorage" VECTOR_STORAGE = "NanoVectorDBStorage" From 208ee8b57703f7e4bd9212d94aefea46160c38a6 Mon Sep 17 00:00:00 2001 From: yangdx Date: Wed, 26 Mar 2025 18:22:18 +0800 Subject: [PATCH 20/23] Revert AlerDialog implementation --- lightrag_webui/src/components/ApiKeyAlert.tsx | 4 +--- lightrag_webui/src/components/ui/AlertDialog.tsx | 3 ++- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/lightrag_webui/src/components/ApiKeyAlert.tsx b/lightrag_webui/src/components/ApiKeyAlert.tsx index 07b3230e..bbbce1bb 100644 --- a/lightrag_webui/src/components/ApiKeyAlert.tsx +++ b/lightrag_webui/src/components/ApiKeyAlert.tsx @@ -5,8 +5,7 @@ import { AlertDialogContent, AlertDialogDescription, AlertDialogHeader, - AlertDialogTitle, - AlertDialogOverlay + AlertDialogTitle } from '@/components/ui/AlertDialog' import Button from '@/components/ui/Button' import Input from '@/components/ui/Input' @@ -51,7 +50,6 @@ const ApiKeyAlert = ({ open: opened, onOpenChange: setOpened }: ApiKeyAlertProps return ( - {t('apiKeyAlert.title')} diff --git a/lightrag_webui/src/components/ui/AlertDialog.tsx b/lightrag_webui/src/components/ui/AlertDialog.tsx index 072bdff7..e510fce4 100644 --- a/lightrag_webui/src/components/ui/AlertDialog.tsx +++ b/lightrag_webui/src/components/ui/AlertDialog.tsx @@ -16,7 +16,7 @@ const AlertDialogOverlay = React.forwardRef< >(({ className, ...props }, ref) => ( >(({ className, ...props }, ref) => ( + Date: Wed, 26 Mar 2025 18:33:12 +0800 Subject: [PATCH 21/23] Update webui assets --- .../api/webui/assets/{index-IDR-_K-N.js => index-CXCx2b5K.js} | 2 +- .../webui/assets/{index-BfapieVI.css => index-CbzkrOyx.css} | 2 +- lightrag/api/webui/index.html | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) rename lightrag/api/webui/assets/{index-IDR-_K-N.js => index-CXCx2b5K.js} (98%) rename lightrag/api/webui/assets/{index-BfapieVI.css => index-CbzkrOyx.css} (99%) diff --git a/lightrag/api/webui/assets/index-IDR-_K-N.js b/lightrag/api/webui/assets/index-CXCx2b5K.js similarity index 98% rename from lightrag/api/webui/assets/index-IDR-_K-N.js rename to lightrag/api/webui/assets/index-CXCx2b5K.js index 8ce93f0a..f121e1f6 100644 --- a/lightrag/api/webui/assets/index-IDR-_K-N.js +++ b/lightrag/api/webui/assets/index-CXCx2b5K.js @@ -116,7 +116,7 @@ You can add a description to the \`${As}\` by passing a \`${FU}\` component as a Alternatively, you can use your own component as a description by assigning it an \`id\` and passing the same value to the \`aria-describedby\` prop in \`${As}\`. If the description is confusing or duplicative for sighted users, you can use the \`@radix-ui/react-visually-hidden\` primitive as a wrapper around your description component. -For more information, see https://radix-ui.com/primitives/docs/components/alert-dialog`;return w.useEffect(()=>{var r;document.getElementById((r=e.current)==null?void 0:r.getAttribute("aria-describedby"))||console.warn(t)},[t,e]),null},uK=OU,cK=IU,GU=DU,HU=LU,$U=BU,qU=jU,VU=PU,WU=zU;const X_=e=>typeof e=="boolean"?`${e}`:e===0?"0":e,Z_=oB,dK=(e,t)=>n=>{var r;if((t==null?void 0:t.variants)==null)return Z_(e,n==null?void 0:n.class,n==null?void 0:n.className);const{variants:a,defaultVariants:o}=t,s=Object.keys(a).map(d=>{const p=n==null?void 0:n[d],g=o==null?void 0:o[d];if(p===null)return null;const m=X_(p)||X_(g);return a[d][m]}),u=n&&Object.entries(n).reduce((d,p)=>{let[g,m]=p;return m===void 0||(d[g]=m),d},{}),c=t==null||(r=t.compoundVariants)===null||r===void 0?void 0:r.reduce((d,p)=>{let{class:g,className:m,...b}=p;return Object.entries(b).every(y=>{let[v,k]=y;return Array.isArray(k)?k.includes({...o,...u}[v]):{...o,...u}[v]===k})?[...d,g,m]:d},[]);return Z_(e,s,c,n==null?void 0:n.class,n==null?void 0:n.className)},fK=["top","right","bottom","left"],No=Math.min,er=Math.max,mf=Math.round,xd=Math.floor,aa=e=>({x:e,y:e}),pK={left:"right",right:"left",bottom:"top",top:"bottom"},gK={start:"end",end:"start"};function Rk(e,t,n){return er(e,No(t,n))}function Ua(e,t){return typeof e=="function"?e(t):e}function ja(e){return e.split("-")[0]}function qs(e){return e.split("-")[1]}function K0(e){return e==="x"?"y":"x"}function X0(e){return e==="y"?"height":"width"}function Oo(e){return["top","bottom"].includes(ja(e))?"y":"x"}function Z0(e){return K0(Oo(e))}function hK(e,t,n){n===void 0&&(n=!1);const r=qs(e),a=Z0(e),o=X0(a);let s=a==="x"?r===(n?"end":"start")?"right":"left":r==="start"?"bottom":"top";return t.reference[o]>t.floating[o]&&(s=bf(s)),[s,bf(s)]}function mK(e){const t=bf(e);return[Ck(e),t,Ck(t)]}function Ck(e){return e.replace(/start|end/g,t=>gK[t])}function bK(e,t,n){const r=["left","right"],a=["right","left"],o=["top","bottom"],s=["bottom","top"];switch(e){case"top":case"bottom":return n?t?a:r:t?r:a;case"left":case"right":return t?o:s;default:return[]}}function yK(e,t,n,r){const a=qs(e);let o=bK(ja(e),n==="start",r);return a&&(o=o.map(s=>s+"-"+a),t&&(o=o.concat(o.map(Ck)))),o}function bf(e){return e.replace(/left|right|bottom|top/g,t=>pK[t])}function vK(e){return{top:0,right:0,bottom:0,left:0,...e}}function YU(e){return typeof e!="number"?vK(e):{top:e,right:e,bottom:e,left:e}}function yf(e){const{x:t,y:n,width:r,height:a}=e;return{width:r,height:a,top:n,left:t,right:t+r,bottom:n+a,x:t,y:n}}function Q_(e,t,n){let{reference:r,floating:a}=e;const o=Oo(t),s=Z0(t),u=X0(s),c=ja(t),d=o==="y",p=r.x+r.width/2-a.width/2,g=r.y+r.height/2-a.height/2,m=r[u]/2-a[u]/2;let b;switch(c){case"top":b={x:p,y:r.y-a.height};break;case"bottom":b={x:p,y:r.y+r.height};break;case"right":b={x:r.x+r.width,y:g};break;case"left":b={x:r.x-a.width,y:g};break;default:b={x:r.x,y:r.y}}switch(qs(t)){case"start":b[s]-=m*(n&&d?-1:1);break;case"end":b[s]+=m*(n&&d?-1:1);break}return b}const SK=async(e,t,n)=>{const{placement:r="bottom",strategy:a="absolute",middleware:o=[],platform:s}=n,u=o.filter(Boolean),c=await(s.isRTL==null?void 0:s.isRTL(t));let d=await s.getElementRects({reference:e,floating:t,strategy:a}),{x:p,y:g}=Q_(d,r,c),m=r,b={},y=0;for(let v=0;v({name:"arrow",options:e,async fn(t){const{x:n,y:r,placement:a,rects:o,platform:s,elements:u,middlewareData:c}=t,{element:d,padding:p=0}=Ua(e,t)||{};if(d==null)return{};const g=YU(p),m={x:n,y:r},b=Z0(a),y=X0(b),v=await s.getDimensions(d),k=b==="y",A=k?"top":"left",x=k?"bottom":"right",R=k?"clientHeight":"clientWidth",O=o.reference[y]+o.reference[b]-m[b]-o.floating[y],_=m[b]-o.reference[b],C=await(s.getOffsetParent==null?void 0:s.getOffsetParent(d));let N=C?C[R]:0;(!N||!await(s.isElement==null?void 0:s.isElement(C)))&&(N=u.floating[R]||o.floating[y]);const M=O/2-_/2,I=N/2-v[y]/2-1,D=No(g[A],I),H=No(g[x],I),$=D,U=N-v[y]-H,W=N/2-v[y]/2+M,Q=Rk($,W,U),G=!c.arrow&&qs(a)!=null&&W!==Q&&o.reference[y]/2-(W<$?D:H)-v[y]/2<0,j=G?W<$?W-$:W-U:0;return{[b]:m[b]+j,data:{[b]:Q,centerOffset:W-Q-j,...G&&{alignmentOffset:j}},reset:G}}}),wK=function(e){return e===void 0&&(e={}),{name:"flip",options:e,async fn(t){var n,r;const{placement:a,middlewareData:o,rects:s,initialPlacement:u,platform:c,elements:d}=t,{mainAxis:p=!0,crossAxis:g=!0,fallbackPlacements:m,fallbackStrategy:b="bestFit",fallbackAxisSideDirection:y="none",flipAlignment:v=!0,...k}=Ua(e,t);if((n=o.arrow)!=null&&n.alignmentOffset)return{};const A=ja(a),x=Oo(u),R=ja(u)===u,O=await(c.isRTL==null?void 0:c.isRTL(d.floating)),_=m||(R||!v?[bf(u)]:mK(u)),C=y!=="none";!m&&C&&_.push(...yK(u,v,y,O));const N=[u,..._],M=await xu(t,k),I=[];let D=((r=o.flip)==null?void 0:r.overflows)||[];if(p&&I.push(M[A]),g){const W=hK(a,s,O);I.push(M[W[0]],M[W[1]])}if(D=[...D,{placement:a,overflows:I}],!I.every(W=>W<=0)){var H,$;const W=(((H=o.flip)==null?void 0:H.index)||0)+1,Q=N[W];if(Q)return{data:{index:W,overflows:D},reset:{placement:Q}};let G=($=D.filter(j=>j.overflows[0]<=0).sort((j,z)=>j.overflows[1]-z.overflows[1])[0])==null?void 0:$.placement;if(!G)switch(b){case"bestFit":{var U;const j=(U=D.filter(z=>{if(C){const Y=Oo(z.placement);return Y===x||Y==="y"}return!0}).map(z=>[z.placement,z.overflows.filter(Y=>Y>0).reduce((Y,L)=>Y+L,0)]).sort((z,Y)=>z[1]-Y[1])[0])==null?void 0:U[0];j&&(G=j);break}case"initialPlacement":G=u;break}if(a!==G)return{reset:{placement:G}}}return{}}}};function J_(e,t){return{top:e.top-t.height,right:e.right-t.width,bottom:e.bottom-t.height,left:e.left-t.width}}function eN(e){return fK.some(t=>e[t]>=0)}const xK=function(e){return e===void 0&&(e={}),{name:"hide",options:e,async fn(t){const{rects:n}=t,{strategy:r="referenceHidden",...a}=Ua(e,t);switch(r){case"referenceHidden":{const o=await xu(t,{...a,elementContext:"reference"}),s=J_(o,n.reference);return{data:{referenceHiddenOffsets:s,referenceHidden:eN(s)}}}case"escaped":{const o=await xu(t,{...a,altBoundary:!0}),s=J_(o,n.floating);return{data:{escapedOffsets:s,escaped:eN(s)}}}default:return{}}}}};async function kK(e,t){const{placement:n,platform:r,elements:a}=e,o=await(r.isRTL==null?void 0:r.isRTL(a.floating)),s=ja(n),u=qs(n),c=Oo(n)==="y",d=["left","top"].includes(s)?-1:1,p=o&&c?-1:1,g=Ua(t,e);let{mainAxis:m,crossAxis:b,alignmentAxis:y}=typeof g=="number"?{mainAxis:g,crossAxis:0,alignmentAxis:null}:{mainAxis:g.mainAxis||0,crossAxis:g.crossAxis||0,alignmentAxis:g.alignmentAxis};return u&&typeof y=="number"&&(b=u==="end"?y*-1:y),c?{x:b*p,y:m*d}:{x:m*d,y:b*p}}const TK=function(e){return e===void 0&&(e=0),{name:"offset",options:e,async fn(t){var n,r;const{x:a,y:o,placement:s,middlewareData:u}=t,c=await kK(t,e);return s===((n=u.offset)==null?void 0:n.placement)&&(r=u.arrow)!=null&&r.alignmentOffset?{}:{x:a+c.x,y:o+c.y,data:{...c,placement:s}}}}},AK=function(e){return e===void 0&&(e={}),{name:"shift",options:e,async fn(t){const{x:n,y:r,placement:a}=t,{mainAxis:o=!0,crossAxis:s=!1,limiter:u={fn:k=>{let{x:A,y:x}=k;return{x:A,y:x}}},...c}=Ua(e,t),d={x:n,y:r},p=await xu(t,c),g=Oo(ja(a)),m=K0(g);let b=d[m],y=d[g];if(o){const k=m==="y"?"top":"left",A=m==="y"?"bottom":"right",x=b+p[k],R=b-p[A];b=Rk(x,b,R)}if(s){const k=g==="y"?"top":"left",A=g==="y"?"bottom":"right",x=y+p[k],R=y-p[A];y=Rk(x,y,R)}const v=u.fn({...t,[m]:b,[g]:y});return{...v,data:{x:v.x-n,y:v.y-r,enabled:{[m]:o,[g]:s}}}}}},RK=function(e){return e===void 0&&(e={}),{options:e,fn(t){const{x:n,y:r,placement:a,rects:o,middlewareData:s}=t,{offset:u=0,mainAxis:c=!0,crossAxis:d=!0}=Ua(e,t),p={x:n,y:r},g=Oo(a),m=K0(g);let b=p[m],y=p[g];const v=Ua(u,t),k=typeof v=="number"?{mainAxis:v,crossAxis:0}:{mainAxis:0,crossAxis:0,...v};if(c){const R=m==="y"?"height":"width",O=o.reference[m]-o.floating[R]+k.mainAxis,_=o.reference[m]+o.reference[R]-k.mainAxis;b_&&(b=_)}if(d){var A,x;const R=m==="y"?"width":"height",O=["top","left"].includes(ja(a)),_=o.reference[g]-o.floating[R]+(O&&((A=s.offset)==null?void 0:A[g])||0)+(O?0:k.crossAxis),C=o.reference[g]+o.reference[R]+(O?0:((x=s.offset)==null?void 0:x[g])||0)-(O?k.crossAxis:0);y<_?y=_:y>C&&(y=C)}return{[m]:b,[g]:y}}}},CK=function(e){return e===void 0&&(e={}),{name:"size",options:e,async fn(t){var n,r;const{placement:a,rects:o,platform:s,elements:u}=t,{apply:c=()=>{},...d}=Ua(e,t),p=await xu(t,d),g=ja(a),m=qs(a),b=Oo(a)==="y",{width:y,height:v}=o.floating;let k,A;g==="top"||g==="bottom"?(k=g,A=m===(await(s.isRTL==null?void 0:s.isRTL(u.floating))?"start":"end")?"left":"right"):(A=g,k=m==="end"?"top":"bottom");const x=v-p.top-p.bottom,R=y-p.left-p.right,O=No(v-p[k],x),_=No(y-p[A],R),C=!t.middlewareData.shift;let N=O,M=_;if((n=t.middlewareData.shift)!=null&&n.enabled.x&&(M=R),(r=t.middlewareData.shift)!=null&&r.enabled.y&&(N=x),C&&!m){const D=er(p.left,0),H=er(p.right,0),$=er(p.top,0),U=er(p.bottom,0);b?M=y-2*(D!==0||H!==0?D+H:er(p.left,p.right)):N=v-2*($!==0||U!==0?$+U:er(p.top,p.bottom))}await c({...t,availableWidth:M,availableHeight:N});const I=await s.getDimensions(u.floating);return y!==I.width||v!==I.height?{reset:{rects:!0}}:{}}}};function op(){return typeof window<"u"}function Vs(e){return KU(e)?(e.nodeName||"").toLowerCase():"#document"}function rr(e){var t;return(e==null||(t=e.ownerDocument)==null?void 0:t.defaultView)||window}function sa(e){var t;return(t=(KU(e)?e.ownerDocument:e.document)||window.document)==null?void 0:t.documentElement}function KU(e){return op()?e instanceof Node||e instanceof rr(e).Node:!1}function Ur(e){return op()?e instanceof Element||e instanceof rr(e).Element:!1}function oa(e){return op()?e instanceof HTMLElement||e instanceof rr(e).HTMLElement:!1}function tN(e){return!op()||typeof ShadowRoot>"u"?!1:e instanceof ShadowRoot||e instanceof rr(e).ShadowRoot}function Vu(e){const{overflow:t,overflowX:n,overflowY:r,display:a}=jr(e);return/auto|scroll|overlay|hidden|clip/.test(t+r+n)&&!["inline","contents"].includes(a)}function _K(e){return["table","td","th"].includes(Vs(e))}function ip(e){return[":popover-open",":modal"].some(t=>{try{return e.matches(t)}catch{return!1}})}function Q0(e){const t=J0(),n=Ur(e)?jr(e):e;return["transform","translate","scale","rotate","perspective"].some(r=>n[r]?n[r]!=="none":!1)||(n.containerType?n.containerType!=="normal":!1)||!t&&(n.backdropFilter?n.backdropFilter!=="none":!1)||!t&&(n.filter?n.filter!=="none":!1)||["transform","translate","scale","rotate","perspective","filter"].some(r=>(n.willChange||"").includes(r))||["paint","layout","strict","content"].some(r=>(n.contain||"").includes(r))}function NK(e){let t=Io(e);for(;oa(t)&&!Os(t);){if(Q0(t))return t;if(ip(t))return null;t=Io(t)}return null}function J0(){return typeof CSS>"u"||!CSS.supports?!1:CSS.supports("-webkit-backdrop-filter","none")}function Os(e){return["html","body","#document"].includes(Vs(e))}function jr(e){return rr(e).getComputedStyle(e)}function sp(e){return Ur(e)?{scrollLeft:e.scrollLeft,scrollTop:e.scrollTop}:{scrollLeft:e.scrollX,scrollTop:e.scrollY}}function Io(e){if(Vs(e)==="html")return e;const t=e.assignedSlot||e.parentNode||tN(e)&&e.host||sa(e);return tN(t)?t.host:t}function XU(e){const t=Io(e);return Os(t)?e.ownerDocument?e.ownerDocument.body:e.body:oa(t)&&Vu(t)?t:XU(t)}function ku(e,t,n){var r;t===void 0&&(t=[]),n===void 0&&(n=!0);const a=XU(e),o=a===((r=e.ownerDocument)==null?void 0:r.body),s=rr(a);if(o){const u=_k(s);return t.concat(s,s.visualViewport||[],Vu(a)?a:[],u&&n?ku(u):[])}return t.concat(a,ku(a,[],n))}function _k(e){return e.parent&&Object.getPrototypeOf(e.parent)?e.frameElement:null}function ZU(e){const t=jr(e);let n=parseFloat(t.width)||0,r=parseFloat(t.height)||0;const a=oa(e),o=a?e.offsetWidth:n,s=a?e.offsetHeight:r,u=mf(n)!==o||mf(r)!==s;return u&&(n=o,r=s),{width:n,height:r,$:u}}function eT(e){return Ur(e)?e:e.contextElement}function Rs(e){const t=eT(e);if(!oa(t))return aa(1);const n=t.getBoundingClientRect(),{width:r,height:a,$:o}=ZU(t);let s=(o?mf(n.width):n.width)/r,u=(o?mf(n.height):n.height)/a;return(!s||!Number.isFinite(s))&&(s=1),(!u||!Number.isFinite(u))&&(u=1),{x:s,y:u}}const OK=aa(0);function QU(e){const t=rr(e);return!J0()||!t.visualViewport?OK:{x:t.visualViewport.offsetLeft,y:t.visualViewport.offsetTop}}function IK(e,t,n){return t===void 0&&(t=!1),!n||t&&n!==rr(e)?!1:t}function bi(e,t,n,r){t===void 0&&(t=!1),n===void 0&&(n=!1);const a=e.getBoundingClientRect(),o=eT(e);let s=aa(1);t&&(r?Ur(r)&&(s=Rs(r)):s=Rs(e));const u=IK(o,n,r)?QU(o):aa(0);let c=(a.left+u.x)/s.x,d=(a.top+u.y)/s.y,p=a.width/s.x,g=a.height/s.y;if(o){const m=rr(o),b=r&&Ur(r)?rr(r):r;let y=m,v=_k(y);for(;v&&r&&b!==y;){const k=Rs(v),A=v.getBoundingClientRect(),x=jr(v),R=A.left+(v.clientLeft+parseFloat(x.paddingLeft))*k.x,O=A.top+(v.clientTop+parseFloat(x.paddingTop))*k.y;c*=k.x,d*=k.y,p*=k.x,g*=k.y,c+=R,d+=O,y=rr(v),v=_k(y)}}return yf({width:p,height:g,x:c,y:d})}function tT(e,t){const n=sp(e).scrollLeft;return t?t.left+n:bi(sa(e)).left+n}function JU(e,t,n){n===void 0&&(n=!1);const r=e.getBoundingClientRect(),a=r.left+t.scrollLeft-(n?0:tT(e,r)),o=r.top+t.scrollTop;return{x:a,y:o}}function DK(e){let{elements:t,rect:n,offsetParent:r,strategy:a}=e;const o=a==="fixed",s=sa(r),u=t?ip(t.floating):!1;if(r===s||u&&o)return n;let c={scrollLeft:0,scrollTop:0},d=aa(1);const p=aa(0),g=oa(r);if((g||!g&&!o)&&((Vs(r)!=="body"||Vu(s))&&(c=sp(r)),oa(r))){const b=bi(r);d=Rs(r),p.x=b.x+r.clientLeft,p.y=b.y+r.clientTop}const m=s&&!g&&!o?JU(s,c,!0):aa(0);return{width:n.width*d.x,height:n.height*d.y,x:n.x*d.x-c.scrollLeft*d.x+p.x+m.x,y:n.y*d.y-c.scrollTop*d.y+p.y+m.y}}function LK(e){return Array.from(e.getClientRects())}function MK(e){const t=sa(e),n=sp(e),r=e.ownerDocument.body,a=er(t.scrollWidth,t.clientWidth,r.scrollWidth,r.clientWidth),o=er(t.scrollHeight,t.clientHeight,r.scrollHeight,r.clientHeight);let s=-n.scrollLeft+tT(e);const u=-n.scrollTop;return jr(r).direction==="rtl"&&(s+=er(t.clientWidth,r.clientWidth)-a),{width:a,height:o,x:s,y:u}}function PK(e,t){const n=rr(e),r=sa(e),a=n.visualViewport;let o=r.clientWidth,s=r.clientHeight,u=0,c=0;if(a){o=a.width,s=a.height;const d=J0();(!d||d&&t==="fixed")&&(u=a.offsetLeft,c=a.offsetTop)}return{width:o,height:s,x:u,y:c}}function FK(e,t){const n=bi(e,!0,t==="fixed"),r=n.top+e.clientTop,a=n.left+e.clientLeft,o=oa(e)?Rs(e):aa(1),s=e.clientWidth*o.x,u=e.clientHeight*o.y,c=a*o.x,d=r*o.y;return{width:s,height:u,x:c,y:d}}function nN(e,t,n){let r;if(t==="viewport")r=PK(e,n);else if(t==="document")r=MK(sa(e));else if(Ur(t))r=FK(t,n);else{const a=QU(e);r={x:t.x-a.x,y:t.y-a.y,width:t.width,height:t.height}}return yf(r)}function ej(e,t){const n=Io(e);return n===t||!Ur(n)||Os(n)?!1:jr(n).position==="fixed"||ej(n,t)}function zK(e,t){const n=t.get(e);if(n)return n;let r=ku(e,[],!1).filter(u=>Ur(u)&&Vs(u)!=="body"),a=null;const o=jr(e).position==="fixed";let s=o?Io(e):e;for(;Ur(s)&&!Os(s);){const u=jr(s),c=Q0(s);!c&&u.position==="fixed"&&(a=null),(o?!c&&!a:!c&&u.position==="static"&&!!a&&["absolute","fixed"].includes(a.position)||Vu(s)&&!c&&ej(e,s))?r=r.filter(p=>p!==s):a=u,s=Io(s)}return t.set(e,r),r}function BK(e){let{element:t,boundary:n,rootBoundary:r,strategy:a}=e;const s=[...n==="clippingAncestors"?ip(t)?[]:zK(t,this._c):[].concat(n),r],u=s[0],c=s.reduce((d,p)=>{const g=nN(t,p,a);return d.top=er(g.top,d.top),d.right=No(g.right,d.right),d.bottom=No(g.bottom,d.bottom),d.left=er(g.left,d.left),d},nN(t,u,a));return{width:c.right-c.left,height:c.bottom-c.top,x:c.left,y:c.top}}function UK(e){const{width:t,height:n}=ZU(e);return{width:t,height:n}}function jK(e,t,n){const r=oa(t),a=sa(t),o=n==="fixed",s=bi(e,!0,o,t);let u={scrollLeft:0,scrollTop:0};const c=aa(0);if(r||!r&&!o)if((Vs(t)!=="body"||Vu(a))&&(u=sp(t)),r){const m=bi(t,!0,o,t);c.x=m.x+t.clientLeft,c.y=m.y+t.clientTop}else a&&(c.x=tT(a));const d=a&&!r&&!o?JU(a,u):aa(0),p=s.left+u.scrollLeft-c.x-d.x,g=s.top+u.scrollTop-c.y-d.y;return{x:p,y:g,width:s.width,height:s.height}}function fm(e){return jr(e).position==="static"}function rN(e,t){if(!oa(e)||jr(e).position==="fixed")return null;if(t)return t(e);let n=e.offsetParent;return sa(e)===n&&(n=n.ownerDocument.body),n}function tj(e,t){const n=rr(e);if(ip(e))return n;if(!oa(e)){let a=Io(e);for(;a&&!Os(a);){if(Ur(a)&&!fm(a))return a;a=Io(a)}return n}let r=rN(e,t);for(;r&&_K(r)&&fm(r);)r=rN(r,t);return r&&Os(r)&&fm(r)&&!Q0(r)?n:r||NK(e)||n}const GK=async function(e){const t=this.getOffsetParent||tj,n=this.getDimensions,r=await n(e.floating);return{reference:jK(e.reference,await t(e.floating),e.strategy),floating:{x:0,y:0,width:r.width,height:r.height}}};function HK(e){return jr(e).direction==="rtl"}const $K={convertOffsetParentRelativeRectToViewportRelativeRect:DK,getDocumentElement:sa,getClippingRect:BK,getOffsetParent:tj,getElementRects:GK,getClientRects:LK,getDimensions:UK,getScale:Rs,isElement:Ur,isRTL:HK};function nj(e,t){return e.x===t.x&&e.y===t.y&&e.width===t.width&&e.height===t.height}function qK(e,t){let n=null,r;const a=sa(e);function o(){var u;clearTimeout(r),(u=n)==null||u.disconnect(),n=null}function s(u,c){u===void 0&&(u=!1),c===void 0&&(c=1),o();const d=e.getBoundingClientRect(),{left:p,top:g,width:m,height:b}=d;if(u||t(),!m||!b)return;const y=xd(g),v=xd(a.clientWidth-(p+m)),k=xd(a.clientHeight-(g+b)),A=xd(p),R={rootMargin:-y+"px "+-v+"px "+-k+"px "+-A+"px",threshold:er(0,No(1,c))||1};let O=!0;function _(C){const N=C[0].intersectionRatio;if(N!==c){if(!O)return s();N?s(!1,N):r=setTimeout(()=>{s(!1,1e-7)},1e3)}N===1&&!nj(d,e.getBoundingClientRect())&&s(),O=!1}try{n=new IntersectionObserver(_,{...R,root:a.ownerDocument})}catch{n=new IntersectionObserver(_,R)}n.observe(e)}return s(!0),o}function VK(e,t,n,r){r===void 0&&(r={});const{ancestorScroll:a=!0,ancestorResize:o=!0,elementResize:s=typeof ResizeObserver=="function",layoutShift:u=typeof IntersectionObserver=="function",animationFrame:c=!1}=r,d=eT(e),p=a||o?[...d?ku(d):[],...ku(t)]:[];p.forEach(A=>{a&&A.addEventListener("scroll",n,{passive:!0}),o&&A.addEventListener("resize",n)});const g=d&&u?qK(d,n):null;let m=-1,b=null;s&&(b=new ResizeObserver(A=>{let[x]=A;x&&x.target===d&&b&&(b.unobserve(t),cancelAnimationFrame(m),m=requestAnimationFrame(()=>{var R;(R=b)==null||R.observe(t)})),n()}),d&&!c&&b.observe(d),b.observe(t));let y,v=c?bi(e):null;c&&k();function k(){const A=bi(e);v&&!nj(v,A)&&n(),v=A,y=requestAnimationFrame(k)}return n(),()=>{var A;p.forEach(x=>{a&&x.removeEventListener("scroll",n),o&&x.removeEventListener("resize",n)}),g==null||g(),(A=b)==null||A.disconnect(),b=null,c&&cancelAnimationFrame(y)}}const WK=TK,YK=AK,KK=wK,XK=CK,ZK=xK,aN=EK,QK=RK,JK=(e,t,n)=>{const r=new Map,a={platform:$K,...n},o={...a.platform,_c:r};return SK(e,t,{...a,platform:o})};var Qd=typeof document<"u"?w.useLayoutEffect:w.useEffect;function vf(e,t){if(e===t)return!0;if(typeof e!=typeof t)return!1;if(typeof e=="function"&&e.toString()===t.toString())return!0;let n,r,a;if(e&&t&&typeof e=="object"){if(Array.isArray(e)){if(n=e.length,n!==t.length)return!1;for(r=n;r--!==0;)if(!vf(e[r],t[r]))return!1;return!0}if(a=Object.keys(e),n=a.length,n!==Object.keys(t).length)return!1;for(r=n;r--!==0;)if(!{}.hasOwnProperty.call(t,a[r]))return!1;for(r=n;r--!==0;){const o=a[r];if(!(o==="_owner"&&e.$$typeof)&&!vf(e[o],t[o]))return!1}return!0}return e!==e&&t!==t}function rj(e){return typeof window>"u"?1:(e.ownerDocument.defaultView||window).devicePixelRatio||1}function oN(e,t){const n=rj(e);return Math.round(t*n)/n}function pm(e){const t=w.useRef(e);return Qd(()=>{t.current=e}),t}function eX(e){e===void 0&&(e={});const{placement:t="bottom",strategy:n="absolute",middleware:r=[],platform:a,elements:{reference:o,floating:s}={},transform:u=!0,whileElementsMounted:c,open:d}=e,[p,g]=w.useState({x:0,y:0,strategy:n,placement:t,middlewareData:{},isPositioned:!1}),[m,b]=w.useState(r);vf(m,r)||b(r);const[y,v]=w.useState(null),[k,A]=w.useState(null),x=w.useCallback(z=>{z!==C.current&&(C.current=z,v(z))},[]),R=w.useCallback(z=>{z!==N.current&&(N.current=z,A(z))},[]),O=o||y,_=s||k,C=w.useRef(null),N=w.useRef(null),M=w.useRef(p),I=c!=null,D=pm(c),H=pm(a),$=pm(d),U=w.useCallback(()=>{if(!C.current||!N.current)return;const z={placement:t,strategy:n,middleware:m};H.current&&(z.platform=H.current),JK(C.current,N.current,z).then(Y=>{const L={...Y,isPositioned:$.current!==!1};W.current&&!vf(M.current,L)&&(M.current=L,Gu.flushSync(()=>{g(L)}))})},[m,t,n,H,$]);Qd(()=>{d===!1&&M.current.isPositioned&&(M.current.isPositioned=!1,g(z=>({...z,isPositioned:!1})))},[d]);const W=w.useRef(!1);Qd(()=>(W.current=!0,()=>{W.current=!1}),[]),Qd(()=>{if(O&&(C.current=O),_&&(N.current=_),O&&_){if(D.current)return D.current(O,_,U);U()}},[O,_,U,D,I]);const Q=w.useMemo(()=>({reference:C,floating:N,setReference:x,setFloating:R}),[x,R]),G=w.useMemo(()=>({reference:O,floating:_}),[O,_]),j=w.useMemo(()=>{const z={position:n,left:0,top:0};if(!G.floating)return z;const Y=oN(G.floating,p.x),L=oN(G.floating,p.y);return u?{...z,transform:"translate("+Y+"px, "+L+"px)",...rj(G.floating)>=1.5&&{willChange:"transform"}}:{position:n,left:Y,top:L}},[n,u,G.floating,p.x,p.y]);return w.useMemo(()=>({...p,update:U,refs:Q,elements:G,floatingStyles:j}),[p,U,Q,G,j])}const tX=e=>{function t(n){return{}.hasOwnProperty.call(n,"current")}return{name:"arrow",options:e,fn(n){const{element:r,padding:a}=typeof e=="function"?e(n):e;return r&&t(r)?r.current!=null?aN({element:r.current,padding:a}).fn(n):{}:r?aN({element:r,padding:a}).fn(n):{}}}},nX=(e,t)=>({...WK(e),options:[e,t]}),rX=(e,t)=>({...YK(e),options:[e,t]}),aX=(e,t)=>({...QK(e),options:[e,t]}),oX=(e,t)=>({...KK(e),options:[e,t]}),iX=(e,t)=>({...XK(e),options:[e,t]}),sX=(e,t)=>({...ZK(e),options:[e,t]}),lX=(e,t)=>({...tX(e),options:[e,t]});var uX="Arrow",aj=w.forwardRef((e,t)=>{const{children:n,width:r=10,height:a=5,...o}=e;return E.jsx(Ze.svg,{...o,ref:t,width:r,height:a,viewBox:"0 0 30 10",preserveAspectRatio:"none",children:e.asChild?n:E.jsx("polygon",{points:"0,0 30,0 15,10"})})});aj.displayName=uX;var cX=aj;function oj(e){const[t,n]=w.useState(void 0);return Rn(()=>{if(e){n({width:e.offsetWidth,height:e.offsetHeight});const r=new ResizeObserver(a=>{if(!Array.isArray(a)||!a.length)return;const o=a[0];let s,u;if("borderBoxSize"in o){const c=o.borderBoxSize,d=Array.isArray(c)?c[0]:c;s=d.inlineSize,u=d.blockSize}else s=e.offsetWidth,u=e.offsetHeight;n({width:s,height:u})});return r.observe(e,{box:"border-box"}),()=>r.unobserve(e)}else n(void 0)},[e]),t}var nT="Popper",[ij,Ws]=wr(nT),[dX,sj]=ij(nT),lj=e=>{const{__scopePopper:t,children:n}=e,[r,a]=w.useState(null);return E.jsx(dX,{scope:t,anchor:r,onAnchorChange:a,children:n})};lj.displayName=nT;var uj="PopperAnchor",cj=w.forwardRef((e,t)=>{const{__scopePopper:n,virtualRef:r,...a}=e,o=sj(uj,n),s=w.useRef(null),u=mt(t,s);return w.useEffect(()=>{o.onAnchorChange((r==null?void 0:r.current)||s.current)}),r?null:E.jsx(Ze.div,{...a,ref:u})});cj.displayName=uj;var rT="PopperContent",[fX,pX]=ij(rT),dj=w.forwardRef((e,t)=>{var J,ae,ke,ie,Se,ve;const{__scopePopper:n,side:r="bottom",sideOffset:a=0,align:o="center",alignOffset:s=0,arrowPadding:u=0,avoidCollisions:c=!0,collisionBoundary:d=[],collisionPadding:p=0,sticky:g="partial",hideWhenDetached:m=!1,updatePositionStrategy:b="optimized",onPlaced:y,...v}=e,k=sj(rT,n),[A,x]=w.useState(null),R=mt(t,De=>x(De)),[O,_]=w.useState(null),C=oj(O),N=(C==null?void 0:C.width)??0,M=(C==null?void 0:C.height)??0,I=r+(o!=="center"?"-"+o:""),D=typeof p=="number"?p:{top:0,right:0,bottom:0,left:0,...p},H=Array.isArray(d)?d:[d],$=H.length>0,U={padding:D,boundary:H.filter(hX),altBoundary:$},{refs:W,floatingStyles:Q,placement:G,isPositioned:j,middlewareData:z}=eX({strategy:"fixed",placement:I,whileElementsMounted:(...De)=>VK(...De,{animationFrame:b==="always"}),elements:{reference:k.anchor},middleware:[nX({mainAxis:a+M,alignmentAxis:s}),c&&rX({mainAxis:!0,crossAxis:!1,limiter:g==="partial"?aX():void 0,...U}),c&&oX({...U}),iX({...U,apply:({elements:De,rects:Ce,availableWidth:Ee,availableHeight:te})=>{const{width:fe,height:Te}=Ce.reference,me=De.floating.style;me.setProperty("--radix-popper-available-width",`${Ee}px`),me.setProperty("--radix-popper-available-height",`${te}px`),me.setProperty("--radix-popper-anchor-width",`${fe}px`),me.setProperty("--radix-popper-anchor-height",`${Te}px`)}}),O&&lX({element:O,padding:u}),mX({arrowWidth:N,arrowHeight:M}),m&&sX({strategy:"referenceHidden",...U})]}),[Y,L]=gj(G),V=yn(y);Rn(()=>{j&&(V==null||V())},[j,V]);const B=(J=z.arrow)==null?void 0:J.x,P=(ae=z.arrow)==null?void 0:ae.y,K=((ke=z.arrow)==null?void 0:ke.centerOffset)!==0,[ee,Z]=w.useState();return Rn(()=>{A&&Z(window.getComputedStyle(A).zIndex)},[A]),E.jsx("div",{ref:W.setFloating,"data-radix-popper-content-wrapper":"",style:{...Q,transform:j?Q.transform:"translate(0, -200%)",minWidth:"max-content",zIndex:ee,"--radix-popper-transform-origin":[(ie=z.transformOrigin)==null?void 0:ie.x,(Se=z.transformOrigin)==null?void 0:Se.y].join(" "),...((ve=z.hide)==null?void 0:ve.referenceHidden)&&{visibility:"hidden",pointerEvents:"none"}},dir:e.dir,children:E.jsx(fX,{scope:n,placedSide:Y,onArrowChange:_,arrowX:B,arrowY:P,shouldHideArrow:K,children:E.jsx(Ze.div,{"data-side":Y,"data-align":L,...v,ref:R,style:{...v.style,animation:j?void 0:"none"}})})})});dj.displayName=rT;var fj="PopperArrow",gX={top:"bottom",right:"left",bottom:"top",left:"right"},pj=w.forwardRef(function(t,n){const{__scopePopper:r,...a}=t,o=pX(fj,r),s=gX[o.placedSide];return E.jsx("span",{ref:o.onArrowChange,style:{position:"absolute",left:o.arrowX,top:o.arrowY,[s]:0,transformOrigin:{top:"",right:"0 0",bottom:"center 0",left:"100% 0"}[o.placedSide],transform:{top:"translateY(100%)",right:"translateY(50%) rotate(90deg) translateX(-50%)",bottom:"rotate(180deg)",left:"translateY(50%) rotate(-90deg) translateX(50%)"}[o.placedSide],visibility:o.shouldHideArrow?"hidden":void 0},children:E.jsx(cX,{...a,ref:n,style:{...a.style,display:"block"}})})});pj.displayName=fj;function hX(e){return e!==null}var mX=e=>({name:"transformOrigin",options:e,fn(t){var k,A,x;const{placement:n,rects:r,middlewareData:a}=t,s=((k=a.arrow)==null?void 0:k.centerOffset)!==0,u=s?0:e.arrowWidth,c=s?0:e.arrowHeight,[d,p]=gj(n),g={start:"0%",center:"50%",end:"100%"}[p],m=(((A=a.arrow)==null?void 0:A.x)??0)+u/2,b=(((x=a.arrow)==null?void 0:x.y)??0)+c/2;let y="",v="";return d==="bottom"?(y=s?g:`${m}px`,v=`${-c}px`):d==="top"?(y=s?g:`${m}px`,v=`${r.floating.height+c}px`):d==="right"?(y=`${-c}px`,v=s?g:`${b}px`):d==="left"&&(y=`${r.floating.width+c}px`,v=s?g:`${b}px`),{data:{x:y,y:v}}}});function gj(e){const[t,n="center"]=e.split("-");return[t,n]}var aT=lj,lp=cj,oT=dj,iT=pj,bX="VisuallyHidden",sT=w.forwardRef((e,t)=>E.jsx(Ze.span,{...e,ref:t,style:{position:"absolute",border:0,width:1,height:1,padding:0,margin:-1,overflow:"hidden",clip:"rect(0, 0, 0, 0)",whiteSpace:"nowrap",wordWrap:"normal",...e.style}}));sT.displayName=bX;var yX=sT,[up,nke]=wr("Tooltip",[Ws]),cp=Ws(),hj="TooltipProvider",vX=700,Nk="tooltip.open",[SX,lT]=up(hj),mj=e=>{const{__scopeTooltip:t,delayDuration:n=vX,skipDelayDuration:r=300,disableHoverableContent:a=!1,children:o}=e,[s,u]=w.useState(!0),c=w.useRef(!1),d=w.useRef(0);return w.useEffect(()=>{const p=d.current;return()=>window.clearTimeout(p)},[]),E.jsx(SX,{scope:t,isOpenDelayed:s,delayDuration:n,onOpen:w.useCallback(()=>{window.clearTimeout(d.current),u(!1)},[]),onClose:w.useCallback(()=>{window.clearTimeout(d.current),d.current=window.setTimeout(()=>u(!0),r)},[r]),isPointerInTransitRef:c,onPointerInTransitChange:w.useCallback(p=>{c.current=p},[]),disableHoverableContent:a,children:o})};mj.displayName=hj;var dp="Tooltip",[EX,fp]=up(dp),bj=e=>{const{__scopeTooltip:t,children:n,open:r,defaultOpen:a=!1,onOpenChange:o,disableHoverableContent:s,delayDuration:u}=e,c=lT(dp,e.__scopeTooltip),d=cp(t),[p,g]=w.useState(null),m=An(),b=w.useRef(0),y=s??c.disableHoverableContent,v=u??c.delayDuration,k=w.useRef(!1),[A=!1,x]=Ba({prop:r,defaultProp:a,onChange:N=>{N?(c.onOpen(),document.dispatchEvent(new CustomEvent(Nk))):c.onClose(),o==null||o(N)}}),R=w.useMemo(()=>A?k.current?"delayed-open":"instant-open":"closed",[A]),O=w.useCallback(()=>{window.clearTimeout(b.current),b.current=0,k.current=!1,x(!0)},[x]),_=w.useCallback(()=>{window.clearTimeout(b.current),b.current=0,x(!1)},[x]),C=w.useCallback(()=>{window.clearTimeout(b.current),b.current=window.setTimeout(()=>{k.current=!0,x(!0),b.current=0},v)},[v,x]);return w.useEffect(()=>()=>{b.current&&(window.clearTimeout(b.current),b.current=0)},[]),E.jsx(aT,{...d,children:E.jsx(EX,{scope:t,contentId:m,open:A,stateAttribute:R,trigger:p,onTriggerChange:g,onTriggerEnter:w.useCallback(()=>{c.isOpenDelayed?C():O()},[c.isOpenDelayed,C,O]),onTriggerLeave:w.useCallback(()=>{y?_():(window.clearTimeout(b.current),b.current=0)},[_,y]),onOpen:O,onClose:_,disableHoverableContent:y,children:n})})};bj.displayName=dp;var Ok="TooltipTrigger",yj=w.forwardRef((e,t)=>{const{__scopeTooltip:n,...r}=e,a=fp(Ok,n),o=lT(Ok,n),s=cp(n),u=w.useRef(null),c=mt(t,u,a.onTriggerChange),d=w.useRef(!1),p=w.useRef(!1),g=w.useCallback(()=>d.current=!1,[]);return w.useEffect(()=>()=>document.removeEventListener("pointerup",g),[g]),E.jsx(lp,{asChild:!0,...s,children:E.jsx(Ze.button,{"aria-describedby":a.open?a.contentId:void 0,"data-state":a.stateAttribute,...r,ref:c,onPointerMove:Ke(e.onPointerMove,m=>{m.pointerType!=="touch"&&!p.current&&!o.isPointerInTransitRef.current&&(a.onTriggerEnter(),p.current=!0)}),onPointerLeave:Ke(e.onPointerLeave,()=>{a.onTriggerLeave(),p.current=!1}),onPointerDown:Ke(e.onPointerDown,()=>{d.current=!0,document.addEventListener("pointerup",g,{once:!0})}),onFocus:Ke(e.onFocus,()=>{d.current||a.onOpen()}),onBlur:Ke(e.onBlur,a.onClose),onClick:Ke(e.onClick,a.onClose)})})});yj.displayName=Ok;var wX="TooltipPortal",[rke,xX]=up(wX,{forceMount:void 0}),Is="TooltipContent",vj=w.forwardRef((e,t)=>{const n=xX(Is,e.__scopeTooltip),{forceMount:r=n.forceMount,side:a="top",...o}=e,s=fp(Is,e.__scopeTooltip);return E.jsx(xr,{present:r||s.open,children:s.disableHoverableContent?E.jsx(Sj,{side:a,...o,ref:t}):E.jsx(kX,{side:a,...o,ref:t})})}),kX=w.forwardRef((e,t)=>{const n=fp(Is,e.__scopeTooltip),r=lT(Is,e.__scopeTooltip),a=w.useRef(null),o=mt(t,a),[s,u]=w.useState(null),{trigger:c,onClose:d}=n,p=a.current,{onPointerInTransitChange:g}=r,m=w.useCallback(()=>{u(null),g(!1)},[g]),b=w.useCallback((y,v)=>{const k=y.currentTarget,A={x:y.clientX,y:y.clientY},x=CX(A,k.getBoundingClientRect()),R=_X(A,x),O=NX(v.getBoundingClientRect()),_=IX([...R,...O]);u(_),g(!0)},[g]);return w.useEffect(()=>()=>m(),[m]),w.useEffect(()=>{if(c&&p){const y=k=>b(k,p),v=k=>b(k,c);return c.addEventListener("pointerleave",y),p.addEventListener("pointerleave",v),()=>{c.removeEventListener("pointerleave",y),p.removeEventListener("pointerleave",v)}}},[c,p,b,m]),w.useEffect(()=>{if(s){const y=v=>{const k=v.target,A={x:v.clientX,y:v.clientY},x=(c==null?void 0:c.contains(k))||(p==null?void 0:p.contains(k)),R=!OX(A,s);x?m():R&&(m(),d())};return document.addEventListener("pointermove",y),()=>document.removeEventListener("pointermove",y)}},[c,p,s,d,m]),E.jsx(Sj,{...e,ref:o})}),[TX,AX]=up(dp,{isInside:!1}),Sj=w.forwardRef((e,t)=>{const{__scopeTooltip:n,children:r,"aria-label":a,onEscapeKeyDown:o,onPointerDownOutside:s,...u}=e,c=fp(Is,n),d=cp(n),{onClose:p}=c;return w.useEffect(()=>(document.addEventListener(Nk,p),()=>document.removeEventListener(Nk,p)),[p]),w.useEffect(()=>{if(c.trigger){const g=m=>{const b=m.target;b!=null&&b.contains(c.trigger)&&p()};return window.addEventListener("scroll",g,{capture:!0}),()=>window.removeEventListener("scroll",g,{capture:!0})}},[c.trigger,p]),E.jsx(qu,{asChild:!0,disableOutsidePointerEvents:!1,onEscapeKeyDown:o,onPointerDownOutside:s,onFocusOutside:g=>g.preventDefault(),onDismiss:p,children:E.jsxs(oT,{"data-state":c.stateAttribute,...d,...u,ref:t,style:{...u.style,"--radix-tooltip-content-transform-origin":"var(--radix-popper-transform-origin)","--radix-tooltip-content-available-width":"var(--radix-popper-available-width)","--radix-tooltip-content-available-height":"var(--radix-popper-available-height)","--radix-tooltip-trigger-width":"var(--radix-popper-anchor-width)","--radix-tooltip-trigger-height":"var(--radix-popper-anchor-height)"},children:[E.jsx(P0,{children:r}),E.jsx(TX,{scope:n,isInside:!0,children:E.jsx(yX,{id:c.contentId,role:"tooltip",children:a||r})})]})})});vj.displayName=Is;var Ej="TooltipArrow",RX=w.forwardRef((e,t)=>{const{__scopeTooltip:n,...r}=e,a=cp(n);return AX(Ej,n).isInside?null:E.jsx(iT,{...a,...r,ref:t})});RX.displayName=Ej;function CX(e,t){const n=Math.abs(t.top-e.y),r=Math.abs(t.bottom-e.y),a=Math.abs(t.right-e.x),o=Math.abs(t.left-e.x);switch(Math.min(n,r,a,o)){case o:return"left";case a:return"right";case n:return"top";case r:return"bottom";default:throw new Error("unreachable")}}function _X(e,t,n=5){const r=[];switch(t){case"top":r.push({x:e.x-n,y:e.y+n},{x:e.x+n,y:e.y+n});break;case"bottom":r.push({x:e.x-n,y:e.y-n},{x:e.x+n,y:e.y-n});break;case"left":r.push({x:e.x+n,y:e.y-n},{x:e.x+n,y:e.y+n});break;case"right":r.push({x:e.x-n,y:e.y-n},{x:e.x-n,y:e.y+n});break}return r}function NX(e){const{top:t,right:n,bottom:r,left:a}=e;return[{x:a,y:t},{x:n,y:t},{x:n,y:r},{x:a,y:r}]}function OX(e,t){const{x:n,y:r}=e;let a=!1;for(let o=0,s=t.length-1;or!=p>r&&n<(d-u)*(r-c)/(p-c)+u&&(a=!a)}return a}function IX(e){const t=e.slice();return t.sort((n,r)=>n.xr.x?1:n.yr.y?1:0),DX(t)}function DX(e){if(e.length<=1)return e.slice();const t=[];for(let r=0;r=2;){const o=t[t.length-1],s=t[t.length-2];if((o.x-s.x)*(a.y-s.y)>=(o.y-s.y)*(a.x-s.x))t.pop();else break}t.push(a)}t.pop();const n=[];for(let r=e.length-1;r>=0;r--){const a=e[r];for(;n.length>=2;){const o=n[n.length-1],s=n[n.length-2];if((o.x-s.x)*(a.y-s.y)>=(o.y-s.y)*(a.x-s.x))n.pop();else break}n.push(a)}return n.pop(),t.length===1&&n.length===1&&t[0].x===n[0].x&&t[0].y===n[0].y?t:t.concat(n)}var LX=mj,MX=bj,PX=yj,wj=vj;const xj=LX,kj=MX,Tj=PX,FX=e=>typeof e!="string"?e:E.jsx("div",{className:"relative top-0 pt-1 whitespace-pre-wrap break-words",children:e}),uT=w.forwardRef(({className:e,side:t="left",align:n="start",children:r,...a},o)=>{const s=w.useRef(null);return w.useEffect(()=>{s.current&&(s.current.scrollTop=0)},[r]),E.jsx(wj,{ref:o,side:t,align:n,className:Me("bg-popover text-popover-foreground animate-in fade-in-0 zoom-in-95 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 max-h-[60vh] overflow-y-auto whitespace-pre-wrap break-words rounded-md border px-3 py-2 text-sm shadow-md z-60",e),...a,children:typeof r=="string"?FX(r):r})});uT.displayName=wj.displayName;const Sf=dK("inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0",{variants:{variant:{default:"bg-primary text-primary-foreground hover:bg-primary/90",destructive:"bg-destructive text-destructive-foreground hover:bg-destructive/90",outline:"border border-input bg-background hover:bg-accent hover:text-accent-foreground",secondary:"bg-secondary text-secondary-foreground hover:bg-secondary/80",ghost:"hover:bg-accent hover:text-accent-foreground",link:"text-primary underline-offset-4 hover:underline"},size:{default:"h-10 px-4 py-2",sm:"h-9 rounded-md px-3",lg:"h-11 rounded-md px-8",icon:"size-8"}},defaultVariants:{variant:"default",size:"default"}}),pt=w.forwardRef(({className:e,variant:t,tooltip:n,size:r,side:a="right",asChild:o=!1,...s},u)=>{const c=o?_o:"button";return n?E.jsx(xj,{children:E.jsxs(kj,{children:[E.jsx(Tj,{asChild:!0,children:E.jsx(c,{className:Me(Sf({variant:t,size:r,className:e}),"cursor-pointer"),ref:u,...s})}),E.jsx(uT,{side:a,children:n})]})}):E.jsx(c,{className:Me(Sf({variant:t,size:r,className:e}),"cursor-pointer"),ref:u,...s})});pt.displayName="Button";const zX=uK,BX=cK,Aj=w.forwardRef(({className:e,...t},n)=>E.jsx(GU,{className:Me("data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 fixed inset-0 z-50 bg-black/80",e),...t,ref:n}));Aj.displayName=GU.displayName;const Rj=w.forwardRef(({className:e,...t},n)=>E.jsx(BX,{children:E.jsx(HU,{ref:n,className:Me("bg-background data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[state=closed]:slide-out-to-top-[48%] data-[state=open]:slide-in-from-top-[48%] fixed top-[50%] left-[50%] z-50 grid w-full max-w-lg translate-x-[-50%] translate-y-[-50%] gap-4 border p-6 shadow-lg duration-200 sm:rounded-lg",e),...t})}));Rj.displayName=HU.displayName;const Cj=({className:e,...t})=>E.jsx("div",{className:Me("flex flex-col space-y-2 text-center sm:text-left",e),...t});Cj.displayName="AlertDialogHeader";const _j=w.forwardRef(({className:e,...t},n)=>E.jsx(VU,{ref:n,className:Me("text-lg font-semibold",e),...t}));_j.displayName=VU.displayName;const Nj=w.forwardRef(({className:e,...t},n)=>E.jsx(WU,{ref:n,className:Me("text-muted-foreground text-sm",e),...t}));Nj.displayName=WU.displayName;const UX=w.forwardRef(({className:e,...t},n)=>E.jsx($U,{ref:n,className:Me(Sf(),e),...t}));UX.displayName=$U.displayName;const jX=w.forwardRef(({className:e,...t},n)=>E.jsx(qU,{ref:n,className:Me(Sf({variant:"outline"}),"mt-2 sm:mt-0",e),...t}));jX.displayName=qU.displayName;const Ga=w.forwardRef(({className:e,type:t,...n},r)=>E.jsx("input",{type:t,className:Me("border-input file:text-foreground placeholder:text-muted-foreground focus-visible:ring-ring flex h-9 rounded-md border bg-transparent px-3 py-1 text-base shadow-sm transition-colors file:border-0 file:bg-transparent file:text-sm file:font-medium focus-visible:ring-1 focus-visible:outline-none disabled:cursor-not-allowed disabled:opacity-50 md:text-sm [&::-webkit-inner-spin-button]:opacity-100 [&::-webkit-outer-spin-button]:opacity-100",e),ref:r,...n}));Ga.displayName="Input";const GX=({open:e,onOpenChange:t})=>{const{t:n}=Dt(),r=Le.use.apiKey(),[a,o]=w.useState(""),s=Sr.use.message();w.useEffect(()=>{o(r||"")},[r,e]),w.useEffect(()=>{s&&(s.includes(GB)||s.includes(HB))&&t(!0)},[s,t]);const u=w.useCallback(()=>{Le.setState({apiKey:a||null}),t(!1)},[a,t]),c=w.useCallback(d=>{o(d.target.value)},[o]);return E.jsxs(zX,{open:e,onOpenChange:t,children:[E.jsx(Aj,{className:"bg-black/30"}),E.jsxs(Rj,{children:[E.jsxs(Cj,{children:[E.jsx(_j,{children:n("apiKeyAlert.title")}),E.jsx(Nj,{children:n("apiKeyAlert.description")})]}),E.jsxs("div",{className:"flex flex-col gap-4",children:[E.jsxs("form",{className:"flex gap-2",onSubmit:d=>d.preventDefault(),children:[E.jsx(Ga,{type:"password",value:a,onChange:c,placeholder:n("apiKeyAlert.placeholder"),className:"max-h-full w-full min-w-0",autoComplete:"off"}),E.jsx(pt,{onClick:u,variant:"outline",size:"sm",children:n("apiKeyAlert.save")})]}),s&&E.jsx("div",{className:"text-sm text-red-500",children:s})]})]})]})};var cT="Popover",[Oj,ake]=wr(cT,[Ws]),Wu=Ws(),[HX,Ti]=Oj(cT),Ij=e=>{const{__scopePopover:t,children:n,open:r,defaultOpen:a,onOpenChange:o,modal:s=!1}=e,u=Wu(t),c=w.useRef(null),[d,p]=w.useState(!1),[g=!1,m]=Ba({prop:r,defaultProp:a,onChange:o});return E.jsx(aT,{...u,children:E.jsx(HX,{scope:t,contentId:An(),triggerRef:c,open:g,onOpenChange:m,onOpenToggle:w.useCallback(()=>m(b=>!b),[m]),hasCustomAnchor:d,onCustomAnchorAdd:w.useCallback(()=>p(!0),[]),onCustomAnchorRemove:w.useCallback(()=>p(!1),[]),modal:s,children:n})})};Ij.displayName=cT;var Dj="PopoverAnchor",$X=w.forwardRef((e,t)=>{const{__scopePopover:n,...r}=e,a=Ti(Dj,n),o=Wu(n),{onCustomAnchorAdd:s,onCustomAnchorRemove:u}=a;return w.useEffect(()=>(s(),()=>u()),[s,u]),E.jsx(lp,{...o,...r,ref:t})});$X.displayName=Dj;var Lj="PopoverTrigger",Mj=w.forwardRef((e,t)=>{const{__scopePopover:n,...r}=e,a=Ti(Lj,n),o=Wu(n),s=mt(t,a.triggerRef),u=E.jsx(Ze.button,{type:"button","aria-haspopup":"dialog","aria-expanded":a.open,"aria-controls":a.contentId,"data-state":Bj(a.open),...r,ref:s,onClick:Ke(e.onClick,a.onOpenToggle)});return a.hasCustomAnchor?u:E.jsx(lp,{asChild:!0,...o,children:u})});Mj.displayName=Lj;var qX="PopoverPortal",[oke,VX]=Oj(qX,{forceMount:void 0}),Ds="PopoverContent",Pj=w.forwardRef((e,t)=>{const n=VX(Ds,e.__scopePopover),{forceMount:r=n.forceMount,...a}=e,o=Ti(Ds,e.__scopePopover);return E.jsx(xr,{present:r||o.open,children:o.modal?E.jsx(WX,{...a,ref:t}):E.jsx(YX,{...a,ref:t})})});Pj.displayName=Ds;var WX=w.forwardRef((e,t)=>{const n=Ti(Ds,e.__scopePopover),r=w.useRef(null),a=mt(t,r),o=w.useRef(!1);return w.useEffect(()=>{const s=r.current;if(s)return B0(s)},[]),E.jsx(np,{as:_o,allowPinchZoom:!0,children:E.jsx(Fj,{...e,ref:a,trapFocus:n.open,disableOutsidePointerEvents:!0,onCloseAutoFocus:Ke(e.onCloseAutoFocus,s=>{var u;s.preventDefault(),o.current||(u=n.triggerRef.current)==null||u.focus()}),onPointerDownOutside:Ke(e.onPointerDownOutside,s=>{const u=s.detail.originalEvent,c=u.button===0&&u.ctrlKey===!0,d=u.button===2||c;o.current=d},{checkForDefaultPrevented:!1}),onFocusOutside:Ke(e.onFocusOutside,s=>s.preventDefault(),{checkForDefaultPrevented:!1})})})}),YX=w.forwardRef((e,t)=>{const n=Ti(Ds,e.__scopePopover),r=w.useRef(!1),a=w.useRef(!1);return E.jsx(Fj,{...e,ref:t,trapFocus:!1,disableOutsidePointerEvents:!1,onCloseAutoFocus:o=>{var s,u;(s=e.onCloseAutoFocus)==null||s.call(e,o),o.defaultPrevented||(r.current||(u=n.triggerRef.current)==null||u.focus(),o.preventDefault()),r.current=!1,a.current=!1},onInteractOutside:o=>{var c,d;(c=e.onInteractOutside)==null||c.call(e,o),o.defaultPrevented||(r.current=!0,o.detail.originalEvent.type==="pointerdown"&&(a.current=!0));const s=o.target;((d=n.triggerRef.current)==null?void 0:d.contains(s))&&o.preventDefault(),o.detail.originalEvent.type==="focusin"&&a.current&&o.preventDefault()}})}),Fj=w.forwardRef((e,t)=>{const{__scopePopover:n,trapFocus:r,onOpenAutoFocus:a,onCloseAutoFocus:o,disableOutsidePointerEvents:s,onEscapeKeyDown:u,onPointerDownOutside:c,onFocusOutside:d,onInteractOutside:p,...g}=e,m=Ti(Ds,n),b=Wu(n);return z0(),E.jsx(ep,{asChild:!0,loop:!0,trapped:r,onMountAutoFocus:a,onUnmountAutoFocus:o,children:E.jsx(qu,{asChild:!0,disableOutsidePointerEvents:s,onInteractOutside:p,onEscapeKeyDown:u,onPointerDownOutside:c,onFocusOutside:d,onDismiss:()=>m.onOpenChange(!1),children:E.jsx(oT,{"data-state":Bj(m.open),role:"dialog",id:m.contentId,...b,...g,ref:t,style:{...g.style,"--radix-popover-content-transform-origin":"var(--radix-popper-transform-origin)","--radix-popover-content-available-width":"var(--radix-popper-available-width)","--radix-popover-content-available-height":"var(--radix-popper-available-height)","--radix-popover-trigger-width":"var(--radix-popper-anchor-width)","--radix-popover-trigger-height":"var(--radix-popper-anchor-height)"}})})})}),zj="PopoverClose",KX=w.forwardRef((e,t)=>{const{__scopePopover:n,...r}=e,a=Ti(zj,n);return E.jsx(Ze.button,{type:"button",...r,ref:t,onClick:Ke(e.onClick,()=>a.onOpenChange(!1))})});KX.displayName=zj;var XX="PopoverArrow",ZX=w.forwardRef((e,t)=>{const{__scopePopover:n,...r}=e,a=Wu(n);return E.jsx(iT,{...a,...r,ref:t})});ZX.displayName=XX;function Bj(e){return e?"open":"closed"}var QX=Ij,JX=Mj,Uj=Pj;const Yu=QX,Ku=JX,Ys=w.forwardRef(({className:e,align:t="center",sideOffset:n=4,...r},a)=>E.jsx(Uj,{ref:a,align:t,sideOffset:n,className:Me("bg-popover text-popover-foreground data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 z-50 rounded-md border p-4 shadow-md outline-none",e),...r}));Ys.displayName=Uj.displayName;const eZ=({status:e})=>{const{t}=Dt();return e?E.jsxs("div",{className:"min-w-[300px] space-y-3 text-sm",children:[E.jsxs("div",{className:"space-y-1",children:[E.jsx("h4",{className:"font-medium",children:t("graphPanel.statusCard.storageInfo")}),E.jsxs("div",{className:"text-muted-foreground grid grid-cols-2 gap-1",children:[E.jsxs("span",{children:[t("graphPanel.statusCard.workingDirectory"),":"]}),E.jsx("span",{className:"truncate",children:e.working_directory}),E.jsxs("span",{children:[t("graphPanel.statusCard.inputDirectory"),":"]}),E.jsx("span",{className:"truncate",children:e.input_directory})]})]}),E.jsxs("div",{className:"space-y-1",children:[E.jsx("h4",{className:"font-medium",children:t("graphPanel.statusCard.llmConfig")}),E.jsxs("div",{className:"text-muted-foreground grid grid-cols-2 gap-1",children:[E.jsxs("span",{children:[t("graphPanel.statusCard.llmBinding"),":"]}),E.jsx("span",{children:e.configuration.llm_binding}),E.jsxs("span",{children:[t("graphPanel.statusCard.llmBindingHost"),":"]}),E.jsx("span",{children:e.configuration.llm_binding_host}),E.jsxs("span",{children:[t("graphPanel.statusCard.llmModel"),":"]}),E.jsx("span",{children:e.configuration.llm_model}),E.jsxs("span",{children:[t("graphPanel.statusCard.maxTokens"),":"]}),E.jsx("span",{children:e.configuration.max_tokens})]})]}),E.jsxs("div",{className:"space-y-1",children:[E.jsx("h4",{className:"font-medium",children:t("graphPanel.statusCard.embeddingConfig")}),E.jsxs("div",{className:"text-muted-foreground grid grid-cols-2 gap-1",children:[E.jsxs("span",{children:[t("graphPanel.statusCard.embeddingBinding"),":"]}),E.jsx("span",{children:e.configuration.embedding_binding}),E.jsxs("span",{children:[t("graphPanel.statusCard.embeddingBindingHost"),":"]}),E.jsx("span",{children:e.configuration.embedding_binding_host}),E.jsxs("span",{children:[t("graphPanel.statusCard.embeddingModel"),":"]}),E.jsx("span",{children:e.configuration.embedding_model})]})]}),E.jsxs("div",{className:"space-y-1",children:[E.jsx("h4",{className:"font-medium",children:t("graphPanel.statusCard.storageConfig")}),E.jsxs("div",{className:"text-muted-foreground grid grid-cols-2 gap-1",children:[E.jsxs("span",{children:[t("graphPanel.statusCard.kvStorage"),":"]}),E.jsx("span",{children:e.configuration.kv_storage}),E.jsxs("span",{children:[t("graphPanel.statusCard.docStatusStorage"),":"]}),E.jsx("span",{children:e.configuration.doc_status_storage}),E.jsxs("span",{children:[t("graphPanel.statusCard.graphStorage"),":"]}),E.jsx("span",{children:e.configuration.graph_storage}),E.jsxs("span",{children:[t("graphPanel.statusCard.vectorStorage"),":"]}),E.jsx("span",{children:e.configuration.vector_storage})]})]})]}):E.jsx("div",{className:"text-muted-foreground text-sm",children:t("graphPanel.statusCard.unavailable")})},tZ=()=>{const{t:e}=Dt(),t=Sr.use.health(),n=Sr.use.lastCheckTime(),r=Sr.use.status(),[a,o]=w.useState(!1);return w.useEffect(()=>{o(!0);const s=setTimeout(()=>o(!1),300);return()=>clearTimeout(s)},[n]),E.jsx("div",{className:"fixed right-4 bottom-4 flex items-center gap-2 opacity-80 select-none",children:E.jsxs(Yu,{children:[E.jsx(Ku,{asChild:!0,children:E.jsxs("div",{className:"flex cursor-help items-center gap-2",children:[E.jsx("div",{className:Me("h-3 w-3 rounded-full transition-all duration-300","shadow-[0_0_8px_rgba(0,0,0,0.2)]",t?"bg-green-500":"bg-red-500",a&&"scale-125",a&&t&&"shadow-[0_0_12px_rgba(34,197,94,0.4)]",a&&!t&&"shadow-[0_0_12px_rgba(239,68,68,0.4)]")}),E.jsx("span",{className:"text-muted-foreground text-xs",children:e(t?"graphPanel.statusIndicator.connected":"graphPanel.statusIndicator.disconnected")})]})}),E.jsx(Ys,{className:"w-auto",side:"top",align:"end",children:E.jsx(eZ,{status:r})})]})})};function Ik(e,[t,n]){return Math.min(n,Math.max(t,e))}function jj(e){const t=e+"CollectionProvider",[n,r]=wr(t),[a,o]=n(t,{collectionRef:{current:null},itemMap:new Map}),s=b=>{const{scope:y,children:v}=b,k=ye.useRef(null),A=ye.useRef(new Map).current;return E.jsx(a,{scope:y,itemMap:A,collectionRef:k,children:v})};s.displayName=t;const u=e+"CollectionSlot",c=ye.forwardRef((b,y)=>{const{scope:v,children:k}=b,A=o(u,v),x=mt(y,A.collectionRef);return E.jsx(_o,{ref:x,children:k})});c.displayName=u;const d=e+"CollectionItemSlot",p="data-radix-collection-item",g=ye.forwardRef((b,y)=>{const{scope:v,children:k,...A}=b,x=ye.useRef(null),R=mt(y,x),O=o(d,v);return ye.useEffect(()=>(O.itemMap.set(x,{ref:x,...A}),()=>void O.itemMap.delete(x))),E.jsx(_o,{[p]:"",ref:R,children:k})});g.displayName=d;function m(b){const y=o(e+"CollectionConsumer",b);return ye.useCallback(()=>{const k=y.collectionRef.current;if(!k)return[];const A=Array.from(k.querySelectorAll(`[${p}]`));return Array.from(y.itemMap.values()).sort((O,_)=>A.indexOf(O.ref.current)-A.indexOf(_.ref.current))},[y.collectionRef,y.itemMap])}return[{Provider:s,Slot:c,ItemSlot:g},m,r]}var nZ=w.createContext(void 0);function pp(e){const t=w.useContext(nZ);return e||t||"ltr"}function Gj(e){const t=w.useRef({value:e,previous:e});return w.useMemo(()=>(t.current.value!==e&&(t.current.previous=t.current.value,t.current.value=e),t.current.previous),[e])}var rZ=[" ","Enter","ArrowUp","ArrowDown"],aZ=[" ","Enter"],Xu="Select",[gp,hp,oZ]=jj(Xu),[Ks,ike]=wr(Xu,[oZ,Ws]),mp=Ws(),[iZ,Do]=Ks(Xu),[sZ,lZ]=Ks(Xu),Hj=e=>{const{__scopeSelect:t,children:n,open:r,defaultOpen:a,onOpenChange:o,value:s,defaultValue:u,onValueChange:c,dir:d,name:p,autoComplete:g,disabled:m,required:b,form:y}=e,v=mp(t),[k,A]=w.useState(null),[x,R]=w.useState(null),[O,_]=w.useState(!1),C=pp(d),[N=!1,M]=Ba({prop:r,defaultProp:a,onChange:o}),[I,D]=Ba({prop:s,defaultProp:u,onChange:c}),H=w.useRef(null),$=k?y||!!k.closest("form"):!0,[U,W]=w.useState(new Set),Q=Array.from(U).map(G=>G.props.value).join(";");return E.jsx(aT,{...v,children:E.jsxs(iZ,{required:b,scope:t,trigger:k,onTriggerChange:A,valueNode:x,onValueNodeChange:R,valueNodeHasChildren:O,onValueNodeHasChildrenChange:_,contentId:An(),value:I,onValueChange:D,open:N,onOpenChange:M,dir:C,triggerPointerDownPosRef:H,disabled:m,children:[E.jsx(gp.Provider,{scope:t,children:E.jsx(sZ,{scope:e.__scopeSelect,onNativeOptionAdd:w.useCallback(G=>{W(j=>new Set(j).add(G))},[]),onNativeOptionRemove:w.useCallback(G=>{W(j=>{const z=new Set(j);return z.delete(G),z})},[]),children:n})}),$?E.jsxs(h3,{"aria-hidden":!0,required:b,tabIndex:-1,name:p,autoComplete:g,value:I,onChange:G=>D(G.target.value),disabled:m,form:y,children:[I===void 0?E.jsx("option",{value:""}):null,Array.from(U)]},Q):null]})})};Hj.displayName=Xu;var $j="SelectTrigger",qj=w.forwardRef((e,t)=>{const{__scopeSelect:n,disabled:r=!1,...a}=e,o=mp(n),s=Do($j,n),u=s.disabled||r,c=mt(t,s.onTriggerChange),d=hp(n),p=w.useRef("touch"),[g,m,b]=m3(v=>{const k=d().filter(R=>!R.disabled),A=k.find(R=>R.value===s.value),x=b3(k,v,A);x!==void 0&&s.onValueChange(x.value)}),y=v=>{u||(s.onOpenChange(!0),b()),v&&(s.triggerPointerDownPosRef.current={x:Math.round(v.pageX),y:Math.round(v.pageY)})};return E.jsx(lp,{asChild:!0,...o,children:E.jsx(Ze.button,{type:"button",role:"combobox","aria-controls":s.contentId,"aria-expanded":s.open,"aria-required":s.required,"aria-autocomplete":"none",dir:s.dir,"data-state":s.open?"open":"closed",disabled:u,"data-disabled":u?"":void 0,"data-placeholder":g3(s.value)?"":void 0,...a,ref:c,onClick:Ke(a.onClick,v=>{v.currentTarget.focus(),p.current!=="mouse"&&y(v)}),onPointerDown:Ke(a.onPointerDown,v=>{p.current=v.pointerType;const k=v.target;k.hasPointerCapture(v.pointerId)&&k.releasePointerCapture(v.pointerId),v.button===0&&v.ctrlKey===!1&&v.pointerType==="mouse"&&(y(v),v.preventDefault())}),onKeyDown:Ke(a.onKeyDown,v=>{const k=g.current!=="";!(v.ctrlKey||v.altKey||v.metaKey)&&v.key.length===1&&m(v.key),!(k&&v.key===" ")&&rZ.includes(v.key)&&(y(),v.preventDefault())})})})});qj.displayName=$j;var Vj="SelectValue",Wj=w.forwardRef((e,t)=>{const{__scopeSelect:n,className:r,style:a,children:o,placeholder:s="",...u}=e,c=Do(Vj,n),{onValueNodeHasChildrenChange:d}=c,p=o!==void 0,g=mt(t,c.onValueNodeChange);return Rn(()=>{d(p)},[d,p]),E.jsx(Ze.span,{...u,ref:g,style:{pointerEvents:"none"},children:g3(c.value)?E.jsx(E.Fragment,{children:s}):o})});Wj.displayName=Vj;var uZ="SelectIcon",Yj=w.forwardRef((e,t)=>{const{__scopeSelect:n,children:r,...a}=e;return E.jsx(Ze.span,{"aria-hidden":!0,...a,ref:t,children:r||"▼"})});Yj.displayName=uZ;var cZ="SelectPortal",Kj=e=>E.jsx(F0,{asChild:!0,...e});Kj.displayName=cZ;var yi="SelectContent",Xj=w.forwardRef((e,t)=>{const n=Do(yi,e.__scopeSelect),[r,a]=w.useState();if(Rn(()=>{a(new DocumentFragment)},[]),!n.open){const o=r;return o?Gu.createPortal(E.jsx(Zj,{scope:e.__scopeSelect,children:E.jsx(gp.Slot,{scope:e.__scopeSelect,children:E.jsx("div",{children:e.children})})}),o):null}return E.jsx(Qj,{...e,ref:t})});Xj.displayName=yi;var Lr=10,[Zj,Lo]=Ks(yi),dZ="SelectContentImpl",Qj=w.forwardRef((e,t)=>{const{__scopeSelect:n,position:r="item-aligned",onCloseAutoFocus:a,onEscapeKeyDown:o,onPointerDownOutside:s,side:u,sideOffset:c,align:d,alignOffset:p,arrowPadding:g,collisionBoundary:m,collisionPadding:b,sticky:y,hideWhenDetached:v,avoidCollisions:k,...A}=e,x=Do(yi,n),[R,O]=w.useState(null),[_,C]=w.useState(null),N=mt(t,J=>O(J)),[M,I]=w.useState(null),[D,H]=w.useState(null),$=hp(n),[U,W]=w.useState(!1),Q=w.useRef(!1);w.useEffect(()=>{if(R)return B0(R)},[R]),z0();const G=w.useCallback(J=>{const[ae,...ke]=$().map(ve=>ve.ref.current),[ie]=ke.slice(-1),Se=document.activeElement;for(const ve of J)if(ve===Se||(ve==null||ve.scrollIntoView({block:"nearest"}),ve===ae&&_&&(_.scrollTop=0),ve===ie&&_&&(_.scrollTop=_.scrollHeight),ve==null||ve.focus(),document.activeElement!==Se))return},[$,_]),j=w.useCallback(()=>G([M,R]),[G,M,R]);w.useEffect(()=>{U&&j()},[U,j]);const{onOpenChange:z,triggerPointerDownPosRef:Y}=x;w.useEffect(()=>{if(R){let J={x:0,y:0};const ae=ie=>{var Se,ve;J={x:Math.abs(Math.round(ie.pageX)-(((Se=Y.current)==null?void 0:Se.x)??0)),y:Math.abs(Math.round(ie.pageY)-(((ve=Y.current)==null?void 0:ve.y)??0))}},ke=ie=>{J.x<=10&&J.y<=10?ie.preventDefault():R.contains(ie.target)||z(!1),document.removeEventListener("pointermove",ae),Y.current=null};return Y.current!==null&&(document.addEventListener("pointermove",ae),document.addEventListener("pointerup",ke,{capture:!0,once:!0})),()=>{document.removeEventListener("pointermove",ae),document.removeEventListener("pointerup",ke,{capture:!0})}}},[R,z,Y]),w.useEffect(()=>{const J=()=>z(!1);return window.addEventListener("blur",J),window.addEventListener("resize",J),()=>{window.removeEventListener("blur",J),window.removeEventListener("resize",J)}},[z]);const[L,V]=m3(J=>{const ae=$().filter(Se=>!Se.disabled),ke=ae.find(Se=>Se.ref.current===document.activeElement),ie=b3(ae,J,ke);ie&&setTimeout(()=>ie.ref.current.focus())}),B=w.useCallback((J,ae,ke)=>{const ie=!Q.current&&!ke;(x.value!==void 0&&x.value===ae||ie)&&(I(J),ie&&(Q.current=!0))},[x.value]),P=w.useCallback(()=>R==null?void 0:R.focus(),[R]),K=w.useCallback((J,ae,ke)=>{const ie=!Q.current&&!ke;(x.value!==void 0&&x.value===ae||ie)&&H(J)},[x.value]),ee=r==="popper"?Dk:Jj,Z=ee===Dk?{side:u,sideOffset:c,align:d,alignOffset:p,arrowPadding:g,collisionBoundary:m,collisionPadding:b,sticky:y,hideWhenDetached:v,avoidCollisions:k}:{};return E.jsx(Zj,{scope:n,content:R,viewport:_,onViewportChange:C,itemRefCallback:B,selectedItem:M,onItemLeave:P,itemTextRefCallback:K,focusSelectedItem:j,selectedItemText:D,position:r,isPositioned:U,searchRef:L,children:E.jsx(np,{as:_o,allowPinchZoom:!0,children:E.jsx(ep,{asChild:!0,trapped:x.open,onMountAutoFocus:J=>{J.preventDefault()},onUnmountAutoFocus:Ke(a,J=>{var ae;(ae=x.trigger)==null||ae.focus({preventScroll:!0}),J.preventDefault()}),children:E.jsx(qu,{asChild:!0,disableOutsidePointerEvents:!0,onEscapeKeyDown:o,onPointerDownOutside:s,onFocusOutside:J=>J.preventDefault(),onDismiss:()=>x.onOpenChange(!1),children:E.jsx(ee,{role:"listbox",id:x.contentId,"data-state":x.open?"open":"closed",dir:x.dir,onContextMenu:J=>J.preventDefault(),...A,...Z,onPlaced:()=>W(!0),ref:N,style:{display:"flex",flexDirection:"column",outline:"none",...A.style},onKeyDown:Ke(A.onKeyDown,J=>{const ae=J.ctrlKey||J.altKey||J.metaKey;if(J.key==="Tab"&&J.preventDefault(),!ae&&J.key.length===1&&V(J.key),["ArrowUp","ArrowDown","Home","End"].includes(J.key)){let ie=$().filter(Se=>!Se.disabled).map(Se=>Se.ref.current);if(["ArrowUp","End"].includes(J.key)&&(ie=ie.slice().reverse()),["ArrowUp","ArrowDown"].includes(J.key)){const Se=J.target,ve=ie.indexOf(Se);ie=ie.slice(ve+1)}setTimeout(()=>G(ie)),J.preventDefault()}})})})})})})});Qj.displayName=dZ;var fZ="SelectItemAlignedPosition",Jj=w.forwardRef((e,t)=>{const{__scopeSelect:n,onPlaced:r,...a}=e,o=Do(yi,n),s=Lo(yi,n),[u,c]=w.useState(null),[d,p]=w.useState(null),g=mt(t,N=>p(N)),m=hp(n),b=w.useRef(!1),y=w.useRef(!0),{viewport:v,selectedItem:k,selectedItemText:A,focusSelectedItem:x}=s,R=w.useCallback(()=>{if(o.trigger&&o.valueNode&&u&&d&&v&&k&&A){const N=o.trigger.getBoundingClientRect(),M=d.getBoundingClientRect(),I=o.valueNode.getBoundingClientRect(),D=A.getBoundingClientRect();if(o.dir!=="rtl"){const Se=D.left-M.left,ve=I.left-Se,De=N.left-ve,Ce=N.width+De,Ee=Math.max(Ce,M.width),te=window.innerWidth-Lr,fe=Ik(ve,[Lr,Math.max(Lr,te-Ee)]);u.style.minWidth=Ce+"px",u.style.left=fe+"px"}else{const Se=M.right-D.right,ve=window.innerWidth-I.right-Se,De=window.innerWidth-N.right-ve,Ce=N.width+De,Ee=Math.max(Ce,M.width),te=window.innerWidth-Lr,fe=Ik(ve,[Lr,Math.max(Lr,te-Ee)]);u.style.minWidth=Ce+"px",u.style.right=fe+"px"}const H=m(),$=window.innerHeight-Lr*2,U=v.scrollHeight,W=window.getComputedStyle(d),Q=parseInt(W.borderTopWidth,10),G=parseInt(W.paddingTop,10),j=parseInt(W.borderBottomWidth,10),z=parseInt(W.paddingBottom,10),Y=Q+G+U+z+j,L=Math.min(k.offsetHeight*5,Y),V=window.getComputedStyle(v),B=parseInt(V.paddingTop,10),P=parseInt(V.paddingBottom,10),K=N.top+N.height/2-Lr,ee=$-K,Z=k.offsetHeight/2,J=k.offsetTop+Z,ae=Q+G+J,ke=Y-ae;if(ae<=K){const Se=H.length>0&&k===H[H.length-1].ref.current;u.style.bottom="0px";const ve=d.clientHeight-v.offsetTop-v.offsetHeight,De=Math.max(ee,Z+(Se?P:0)+ve+j),Ce=ae+De;u.style.height=Ce+"px"}else{const Se=H.length>0&&k===H[0].ref.current;u.style.top="0px";const De=Math.max(K,Q+v.offsetTop+(Se?B:0)+Z)+ke;u.style.height=De+"px",v.scrollTop=ae-K+v.offsetTop}u.style.margin=`${Lr}px 0`,u.style.minHeight=L+"px",u.style.maxHeight=$+"px",r==null||r(),requestAnimationFrame(()=>b.current=!0)}},[m,o.trigger,o.valueNode,u,d,v,k,A,o.dir,r]);Rn(()=>R(),[R]);const[O,_]=w.useState();Rn(()=>{d&&_(window.getComputedStyle(d).zIndex)},[d]);const C=w.useCallback(N=>{N&&y.current===!0&&(R(),x==null||x(),y.current=!1)},[R,x]);return E.jsx(gZ,{scope:n,contentWrapper:u,shouldExpandOnScrollRef:b,onScrollButtonChange:C,children:E.jsx("div",{ref:c,style:{display:"flex",flexDirection:"column",position:"fixed",zIndex:O},children:E.jsx(Ze.div,{...a,ref:g,style:{boxSizing:"border-box",maxHeight:"100%",...a.style}})})})});Jj.displayName=fZ;var pZ="SelectPopperPosition",Dk=w.forwardRef((e,t)=>{const{__scopeSelect:n,align:r="start",collisionPadding:a=Lr,...o}=e,s=mp(n);return E.jsx(oT,{...s,...o,ref:t,align:r,collisionPadding:a,style:{boxSizing:"border-box",...o.style,"--radix-select-content-transform-origin":"var(--radix-popper-transform-origin)","--radix-select-content-available-width":"var(--radix-popper-available-width)","--radix-select-content-available-height":"var(--radix-popper-available-height)","--radix-select-trigger-width":"var(--radix-popper-anchor-width)","--radix-select-trigger-height":"var(--radix-popper-anchor-height)"}})});Dk.displayName=pZ;var[gZ,dT]=Ks(yi,{}),Lk="SelectViewport",e3=w.forwardRef((e,t)=>{const{__scopeSelect:n,nonce:r,...a}=e,o=Lo(Lk,n),s=dT(Lk,n),u=mt(t,o.onViewportChange),c=w.useRef(0);return E.jsxs(E.Fragment,{children:[E.jsx("style",{dangerouslySetInnerHTML:{__html:"[data-radix-select-viewport]{scrollbar-width:none;-ms-overflow-style:none;-webkit-overflow-scrolling:touch;}[data-radix-select-viewport]::-webkit-scrollbar{display:none}"},nonce:r}),E.jsx(gp.Slot,{scope:n,children:E.jsx(Ze.div,{"data-radix-select-viewport":"",role:"presentation",...a,ref:u,style:{position:"relative",flex:1,overflow:"hidden auto",...a.style},onScroll:Ke(a.onScroll,d=>{const p=d.currentTarget,{contentWrapper:g,shouldExpandOnScrollRef:m}=s;if(m!=null&&m.current&&g){const b=Math.abs(c.current-p.scrollTop);if(b>0){const y=window.innerHeight-Lr*2,v=parseFloat(g.style.minHeight),k=parseFloat(g.style.height),A=Math.max(v,k);if(A0?O:0,g.style.justifyContent="flex-end")}}}c.current=p.scrollTop})})})]})});e3.displayName=Lk;var t3="SelectGroup",[hZ,mZ]=Ks(t3),n3=w.forwardRef((e,t)=>{const{__scopeSelect:n,...r}=e,a=An();return E.jsx(hZ,{scope:n,id:a,children:E.jsx(Ze.div,{role:"group","aria-labelledby":a,...r,ref:t})})});n3.displayName=t3;var r3="SelectLabel",a3=w.forwardRef((e,t)=>{const{__scopeSelect:n,...r}=e,a=mZ(r3,n);return E.jsx(Ze.div,{id:a.id,...r,ref:t})});a3.displayName=r3;var Ef="SelectItem",[bZ,o3]=Ks(Ef),i3=w.forwardRef((e,t)=>{const{__scopeSelect:n,value:r,disabled:a=!1,textValue:o,...s}=e,u=Do(Ef,n),c=Lo(Ef,n),d=u.value===r,[p,g]=w.useState(o??""),[m,b]=w.useState(!1),y=mt(t,x=>{var R;return(R=c.itemRefCallback)==null?void 0:R.call(c,x,r,a)}),v=An(),k=w.useRef("touch"),A=()=>{a||(u.onValueChange(r),u.onOpenChange(!1))};if(r==="")throw new Error("A must have a value prop that is not an empty string. This is because the Select value can be set to an empty string to clear the selection and show the placeholder.");return E.jsx(bZ,{scope:n,value:r,disabled:a,textId:v,isSelected:d,onItemTextChange:w.useCallback(x=>{g(R=>R||((x==null?void 0:x.textContent)??"").trim())},[]),children:E.jsx(gp.ItemSlot,{scope:n,value:r,disabled:a,textValue:p,children:E.jsx(Ze.div,{role:"option","aria-labelledby":v,"data-highlighted":m?"":void 0,"aria-selected":d&&m,"data-state":d?"checked":"unchecked","aria-disabled":a||void 0,"data-disabled":a?"":void 0,tabIndex:a?void 0:-1,...s,ref:y,onFocus:Ke(s.onFocus,()=>b(!0)),onBlur:Ke(s.onBlur,()=>b(!1)),onClick:Ke(s.onClick,()=>{k.current!=="mouse"&&A()}),onPointerUp:Ke(s.onPointerUp,()=>{k.current==="mouse"&&A()}),onPointerDown:Ke(s.onPointerDown,x=>{k.current=x.pointerType}),onPointerMove:Ke(s.onPointerMove,x=>{var R;k.current=x.pointerType,a?(R=c.onItemLeave)==null||R.call(c):k.current==="mouse"&&x.currentTarget.focus({preventScroll:!0})}),onPointerLeave:Ke(s.onPointerLeave,x=>{var R;x.currentTarget===document.activeElement&&((R=c.onItemLeave)==null||R.call(c))}),onKeyDown:Ke(s.onKeyDown,x=>{var O;((O=c.searchRef)==null?void 0:O.current)!==""&&x.key===" "||(aZ.includes(x.key)&&A(),x.key===" "&&x.preventDefault())})})})})});i3.displayName=Ef;var pu="SelectItemText",s3=w.forwardRef((e,t)=>{const{__scopeSelect:n,className:r,style:a,...o}=e,s=Do(pu,n),u=Lo(pu,n),c=o3(pu,n),d=lZ(pu,n),[p,g]=w.useState(null),m=mt(t,A=>g(A),c.onItemTextChange,A=>{var x;return(x=u.itemTextRefCallback)==null?void 0:x.call(u,A,c.value,c.disabled)}),b=p==null?void 0:p.textContent,y=w.useMemo(()=>E.jsx("option",{value:c.value,disabled:c.disabled,children:b},c.value),[c.disabled,c.value,b]),{onNativeOptionAdd:v,onNativeOptionRemove:k}=d;return Rn(()=>(v(y),()=>k(y)),[v,k,y]),E.jsxs(E.Fragment,{children:[E.jsx(Ze.span,{id:c.textId,...o,ref:m}),c.isSelected&&s.valueNode&&!s.valueNodeHasChildren?Gu.createPortal(o.children,s.valueNode):null]})});s3.displayName=pu;var l3="SelectItemIndicator",u3=w.forwardRef((e,t)=>{const{__scopeSelect:n,...r}=e;return o3(l3,n).isSelected?E.jsx(Ze.span,{"aria-hidden":!0,...r,ref:t}):null});u3.displayName=l3;var Mk="SelectScrollUpButton",c3=w.forwardRef((e,t)=>{const n=Lo(Mk,e.__scopeSelect),r=dT(Mk,e.__scopeSelect),[a,o]=w.useState(!1),s=mt(t,r.onScrollButtonChange);return Rn(()=>{if(n.viewport&&n.isPositioned){let u=function(){const d=c.scrollTop>0;o(d)};const c=n.viewport;return u(),c.addEventListener("scroll",u),()=>c.removeEventListener("scroll",u)}},[n.viewport,n.isPositioned]),a?E.jsx(f3,{...e,ref:s,onAutoScroll:()=>{const{viewport:u,selectedItem:c}=n;u&&c&&(u.scrollTop=u.scrollTop-c.offsetHeight)}}):null});c3.displayName=Mk;var Pk="SelectScrollDownButton",d3=w.forwardRef((e,t)=>{const n=Lo(Pk,e.__scopeSelect),r=dT(Pk,e.__scopeSelect),[a,o]=w.useState(!1),s=mt(t,r.onScrollButtonChange);return Rn(()=>{if(n.viewport&&n.isPositioned){let u=function(){const d=c.scrollHeight-c.clientHeight,p=Math.ceil(c.scrollTop)c.removeEventListener("scroll",u)}},[n.viewport,n.isPositioned]),a?E.jsx(f3,{...e,ref:s,onAutoScroll:()=>{const{viewport:u,selectedItem:c}=n;u&&c&&(u.scrollTop=u.scrollTop+c.offsetHeight)}}):null});d3.displayName=Pk;var f3=w.forwardRef((e,t)=>{const{__scopeSelect:n,onAutoScroll:r,...a}=e,o=Lo("SelectScrollButton",n),s=w.useRef(null),u=hp(n),c=w.useCallback(()=>{s.current!==null&&(window.clearInterval(s.current),s.current=null)},[]);return w.useEffect(()=>()=>c(),[c]),Rn(()=>{var p;const d=u().find(g=>g.ref.current===document.activeElement);(p=d==null?void 0:d.ref.current)==null||p.scrollIntoView({block:"nearest"})},[u]),E.jsx(Ze.div,{"aria-hidden":!0,...a,ref:t,style:{flexShrink:0,...a.style},onPointerDown:Ke(a.onPointerDown,()=>{s.current===null&&(s.current=window.setInterval(r,50))}),onPointerMove:Ke(a.onPointerMove,()=>{var d;(d=o.onItemLeave)==null||d.call(o),s.current===null&&(s.current=window.setInterval(r,50))}),onPointerLeave:Ke(a.onPointerLeave,()=>{c()})})}),yZ="SelectSeparator",p3=w.forwardRef((e,t)=>{const{__scopeSelect:n,...r}=e;return E.jsx(Ze.div,{"aria-hidden":!0,...r,ref:t})});p3.displayName=yZ;var Fk="SelectArrow",vZ=w.forwardRef((e,t)=>{const{__scopeSelect:n,...r}=e,a=mp(n),o=Do(Fk,n),s=Lo(Fk,n);return o.open&&s.position==="popper"?E.jsx(iT,{...a,...r,ref:t}):null});vZ.displayName=Fk;function g3(e){return e===""||e===void 0}var h3=w.forwardRef((e,t)=>{const{value:n,...r}=e,a=w.useRef(null),o=mt(t,a),s=Gj(n);return w.useEffect(()=>{const u=a.current,c=window.HTMLSelectElement.prototype,p=Object.getOwnPropertyDescriptor(c,"value").set;if(s!==n&&p){const g=new Event("change",{bubbles:!0});p.call(u,n),u.dispatchEvent(g)}},[s,n]),E.jsx(sT,{asChild:!0,children:E.jsx("select",{...r,ref:o,defaultValue:n})})});h3.displayName="BubbleSelect";function m3(e){const t=yn(e),n=w.useRef(""),r=w.useRef(0),a=w.useCallback(s=>{const u=n.current+s;t(u),function c(d){n.current=d,window.clearTimeout(r.current),d!==""&&(r.current=window.setTimeout(()=>c(""),1e3))}(u)},[t]),o=w.useCallback(()=>{n.current="",window.clearTimeout(r.current)},[]);return w.useEffect(()=>()=>window.clearTimeout(r.current),[]),[n,a,o]}function b3(e,t,n){const a=t.length>1&&Array.from(t).every(d=>d===t[0])?t[0]:t,o=n?e.indexOf(n):-1;let s=SZ(e,Math.max(o,0));a.length===1&&(s=s.filter(d=>d!==n));const c=s.find(d=>d.textValue.toLowerCase().startsWith(a.toLowerCase()));return c!==n?c:void 0}function SZ(e,t){return e.map((n,r)=>e[(t+r)%e.length])}var EZ=Hj,y3=qj,wZ=Wj,xZ=Yj,kZ=Kj,v3=Xj,TZ=e3,AZ=n3,S3=a3,E3=i3,RZ=s3,CZ=u3,w3=c3,x3=d3,k3=p3;/** +For more information, see https://radix-ui.com/primitives/docs/components/alert-dialog`;return w.useEffect(()=>{var r;document.getElementById((r=e.current)==null?void 0:r.getAttribute("aria-describedby"))||console.warn(t)},[t,e]),null},uK=OU,cK=IU,GU=DU,HU=LU,$U=BU,qU=jU,VU=PU,WU=zU;const X_=e=>typeof e=="boolean"?`${e}`:e===0?"0":e,Z_=oB,dK=(e,t)=>n=>{var r;if((t==null?void 0:t.variants)==null)return Z_(e,n==null?void 0:n.class,n==null?void 0:n.className);const{variants:a,defaultVariants:o}=t,s=Object.keys(a).map(d=>{const p=n==null?void 0:n[d],g=o==null?void 0:o[d];if(p===null)return null;const m=X_(p)||X_(g);return a[d][m]}),u=n&&Object.entries(n).reduce((d,p)=>{let[g,m]=p;return m===void 0||(d[g]=m),d},{}),c=t==null||(r=t.compoundVariants)===null||r===void 0?void 0:r.reduce((d,p)=>{let{class:g,className:m,...b}=p;return Object.entries(b).every(y=>{let[v,k]=y;return Array.isArray(k)?k.includes({...o,...u}[v]):{...o,...u}[v]===k})?[...d,g,m]:d},[]);return Z_(e,s,c,n==null?void 0:n.class,n==null?void 0:n.className)},fK=["top","right","bottom","left"],No=Math.min,er=Math.max,mf=Math.round,xd=Math.floor,aa=e=>({x:e,y:e}),pK={left:"right",right:"left",bottom:"top",top:"bottom"},gK={start:"end",end:"start"};function Rk(e,t,n){return er(e,No(t,n))}function Ua(e,t){return typeof e=="function"?e(t):e}function ja(e){return e.split("-")[0]}function qs(e){return e.split("-")[1]}function K0(e){return e==="x"?"y":"x"}function X0(e){return e==="y"?"height":"width"}function Oo(e){return["top","bottom"].includes(ja(e))?"y":"x"}function Z0(e){return K0(Oo(e))}function hK(e,t,n){n===void 0&&(n=!1);const r=qs(e),a=Z0(e),o=X0(a);let s=a==="x"?r===(n?"end":"start")?"right":"left":r==="start"?"bottom":"top";return t.reference[o]>t.floating[o]&&(s=bf(s)),[s,bf(s)]}function mK(e){const t=bf(e);return[Ck(e),t,Ck(t)]}function Ck(e){return e.replace(/start|end/g,t=>gK[t])}function bK(e,t,n){const r=["left","right"],a=["right","left"],o=["top","bottom"],s=["bottom","top"];switch(e){case"top":case"bottom":return n?t?a:r:t?r:a;case"left":case"right":return t?o:s;default:return[]}}function yK(e,t,n,r){const a=qs(e);let o=bK(ja(e),n==="start",r);return a&&(o=o.map(s=>s+"-"+a),t&&(o=o.concat(o.map(Ck)))),o}function bf(e){return e.replace(/left|right|bottom|top/g,t=>pK[t])}function vK(e){return{top:0,right:0,bottom:0,left:0,...e}}function YU(e){return typeof e!="number"?vK(e):{top:e,right:e,bottom:e,left:e}}function yf(e){const{x:t,y:n,width:r,height:a}=e;return{width:r,height:a,top:n,left:t,right:t+r,bottom:n+a,x:t,y:n}}function Q_(e,t,n){let{reference:r,floating:a}=e;const o=Oo(t),s=Z0(t),u=X0(s),c=ja(t),d=o==="y",p=r.x+r.width/2-a.width/2,g=r.y+r.height/2-a.height/2,m=r[u]/2-a[u]/2;let b;switch(c){case"top":b={x:p,y:r.y-a.height};break;case"bottom":b={x:p,y:r.y+r.height};break;case"right":b={x:r.x+r.width,y:g};break;case"left":b={x:r.x-a.width,y:g};break;default:b={x:r.x,y:r.y}}switch(qs(t)){case"start":b[s]-=m*(n&&d?-1:1);break;case"end":b[s]+=m*(n&&d?-1:1);break}return b}const SK=async(e,t,n)=>{const{placement:r="bottom",strategy:a="absolute",middleware:o=[],platform:s}=n,u=o.filter(Boolean),c=await(s.isRTL==null?void 0:s.isRTL(t));let d=await s.getElementRects({reference:e,floating:t,strategy:a}),{x:p,y:g}=Q_(d,r,c),m=r,b={},y=0;for(let v=0;v({name:"arrow",options:e,async fn(t){const{x:n,y:r,placement:a,rects:o,platform:s,elements:u,middlewareData:c}=t,{element:d,padding:p=0}=Ua(e,t)||{};if(d==null)return{};const g=YU(p),m={x:n,y:r},b=Z0(a),y=X0(b),v=await s.getDimensions(d),k=b==="y",A=k?"top":"left",x=k?"bottom":"right",R=k?"clientHeight":"clientWidth",O=o.reference[y]+o.reference[b]-m[b]-o.floating[y],_=m[b]-o.reference[b],C=await(s.getOffsetParent==null?void 0:s.getOffsetParent(d));let N=C?C[R]:0;(!N||!await(s.isElement==null?void 0:s.isElement(C)))&&(N=u.floating[R]||o.floating[y]);const M=O/2-_/2,I=N/2-v[y]/2-1,D=No(g[A],I),H=No(g[x],I),$=D,U=N-v[y]-H,W=N/2-v[y]/2+M,Q=Rk($,W,U),G=!c.arrow&&qs(a)!=null&&W!==Q&&o.reference[y]/2-(W<$?D:H)-v[y]/2<0,j=G?W<$?W-$:W-U:0;return{[b]:m[b]+j,data:{[b]:Q,centerOffset:W-Q-j,...G&&{alignmentOffset:j}},reset:G}}}),wK=function(e){return e===void 0&&(e={}),{name:"flip",options:e,async fn(t){var n,r;const{placement:a,middlewareData:o,rects:s,initialPlacement:u,platform:c,elements:d}=t,{mainAxis:p=!0,crossAxis:g=!0,fallbackPlacements:m,fallbackStrategy:b="bestFit",fallbackAxisSideDirection:y="none",flipAlignment:v=!0,...k}=Ua(e,t);if((n=o.arrow)!=null&&n.alignmentOffset)return{};const A=ja(a),x=Oo(u),R=ja(u)===u,O=await(c.isRTL==null?void 0:c.isRTL(d.floating)),_=m||(R||!v?[bf(u)]:mK(u)),C=y!=="none";!m&&C&&_.push(...yK(u,v,y,O));const N=[u,..._],M=await xu(t,k),I=[];let D=((r=o.flip)==null?void 0:r.overflows)||[];if(p&&I.push(M[A]),g){const W=hK(a,s,O);I.push(M[W[0]],M[W[1]])}if(D=[...D,{placement:a,overflows:I}],!I.every(W=>W<=0)){var H,$;const W=(((H=o.flip)==null?void 0:H.index)||0)+1,Q=N[W];if(Q)return{data:{index:W,overflows:D},reset:{placement:Q}};let G=($=D.filter(j=>j.overflows[0]<=0).sort((j,z)=>j.overflows[1]-z.overflows[1])[0])==null?void 0:$.placement;if(!G)switch(b){case"bestFit":{var U;const j=(U=D.filter(z=>{if(C){const Y=Oo(z.placement);return Y===x||Y==="y"}return!0}).map(z=>[z.placement,z.overflows.filter(Y=>Y>0).reduce((Y,L)=>Y+L,0)]).sort((z,Y)=>z[1]-Y[1])[0])==null?void 0:U[0];j&&(G=j);break}case"initialPlacement":G=u;break}if(a!==G)return{reset:{placement:G}}}return{}}}};function J_(e,t){return{top:e.top-t.height,right:e.right-t.width,bottom:e.bottom-t.height,left:e.left-t.width}}function eN(e){return fK.some(t=>e[t]>=0)}const xK=function(e){return e===void 0&&(e={}),{name:"hide",options:e,async fn(t){const{rects:n}=t,{strategy:r="referenceHidden",...a}=Ua(e,t);switch(r){case"referenceHidden":{const o=await xu(t,{...a,elementContext:"reference"}),s=J_(o,n.reference);return{data:{referenceHiddenOffsets:s,referenceHidden:eN(s)}}}case"escaped":{const o=await xu(t,{...a,altBoundary:!0}),s=J_(o,n.floating);return{data:{escapedOffsets:s,escaped:eN(s)}}}default:return{}}}}};async function kK(e,t){const{placement:n,platform:r,elements:a}=e,o=await(r.isRTL==null?void 0:r.isRTL(a.floating)),s=ja(n),u=qs(n),c=Oo(n)==="y",d=["left","top"].includes(s)?-1:1,p=o&&c?-1:1,g=Ua(t,e);let{mainAxis:m,crossAxis:b,alignmentAxis:y}=typeof g=="number"?{mainAxis:g,crossAxis:0,alignmentAxis:null}:{mainAxis:g.mainAxis||0,crossAxis:g.crossAxis||0,alignmentAxis:g.alignmentAxis};return u&&typeof y=="number"&&(b=u==="end"?y*-1:y),c?{x:b*p,y:m*d}:{x:m*d,y:b*p}}const TK=function(e){return e===void 0&&(e=0),{name:"offset",options:e,async fn(t){var n,r;const{x:a,y:o,placement:s,middlewareData:u}=t,c=await kK(t,e);return s===((n=u.offset)==null?void 0:n.placement)&&(r=u.arrow)!=null&&r.alignmentOffset?{}:{x:a+c.x,y:o+c.y,data:{...c,placement:s}}}}},AK=function(e){return e===void 0&&(e={}),{name:"shift",options:e,async fn(t){const{x:n,y:r,placement:a}=t,{mainAxis:o=!0,crossAxis:s=!1,limiter:u={fn:k=>{let{x:A,y:x}=k;return{x:A,y:x}}},...c}=Ua(e,t),d={x:n,y:r},p=await xu(t,c),g=Oo(ja(a)),m=K0(g);let b=d[m],y=d[g];if(o){const k=m==="y"?"top":"left",A=m==="y"?"bottom":"right",x=b+p[k],R=b-p[A];b=Rk(x,b,R)}if(s){const k=g==="y"?"top":"left",A=g==="y"?"bottom":"right",x=y+p[k],R=y-p[A];y=Rk(x,y,R)}const v=u.fn({...t,[m]:b,[g]:y});return{...v,data:{x:v.x-n,y:v.y-r,enabled:{[m]:o,[g]:s}}}}}},RK=function(e){return e===void 0&&(e={}),{options:e,fn(t){const{x:n,y:r,placement:a,rects:o,middlewareData:s}=t,{offset:u=0,mainAxis:c=!0,crossAxis:d=!0}=Ua(e,t),p={x:n,y:r},g=Oo(a),m=K0(g);let b=p[m],y=p[g];const v=Ua(u,t),k=typeof v=="number"?{mainAxis:v,crossAxis:0}:{mainAxis:0,crossAxis:0,...v};if(c){const R=m==="y"?"height":"width",O=o.reference[m]-o.floating[R]+k.mainAxis,_=o.reference[m]+o.reference[R]-k.mainAxis;b_&&(b=_)}if(d){var A,x;const R=m==="y"?"width":"height",O=["top","left"].includes(ja(a)),_=o.reference[g]-o.floating[R]+(O&&((A=s.offset)==null?void 0:A[g])||0)+(O?0:k.crossAxis),C=o.reference[g]+o.reference[R]+(O?0:((x=s.offset)==null?void 0:x[g])||0)-(O?k.crossAxis:0);y<_?y=_:y>C&&(y=C)}return{[m]:b,[g]:y}}}},CK=function(e){return e===void 0&&(e={}),{name:"size",options:e,async fn(t){var n,r;const{placement:a,rects:o,platform:s,elements:u}=t,{apply:c=()=>{},...d}=Ua(e,t),p=await xu(t,d),g=ja(a),m=qs(a),b=Oo(a)==="y",{width:y,height:v}=o.floating;let k,A;g==="top"||g==="bottom"?(k=g,A=m===(await(s.isRTL==null?void 0:s.isRTL(u.floating))?"start":"end")?"left":"right"):(A=g,k=m==="end"?"top":"bottom");const x=v-p.top-p.bottom,R=y-p.left-p.right,O=No(v-p[k],x),_=No(y-p[A],R),C=!t.middlewareData.shift;let N=O,M=_;if((n=t.middlewareData.shift)!=null&&n.enabled.x&&(M=R),(r=t.middlewareData.shift)!=null&&r.enabled.y&&(N=x),C&&!m){const D=er(p.left,0),H=er(p.right,0),$=er(p.top,0),U=er(p.bottom,0);b?M=y-2*(D!==0||H!==0?D+H:er(p.left,p.right)):N=v-2*($!==0||U!==0?$+U:er(p.top,p.bottom))}await c({...t,availableWidth:M,availableHeight:N});const I=await s.getDimensions(u.floating);return y!==I.width||v!==I.height?{reset:{rects:!0}}:{}}}};function op(){return typeof window<"u"}function Vs(e){return KU(e)?(e.nodeName||"").toLowerCase():"#document"}function rr(e){var t;return(e==null||(t=e.ownerDocument)==null?void 0:t.defaultView)||window}function sa(e){var t;return(t=(KU(e)?e.ownerDocument:e.document)||window.document)==null?void 0:t.documentElement}function KU(e){return op()?e instanceof Node||e instanceof rr(e).Node:!1}function Ur(e){return op()?e instanceof Element||e instanceof rr(e).Element:!1}function oa(e){return op()?e instanceof HTMLElement||e instanceof rr(e).HTMLElement:!1}function tN(e){return!op()||typeof ShadowRoot>"u"?!1:e instanceof ShadowRoot||e instanceof rr(e).ShadowRoot}function Vu(e){const{overflow:t,overflowX:n,overflowY:r,display:a}=jr(e);return/auto|scroll|overlay|hidden|clip/.test(t+r+n)&&!["inline","contents"].includes(a)}function _K(e){return["table","td","th"].includes(Vs(e))}function ip(e){return[":popover-open",":modal"].some(t=>{try{return e.matches(t)}catch{return!1}})}function Q0(e){const t=J0(),n=Ur(e)?jr(e):e;return["transform","translate","scale","rotate","perspective"].some(r=>n[r]?n[r]!=="none":!1)||(n.containerType?n.containerType!=="normal":!1)||!t&&(n.backdropFilter?n.backdropFilter!=="none":!1)||!t&&(n.filter?n.filter!=="none":!1)||["transform","translate","scale","rotate","perspective","filter"].some(r=>(n.willChange||"").includes(r))||["paint","layout","strict","content"].some(r=>(n.contain||"").includes(r))}function NK(e){let t=Io(e);for(;oa(t)&&!Os(t);){if(Q0(t))return t;if(ip(t))return null;t=Io(t)}return null}function J0(){return typeof CSS>"u"||!CSS.supports?!1:CSS.supports("-webkit-backdrop-filter","none")}function Os(e){return["html","body","#document"].includes(Vs(e))}function jr(e){return rr(e).getComputedStyle(e)}function sp(e){return Ur(e)?{scrollLeft:e.scrollLeft,scrollTop:e.scrollTop}:{scrollLeft:e.scrollX,scrollTop:e.scrollY}}function Io(e){if(Vs(e)==="html")return e;const t=e.assignedSlot||e.parentNode||tN(e)&&e.host||sa(e);return tN(t)?t.host:t}function XU(e){const t=Io(e);return Os(t)?e.ownerDocument?e.ownerDocument.body:e.body:oa(t)&&Vu(t)?t:XU(t)}function ku(e,t,n){var r;t===void 0&&(t=[]),n===void 0&&(n=!0);const a=XU(e),o=a===((r=e.ownerDocument)==null?void 0:r.body),s=rr(a);if(o){const u=_k(s);return t.concat(s,s.visualViewport||[],Vu(a)?a:[],u&&n?ku(u):[])}return t.concat(a,ku(a,[],n))}function _k(e){return e.parent&&Object.getPrototypeOf(e.parent)?e.frameElement:null}function ZU(e){const t=jr(e);let n=parseFloat(t.width)||0,r=parseFloat(t.height)||0;const a=oa(e),o=a?e.offsetWidth:n,s=a?e.offsetHeight:r,u=mf(n)!==o||mf(r)!==s;return u&&(n=o,r=s),{width:n,height:r,$:u}}function eT(e){return Ur(e)?e:e.contextElement}function Rs(e){const t=eT(e);if(!oa(t))return aa(1);const n=t.getBoundingClientRect(),{width:r,height:a,$:o}=ZU(t);let s=(o?mf(n.width):n.width)/r,u=(o?mf(n.height):n.height)/a;return(!s||!Number.isFinite(s))&&(s=1),(!u||!Number.isFinite(u))&&(u=1),{x:s,y:u}}const OK=aa(0);function QU(e){const t=rr(e);return!J0()||!t.visualViewport?OK:{x:t.visualViewport.offsetLeft,y:t.visualViewport.offsetTop}}function IK(e,t,n){return t===void 0&&(t=!1),!n||t&&n!==rr(e)?!1:t}function bi(e,t,n,r){t===void 0&&(t=!1),n===void 0&&(n=!1);const a=e.getBoundingClientRect(),o=eT(e);let s=aa(1);t&&(r?Ur(r)&&(s=Rs(r)):s=Rs(e));const u=IK(o,n,r)?QU(o):aa(0);let c=(a.left+u.x)/s.x,d=(a.top+u.y)/s.y,p=a.width/s.x,g=a.height/s.y;if(o){const m=rr(o),b=r&&Ur(r)?rr(r):r;let y=m,v=_k(y);for(;v&&r&&b!==y;){const k=Rs(v),A=v.getBoundingClientRect(),x=jr(v),R=A.left+(v.clientLeft+parseFloat(x.paddingLeft))*k.x,O=A.top+(v.clientTop+parseFloat(x.paddingTop))*k.y;c*=k.x,d*=k.y,p*=k.x,g*=k.y,c+=R,d+=O,y=rr(v),v=_k(y)}}return yf({width:p,height:g,x:c,y:d})}function tT(e,t){const n=sp(e).scrollLeft;return t?t.left+n:bi(sa(e)).left+n}function JU(e,t,n){n===void 0&&(n=!1);const r=e.getBoundingClientRect(),a=r.left+t.scrollLeft-(n?0:tT(e,r)),o=r.top+t.scrollTop;return{x:a,y:o}}function DK(e){let{elements:t,rect:n,offsetParent:r,strategy:a}=e;const o=a==="fixed",s=sa(r),u=t?ip(t.floating):!1;if(r===s||u&&o)return n;let c={scrollLeft:0,scrollTop:0},d=aa(1);const p=aa(0),g=oa(r);if((g||!g&&!o)&&((Vs(r)!=="body"||Vu(s))&&(c=sp(r)),oa(r))){const b=bi(r);d=Rs(r),p.x=b.x+r.clientLeft,p.y=b.y+r.clientTop}const m=s&&!g&&!o?JU(s,c,!0):aa(0);return{width:n.width*d.x,height:n.height*d.y,x:n.x*d.x-c.scrollLeft*d.x+p.x+m.x,y:n.y*d.y-c.scrollTop*d.y+p.y+m.y}}function LK(e){return Array.from(e.getClientRects())}function MK(e){const t=sa(e),n=sp(e),r=e.ownerDocument.body,a=er(t.scrollWidth,t.clientWidth,r.scrollWidth,r.clientWidth),o=er(t.scrollHeight,t.clientHeight,r.scrollHeight,r.clientHeight);let s=-n.scrollLeft+tT(e);const u=-n.scrollTop;return jr(r).direction==="rtl"&&(s+=er(t.clientWidth,r.clientWidth)-a),{width:a,height:o,x:s,y:u}}function PK(e,t){const n=rr(e),r=sa(e),a=n.visualViewport;let o=r.clientWidth,s=r.clientHeight,u=0,c=0;if(a){o=a.width,s=a.height;const d=J0();(!d||d&&t==="fixed")&&(u=a.offsetLeft,c=a.offsetTop)}return{width:o,height:s,x:u,y:c}}function FK(e,t){const n=bi(e,!0,t==="fixed"),r=n.top+e.clientTop,a=n.left+e.clientLeft,o=oa(e)?Rs(e):aa(1),s=e.clientWidth*o.x,u=e.clientHeight*o.y,c=a*o.x,d=r*o.y;return{width:s,height:u,x:c,y:d}}function nN(e,t,n){let r;if(t==="viewport")r=PK(e,n);else if(t==="document")r=MK(sa(e));else if(Ur(t))r=FK(t,n);else{const a=QU(e);r={x:t.x-a.x,y:t.y-a.y,width:t.width,height:t.height}}return yf(r)}function ej(e,t){const n=Io(e);return n===t||!Ur(n)||Os(n)?!1:jr(n).position==="fixed"||ej(n,t)}function zK(e,t){const n=t.get(e);if(n)return n;let r=ku(e,[],!1).filter(u=>Ur(u)&&Vs(u)!=="body"),a=null;const o=jr(e).position==="fixed";let s=o?Io(e):e;for(;Ur(s)&&!Os(s);){const u=jr(s),c=Q0(s);!c&&u.position==="fixed"&&(a=null),(o?!c&&!a:!c&&u.position==="static"&&!!a&&["absolute","fixed"].includes(a.position)||Vu(s)&&!c&&ej(e,s))?r=r.filter(p=>p!==s):a=u,s=Io(s)}return t.set(e,r),r}function BK(e){let{element:t,boundary:n,rootBoundary:r,strategy:a}=e;const s=[...n==="clippingAncestors"?ip(t)?[]:zK(t,this._c):[].concat(n),r],u=s[0],c=s.reduce((d,p)=>{const g=nN(t,p,a);return d.top=er(g.top,d.top),d.right=No(g.right,d.right),d.bottom=No(g.bottom,d.bottom),d.left=er(g.left,d.left),d},nN(t,u,a));return{width:c.right-c.left,height:c.bottom-c.top,x:c.left,y:c.top}}function UK(e){const{width:t,height:n}=ZU(e);return{width:t,height:n}}function jK(e,t,n){const r=oa(t),a=sa(t),o=n==="fixed",s=bi(e,!0,o,t);let u={scrollLeft:0,scrollTop:0};const c=aa(0);if(r||!r&&!o)if((Vs(t)!=="body"||Vu(a))&&(u=sp(t)),r){const m=bi(t,!0,o,t);c.x=m.x+t.clientLeft,c.y=m.y+t.clientTop}else a&&(c.x=tT(a));const d=a&&!r&&!o?JU(a,u):aa(0),p=s.left+u.scrollLeft-c.x-d.x,g=s.top+u.scrollTop-c.y-d.y;return{x:p,y:g,width:s.width,height:s.height}}function fm(e){return jr(e).position==="static"}function rN(e,t){if(!oa(e)||jr(e).position==="fixed")return null;if(t)return t(e);let n=e.offsetParent;return sa(e)===n&&(n=n.ownerDocument.body),n}function tj(e,t){const n=rr(e);if(ip(e))return n;if(!oa(e)){let a=Io(e);for(;a&&!Os(a);){if(Ur(a)&&!fm(a))return a;a=Io(a)}return n}let r=rN(e,t);for(;r&&_K(r)&&fm(r);)r=rN(r,t);return r&&Os(r)&&fm(r)&&!Q0(r)?n:r||NK(e)||n}const GK=async function(e){const t=this.getOffsetParent||tj,n=this.getDimensions,r=await n(e.floating);return{reference:jK(e.reference,await t(e.floating),e.strategy),floating:{x:0,y:0,width:r.width,height:r.height}}};function HK(e){return jr(e).direction==="rtl"}const $K={convertOffsetParentRelativeRectToViewportRelativeRect:DK,getDocumentElement:sa,getClippingRect:BK,getOffsetParent:tj,getElementRects:GK,getClientRects:LK,getDimensions:UK,getScale:Rs,isElement:Ur,isRTL:HK};function nj(e,t){return e.x===t.x&&e.y===t.y&&e.width===t.width&&e.height===t.height}function qK(e,t){let n=null,r;const a=sa(e);function o(){var u;clearTimeout(r),(u=n)==null||u.disconnect(),n=null}function s(u,c){u===void 0&&(u=!1),c===void 0&&(c=1),o();const d=e.getBoundingClientRect(),{left:p,top:g,width:m,height:b}=d;if(u||t(),!m||!b)return;const y=xd(g),v=xd(a.clientWidth-(p+m)),k=xd(a.clientHeight-(g+b)),A=xd(p),R={rootMargin:-y+"px "+-v+"px "+-k+"px "+-A+"px",threshold:er(0,No(1,c))||1};let O=!0;function _(C){const N=C[0].intersectionRatio;if(N!==c){if(!O)return s();N?s(!1,N):r=setTimeout(()=>{s(!1,1e-7)},1e3)}N===1&&!nj(d,e.getBoundingClientRect())&&s(),O=!1}try{n=new IntersectionObserver(_,{...R,root:a.ownerDocument})}catch{n=new IntersectionObserver(_,R)}n.observe(e)}return s(!0),o}function VK(e,t,n,r){r===void 0&&(r={});const{ancestorScroll:a=!0,ancestorResize:o=!0,elementResize:s=typeof ResizeObserver=="function",layoutShift:u=typeof IntersectionObserver=="function",animationFrame:c=!1}=r,d=eT(e),p=a||o?[...d?ku(d):[],...ku(t)]:[];p.forEach(A=>{a&&A.addEventListener("scroll",n,{passive:!0}),o&&A.addEventListener("resize",n)});const g=d&&u?qK(d,n):null;let m=-1,b=null;s&&(b=new ResizeObserver(A=>{let[x]=A;x&&x.target===d&&b&&(b.unobserve(t),cancelAnimationFrame(m),m=requestAnimationFrame(()=>{var R;(R=b)==null||R.observe(t)})),n()}),d&&!c&&b.observe(d),b.observe(t));let y,v=c?bi(e):null;c&&k();function k(){const A=bi(e);v&&!nj(v,A)&&n(),v=A,y=requestAnimationFrame(k)}return n(),()=>{var A;p.forEach(x=>{a&&x.removeEventListener("scroll",n),o&&x.removeEventListener("resize",n)}),g==null||g(),(A=b)==null||A.disconnect(),b=null,c&&cancelAnimationFrame(y)}}const WK=TK,YK=AK,KK=wK,XK=CK,ZK=xK,aN=EK,QK=RK,JK=(e,t,n)=>{const r=new Map,a={platform:$K,...n},o={...a.platform,_c:r};return SK(e,t,{...a,platform:o})};var Qd=typeof document<"u"?w.useLayoutEffect:w.useEffect;function vf(e,t){if(e===t)return!0;if(typeof e!=typeof t)return!1;if(typeof e=="function"&&e.toString()===t.toString())return!0;let n,r,a;if(e&&t&&typeof e=="object"){if(Array.isArray(e)){if(n=e.length,n!==t.length)return!1;for(r=n;r--!==0;)if(!vf(e[r],t[r]))return!1;return!0}if(a=Object.keys(e),n=a.length,n!==Object.keys(t).length)return!1;for(r=n;r--!==0;)if(!{}.hasOwnProperty.call(t,a[r]))return!1;for(r=n;r--!==0;){const o=a[r];if(!(o==="_owner"&&e.$$typeof)&&!vf(e[o],t[o]))return!1}return!0}return e!==e&&t!==t}function rj(e){return typeof window>"u"?1:(e.ownerDocument.defaultView||window).devicePixelRatio||1}function oN(e,t){const n=rj(e);return Math.round(t*n)/n}function pm(e){const t=w.useRef(e);return Qd(()=>{t.current=e}),t}function eX(e){e===void 0&&(e={});const{placement:t="bottom",strategy:n="absolute",middleware:r=[],platform:a,elements:{reference:o,floating:s}={},transform:u=!0,whileElementsMounted:c,open:d}=e,[p,g]=w.useState({x:0,y:0,strategy:n,placement:t,middlewareData:{},isPositioned:!1}),[m,b]=w.useState(r);vf(m,r)||b(r);const[y,v]=w.useState(null),[k,A]=w.useState(null),x=w.useCallback(z=>{z!==C.current&&(C.current=z,v(z))},[]),R=w.useCallback(z=>{z!==N.current&&(N.current=z,A(z))},[]),O=o||y,_=s||k,C=w.useRef(null),N=w.useRef(null),M=w.useRef(p),I=c!=null,D=pm(c),H=pm(a),$=pm(d),U=w.useCallback(()=>{if(!C.current||!N.current)return;const z={placement:t,strategy:n,middleware:m};H.current&&(z.platform=H.current),JK(C.current,N.current,z).then(Y=>{const L={...Y,isPositioned:$.current!==!1};W.current&&!vf(M.current,L)&&(M.current=L,Gu.flushSync(()=>{g(L)}))})},[m,t,n,H,$]);Qd(()=>{d===!1&&M.current.isPositioned&&(M.current.isPositioned=!1,g(z=>({...z,isPositioned:!1})))},[d]);const W=w.useRef(!1);Qd(()=>(W.current=!0,()=>{W.current=!1}),[]),Qd(()=>{if(O&&(C.current=O),_&&(N.current=_),O&&_){if(D.current)return D.current(O,_,U);U()}},[O,_,U,D,I]);const Q=w.useMemo(()=>({reference:C,floating:N,setReference:x,setFloating:R}),[x,R]),G=w.useMemo(()=>({reference:O,floating:_}),[O,_]),j=w.useMemo(()=>{const z={position:n,left:0,top:0};if(!G.floating)return z;const Y=oN(G.floating,p.x),L=oN(G.floating,p.y);return u?{...z,transform:"translate("+Y+"px, "+L+"px)",...rj(G.floating)>=1.5&&{willChange:"transform"}}:{position:n,left:Y,top:L}},[n,u,G.floating,p.x,p.y]);return w.useMemo(()=>({...p,update:U,refs:Q,elements:G,floatingStyles:j}),[p,U,Q,G,j])}const tX=e=>{function t(n){return{}.hasOwnProperty.call(n,"current")}return{name:"arrow",options:e,fn(n){const{element:r,padding:a}=typeof e=="function"?e(n):e;return r&&t(r)?r.current!=null?aN({element:r.current,padding:a}).fn(n):{}:r?aN({element:r,padding:a}).fn(n):{}}}},nX=(e,t)=>({...WK(e),options:[e,t]}),rX=(e,t)=>({...YK(e),options:[e,t]}),aX=(e,t)=>({...QK(e),options:[e,t]}),oX=(e,t)=>({...KK(e),options:[e,t]}),iX=(e,t)=>({...XK(e),options:[e,t]}),sX=(e,t)=>({...ZK(e),options:[e,t]}),lX=(e,t)=>({...tX(e),options:[e,t]});var uX="Arrow",aj=w.forwardRef((e,t)=>{const{children:n,width:r=10,height:a=5,...o}=e;return E.jsx(Ze.svg,{...o,ref:t,width:r,height:a,viewBox:"0 0 30 10",preserveAspectRatio:"none",children:e.asChild?n:E.jsx("polygon",{points:"0,0 30,0 15,10"})})});aj.displayName=uX;var cX=aj;function oj(e){const[t,n]=w.useState(void 0);return Rn(()=>{if(e){n({width:e.offsetWidth,height:e.offsetHeight});const r=new ResizeObserver(a=>{if(!Array.isArray(a)||!a.length)return;const o=a[0];let s,u;if("borderBoxSize"in o){const c=o.borderBoxSize,d=Array.isArray(c)?c[0]:c;s=d.inlineSize,u=d.blockSize}else s=e.offsetWidth,u=e.offsetHeight;n({width:s,height:u})});return r.observe(e,{box:"border-box"}),()=>r.unobserve(e)}else n(void 0)},[e]),t}var nT="Popper",[ij,Ws]=wr(nT),[dX,sj]=ij(nT),lj=e=>{const{__scopePopper:t,children:n}=e,[r,a]=w.useState(null);return E.jsx(dX,{scope:t,anchor:r,onAnchorChange:a,children:n})};lj.displayName=nT;var uj="PopperAnchor",cj=w.forwardRef((e,t)=>{const{__scopePopper:n,virtualRef:r,...a}=e,o=sj(uj,n),s=w.useRef(null),u=mt(t,s);return w.useEffect(()=>{o.onAnchorChange((r==null?void 0:r.current)||s.current)}),r?null:E.jsx(Ze.div,{...a,ref:u})});cj.displayName=uj;var rT="PopperContent",[fX,pX]=ij(rT),dj=w.forwardRef((e,t)=>{var J,ae,ke,ie,Se,ve;const{__scopePopper:n,side:r="bottom",sideOffset:a=0,align:o="center",alignOffset:s=0,arrowPadding:u=0,avoidCollisions:c=!0,collisionBoundary:d=[],collisionPadding:p=0,sticky:g="partial",hideWhenDetached:m=!1,updatePositionStrategy:b="optimized",onPlaced:y,...v}=e,k=sj(rT,n),[A,x]=w.useState(null),R=mt(t,De=>x(De)),[O,_]=w.useState(null),C=oj(O),N=(C==null?void 0:C.width)??0,M=(C==null?void 0:C.height)??0,I=r+(o!=="center"?"-"+o:""),D=typeof p=="number"?p:{top:0,right:0,bottom:0,left:0,...p},H=Array.isArray(d)?d:[d],$=H.length>0,U={padding:D,boundary:H.filter(hX),altBoundary:$},{refs:W,floatingStyles:Q,placement:G,isPositioned:j,middlewareData:z}=eX({strategy:"fixed",placement:I,whileElementsMounted:(...De)=>VK(...De,{animationFrame:b==="always"}),elements:{reference:k.anchor},middleware:[nX({mainAxis:a+M,alignmentAxis:s}),c&&rX({mainAxis:!0,crossAxis:!1,limiter:g==="partial"?aX():void 0,...U}),c&&oX({...U}),iX({...U,apply:({elements:De,rects:Ce,availableWidth:Ee,availableHeight:te})=>{const{width:fe,height:Te}=Ce.reference,me=De.floating.style;me.setProperty("--radix-popper-available-width",`${Ee}px`),me.setProperty("--radix-popper-available-height",`${te}px`),me.setProperty("--radix-popper-anchor-width",`${fe}px`),me.setProperty("--radix-popper-anchor-height",`${Te}px`)}}),O&&lX({element:O,padding:u}),mX({arrowWidth:N,arrowHeight:M}),m&&sX({strategy:"referenceHidden",...U})]}),[Y,L]=gj(G),V=yn(y);Rn(()=>{j&&(V==null||V())},[j,V]);const B=(J=z.arrow)==null?void 0:J.x,P=(ae=z.arrow)==null?void 0:ae.y,K=((ke=z.arrow)==null?void 0:ke.centerOffset)!==0,[ee,Z]=w.useState();return Rn(()=>{A&&Z(window.getComputedStyle(A).zIndex)},[A]),E.jsx("div",{ref:W.setFloating,"data-radix-popper-content-wrapper":"",style:{...Q,transform:j?Q.transform:"translate(0, -200%)",minWidth:"max-content",zIndex:ee,"--radix-popper-transform-origin":[(ie=z.transformOrigin)==null?void 0:ie.x,(Se=z.transformOrigin)==null?void 0:Se.y].join(" "),...((ve=z.hide)==null?void 0:ve.referenceHidden)&&{visibility:"hidden",pointerEvents:"none"}},dir:e.dir,children:E.jsx(fX,{scope:n,placedSide:Y,onArrowChange:_,arrowX:B,arrowY:P,shouldHideArrow:K,children:E.jsx(Ze.div,{"data-side":Y,"data-align":L,...v,ref:R,style:{...v.style,animation:j?void 0:"none"}})})})});dj.displayName=rT;var fj="PopperArrow",gX={top:"bottom",right:"left",bottom:"top",left:"right"},pj=w.forwardRef(function(t,n){const{__scopePopper:r,...a}=t,o=pX(fj,r),s=gX[o.placedSide];return E.jsx("span",{ref:o.onArrowChange,style:{position:"absolute",left:o.arrowX,top:o.arrowY,[s]:0,transformOrigin:{top:"",right:"0 0",bottom:"center 0",left:"100% 0"}[o.placedSide],transform:{top:"translateY(100%)",right:"translateY(50%) rotate(90deg) translateX(-50%)",bottom:"rotate(180deg)",left:"translateY(50%) rotate(-90deg) translateX(50%)"}[o.placedSide],visibility:o.shouldHideArrow?"hidden":void 0},children:E.jsx(cX,{...a,ref:n,style:{...a.style,display:"block"}})})});pj.displayName=fj;function hX(e){return e!==null}var mX=e=>({name:"transformOrigin",options:e,fn(t){var k,A,x;const{placement:n,rects:r,middlewareData:a}=t,s=((k=a.arrow)==null?void 0:k.centerOffset)!==0,u=s?0:e.arrowWidth,c=s?0:e.arrowHeight,[d,p]=gj(n),g={start:"0%",center:"50%",end:"100%"}[p],m=(((A=a.arrow)==null?void 0:A.x)??0)+u/2,b=(((x=a.arrow)==null?void 0:x.y)??0)+c/2;let y="",v="";return d==="bottom"?(y=s?g:`${m}px`,v=`${-c}px`):d==="top"?(y=s?g:`${m}px`,v=`${r.floating.height+c}px`):d==="right"?(y=`${-c}px`,v=s?g:`${b}px`):d==="left"&&(y=`${r.floating.width+c}px`,v=s?g:`${b}px`),{data:{x:y,y:v}}}});function gj(e){const[t,n="center"]=e.split("-");return[t,n]}var aT=lj,lp=cj,oT=dj,iT=pj,bX="VisuallyHidden",sT=w.forwardRef((e,t)=>E.jsx(Ze.span,{...e,ref:t,style:{position:"absolute",border:0,width:1,height:1,padding:0,margin:-1,overflow:"hidden",clip:"rect(0, 0, 0, 0)",whiteSpace:"nowrap",wordWrap:"normal",...e.style}}));sT.displayName=bX;var yX=sT,[up,nke]=wr("Tooltip",[Ws]),cp=Ws(),hj="TooltipProvider",vX=700,Nk="tooltip.open",[SX,lT]=up(hj),mj=e=>{const{__scopeTooltip:t,delayDuration:n=vX,skipDelayDuration:r=300,disableHoverableContent:a=!1,children:o}=e,[s,u]=w.useState(!0),c=w.useRef(!1),d=w.useRef(0);return w.useEffect(()=>{const p=d.current;return()=>window.clearTimeout(p)},[]),E.jsx(SX,{scope:t,isOpenDelayed:s,delayDuration:n,onOpen:w.useCallback(()=>{window.clearTimeout(d.current),u(!1)},[]),onClose:w.useCallback(()=>{window.clearTimeout(d.current),d.current=window.setTimeout(()=>u(!0),r)},[r]),isPointerInTransitRef:c,onPointerInTransitChange:w.useCallback(p=>{c.current=p},[]),disableHoverableContent:a,children:o})};mj.displayName=hj;var dp="Tooltip",[EX,fp]=up(dp),bj=e=>{const{__scopeTooltip:t,children:n,open:r,defaultOpen:a=!1,onOpenChange:o,disableHoverableContent:s,delayDuration:u}=e,c=lT(dp,e.__scopeTooltip),d=cp(t),[p,g]=w.useState(null),m=An(),b=w.useRef(0),y=s??c.disableHoverableContent,v=u??c.delayDuration,k=w.useRef(!1),[A=!1,x]=Ba({prop:r,defaultProp:a,onChange:N=>{N?(c.onOpen(),document.dispatchEvent(new CustomEvent(Nk))):c.onClose(),o==null||o(N)}}),R=w.useMemo(()=>A?k.current?"delayed-open":"instant-open":"closed",[A]),O=w.useCallback(()=>{window.clearTimeout(b.current),b.current=0,k.current=!1,x(!0)},[x]),_=w.useCallback(()=>{window.clearTimeout(b.current),b.current=0,x(!1)},[x]),C=w.useCallback(()=>{window.clearTimeout(b.current),b.current=window.setTimeout(()=>{k.current=!0,x(!0),b.current=0},v)},[v,x]);return w.useEffect(()=>()=>{b.current&&(window.clearTimeout(b.current),b.current=0)},[]),E.jsx(aT,{...d,children:E.jsx(EX,{scope:t,contentId:m,open:A,stateAttribute:R,trigger:p,onTriggerChange:g,onTriggerEnter:w.useCallback(()=>{c.isOpenDelayed?C():O()},[c.isOpenDelayed,C,O]),onTriggerLeave:w.useCallback(()=>{y?_():(window.clearTimeout(b.current),b.current=0)},[_,y]),onOpen:O,onClose:_,disableHoverableContent:y,children:n})})};bj.displayName=dp;var Ok="TooltipTrigger",yj=w.forwardRef((e,t)=>{const{__scopeTooltip:n,...r}=e,a=fp(Ok,n),o=lT(Ok,n),s=cp(n),u=w.useRef(null),c=mt(t,u,a.onTriggerChange),d=w.useRef(!1),p=w.useRef(!1),g=w.useCallback(()=>d.current=!1,[]);return w.useEffect(()=>()=>document.removeEventListener("pointerup",g),[g]),E.jsx(lp,{asChild:!0,...s,children:E.jsx(Ze.button,{"aria-describedby":a.open?a.contentId:void 0,"data-state":a.stateAttribute,...r,ref:c,onPointerMove:Ke(e.onPointerMove,m=>{m.pointerType!=="touch"&&!p.current&&!o.isPointerInTransitRef.current&&(a.onTriggerEnter(),p.current=!0)}),onPointerLeave:Ke(e.onPointerLeave,()=>{a.onTriggerLeave(),p.current=!1}),onPointerDown:Ke(e.onPointerDown,()=>{d.current=!0,document.addEventListener("pointerup",g,{once:!0})}),onFocus:Ke(e.onFocus,()=>{d.current||a.onOpen()}),onBlur:Ke(e.onBlur,a.onClose),onClick:Ke(e.onClick,a.onClose)})})});yj.displayName=Ok;var wX="TooltipPortal",[rke,xX]=up(wX,{forceMount:void 0}),Is="TooltipContent",vj=w.forwardRef((e,t)=>{const n=xX(Is,e.__scopeTooltip),{forceMount:r=n.forceMount,side:a="top",...o}=e,s=fp(Is,e.__scopeTooltip);return E.jsx(xr,{present:r||s.open,children:s.disableHoverableContent?E.jsx(Sj,{side:a,...o,ref:t}):E.jsx(kX,{side:a,...o,ref:t})})}),kX=w.forwardRef((e,t)=>{const n=fp(Is,e.__scopeTooltip),r=lT(Is,e.__scopeTooltip),a=w.useRef(null),o=mt(t,a),[s,u]=w.useState(null),{trigger:c,onClose:d}=n,p=a.current,{onPointerInTransitChange:g}=r,m=w.useCallback(()=>{u(null),g(!1)},[g]),b=w.useCallback((y,v)=>{const k=y.currentTarget,A={x:y.clientX,y:y.clientY},x=CX(A,k.getBoundingClientRect()),R=_X(A,x),O=NX(v.getBoundingClientRect()),_=IX([...R,...O]);u(_),g(!0)},[g]);return w.useEffect(()=>()=>m(),[m]),w.useEffect(()=>{if(c&&p){const y=k=>b(k,p),v=k=>b(k,c);return c.addEventListener("pointerleave",y),p.addEventListener("pointerleave",v),()=>{c.removeEventListener("pointerleave",y),p.removeEventListener("pointerleave",v)}}},[c,p,b,m]),w.useEffect(()=>{if(s){const y=v=>{const k=v.target,A={x:v.clientX,y:v.clientY},x=(c==null?void 0:c.contains(k))||(p==null?void 0:p.contains(k)),R=!OX(A,s);x?m():R&&(m(),d())};return document.addEventListener("pointermove",y),()=>document.removeEventListener("pointermove",y)}},[c,p,s,d,m]),E.jsx(Sj,{...e,ref:o})}),[TX,AX]=up(dp,{isInside:!1}),Sj=w.forwardRef((e,t)=>{const{__scopeTooltip:n,children:r,"aria-label":a,onEscapeKeyDown:o,onPointerDownOutside:s,...u}=e,c=fp(Is,n),d=cp(n),{onClose:p}=c;return w.useEffect(()=>(document.addEventListener(Nk,p),()=>document.removeEventListener(Nk,p)),[p]),w.useEffect(()=>{if(c.trigger){const g=m=>{const b=m.target;b!=null&&b.contains(c.trigger)&&p()};return window.addEventListener("scroll",g,{capture:!0}),()=>window.removeEventListener("scroll",g,{capture:!0})}},[c.trigger,p]),E.jsx(qu,{asChild:!0,disableOutsidePointerEvents:!1,onEscapeKeyDown:o,onPointerDownOutside:s,onFocusOutside:g=>g.preventDefault(),onDismiss:p,children:E.jsxs(oT,{"data-state":c.stateAttribute,...d,...u,ref:t,style:{...u.style,"--radix-tooltip-content-transform-origin":"var(--radix-popper-transform-origin)","--radix-tooltip-content-available-width":"var(--radix-popper-available-width)","--radix-tooltip-content-available-height":"var(--radix-popper-available-height)","--radix-tooltip-trigger-width":"var(--radix-popper-anchor-width)","--radix-tooltip-trigger-height":"var(--radix-popper-anchor-height)"},children:[E.jsx(P0,{children:r}),E.jsx(TX,{scope:n,isInside:!0,children:E.jsx(yX,{id:c.contentId,role:"tooltip",children:a||r})})]})})});vj.displayName=Is;var Ej="TooltipArrow",RX=w.forwardRef((e,t)=>{const{__scopeTooltip:n,...r}=e,a=cp(n);return AX(Ej,n).isInside?null:E.jsx(iT,{...a,...r,ref:t})});RX.displayName=Ej;function CX(e,t){const n=Math.abs(t.top-e.y),r=Math.abs(t.bottom-e.y),a=Math.abs(t.right-e.x),o=Math.abs(t.left-e.x);switch(Math.min(n,r,a,o)){case o:return"left";case a:return"right";case n:return"top";case r:return"bottom";default:throw new Error("unreachable")}}function _X(e,t,n=5){const r=[];switch(t){case"top":r.push({x:e.x-n,y:e.y+n},{x:e.x+n,y:e.y+n});break;case"bottom":r.push({x:e.x-n,y:e.y-n},{x:e.x+n,y:e.y-n});break;case"left":r.push({x:e.x+n,y:e.y-n},{x:e.x+n,y:e.y+n});break;case"right":r.push({x:e.x-n,y:e.y-n},{x:e.x-n,y:e.y+n});break}return r}function NX(e){const{top:t,right:n,bottom:r,left:a}=e;return[{x:a,y:t},{x:n,y:t},{x:n,y:r},{x:a,y:r}]}function OX(e,t){const{x:n,y:r}=e;let a=!1;for(let o=0,s=t.length-1;or!=p>r&&n<(d-u)*(r-c)/(p-c)+u&&(a=!a)}return a}function IX(e){const t=e.slice();return t.sort((n,r)=>n.xr.x?1:n.yr.y?1:0),DX(t)}function DX(e){if(e.length<=1)return e.slice();const t=[];for(let r=0;r=2;){const o=t[t.length-1],s=t[t.length-2];if((o.x-s.x)*(a.y-s.y)>=(o.y-s.y)*(a.x-s.x))t.pop();else break}t.push(a)}t.pop();const n=[];for(let r=e.length-1;r>=0;r--){const a=e[r];for(;n.length>=2;){const o=n[n.length-1],s=n[n.length-2];if((o.x-s.x)*(a.y-s.y)>=(o.y-s.y)*(a.x-s.x))n.pop();else break}n.push(a)}return n.pop(),t.length===1&&n.length===1&&t[0].x===n[0].x&&t[0].y===n[0].y?t:t.concat(n)}var LX=mj,MX=bj,PX=yj,wj=vj;const xj=LX,kj=MX,Tj=PX,FX=e=>typeof e!="string"?e:E.jsx("div",{className:"relative top-0 pt-1 whitespace-pre-wrap break-words",children:e}),uT=w.forwardRef(({className:e,side:t="left",align:n="start",children:r,...a},o)=>{const s=w.useRef(null);return w.useEffect(()=>{s.current&&(s.current.scrollTop=0)},[r]),E.jsx(wj,{ref:o,side:t,align:n,className:Me("bg-popover text-popover-foreground animate-in fade-in-0 zoom-in-95 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 max-h-[60vh] overflow-y-auto whitespace-pre-wrap break-words rounded-md border px-3 py-2 text-sm shadow-md z-60",e),...a,children:typeof r=="string"?FX(r):r})});uT.displayName=wj.displayName;const Sf=dK("inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0",{variants:{variant:{default:"bg-primary text-primary-foreground hover:bg-primary/90",destructive:"bg-destructive text-destructive-foreground hover:bg-destructive/90",outline:"border border-input bg-background hover:bg-accent hover:text-accent-foreground",secondary:"bg-secondary text-secondary-foreground hover:bg-secondary/80",ghost:"hover:bg-accent hover:text-accent-foreground",link:"text-primary underline-offset-4 hover:underline"},size:{default:"h-10 px-4 py-2",sm:"h-9 rounded-md px-3",lg:"h-11 rounded-md px-8",icon:"size-8"}},defaultVariants:{variant:"default",size:"default"}}),pt=w.forwardRef(({className:e,variant:t,tooltip:n,size:r,side:a="right",asChild:o=!1,...s},u)=>{const c=o?_o:"button";return n?E.jsx(xj,{children:E.jsxs(kj,{children:[E.jsx(Tj,{asChild:!0,children:E.jsx(c,{className:Me(Sf({variant:t,size:r,className:e}),"cursor-pointer"),ref:u,...s})}),E.jsx(uT,{side:a,children:n})]})}):E.jsx(c,{className:Me(Sf({variant:t,size:r,className:e}),"cursor-pointer"),ref:u,...s})});pt.displayName="Button";const zX=uK,BX=cK,Aj=w.forwardRef(({className:e,...t},n)=>E.jsx(GU,{className:Me("data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 fixed inset-0 z-50 bg-black/50",e),...t,ref:n}));Aj.displayName=GU.displayName;const Rj=w.forwardRef(({className:e,...t},n)=>E.jsxs(BX,{children:[E.jsx(Aj,{}),E.jsx(HU,{ref:n,className:Me("bg-background data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[state=closed]:slide-out-to-top-[48%] data-[state=open]:slide-in-from-top-[48%] fixed top-[50%] left-[50%] z-50 grid w-full max-w-lg translate-x-[-50%] translate-y-[-50%] gap-4 border p-6 shadow-lg duration-200 sm:rounded-lg",e),...t})]}));Rj.displayName=HU.displayName;const Cj=({className:e,...t})=>E.jsx("div",{className:Me("flex flex-col space-y-2 text-center sm:text-left",e),...t});Cj.displayName="AlertDialogHeader";const _j=w.forwardRef(({className:e,...t},n)=>E.jsx(VU,{ref:n,className:Me("text-lg font-semibold",e),...t}));_j.displayName=VU.displayName;const Nj=w.forwardRef(({className:e,...t},n)=>E.jsx(WU,{ref:n,className:Me("text-muted-foreground text-sm",e),...t}));Nj.displayName=WU.displayName;const UX=w.forwardRef(({className:e,...t},n)=>E.jsx($U,{ref:n,className:Me(Sf(),e),...t}));UX.displayName=$U.displayName;const jX=w.forwardRef(({className:e,...t},n)=>E.jsx(qU,{ref:n,className:Me(Sf({variant:"outline"}),"mt-2 sm:mt-0",e),...t}));jX.displayName=qU.displayName;const Ga=w.forwardRef(({className:e,type:t,...n},r)=>E.jsx("input",{type:t,className:Me("border-input file:text-foreground placeholder:text-muted-foreground focus-visible:ring-ring flex h-9 rounded-md border bg-transparent px-3 py-1 text-base shadow-sm transition-colors file:border-0 file:bg-transparent file:text-sm file:font-medium focus-visible:ring-1 focus-visible:outline-none disabled:cursor-not-allowed disabled:opacity-50 md:text-sm [&::-webkit-inner-spin-button]:opacity-100 [&::-webkit-outer-spin-button]:opacity-100",e),ref:r,...n}));Ga.displayName="Input";const GX=({open:e,onOpenChange:t})=>{const{t:n}=Dt(),r=Le.use.apiKey(),[a,o]=w.useState(""),s=Sr.use.message();w.useEffect(()=>{o(r||"")},[r,e]),w.useEffect(()=>{s&&(s.includes(GB)||s.includes(HB))&&t(!0)},[s,t]);const u=w.useCallback(()=>{Le.setState({apiKey:a||null}),t(!1)},[a,t]),c=w.useCallback(d=>{o(d.target.value)},[o]);return E.jsx(zX,{open:e,onOpenChange:t,children:E.jsxs(Rj,{children:[E.jsxs(Cj,{children:[E.jsx(_j,{children:n("apiKeyAlert.title")}),E.jsx(Nj,{children:n("apiKeyAlert.description")})]}),E.jsxs("div",{className:"flex flex-col gap-4",children:[E.jsxs("form",{className:"flex gap-2",onSubmit:d=>d.preventDefault(),children:[E.jsx(Ga,{type:"password",value:a,onChange:c,placeholder:n("apiKeyAlert.placeholder"),className:"max-h-full w-full min-w-0",autoComplete:"off"}),E.jsx(pt,{onClick:u,variant:"outline",size:"sm",children:n("apiKeyAlert.save")})]}),s&&E.jsx("div",{className:"text-sm text-red-500",children:s})]})]})})};var cT="Popover",[Oj,ake]=wr(cT,[Ws]),Wu=Ws(),[HX,Ti]=Oj(cT),Ij=e=>{const{__scopePopover:t,children:n,open:r,defaultOpen:a,onOpenChange:o,modal:s=!1}=e,u=Wu(t),c=w.useRef(null),[d,p]=w.useState(!1),[g=!1,m]=Ba({prop:r,defaultProp:a,onChange:o});return E.jsx(aT,{...u,children:E.jsx(HX,{scope:t,contentId:An(),triggerRef:c,open:g,onOpenChange:m,onOpenToggle:w.useCallback(()=>m(b=>!b),[m]),hasCustomAnchor:d,onCustomAnchorAdd:w.useCallback(()=>p(!0),[]),onCustomAnchorRemove:w.useCallback(()=>p(!1),[]),modal:s,children:n})})};Ij.displayName=cT;var Dj="PopoverAnchor",$X=w.forwardRef((e,t)=>{const{__scopePopover:n,...r}=e,a=Ti(Dj,n),o=Wu(n),{onCustomAnchorAdd:s,onCustomAnchorRemove:u}=a;return w.useEffect(()=>(s(),()=>u()),[s,u]),E.jsx(lp,{...o,...r,ref:t})});$X.displayName=Dj;var Lj="PopoverTrigger",Mj=w.forwardRef((e,t)=>{const{__scopePopover:n,...r}=e,a=Ti(Lj,n),o=Wu(n),s=mt(t,a.triggerRef),u=E.jsx(Ze.button,{type:"button","aria-haspopup":"dialog","aria-expanded":a.open,"aria-controls":a.contentId,"data-state":Bj(a.open),...r,ref:s,onClick:Ke(e.onClick,a.onOpenToggle)});return a.hasCustomAnchor?u:E.jsx(lp,{asChild:!0,...o,children:u})});Mj.displayName=Lj;var qX="PopoverPortal",[oke,VX]=Oj(qX,{forceMount:void 0}),Ds="PopoverContent",Pj=w.forwardRef((e,t)=>{const n=VX(Ds,e.__scopePopover),{forceMount:r=n.forceMount,...a}=e,o=Ti(Ds,e.__scopePopover);return E.jsx(xr,{present:r||o.open,children:o.modal?E.jsx(WX,{...a,ref:t}):E.jsx(YX,{...a,ref:t})})});Pj.displayName=Ds;var WX=w.forwardRef((e,t)=>{const n=Ti(Ds,e.__scopePopover),r=w.useRef(null),a=mt(t,r),o=w.useRef(!1);return w.useEffect(()=>{const s=r.current;if(s)return B0(s)},[]),E.jsx(np,{as:_o,allowPinchZoom:!0,children:E.jsx(Fj,{...e,ref:a,trapFocus:n.open,disableOutsidePointerEvents:!0,onCloseAutoFocus:Ke(e.onCloseAutoFocus,s=>{var u;s.preventDefault(),o.current||(u=n.triggerRef.current)==null||u.focus()}),onPointerDownOutside:Ke(e.onPointerDownOutside,s=>{const u=s.detail.originalEvent,c=u.button===0&&u.ctrlKey===!0,d=u.button===2||c;o.current=d},{checkForDefaultPrevented:!1}),onFocusOutside:Ke(e.onFocusOutside,s=>s.preventDefault(),{checkForDefaultPrevented:!1})})})}),YX=w.forwardRef((e,t)=>{const n=Ti(Ds,e.__scopePopover),r=w.useRef(!1),a=w.useRef(!1);return E.jsx(Fj,{...e,ref:t,trapFocus:!1,disableOutsidePointerEvents:!1,onCloseAutoFocus:o=>{var s,u;(s=e.onCloseAutoFocus)==null||s.call(e,o),o.defaultPrevented||(r.current||(u=n.triggerRef.current)==null||u.focus(),o.preventDefault()),r.current=!1,a.current=!1},onInteractOutside:o=>{var c,d;(c=e.onInteractOutside)==null||c.call(e,o),o.defaultPrevented||(r.current=!0,o.detail.originalEvent.type==="pointerdown"&&(a.current=!0));const s=o.target;((d=n.triggerRef.current)==null?void 0:d.contains(s))&&o.preventDefault(),o.detail.originalEvent.type==="focusin"&&a.current&&o.preventDefault()}})}),Fj=w.forwardRef((e,t)=>{const{__scopePopover:n,trapFocus:r,onOpenAutoFocus:a,onCloseAutoFocus:o,disableOutsidePointerEvents:s,onEscapeKeyDown:u,onPointerDownOutside:c,onFocusOutside:d,onInteractOutside:p,...g}=e,m=Ti(Ds,n),b=Wu(n);return z0(),E.jsx(ep,{asChild:!0,loop:!0,trapped:r,onMountAutoFocus:a,onUnmountAutoFocus:o,children:E.jsx(qu,{asChild:!0,disableOutsidePointerEvents:s,onInteractOutside:p,onEscapeKeyDown:u,onPointerDownOutside:c,onFocusOutside:d,onDismiss:()=>m.onOpenChange(!1),children:E.jsx(oT,{"data-state":Bj(m.open),role:"dialog",id:m.contentId,...b,...g,ref:t,style:{...g.style,"--radix-popover-content-transform-origin":"var(--radix-popper-transform-origin)","--radix-popover-content-available-width":"var(--radix-popper-available-width)","--radix-popover-content-available-height":"var(--radix-popper-available-height)","--radix-popover-trigger-width":"var(--radix-popper-anchor-width)","--radix-popover-trigger-height":"var(--radix-popper-anchor-height)"}})})})}),zj="PopoverClose",KX=w.forwardRef((e,t)=>{const{__scopePopover:n,...r}=e,a=Ti(zj,n);return E.jsx(Ze.button,{type:"button",...r,ref:t,onClick:Ke(e.onClick,()=>a.onOpenChange(!1))})});KX.displayName=zj;var XX="PopoverArrow",ZX=w.forwardRef((e,t)=>{const{__scopePopover:n,...r}=e,a=Wu(n);return E.jsx(iT,{...a,...r,ref:t})});ZX.displayName=XX;function Bj(e){return e?"open":"closed"}var QX=Ij,JX=Mj,Uj=Pj;const Yu=QX,Ku=JX,Ys=w.forwardRef(({className:e,align:t="center",sideOffset:n=4,...r},a)=>E.jsx(Uj,{ref:a,align:t,sideOffset:n,className:Me("bg-popover text-popover-foreground data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 z-50 rounded-md border p-4 shadow-md outline-none",e),...r}));Ys.displayName=Uj.displayName;const eZ=({status:e})=>{const{t}=Dt();return e?E.jsxs("div",{className:"min-w-[300px] space-y-3 text-sm",children:[E.jsxs("div",{className:"space-y-1",children:[E.jsx("h4",{className:"font-medium",children:t("graphPanel.statusCard.storageInfo")}),E.jsxs("div",{className:"text-muted-foreground grid grid-cols-2 gap-1",children:[E.jsxs("span",{children:[t("graphPanel.statusCard.workingDirectory"),":"]}),E.jsx("span",{className:"truncate",children:e.working_directory}),E.jsxs("span",{children:[t("graphPanel.statusCard.inputDirectory"),":"]}),E.jsx("span",{className:"truncate",children:e.input_directory})]})]}),E.jsxs("div",{className:"space-y-1",children:[E.jsx("h4",{className:"font-medium",children:t("graphPanel.statusCard.llmConfig")}),E.jsxs("div",{className:"text-muted-foreground grid grid-cols-2 gap-1",children:[E.jsxs("span",{children:[t("graphPanel.statusCard.llmBinding"),":"]}),E.jsx("span",{children:e.configuration.llm_binding}),E.jsxs("span",{children:[t("graphPanel.statusCard.llmBindingHost"),":"]}),E.jsx("span",{children:e.configuration.llm_binding_host}),E.jsxs("span",{children:[t("graphPanel.statusCard.llmModel"),":"]}),E.jsx("span",{children:e.configuration.llm_model}),E.jsxs("span",{children:[t("graphPanel.statusCard.maxTokens"),":"]}),E.jsx("span",{children:e.configuration.max_tokens})]})]}),E.jsxs("div",{className:"space-y-1",children:[E.jsx("h4",{className:"font-medium",children:t("graphPanel.statusCard.embeddingConfig")}),E.jsxs("div",{className:"text-muted-foreground grid grid-cols-2 gap-1",children:[E.jsxs("span",{children:[t("graphPanel.statusCard.embeddingBinding"),":"]}),E.jsx("span",{children:e.configuration.embedding_binding}),E.jsxs("span",{children:[t("graphPanel.statusCard.embeddingBindingHost"),":"]}),E.jsx("span",{children:e.configuration.embedding_binding_host}),E.jsxs("span",{children:[t("graphPanel.statusCard.embeddingModel"),":"]}),E.jsx("span",{children:e.configuration.embedding_model})]})]}),E.jsxs("div",{className:"space-y-1",children:[E.jsx("h4",{className:"font-medium",children:t("graphPanel.statusCard.storageConfig")}),E.jsxs("div",{className:"text-muted-foreground grid grid-cols-2 gap-1",children:[E.jsxs("span",{children:[t("graphPanel.statusCard.kvStorage"),":"]}),E.jsx("span",{children:e.configuration.kv_storage}),E.jsxs("span",{children:[t("graphPanel.statusCard.docStatusStorage"),":"]}),E.jsx("span",{children:e.configuration.doc_status_storage}),E.jsxs("span",{children:[t("graphPanel.statusCard.graphStorage"),":"]}),E.jsx("span",{children:e.configuration.graph_storage}),E.jsxs("span",{children:[t("graphPanel.statusCard.vectorStorage"),":"]}),E.jsx("span",{children:e.configuration.vector_storage})]})]})]}):E.jsx("div",{className:"text-muted-foreground text-sm",children:t("graphPanel.statusCard.unavailable")})},tZ=()=>{const{t:e}=Dt(),t=Sr.use.health(),n=Sr.use.lastCheckTime(),r=Sr.use.status(),[a,o]=w.useState(!1);return w.useEffect(()=>{o(!0);const s=setTimeout(()=>o(!1),300);return()=>clearTimeout(s)},[n]),E.jsx("div",{className:"fixed right-4 bottom-4 flex items-center gap-2 opacity-80 select-none",children:E.jsxs(Yu,{children:[E.jsx(Ku,{asChild:!0,children:E.jsxs("div",{className:"flex cursor-help items-center gap-2",children:[E.jsx("div",{className:Me("h-3 w-3 rounded-full transition-all duration-300","shadow-[0_0_8px_rgba(0,0,0,0.2)]",t?"bg-green-500":"bg-red-500",a&&"scale-125",a&&t&&"shadow-[0_0_12px_rgba(34,197,94,0.4)]",a&&!t&&"shadow-[0_0_12px_rgba(239,68,68,0.4)]")}),E.jsx("span",{className:"text-muted-foreground text-xs",children:e(t?"graphPanel.statusIndicator.connected":"graphPanel.statusIndicator.disconnected")})]})}),E.jsx(Ys,{className:"w-auto",side:"top",align:"end",children:E.jsx(eZ,{status:r})})]})})};function Ik(e,[t,n]){return Math.min(n,Math.max(t,e))}function jj(e){const t=e+"CollectionProvider",[n,r]=wr(t),[a,o]=n(t,{collectionRef:{current:null},itemMap:new Map}),s=b=>{const{scope:y,children:v}=b,k=ye.useRef(null),A=ye.useRef(new Map).current;return E.jsx(a,{scope:y,itemMap:A,collectionRef:k,children:v})};s.displayName=t;const u=e+"CollectionSlot",c=ye.forwardRef((b,y)=>{const{scope:v,children:k}=b,A=o(u,v),x=mt(y,A.collectionRef);return E.jsx(_o,{ref:x,children:k})});c.displayName=u;const d=e+"CollectionItemSlot",p="data-radix-collection-item",g=ye.forwardRef((b,y)=>{const{scope:v,children:k,...A}=b,x=ye.useRef(null),R=mt(y,x),O=o(d,v);return ye.useEffect(()=>(O.itemMap.set(x,{ref:x,...A}),()=>void O.itemMap.delete(x))),E.jsx(_o,{[p]:"",ref:R,children:k})});g.displayName=d;function m(b){const y=o(e+"CollectionConsumer",b);return ye.useCallback(()=>{const k=y.collectionRef.current;if(!k)return[];const A=Array.from(k.querySelectorAll(`[${p}]`));return Array.from(y.itemMap.values()).sort((O,_)=>A.indexOf(O.ref.current)-A.indexOf(_.ref.current))},[y.collectionRef,y.itemMap])}return[{Provider:s,Slot:c,ItemSlot:g},m,r]}var nZ=w.createContext(void 0);function pp(e){const t=w.useContext(nZ);return e||t||"ltr"}function Gj(e){const t=w.useRef({value:e,previous:e});return w.useMemo(()=>(t.current.value!==e&&(t.current.previous=t.current.value,t.current.value=e),t.current.previous),[e])}var rZ=[" ","Enter","ArrowUp","ArrowDown"],aZ=[" ","Enter"],Xu="Select",[gp,hp,oZ]=jj(Xu),[Ks,ike]=wr(Xu,[oZ,Ws]),mp=Ws(),[iZ,Do]=Ks(Xu),[sZ,lZ]=Ks(Xu),Hj=e=>{const{__scopeSelect:t,children:n,open:r,defaultOpen:a,onOpenChange:o,value:s,defaultValue:u,onValueChange:c,dir:d,name:p,autoComplete:g,disabled:m,required:b,form:y}=e,v=mp(t),[k,A]=w.useState(null),[x,R]=w.useState(null),[O,_]=w.useState(!1),C=pp(d),[N=!1,M]=Ba({prop:r,defaultProp:a,onChange:o}),[I,D]=Ba({prop:s,defaultProp:u,onChange:c}),H=w.useRef(null),$=k?y||!!k.closest("form"):!0,[U,W]=w.useState(new Set),Q=Array.from(U).map(G=>G.props.value).join(";");return E.jsx(aT,{...v,children:E.jsxs(iZ,{required:b,scope:t,trigger:k,onTriggerChange:A,valueNode:x,onValueNodeChange:R,valueNodeHasChildren:O,onValueNodeHasChildrenChange:_,contentId:An(),value:I,onValueChange:D,open:N,onOpenChange:M,dir:C,triggerPointerDownPosRef:H,disabled:m,children:[E.jsx(gp.Provider,{scope:t,children:E.jsx(sZ,{scope:e.__scopeSelect,onNativeOptionAdd:w.useCallback(G=>{W(j=>new Set(j).add(G))},[]),onNativeOptionRemove:w.useCallback(G=>{W(j=>{const z=new Set(j);return z.delete(G),z})},[]),children:n})}),$?E.jsxs(h3,{"aria-hidden":!0,required:b,tabIndex:-1,name:p,autoComplete:g,value:I,onChange:G=>D(G.target.value),disabled:m,form:y,children:[I===void 0?E.jsx("option",{value:""}):null,Array.from(U)]},Q):null]})})};Hj.displayName=Xu;var $j="SelectTrigger",qj=w.forwardRef((e,t)=>{const{__scopeSelect:n,disabled:r=!1,...a}=e,o=mp(n),s=Do($j,n),u=s.disabled||r,c=mt(t,s.onTriggerChange),d=hp(n),p=w.useRef("touch"),[g,m,b]=m3(v=>{const k=d().filter(R=>!R.disabled),A=k.find(R=>R.value===s.value),x=b3(k,v,A);x!==void 0&&s.onValueChange(x.value)}),y=v=>{u||(s.onOpenChange(!0),b()),v&&(s.triggerPointerDownPosRef.current={x:Math.round(v.pageX),y:Math.round(v.pageY)})};return E.jsx(lp,{asChild:!0,...o,children:E.jsx(Ze.button,{type:"button",role:"combobox","aria-controls":s.contentId,"aria-expanded":s.open,"aria-required":s.required,"aria-autocomplete":"none",dir:s.dir,"data-state":s.open?"open":"closed",disabled:u,"data-disabled":u?"":void 0,"data-placeholder":g3(s.value)?"":void 0,...a,ref:c,onClick:Ke(a.onClick,v=>{v.currentTarget.focus(),p.current!=="mouse"&&y(v)}),onPointerDown:Ke(a.onPointerDown,v=>{p.current=v.pointerType;const k=v.target;k.hasPointerCapture(v.pointerId)&&k.releasePointerCapture(v.pointerId),v.button===0&&v.ctrlKey===!1&&v.pointerType==="mouse"&&(y(v),v.preventDefault())}),onKeyDown:Ke(a.onKeyDown,v=>{const k=g.current!=="";!(v.ctrlKey||v.altKey||v.metaKey)&&v.key.length===1&&m(v.key),!(k&&v.key===" ")&&rZ.includes(v.key)&&(y(),v.preventDefault())})})})});qj.displayName=$j;var Vj="SelectValue",Wj=w.forwardRef((e,t)=>{const{__scopeSelect:n,className:r,style:a,children:o,placeholder:s="",...u}=e,c=Do(Vj,n),{onValueNodeHasChildrenChange:d}=c,p=o!==void 0,g=mt(t,c.onValueNodeChange);return Rn(()=>{d(p)},[d,p]),E.jsx(Ze.span,{...u,ref:g,style:{pointerEvents:"none"},children:g3(c.value)?E.jsx(E.Fragment,{children:s}):o})});Wj.displayName=Vj;var uZ="SelectIcon",Yj=w.forwardRef((e,t)=>{const{__scopeSelect:n,children:r,...a}=e;return E.jsx(Ze.span,{"aria-hidden":!0,...a,ref:t,children:r||"▼"})});Yj.displayName=uZ;var cZ="SelectPortal",Kj=e=>E.jsx(F0,{asChild:!0,...e});Kj.displayName=cZ;var yi="SelectContent",Xj=w.forwardRef((e,t)=>{const n=Do(yi,e.__scopeSelect),[r,a]=w.useState();if(Rn(()=>{a(new DocumentFragment)},[]),!n.open){const o=r;return o?Gu.createPortal(E.jsx(Zj,{scope:e.__scopeSelect,children:E.jsx(gp.Slot,{scope:e.__scopeSelect,children:E.jsx("div",{children:e.children})})}),o):null}return E.jsx(Qj,{...e,ref:t})});Xj.displayName=yi;var Lr=10,[Zj,Lo]=Ks(yi),dZ="SelectContentImpl",Qj=w.forwardRef((e,t)=>{const{__scopeSelect:n,position:r="item-aligned",onCloseAutoFocus:a,onEscapeKeyDown:o,onPointerDownOutside:s,side:u,sideOffset:c,align:d,alignOffset:p,arrowPadding:g,collisionBoundary:m,collisionPadding:b,sticky:y,hideWhenDetached:v,avoidCollisions:k,...A}=e,x=Do(yi,n),[R,O]=w.useState(null),[_,C]=w.useState(null),N=mt(t,J=>O(J)),[M,I]=w.useState(null),[D,H]=w.useState(null),$=hp(n),[U,W]=w.useState(!1),Q=w.useRef(!1);w.useEffect(()=>{if(R)return B0(R)},[R]),z0();const G=w.useCallback(J=>{const[ae,...ke]=$().map(ve=>ve.ref.current),[ie]=ke.slice(-1),Se=document.activeElement;for(const ve of J)if(ve===Se||(ve==null||ve.scrollIntoView({block:"nearest"}),ve===ae&&_&&(_.scrollTop=0),ve===ie&&_&&(_.scrollTop=_.scrollHeight),ve==null||ve.focus(),document.activeElement!==Se))return},[$,_]),j=w.useCallback(()=>G([M,R]),[G,M,R]);w.useEffect(()=>{U&&j()},[U,j]);const{onOpenChange:z,triggerPointerDownPosRef:Y}=x;w.useEffect(()=>{if(R){let J={x:0,y:0};const ae=ie=>{var Se,ve;J={x:Math.abs(Math.round(ie.pageX)-(((Se=Y.current)==null?void 0:Se.x)??0)),y:Math.abs(Math.round(ie.pageY)-(((ve=Y.current)==null?void 0:ve.y)??0))}},ke=ie=>{J.x<=10&&J.y<=10?ie.preventDefault():R.contains(ie.target)||z(!1),document.removeEventListener("pointermove",ae),Y.current=null};return Y.current!==null&&(document.addEventListener("pointermove",ae),document.addEventListener("pointerup",ke,{capture:!0,once:!0})),()=>{document.removeEventListener("pointermove",ae),document.removeEventListener("pointerup",ke,{capture:!0})}}},[R,z,Y]),w.useEffect(()=>{const J=()=>z(!1);return window.addEventListener("blur",J),window.addEventListener("resize",J),()=>{window.removeEventListener("blur",J),window.removeEventListener("resize",J)}},[z]);const[L,V]=m3(J=>{const ae=$().filter(Se=>!Se.disabled),ke=ae.find(Se=>Se.ref.current===document.activeElement),ie=b3(ae,J,ke);ie&&setTimeout(()=>ie.ref.current.focus())}),B=w.useCallback((J,ae,ke)=>{const ie=!Q.current&&!ke;(x.value!==void 0&&x.value===ae||ie)&&(I(J),ie&&(Q.current=!0))},[x.value]),P=w.useCallback(()=>R==null?void 0:R.focus(),[R]),K=w.useCallback((J,ae,ke)=>{const ie=!Q.current&&!ke;(x.value!==void 0&&x.value===ae||ie)&&H(J)},[x.value]),ee=r==="popper"?Dk:Jj,Z=ee===Dk?{side:u,sideOffset:c,align:d,alignOffset:p,arrowPadding:g,collisionBoundary:m,collisionPadding:b,sticky:y,hideWhenDetached:v,avoidCollisions:k}:{};return E.jsx(Zj,{scope:n,content:R,viewport:_,onViewportChange:C,itemRefCallback:B,selectedItem:M,onItemLeave:P,itemTextRefCallback:K,focusSelectedItem:j,selectedItemText:D,position:r,isPositioned:U,searchRef:L,children:E.jsx(np,{as:_o,allowPinchZoom:!0,children:E.jsx(ep,{asChild:!0,trapped:x.open,onMountAutoFocus:J=>{J.preventDefault()},onUnmountAutoFocus:Ke(a,J=>{var ae;(ae=x.trigger)==null||ae.focus({preventScroll:!0}),J.preventDefault()}),children:E.jsx(qu,{asChild:!0,disableOutsidePointerEvents:!0,onEscapeKeyDown:o,onPointerDownOutside:s,onFocusOutside:J=>J.preventDefault(),onDismiss:()=>x.onOpenChange(!1),children:E.jsx(ee,{role:"listbox",id:x.contentId,"data-state":x.open?"open":"closed",dir:x.dir,onContextMenu:J=>J.preventDefault(),...A,...Z,onPlaced:()=>W(!0),ref:N,style:{display:"flex",flexDirection:"column",outline:"none",...A.style},onKeyDown:Ke(A.onKeyDown,J=>{const ae=J.ctrlKey||J.altKey||J.metaKey;if(J.key==="Tab"&&J.preventDefault(),!ae&&J.key.length===1&&V(J.key),["ArrowUp","ArrowDown","Home","End"].includes(J.key)){let ie=$().filter(Se=>!Se.disabled).map(Se=>Se.ref.current);if(["ArrowUp","End"].includes(J.key)&&(ie=ie.slice().reverse()),["ArrowUp","ArrowDown"].includes(J.key)){const Se=J.target,ve=ie.indexOf(Se);ie=ie.slice(ve+1)}setTimeout(()=>G(ie)),J.preventDefault()}})})})})})})});Qj.displayName=dZ;var fZ="SelectItemAlignedPosition",Jj=w.forwardRef((e,t)=>{const{__scopeSelect:n,onPlaced:r,...a}=e,o=Do(yi,n),s=Lo(yi,n),[u,c]=w.useState(null),[d,p]=w.useState(null),g=mt(t,N=>p(N)),m=hp(n),b=w.useRef(!1),y=w.useRef(!0),{viewport:v,selectedItem:k,selectedItemText:A,focusSelectedItem:x}=s,R=w.useCallback(()=>{if(o.trigger&&o.valueNode&&u&&d&&v&&k&&A){const N=o.trigger.getBoundingClientRect(),M=d.getBoundingClientRect(),I=o.valueNode.getBoundingClientRect(),D=A.getBoundingClientRect();if(o.dir!=="rtl"){const Se=D.left-M.left,ve=I.left-Se,De=N.left-ve,Ce=N.width+De,Ee=Math.max(Ce,M.width),te=window.innerWidth-Lr,fe=Ik(ve,[Lr,Math.max(Lr,te-Ee)]);u.style.minWidth=Ce+"px",u.style.left=fe+"px"}else{const Se=M.right-D.right,ve=window.innerWidth-I.right-Se,De=window.innerWidth-N.right-ve,Ce=N.width+De,Ee=Math.max(Ce,M.width),te=window.innerWidth-Lr,fe=Ik(ve,[Lr,Math.max(Lr,te-Ee)]);u.style.minWidth=Ce+"px",u.style.right=fe+"px"}const H=m(),$=window.innerHeight-Lr*2,U=v.scrollHeight,W=window.getComputedStyle(d),Q=parseInt(W.borderTopWidth,10),G=parseInt(W.paddingTop,10),j=parseInt(W.borderBottomWidth,10),z=parseInt(W.paddingBottom,10),Y=Q+G+U+z+j,L=Math.min(k.offsetHeight*5,Y),V=window.getComputedStyle(v),B=parseInt(V.paddingTop,10),P=parseInt(V.paddingBottom,10),K=N.top+N.height/2-Lr,ee=$-K,Z=k.offsetHeight/2,J=k.offsetTop+Z,ae=Q+G+J,ke=Y-ae;if(ae<=K){const Se=H.length>0&&k===H[H.length-1].ref.current;u.style.bottom="0px";const ve=d.clientHeight-v.offsetTop-v.offsetHeight,De=Math.max(ee,Z+(Se?P:0)+ve+j),Ce=ae+De;u.style.height=Ce+"px"}else{const Se=H.length>0&&k===H[0].ref.current;u.style.top="0px";const De=Math.max(K,Q+v.offsetTop+(Se?B:0)+Z)+ke;u.style.height=De+"px",v.scrollTop=ae-K+v.offsetTop}u.style.margin=`${Lr}px 0`,u.style.minHeight=L+"px",u.style.maxHeight=$+"px",r==null||r(),requestAnimationFrame(()=>b.current=!0)}},[m,o.trigger,o.valueNode,u,d,v,k,A,o.dir,r]);Rn(()=>R(),[R]);const[O,_]=w.useState();Rn(()=>{d&&_(window.getComputedStyle(d).zIndex)},[d]);const C=w.useCallback(N=>{N&&y.current===!0&&(R(),x==null||x(),y.current=!1)},[R,x]);return E.jsx(gZ,{scope:n,contentWrapper:u,shouldExpandOnScrollRef:b,onScrollButtonChange:C,children:E.jsx("div",{ref:c,style:{display:"flex",flexDirection:"column",position:"fixed",zIndex:O},children:E.jsx(Ze.div,{...a,ref:g,style:{boxSizing:"border-box",maxHeight:"100%",...a.style}})})})});Jj.displayName=fZ;var pZ="SelectPopperPosition",Dk=w.forwardRef((e,t)=>{const{__scopeSelect:n,align:r="start",collisionPadding:a=Lr,...o}=e,s=mp(n);return E.jsx(oT,{...s,...o,ref:t,align:r,collisionPadding:a,style:{boxSizing:"border-box",...o.style,"--radix-select-content-transform-origin":"var(--radix-popper-transform-origin)","--radix-select-content-available-width":"var(--radix-popper-available-width)","--radix-select-content-available-height":"var(--radix-popper-available-height)","--radix-select-trigger-width":"var(--radix-popper-anchor-width)","--radix-select-trigger-height":"var(--radix-popper-anchor-height)"}})});Dk.displayName=pZ;var[gZ,dT]=Ks(yi,{}),Lk="SelectViewport",e3=w.forwardRef((e,t)=>{const{__scopeSelect:n,nonce:r,...a}=e,o=Lo(Lk,n),s=dT(Lk,n),u=mt(t,o.onViewportChange),c=w.useRef(0);return E.jsxs(E.Fragment,{children:[E.jsx("style",{dangerouslySetInnerHTML:{__html:"[data-radix-select-viewport]{scrollbar-width:none;-ms-overflow-style:none;-webkit-overflow-scrolling:touch;}[data-radix-select-viewport]::-webkit-scrollbar{display:none}"},nonce:r}),E.jsx(gp.Slot,{scope:n,children:E.jsx(Ze.div,{"data-radix-select-viewport":"",role:"presentation",...a,ref:u,style:{position:"relative",flex:1,overflow:"hidden auto",...a.style},onScroll:Ke(a.onScroll,d=>{const p=d.currentTarget,{contentWrapper:g,shouldExpandOnScrollRef:m}=s;if(m!=null&&m.current&&g){const b=Math.abs(c.current-p.scrollTop);if(b>0){const y=window.innerHeight-Lr*2,v=parseFloat(g.style.minHeight),k=parseFloat(g.style.height),A=Math.max(v,k);if(A0?O:0,g.style.justifyContent="flex-end")}}}c.current=p.scrollTop})})})]})});e3.displayName=Lk;var t3="SelectGroup",[hZ,mZ]=Ks(t3),n3=w.forwardRef((e,t)=>{const{__scopeSelect:n,...r}=e,a=An();return E.jsx(hZ,{scope:n,id:a,children:E.jsx(Ze.div,{role:"group","aria-labelledby":a,...r,ref:t})})});n3.displayName=t3;var r3="SelectLabel",a3=w.forwardRef((e,t)=>{const{__scopeSelect:n,...r}=e,a=mZ(r3,n);return E.jsx(Ze.div,{id:a.id,...r,ref:t})});a3.displayName=r3;var Ef="SelectItem",[bZ,o3]=Ks(Ef),i3=w.forwardRef((e,t)=>{const{__scopeSelect:n,value:r,disabled:a=!1,textValue:o,...s}=e,u=Do(Ef,n),c=Lo(Ef,n),d=u.value===r,[p,g]=w.useState(o??""),[m,b]=w.useState(!1),y=mt(t,x=>{var R;return(R=c.itemRefCallback)==null?void 0:R.call(c,x,r,a)}),v=An(),k=w.useRef("touch"),A=()=>{a||(u.onValueChange(r),u.onOpenChange(!1))};if(r==="")throw new Error("A must have a value prop that is not an empty string. This is because the Select value can be set to an empty string to clear the selection and show the placeholder.");return E.jsx(bZ,{scope:n,value:r,disabled:a,textId:v,isSelected:d,onItemTextChange:w.useCallback(x=>{g(R=>R||((x==null?void 0:x.textContent)??"").trim())},[]),children:E.jsx(gp.ItemSlot,{scope:n,value:r,disabled:a,textValue:p,children:E.jsx(Ze.div,{role:"option","aria-labelledby":v,"data-highlighted":m?"":void 0,"aria-selected":d&&m,"data-state":d?"checked":"unchecked","aria-disabled":a||void 0,"data-disabled":a?"":void 0,tabIndex:a?void 0:-1,...s,ref:y,onFocus:Ke(s.onFocus,()=>b(!0)),onBlur:Ke(s.onBlur,()=>b(!1)),onClick:Ke(s.onClick,()=>{k.current!=="mouse"&&A()}),onPointerUp:Ke(s.onPointerUp,()=>{k.current==="mouse"&&A()}),onPointerDown:Ke(s.onPointerDown,x=>{k.current=x.pointerType}),onPointerMove:Ke(s.onPointerMove,x=>{var R;k.current=x.pointerType,a?(R=c.onItemLeave)==null||R.call(c):k.current==="mouse"&&x.currentTarget.focus({preventScroll:!0})}),onPointerLeave:Ke(s.onPointerLeave,x=>{var R;x.currentTarget===document.activeElement&&((R=c.onItemLeave)==null||R.call(c))}),onKeyDown:Ke(s.onKeyDown,x=>{var O;((O=c.searchRef)==null?void 0:O.current)!==""&&x.key===" "||(aZ.includes(x.key)&&A(),x.key===" "&&x.preventDefault())})})})})});i3.displayName=Ef;var pu="SelectItemText",s3=w.forwardRef((e,t)=>{const{__scopeSelect:n,className:r,style:a,...o}=e,s=Do(pu,n),u=Lo(pu,n),c=o3(pu,n),d=lZ(pu,n),[p,g]=w.useState(null),m=mt(t,A=>g(A),c.onItemTextChange,A=>{var x;return(x=u.itemTextRefCallback)==null?void 0:x.call(u,A,c.value,c.disabled)}),b=p==null?void 0:p.textContent,y=w.useMemo(()=>E.jsx("option",{value:c.value,disabled:c.disabled,children:b},c.value),[c.disabled,c.value,b]),{onNativeOptionAdd:v,onNativeOptionRemove:k}=d;return Rn(()=>(v(y),()=>k(y)),[v,k,y]),E.jsxs(E.Fragment,{children:[E.jsx(Ze.span,{id:c.textId,...o,ref:m}),c.isSelected&&s.valueNode&&!s.valueNodeHasChildren?Gu.createPortal(o.children,s.valueNode):null]})});s3.displayName=pu;var l3="SelectItemIndicator",u3=w.forwardRef((e,t)=>{const{__scopeSelect:n,...r}=e;return o3(l3,n).isSelected?E.jsx(Ze.span,{"aria-hidden":!0,...r,ref:t}):null});u3.displayName=l3;var Mk="SelectScrollUpButton",c3=w.forwardRef((e,t)=>{const n=Lo(Mk,e.__scopeSelect),r=dT(Mk,e.__scopeSelect),[a,o]=w.useState(!1),s=mt(t,r.onScrollButtonChange);return Rn(()=>{if(n.viewport&&n.isPositioned){let u=function(){const d=c.scrollTop>0;o(d)};const c=n.viewport;return u(),c.addEventListener("scroll",u),()=>c.removeEventListener("scroll",u)}},[n.viewport,n.isPositioned]),a?E.jsx(f3,{...e,ref:s,onAutoScroll:()=>{const{viewport:u,selectedItem:c}=n;u&&c&&(u.scrollTop=u.scrollTop-c.offsetHeight)}}):null});c3.displayName=Mk;var Pk="SelectScrollDownButton",d3=w.forwardRef((e,t)=>{const n=Lo(Pk,e.__scopeSelect),r=dT(Pk,e.__scopeSelect),[a,o]=w.useState(!1),s=mt(t,r.onScrollButtonChange);return Rn(()=>{if(n.viewport&&n.isPositioned){let u=function(){const d=c.scrollHeight-c.clientHeight,p=Math.ceil(c.scrollTop)c.removeEventListener("scroll",u)}},[n.viewport,n.isPositioned]),a?E.jsx(f3,{...e,ref:s,onAutoScroll:()=>{const{viewport:u,selectedItem:c}=n;u&&c&&(u.scrollTop=u.scrollTop+c.offsetHeight)}}):null});d3.displayName=Pk;var f3=w.forwardRef((e,t)=>{const{__scopeSelect:n,onAutoScroll:r,...a}=e,o=Lo("SelectScrollButton",n),s=w.useRef(null),u=hp(n),c=w.useCallback(()=>{s.current!==null&&(window.clearInterval(s.current),s.current=null)},[]);return w.useEffect(()=>()=>c(),[c]),Rn(()=>{var p;const d=u().find(g=>g.ref.current===document.activeElement);(p=d==null?void 0:d.ref.current)==null||p.scrollIntoView({block:"nearest"})},[u]),E.jsx(Ze.div,{"aria-hidden":!0,...a,ref:t,style:{flexShrink:0,...a.style},onPointerDown:Ke(a.onPointerDown,()=>{s.current===null&&(s.current=window.setInterval(r,50))}),onPointerMove:Ke(a.onPointerMove,()=>{var d;(d=o.onItemLeave)==null||d.call(o),s.current===null&&(s.current=window.setInterval(r,50))}),onPointerLeave:Ke(a.onPointerLeave,()=>{c()})})}),yZ="SelectSeparator",p3=w.forwardRef((e,t)=>{const{__scopeSelect:n,...r}=e;return E.jsx(Ze.div,{"aria-hidden":!0,...r,ref:t})});p3.displayName=yZ;var Fk="SelectArrow",vZ=w.forwardRef((e,t)=>{const{__scopeSelect:n,...r}=e,a=mp(n),o=Do(Fk,n),s=Lo(Fk,n);return o.open&&s.position==="popper"?E.jsx(iT,{...a,...r,ref:t}):null});vZ.displayName=Fk;function g3(e){return e===""||e===void 0}var h3=w.forwardRef((e,t)=>{const{value:n,...r}=e,a=w.useRef(null),o=mt(t,a),s=Gj(n);return w.useEffect(()=>{const u=a.current,c=window.HTMLSelectElement.prototype,p=Object.getOwnPropertyDescriptor(c,"value").set;if(s!==n&&p){const g=new Event("change",{bubbles:!0});p.call(u,n),u.dispatchEvent(g)}},[s,n]),E.jsx(sT,{asChild:!0,children:E.jsx("select",{...r,ref:o,defaultValue:n})})});h3.displayName="BubbleSelect";function m3(e){const t=yn(e),n=w.useRef(""),r=w.useRef(0),a=w.useCallback(s=>{const u=n.current+s;t(u),function c(d){n.current=d,window.clearTimeout(r.current),d!==""&&(r.current=window.setTimeout(()=>c(""),1e3))}(u)},[t]),o=w.useCallback(()=>{n.current="",window.clearTimeout(r.current)},[]);return w.useEffect(()=>()=>window.clearTimeout(r.current),[]),[n,a,o]}function b3(e,t,n){const a=t.length>1&&Array.from(t).every(d=>d===t[0])?t[0]:t,o=n?e.indexOf(n):-1;let s=SZ(e,Math.max(o,0));a.length===1&&(s=s.filter(d=>d!==n));const c=s.find(d=>d.textValue.toLowerCase().startsWith(a.toLowerCase()));return c!==n?c:void 0}function SZ(e,t){return e.map((n,r)=>e[(t+r)%e.length])}var EZ=Hj,y3=qj,wZ=Wj,xZ=Yj,kZ=Kj,v3=Xj,TZ=e3,AZ=n3,S3=a3,E3=i3,RZ=s3,CZ=u3,w3=c3,x3=d3,k3=p3;/** * @license lucide-react v0.475.0 - ISC * * This source code is licensed under the ISC license. diff --git a/lightrag/api/webui/assets/index-BfapieVI.css b/lightrag/api/webui/assets/index-CbzkrOyx.css similarity index 99% rename from lightrag/api/webui/assets/index-BfapieVI.css rename to lightrag/api/webui/assets/index-CbzkrOyx.css index cd3b54e6..d29a2fd7 100644 --- a/lightrag/api/webui/assets/index-BfapieVI.css +++ b/lightrag/api/webui/assets/index-CbzkrOyx.css @@ -1 +1 @@ -/*! tailwindcss v4.0.8 | MIT License | https://tailwindcss.com */@layer theme{:root,:host{--font-sans:ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";--font-mono:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;--color-red-100:oklch(.936 .032 17.717);--color-red-400:oklch(.704 .191 22.216);--color-red-500:oklch(.637 .237 25.331);--color-red-600:oklch(.577 .245 27.325);--color-red-950:oklch(.258 .092 26.042);--color-amber-100:oklch(.962 .059 95.617);--color-amber-200:oklch(.924 .12 95.746);--color-amber-700:oklch(.555 .163 48.998);--color-amber-800:oklch(.473 .137 46.201);--color-amber-900:oklch(.414 .112 45.904);--color-yellow-600:oklch(.681 .162 75.834);--color-green-500:oklch(.723 .219 149.579);--color-green-600:oklch(.627 .194 149.214);--color-emerald-50:oklch(.979 .021 166.113);--color-emerald-400:oklch(.765 .177 163.223);--color-emerald-700:oklch(.508 .118 165.612);--color-teal-100:oklch(.953 .051 180.801);--color-blue-600:oklch(.546 .245 262.881);--color-blue-700:oklch(.488 .243 264.376);--color-violet-700:oklch(.491 .27 292.581);--color-gray-100:oklch(.967 .003 264.542);--color-gray-200:oklch(.928 .006 264.531);--color-gray-300:oklch(.872 .01 258.338);--color-gray-400:oklch(.707 .022 261.325);--color-gray-500:oklch(.551 .027 264.364);--color-gray-600:oklch(.446 .03 256.802);--color-gray-700:oklch(.373 .034 259.733);--color-gray-800:oklch(.278 .033 256.848);--color-gray-900:oklch(.21 .034 264.665);--color-zinc-50:oklch(.985 0 0);--color-zinc-100:oklch(.967 .001 286.375);--color-zinc-200:oklch(.92 .004 286.32);--color-zinc-300:oklch(.871 .006 286.286);--color-zinc-600:oklch(.442 .017 285.786);--color-zinc-700:oklch(.37 .013 285.805);--color-zinc-800:oklch(.274 .006 286.033);--color-black:#000;--color-white:#fff;--spacing:.25rem;--container-xs:20rem;--container-lg:32rem;--container-xl:36rem;--text-xs:.75rem;--text-xs--line-height:calc(1/.75);--text-sm:.875rem;--text-sm--line-height:calc(1.25/.875);--text-base:1rem;--text-base--line-height: 1.5 ;--text-lg:1.125rem;--text-lg--line-height:calc(1.75/1.125);--text-3xl:1.875rem;--text-3xl--line-height: 1.2 ;--font-weight-medium:500;--font-weight-semibold:600;--font-weight-bold:700;--tracking-tight:-.025em;--tracking-wide:.025em;--tracking-widest:.1em;--leading-relaxed:1.625;--radius-xs:.125rem;--animate-spin:spin 1s linear infinite;--animate-pulse:pulse 2s cubic-bezier(.4,0,.6,1)infinite;--blur-sm:8px;--blur-lg:16px;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4,0,.2,1);--default-font-family:var(--font-sans);--default-font-feature-settings:var(--font-sans--font-feature-settings);--default-font-variation-settings:var(--font-sans--font-variation-settings);--default-mono-font-family:var(--font-mono);--default-mono-font-feature-settings:var(--font-mono--font-feature-settings);--default-mono-font-variation-settings:var(--font-mono--font-variation-settings)}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;-moz-tab-size:4;tab-size:4;line-height:1.5;font-family:var(--default-font-family,ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}body{line-height:inherit}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring{outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1;color:color-mix(in oklab,currentColor 50%,transparent)}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){-webkit-appearance:button;-moz-appearance:button;appearance:button}::file-selector-button{-webkit-appearance:button;-moz-appearance:button;appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}*{border-color:var(--border);outline-color:color-mix(in oklab,var(--ring)50%,transparent)}body{background-color:var(--background);color:var(--foreground)}*{scrollbar-color:initial;scrollbar-width:initial}}@layer components;@layer utilities{.pointer-events-none{pointer-events:none}.invisible{visibility:hidden}.visible{visibility:visible}.sr-only{clip:rect(0,0,0,0);white-space:nowrap;border-width:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}.absolute{position:absolute}.fixed{position:fixed}.relative{position:relative}.sticky{position:sticky}.inset-0{inset:calc(var(--spacing)*0)}.top-0{top:calc(var(--spacing)*0)}.top-1\/2{top:50%}.top-2{top:calc(var(--spacing)*2)}.top-4{top:calc(var(--spacing)*4)}.top-\[50\%\]{top:50%}.right-0{right:calc(var(--spacing)*0)}.right-2{right:calc(var(--spacing)*2)}.right-4{right:calc(var(--spacing)*4)}.bottom-0{bottom:calc(var(--spacing)*0)}.bottom-2{bottom:calc(var(--spacing)*2)}.bottom-4{bottom:calc(var(--spacing)*4)}.\!left-1\/2{left:50%!important}.\!left-\[25\%\]{left:25%!important}.\!left-\[75\%\]{left:75%!important}.left-0{left:calc(var(--spacing)*0)}.left-2{left:calc(var(--spacing)*2)}.left-\[50\%\]{left:50%}.left-\[calc\(1rem\+2\.5rem\)\]{left:3.5rem}.z-10{z-index:10}.z-50{z-index:50}.z-60{z-index:60}.z-\[9999\]{z-index:9999}.\!container{width:100%!important}@media (width>=40rem){.\!container{max-width:40rem!important}}@media (width>=48rem){.\!container{max-width:48rem!important}}@media (width>=64rem){.\!container{max-width:64rem!important}}@media (width>=80rem){.\!container{max-width:80rem!important}}@media (width>=96rem){.\!container{max-width:96rem!important}}.container{width:100%}@media (width>=40rem){.container{max-width:40rem}}@media (width>=48rem){.container{max-width:48rem}}@media (width>=64rem){.container{max-width:64rem}}@media (width>=80rem){.container{max-width:80rem}}@media (width>=96rem){.container{max-width:96rem}}.\!m-0{margin:calc(var(--spacing)*0)!important}.m-0{margin:calc(var(--spacing)*0)}.\!mx-4{margin-inline:calc(var(--spacing)*4)!important}.-mx-1{margin-inline:calc(var(--spacing)*-1)}.mx-1{margin-inline:calc(var(--spacing)*1)}.mx-4{margin-inline:calc(var(--spacing)*4)}.my-1{margin-block:calc(var(--spacing)*1)}.mt-1{margin-top:calc(var(--spacing)*1)}.mt-2{margin-top:calc(var(--spacing)*2)}.mt-4{margin-top:calc(var(--spacing)*4)}.mr-1{margin-right:calc(var(--spacing)*1)}.mr-2{margin-right:calc(var(--spacing)*2)}.mr-4{margin-right:calc(var(--spacing)*4)}.mr-8{margin-right:calc(var(--spacing)*8)}.mb-1{margin-bottom:calc(var(--spacing)*1)}.mb-2{margin-bottom:calc(var(--spacing)*2)}.ml-1{margin-left:calc(var(--spacing)*1)}.ml-2{margin-left:calc(var(--spacing)*2)}.ml-auto{margin-left:auto}.line-clamp-1{-webkit-line-clamp:1;-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden}.\!inline{display:inline!important}.block{display:block}.flex{display:flex}.grid{display:grid}.hidden{display:none}.inline{display:inline}.inline-flex{display:inline-flex}.table{display:table}.aspect-square{aspect-ratio:1}.\!size-full{width:100%!important;height:100%!important}.size-4{width:calc(var(--spacing)*4);height:calc(var(--spacing)*4)}.size-6{width:calc(var(--spacing)*6);height:calc(var(--spacing)*6)}.size-7{width:calc(var(--spacing)*7);height:calc(var(--spacing)*7)}.size-8{width:calc(var(--spacing)*8);height:calc(var(--spacing)*8)}.size-10{width:calc(var(--spacing)*10);height:calc(var(--spacing)*10)}.size-full{width:100%;height:100%}.h-1\/2{height:50%}.h-2{height:calc(var(--spacing)*2)}.h-2\.5{height:calc(var(--spacing)*2.5)}.h-3{height:calc(var(--spacing)*3)}.h-3\.5{height:calc(var(--spacing)*3.5)}.h-4{height:calc(var(--spacing)*4)}.h-5{height:calc(var(--spacing)*5)}.h-6{height:calc(var(--spacing)*6)}.h-7{height:calc(var(--spacing)*7)}.h-8{height:calc(var(--spacing)*8)}.h-9{height:calc(var(--spacing)*9)}.h-10{height:calc(var(--spacing)*10)}.h-11{height:calc(var(--spacing)*11)}.h-12{height:calc(var(--spacing)*12)}.h-24{height:calc(var(--spacing)*24)}.h-52{height:calc(var(--spacing)*52)}.h-\[1px\]{height:1px}.h-\[var\(--radix-select-trigger-height\)\]{height:var(--radix-select-trigger-height)}.h-fit{height:fit-content}.h-full{height:100%}.h-px{height:1px}.h-screen{height:100vh}.max-h-8{max-height:calc(var(--spacing)*8)}.max-h-48{max-height:calc(var(--spacing)*48)}.max-h-96{max-height:calc(var(--spacing)*96)}.max-h-\[40vh\]{max-height:40vh}.max-h-\[60vh\]{max-height:60vh}.max-h-\[300px\]{max-height:300px}.max-h-full{max-height:100%}.min-h-0{min-height:calc(var(--spacing)*0)}.min-h-\[7\.5em\]{min-height:7.5em}.w-2{width:calc(var(--spacing)*2)}.w-2\.5{width:calc(var(--spacing)*2.5)}.w-3{width:calc(var(--spacing)*3)}.w-3\.5{width:calc(var(--spacing)*3.5)}.w-4{width:calc(var(--spacing)*4)}.w-5{width:calc(var(--spacing)*5)}.w-6{width:calc(var(--spacing)*6)}.w-7{width:calc(var(--spacing)*7)}.w-8{width:calc(var(--spacing)*8)}.w-9{width:calc(var(--spacing)*9)}.w-12{width:calc(var(--spacing)*12)}.w-16{width:calc(var(--spacing)*16)}.w-24{width:calc(var(--spacing)*24)}.w-56{width:calc(var(--spacing)*56)}.w-\[1px\]{width:1px}.w-\[200px\]{width:200px}.w-auto{width:auto}.w-full{width:100%}.w-screen{width:100vw}.max-w-80{max-width:calc(var(--spacing)*80)}.max-w-\[80\%\]{max-width:80%}.max-w-\[480px\]{max-width:480px}.max-w-\[800px\]{max-width:800px}.max-w-lg{max-width:var(--container-lg)}.max-w-none{max-width:none}.max-w-xs{max-width:var(--container-xs)}.min-w-0{min-width:calc(var(--spacing)*0)}.min-w-24{min-width:calc(var(--spacing)*24)}.min-w-\[8rem\]{min-width:8rem}.min-w-\[180px\]{min-width:180px}.min-w-\[300px\]{min-width:300px}.min-w-\[var\(--radix-select-trigger-width\)\]{min-width:var(--radix-select-trigger-width)}.flex-1{flex:1}.shrink-0{flex-shrink:0}.grow{flex-grow:1}.caption-bottom{caption-side:bottom}.\!-translate-x-1\/2{--tw-translate-x: -50% ;translate:var(--tw-translate-x)var(--tw-translate-y)!important}.\!translate-x-\[-50\%\]{--tw-translate-x:-50%;translate:var(--tw-translate-x)var(--tw-translate-y)!important}.translate-x-\[-50\%\]{--tw-translate-x:-50%;translate:var(--tw-translate-x)var(--tw-translate-y)}.-translate-y-1\/2{--tw-translate-y: -50% ;translate:var(--tw-translate-x)var(--tw-translate-y)}.translate-y-\[-50\%\]{--tw-translate-y:-50%;translate:var(--tw-translate-x)var(--tw-translate-y)}.scale-125{--tw-scale-x:125%;--tw-scale-y:125%;--tw-scale-z:125%;scale:var(--tw-scale-x)var(--tw-scale-y)}.transform{transform:var(--tw-rotate-x)var(--tw-rotate-y)var(--tw-rotate-z)var(--tw-skew-x)var(--tw-skew-y)}.animate-pulse{animation:var(--animate-pulse)}.animate-spin{animation:var(--animate-spin)}.cursor-default{cursor:default}.cursor-help{cursor:help}.cursor-not-allowed{cursor:not-allowed}.cursor-pointer{cursor:pointer}.touch-none{touch-action:none}.\[appearance\:textfield\]{-webkit-appearance:textfield;-moz-appearance:textfield;appearance:textfield}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.flex-col{flex-direction:column}.flex-col-reverse{flex-direction:column-reverse}.flex-row{flex-direction:row}.place-items-center{place-items:center}.items-center{align-items:center}.items-start{align-items:flex-start}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.justify-end{justify-content:flex-end}.justify-start{justify-content:flex-start}.gap-1{gap:calc(var(--spacing)*1)}.gap-1\.5{gap:calc(var(--spacing)*1.5)}.gap-2{gap:calc(var(--spacing)*2)}.gap-2\.5{gap:calc(var(--spacing)*2.5)}.gap-3{gap:calc(var(--spacing)*3)}.gap-4{gap:calc(var(--spacing)*4)}.gap-6{gap:calc(var(--spacing)*6)}.gap-px{gap:1px}:where(.space-y-1>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*1)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*1)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-1\.5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*1.5)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*1.5)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-2>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*2)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*2)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-3>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*3)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*3)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-4>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*4)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*4)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-6>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*6)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*6)*calc(1 - var(--tw-space-y-reverse)))}.self-center{align-self:center}.truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-visible{overflow:visible}.overflow-x-hidden{overflow-x:hidden}.overflow-y-auto{overflow-y:auto}.\!rounded-none{border-radius:0!important}.rounded{border-radius:.25rem}.rounded-\[inherit\]{border-radius:inherit}.rounded-full{border-radius:3.40282e38px}.rounded-lg{border-radius:var(--radius)}.rounded-md{border-radius:calc(var(--radius) - 2px)}.rounded-sm{border-radius:calc(var(--radius) - 4px)}.rounded-xl{border-radius:calc(var(--radius) + 4px)}.rounded-xs{border-radius:var(--radius-xs)}.rounded-l-none{border-top-left-radius:0;border-bottom-left-radius:0}.rounded-tr-none{border-top-right-radius:0}.rounded-br-none{border-bottom-right-radius:0}.border,.border-1{border-style:var(--tw-border-style);border-width:1px}.border-2{border-style:var(--tw-border-style);border-width:2px}.border-4{border-style:var(--tw-border-style);border-width:4px}.border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.border-l{border-left-style:var(--tw-border-style);border-left-width:1px}.\!border-none{--tw-border-style:none;border-style:none!important}.border-dashed{--tw-border-style:dashed;border-style:dashed}.\!border-input{border-color:var(--input)!important}.border-border\/40{border-color:color-mix(in oklab,var(--border)40%,transparent)}.border-destructive\/50{border-color:color-mix(in oklab,var(--destructive)50%,transparent)}.border-gray-200{border-color:var(--color-gray-200)}.border-gray-400{border-color:var(--color-gray-400)}.border-input{border-color:var(--input)}.border-muted-foreground\/25{border-color:color-mix(in oklab,var(--muted-foreground)25%,transparent)}.border-muted-foreground\/50{border-color:color-mix(in oklab,var(--muted-foreground)50%,transparent)}.border-primary{border-color:var(--primary)}.border-transparent{border-color:#0000}.border-t-transparent{border-top-color:#0000}.border-l-transparent{border-left-color:#0000}.\!bg-background{background-color:var(--background)!important}.\!bg-emerald-400{background-color:var(--color-emerald-400)!important}.bg-amber-100{background-color:var(--color-amber-100)}.bg-background{background-color:var(--background)}.bg-background\/60{background-color:color-mix(in oklab,var(--background)60%,transparent)}.bg-background\/80{background-color:color-mix(in oklab,var(--background)80%,transparent)}.bg-background\/95{background-color:color-mix(in oklab,var(--background)95%,transparent)}.bg-black\/10{background-color:color-mix(in oklab,var(--color-black)10%,transparent)}.bg-black\/30{background-color:color-mix(in oklab,var(--color-black)30%,transparent)}.bg-black\/80{background-color:color-mix(in oklab,var(--color-black)80%,transparent)}.bg-black\/95{background-color:color-mix(in oklab,var(--color-black)95%,transparent)}.bg-border{background-color:var(--border)}.bg-card{background-color:var(--card)}.bg-destructive{background-color:var(--destructive)}.bg-foreground\/10{background-color:color-mix(in oklab,var(--foreground)10%,transparent)}.bg-gray-300{background-color:var(--color-gray-300)}.bg-green-500{background-color:var(--color-green-500)}.bg-muted{background-color:var(--muted)}.bg-muted\/50{background-color:color-mix(in oklab,var(--muted)50%,transparent)}.bg-popover{background-color:var(--popover)}.bg-primary{background-color:var(--primary)}.bg-primary-foreground\/60{background-color:color-mix(in oklab,var(--primary-foreground)60%,transparent)}.bg-primary\/5{background-color:color-mix(in oklab,var(--primary)5%,transparent)}.bg-red-100{background-color:var(--color-red-100)}.bg-red-500{background-color:var(--color-red-500)}.bg-secondary{background-color:var(--secondary)}.bg-transparent{background-color:#0000}.bg-white\/30{background-color:color-mix(in oklab,var(--color-white)30%,transparent)}.bg-zinc-200{background-color:var(--color-zinc-200)}.bg-zinc-800{background-color:var(--color-zinc-800)}.bg-gradient-to-br{--tw-gradient-position:to bottom right in oklab;background-image:linear-gradient(var(--tw-gradient-stops))}.from-emerald-50{--tw-gradient-from:var(--color-emerald-50);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.to-teal-100{--tw-gradient-to:var(--color-teal-100);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.object-cover{object-fit:cover}.\!p-0{padding:calc(var(--spacing)*0)!important}.p-0{padding:calc(var(--spacing)*0)}.p-1{padding:calc(var(--spacing)*1)}.p-2{padding:calc(var(--spacing)*2)}.p-3{padding:calc(var(--spacing)*3)}.p-4{padding:calc(var(--spacing)*4)}.p-6{padding:calc(var(--spacing)*6)}.p-16{padding:calc(var(--spacing)*16)}.p-\[1px\]{padding:1px}.px-1{padding-inline:calc(var(--spacing)*1)}.px-2{padding-inline:calc(var(--spacing)*2)}.px-2\.5{padding-inline:calc(var(--spacing)*2.5)}.px-3{padding-inline:calc(var(--spacing)*3)}.px-4{padding-inline:calc(var(--spacing)*4)}.px-5{padding-inline:calc(var(--spacing)*5)}.px-8{padding-inline:calc(var(--spacing)*8)}.py-0\.5{padding-block:calc(var(--spacing)*.5)}.py-1{padding-block:calc(var(--spacing)*1)}.py-1\.5{padding-block:calc(var(--spacing)*1.5)}.py-2{padding-block:calc(var(--spacing)*2)}.py-2\.5{padding-block:calc(var(--spacing)*2.5)}.py-3{padding-block:calc(var(--spacing)*3)}.py-6{padding-block:calc(var(--spacing)*6)}.pt-0{padding-top:calc(var(--spacing)*0)}.pt-1{padding-top:calc(var(--spacing)*1)}.pt-4{padding-top:calc(var(--spacing)*4)}.pt-6{padding-top:calc(var(--spacing)*6)}.pr-1{padding-right:calc(var(--spacing)*1)}.pr-2{padding-right:calc(var(--spacing)*2)}.pb-1{padding-bottom:calc(var(--spacing)*1)}.pb-2{padding-bottom:calc(var(--spacing)*2)}.pb-8{padding-bottom:calc(var(--spacing)*8)}.pb-12{padding-bottom:calc(var(--spacing)*12)}.pl-1{padding-left:calc(var(--spacing)*1)}.pl-8{padding-left:calc(var(--spacing)*8)}.text-center{text-align:center}.text-left{text-align:left}.align-middle{vertical-align:middle}.font-mono{font-family:var(--font-mono)}.text-3xl{font-size:var(--text-3xl);line-height:var(--tw-leading,var(--text-3xl--line-height))}.text-base{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}.text-lg{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.leading-none{--tw-leading:1;line-height:1}.font-bold{--tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold)}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.tracking-tight{--tw-tracking:var(--tracking-tight);letter-spacing:var(--tracking-tight)}.tracking-wide{--tw-tracking:var(--tracking-wide);letter-spacing:var(--tracking-wide)}.tracking-widest{--tw-tracking:var(--tracking-widest);letter-spacing:var(--tracking-widest)}.break-words{overflow-wrap:break-word}.break-all{word-break:break-all}.text-ellipsis{text-overflow:ellipsis}.whitespace-normal{white-space:normal}.whitespace-nowrap{white-space:nowrap}.whitespace-pre-wrap{white-space:pre-wrap}.\!text-zinc-50{color:var(--color-zinc-50)!important}.text-amber-700{color:var(--color-amber-700)}.text-amber-800{color:var(--color-amber-800)}.text-blue-600{color:var(--color-blue-600)}.text-blue-700{color:var(--color-blue-700)}.text-card-foreground{color:var(--card-foreground)}.text-current{color:currentColor}.text-destructive{color:var(--destructive)}.text-destructive-foreground{color:var(--destructive-foreground)}.text-emerald-400{color:var(--color-emerald-400)}.text-emerald-700{color:var(--color-emerald-700)}.text-foreground{color:var(--foreground)}.text-foreground\/80{color:color-mix(in oklab,var(--foreground)80%,transparent)}.text-gray-400{color:var(--color-gray-400)}.text-gray-500{color:var(--color-gray-500)}.text-gray-700{color:var(--color-gray-700)}.text-gray-900{color:var(--color-gray-900)}.text-green-600{color:var(--color-green-600)}.text-muted-foreground{color:var(--muted-foreground)}.text-muted-foreground\/70{color:color-mix(in oklab,var(--muted-foreground)70%,transparent)}.text-popover-foreground{color:var(--popover-foreground)}.text-primary{color:var(--primary)}.text-primary-foreground{color:var(--primary-foreground)}.text-primary\/60{color:color-mix(in oklab,var(--primary)60%,transparent)}.text-red-500{color:var(--color-red-500)}.text-red-600{color:var(--color-red-600)}.text-secondary-foreground{color:var(--secondary-foreground)}.text-violet-700{color:var(--color-violet-700)}.text-white{color:var(--color-white)}.text-yellow-600{color:var(--color-yellow-600)}.text-zinc-100{color:var(--color-zinc-100)}.text-zinc-800{color:var(--color-zinc-800)}.underline-offset-4{text-underline-offset:4px}.opacity-0{opacity:0}.opacity-20{opacity:.2}.opacity-50{opacity:.5}.opacity-60{opacity:.6}.opacity-70{opacity:.7}.opacity-80{opacity:.8}.opacity-100{opacity:1}.shadow{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a),0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-\[0_0_8px_rgba\(0\,0\,0\,0\.2\)\]{--tw-shadow:0 0 8px var(--tw-shadow-color,#0003);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-\[0_0_12px_rgba\(34\,197\,94\,0\.4\)\]{--tw-shadow:0 0 12px var(--tw-shadow-color,#22c55e66);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-\[0_0_12px_rgba\(239\,68\,68\,0\.4\)\]{--tw-shadow:0 0 12px var(--tw-shadow-color,#ef444466);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-lg{--tw-shadow:0 10px 15px -3px var(--tw-shadow-color,#0000001a),0 4px 6px -4px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-md{--tw-shadow:0 4px 6px -1px var(--tw-shadow-color,#0000001a),0 2px 4px -2px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-sm{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a),0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.ring-offset-background{--tw-ring-offset-color:var(--background)}.outline{outline-style:var(--tw-outline-style);outline-width:1px}.blur{--tw-blur:blur(8px);filter:var(--tw-blur,)var(--tw-brightness,)var(--tw-contrast,)var(--tw-grayscale,)var(--tw-hue-rotate,)var(--tw-invert,)var(--tw-saturate,)var(--tw-sepia,)var(--tw-drop-shadow,)}.filter{filter:var(--tw-blur,)var(--tw-brightness,)var(--tw-contrast,)var(--tw-grayscale,)var(--tw-hue-rotate,)var(--tw-invert,)var(--tw-saturate,)var(--tw-sepia,)var(--tw-drop-shadow,)}.backdrop-blur{--tw-backdrop-blur:blur(8px);-webkit-backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,)}.backdrop-blur-lg{--tw-backdrop-blur:blur(var(--blur-lg));-webkit-backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,)}.backdrop-blur-sm{--tw-backdrop-blur:blur(var(--blur-sm));-webkit-backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,)}.transition{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-all{transition-property:all;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-opacity{transition-property:opacity;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.duration-200{--tw-duration:.2s;transition-duration:.2s}.duration-300{--tw-duration:.3s;transition-duration:.3s}.duration-2000{--tw-duration:2s;transition-duration:2s}.animate-in{--tw-enter-opacity:initial;--tw-enter-scale:initial;--tw-enter-rotate:initial;--tw-enter-translate-x:initial;--tw-enter-translate-y:initial;animation-name:enter;animation-duration:.15s}.outline-none{--tw-outline-style:none;outline-style:none}.select-none{-webkit-user-select:none;user-select:none}.duration-200{animation-duration:.2s}.duration-300{animation-duration:.3s}.duration-2000{animation-duration:2s}.fade-in-0{--tw-enter-opacity:0}.running{animation-play-state:running}.zoom-in-95{--tw-enter-scale:.95}@media (hover:hover){.group-hover\:visible:is(:where(.group):hover *){visibility:visible}}.peer-disabled\:cursor-not-allowed:is(:where(.peer):disabled~*){cursor:not-allowed}.peer-disabled\:opacity-70:is(:where(.peer):disabled~*){opacity:.7}.file\:border-0::file-selector-button{border-style:var(--tw-border-style);border-width:0}.file\:bg-transparent::file-selector-button{background-color:#0000}.file\:text-sm::file-selector-button{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.file\:font-medium::file-selector-button{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.file\:text-foreground::file-selector-button{color:var(--foreground)}.placeholder\:text-muted-foreground::placeholder{color:var(--muted-foreground)}@media (hover:hover){.hover\:w-fit:hover{width:fit-content}.hover\:bg-accent:hover{background-color:var(--accent)}.hover\:bg-background\/60:hover{background-color:color-mix(in oklab,var(--background)60%,transparent)}.hover\:bg-destructive\/80:hover{background-color:color-mix(in oklab,var(--destructive)80%,transparent)}.hover\:bg-destructive\/90:hover{background-color:color-mix(in oklab,var(--destructive)90%,transparent)}.hover\:bg-gray-100:hover{background-color:var(--color-gray-100)}.hover\:bg-gray-200:hover{background-color:var(--color-gray-200)}.hover\:bg-muted\/25:hover{background-color:color-mix(in oklab,var(--muted)25%,transparent)}.hover\:bg-muted\/50:hover{background-color:color-mix(in oklab,var(--muted)50%,transparent)}.hover\:bg-primary\/5:hover{background-color:color-mix(in oklab,var(--primary)5%,transparent)}.hover\:bg-primary\/20:hover{background-color:color-mix(in oklab,var(--primary)20%,transparent)}.hover\:bg-primary\/80:hover{background-color:color-mix(in oklab,var(--primary)80%,transparent)}.hover\:bg-primary\/90:hover{background-color:color-mix(in oklab,var(--primary)90%,transparent)}.hover\:bg-secondary\/80:hover{background-color:color-mix(in oklab,var(--secondary)80%,transparent)}.hover\:bg-zinc-300:hover{background-color:var(--color-zinc-300)}.hover\:text-accent-foreground:hover{color:var(--accent-foreground)}.hover\:underline:hover{text-decoration-line:underline}.hover\:opacity-100:hover{opacity:1}}.focus\:bg-accent:focus{background-color:var(--accent)}.focus\:text-accent-foreground:focus{color:var(--accent-foreground)}.focus\:ring-0:focus{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(0px + var(--tw-ring-offset-width))var(--tw-ring-color,currentColor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.focus\:ring-2:focus{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(2px + var(--tw-ring-offset-width))var(--tw-ring-color,currentColor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.focus\:ring-ring:focus{--tw-ring-color:var(--ring)}.focus\:ring-offset-0:focus{--tw-ring-offset-width:0px;--tw-ring-offset-shadow:var(--tw-ring-inset,)0 0 0 var(--tw-ring-offset-width)var(--tw-ring-offset-color)}.focus\:ring-offset-2:focus{--tw-ring-offset-width:2px;--tw-ring-offset-shadow:var(--tw-ring-inset,)0 0 0 var(--tw-ring-offset-width)var(--tw-ring-offset-color)}.focus\:outline-0:focus{outline-style:var(--tw-outline-style);outline-width:0}.focus\:outline-none:focus{--tw-outline-style:none;outline-style:none}.focus-visible\:relative:focus-visible{position:relative}.focus-visible\:ring-1:focus-visible{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(1px + var(--tw-ring-offset-width))var(--tw-ring-color,currentColor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.focus-visible\:ring-2:focus-visible{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(2px + var(--tw-ring-offset-width))var(--tw-ring-color,currentColor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.focus-visible\:ring-ring:focus-visible{--tw-ring-color:var(--ring)}.focus-visible\:ring-offset-2:focus-visible{--tw-ring-offset-width:2px;--tw-ring-offset-shadow:var(--tw-ring-inset,)0 0 0 var(--tw-ring-offset-width)var(--tw-ring-offset-color)}.focus-visible\:outline-none:focus-visible{--tw-outline-style:none;outline-style:none}.active\:right-0:active{right:calc(var(--spacing)*0)}.disabled\:pointer-events-none:disabled{pointer-events:none}.disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\:opacity-50:disabled{opacity:.5}.data-\[disabled\]\:pointer-events-none[data-disabled]{pointer-events:none}.data-\[disabled\]\:opacity-50[data-disabled]{opacity:.5}.data-\[disabled\=true\]\:pointer-events-none[data-disabled=true]{pointer-events:none}.data-\[disabled\=true\]\:opacity-50[data-disabled=true]{opacity:.5}.data-\[selected\=\'true\'\]\:bg-accent[data-selected=true]{background-color:var(--accent)}.data-\[selected\=true\]\:text-accent-foreground[data-selected=true]{color:var(--accent-foreground)}.data-\[side\=bottom\]\:translate-y-1[data-side=bottom]{--tw-translate-y:calc(var(--spacing)*1);translate:var(--tw-translate-x)var(--tw-translate-y)}.data-\[side\=bottom\]\:slide-in-from-top-2[data-side=bottom]{--tw-enter-translate-y:-.5rem}.data-\[side\=left\]\:-translate-x-1[data-side=left]{--tw-translate-x:calc(var(--spacing)*-1);translate:var(--tw-translate-x)var(--tw-translate-y)}.data-\[side\=left\]\:slide-in-from-right-2[data-side=left]{--tw-enter-translate-x:.5rem}.data-\[side\=right\]\:translate-x-1[data-side=right]{--tw-translate-x:calc(var(--spacing)*1);translate:var(--tw-translate-x)var(--tw-translate-y)}.data-\[side\=right\]\:slide-in-from-left-2[data-side=right]{--tw-enter-translate-x:-.5rem}.data-\[side\=top\]\:-translate-y-1[data-side=top]{--tw-translate-y:calc(var(--spacing)*-1);translate:var(--tw-translate-x)var(--tw-translate-y)}.data-\[side\=top\]\:slide-in-from-bottom-2[data-side=top]{--tw-enter-translate-y:.5rem}.data-\[state\=active\]\:visible[data-state=active]{visibility:visible}.data-\[state\=active\]\:bg-background[data-state=active]{background-color:var(--background)}.data-\[state\=active\]\:text-foreground[data-state=active]{color:var(--foreground)}.data-\[state\=active\]\:shadow-sm[data-state=active]{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a),0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.data-\[state\=checked\]\:bg-primary[data-state=checked]{background-color:var(--primary)}.data-\[state\=checked\]\:text-primary-foreground[data-state=checked]{color:var(--primary-foreground)}.data-\[state\=closed\]\:animate-out[data-state=closed]{--tw-exit-opacity:initial;--tw-exit-scale:initial;--tw-exit-rotate:initial;--tw-exit-translate-x:initial;--tw-exit-translate-y:initial;animation-name:exit;animation-duration:.15s}.data-\[state\=closed\]\:fade-out-0[data-state=closed]{--tw-exit-opacity:0}.data-\[state\=closed\]\:slide-out-to-top-\[48\%\][data-state=closed]{--tw-exit-translate-y:-48%}.data-\[state\=closed\]\:zoom-out-95[data-state=closed]{--tw-exit-scale:.95}.data-\[state\=inactive\]\:invisible[data-state=inactive]{visibility:hidden}.data-\[state\=open\]\:bg-accent[data-state=open]{background-color:var(--accent)}.data-\[state\=open\]\:text-muted-foreground[data-state=open]{color:var(--muted-foreground)}.data-\[state\=open\]\:animate-in[data-state=open]{--tw-enter-opacity:initial;--tw-enter-scale:initial;--tw-enter-rotate:initial;--tw-enter-translate-x:initial;--tw-enter-translate-y:initial;animation-name:enter;animation-duration:.15s}.data-\[state\=open\]\:fade-in-0[data-state=open]{--tw-enter-opacity:0}.data-\[state\=open\]\:slide-in-from-top-\[48\%\][data-state=open]{--tw-enter-translate-y:-48%}.data-\[state\=open\]\:zoom-in-95[data-state=open]{--tw-enter-scale:.95}.data-\[state\=selected\]\:bg-muted[data-state=selected]{background-color:var(--muted)}@supports ((-webkit-backdrop-filter:var(--tw)) or (backdrop-filter:var(--tw))){.supports-\[backdrop-filter\]\:bg-background\/60{background-color:color-mix(in oklab,var(--background)60%,transparent)}}@media (width>=40rem){.sm\:mt-0{margin-top:calc(var(--spacing)*0)}.sm\:max-w-\[600px\]{max-width:600px}.sm\:max-w-xl{max-width:var(--container-xl)}.sm\:flex-row{flex-direction:row}.sm\:justify-end{justify-content:flex-end}:where(.sm\:space-x-2>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(calc(var(--spacing)*2)*var(--tw-space-x-reverse));margin-inline-end:calc(calc(var(--spacing)*2)*calc(1 - var(--tw-space-x-reverse)))}.sm\:rounded-lg{border-radius:var(--radius)}.sm\:px-5{padding-inline:calc(var(--spacing)*5)}.sm\:text-left{text-align:left}}@media (width>=48rem){.md\:inline-block{display:inline-block}.md\:text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}}.dark\:border-destructive:is(.dark *){border-color:var(--destructive)}.dark\:border-gray-600:is(.dark *){border-color:var(--color-gray-600)}.dark\:border-gray-700:is(.dark *){border-color:var(--color-gray-700)}.dark\:bg-amber-900:is(.dark *){background-color:var(--color-amber-900)}.dark\:bg-gray-100\/20:is(.dark *){background-color:color-mix(in oklab,var(--color-gray-100)20%,transparent)}.dark\:bg-gray-800\/30:is(.dark *){background-color:color-mix(in oklab,var(--color-gray-800)30%,transparent)}.dark\:bg-red-950:is(.dark *){background-color:var(--color-red-950)}.dark\:bg-white\/95:is(.dark *){background-color:color-mix(in oklab,var(--color-white)95%,transparent)}.dark\:bg-zinc-700:is(.dark *){background-color:var(--color-zinc-700)}.dark\:from-gray-900:is(.dark *){--tw-gradient-from:var(--color-gray-900);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.dark\:to-gray-800:is(.dark *){--tw-gradient-to:var(--color-gray-800);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.dark\:text-amber-200:is(.dark *){color:var(--color-amber-200)}.dark\:text-black:is(.dark *){color:var(--color-black)}.dark\:text-gray-300:is(.dark *){color:var(--color-gray-300)}.dark\:text-gray-400:is(.dark *){color:var(--color-gray-400)}.dark\:text-red-400:is(.dark *){color:var(--color-red-400)}.dark\:text-zinc-200:is(.dark *){color:var(--color-zinc-200)}@media (hover:hover){.dark\:hover\:bg-gray-700:is(.dark *):hover{background-color:var(--color-gray-700)}.dark\:hover\:bg-gray-800:is(.dark *):hover{background-color:var(--color-gray-800)}.dark\:hover\:bg-zinc-600:is(.dark *):hover{background-color:var(--color-zinc-600)}}.\[\&_\[cmdk-group-heading\]\]\:px-2 [cmdk-group-heading]{padding-inline:calc(var(--spacing)*2)}.\[\&_\[cmdk-group-heading\]\]\:py-1\.5 [cmdk-group-heading]{padding-block:calc(var(--spacing)*1.5)}.\[\&_\[cmdk-group-heading\]\]\:text-xs [cmdk-group-heading]{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.\[\&_\[cmdk-group-heading\]\]\:font-medium [cmdk-group-heading]{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.\[\&_\[cmdk-group-heading\]\]\:text-muted-foreground [cmdk-group-heading]{color:var(--muted-foreground)}.\[\&_\[cmdk-group\]\]\:px-2 [cmdk-group]{padding-inline:calc(var(--spacing)*2)}.\[\&_\[cmdk-group\]\:not\(\[hidden\]\)_\~\[cmdk-group\]\]\:pt-0 [cmdk-group]:not([hidden])~[cmdk-group]{padding-top:calc(var(--spacing)*0)}.\[\&_\[cmdk-input-wrapper\]_svg\]\:h-5 [cmdk-input-wrapper] svg{height:calc(var(--spacing)*5)}.\[\&_\[cmdk-input-wrapper\]_svg\]\:w-5 [cmdk-input-wrapper] svg{width:calc(var(--spacing)*5)}.\[\&_\[cmdk-input\]\]\:h-12 [cmdk-input]{height:calc(var(--spacing)*12)}.\[\&_\[cmdk-item\]\]\:px-2 [cmdk-item]{padding-inline:calc(var(--spacing)*2)}.\[\&_\[cmdk-item\]\]\:py-3 [cmdk-item]{padding-block:calc(var(--spacing)*3)}.\[\&_\[cmdk-item\]_svg\]\:h-5 [cmdk-item] svg{height:calc(var(--spacing)*5)}.\[\&_\[cmdk-item\]_svg\]\:w-5 [cmdk-item] svg{width:calc(var(--spacing)*5)}.\[\&_p\]\:leading-relaxed p{--tw-leading:var(--leading-relaxed);line-height:var(--leading-relaxed)}.\[\&_svg\]\:pointer-events-none svg{pointer-events:none}.\[\&_svg\]\:size-4 svg{width:calc(var(--spacing)*4);height:calc(var(--spacing)*4)}.\[\&_svg\]\:shrink-0 svg{flex-shrink:0}.\[\&_tr\]\:border-b tr{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.\[\&_tr\:last-child\]\:border-0 tr:last-child{border-style:var(--tw-border-style);border-width:0}.\[\&\:\:-webkit-inner-spin-button\]\:appearance-none::-webkit-inner-spin-button{-webkit-appearance:none;-moz-appearance:none;appearance:none}.\[\&\:\:-webkit-inner-spin-button\]\:opacity-100::-webkit-inner-spin-button{opacity:1}.\[\&\:\:-webkit-outer-spin-button\]\:appearance-none::-webkit-outer-spin-button{-webkit-appearance:none;-moz-appearance:none;appearance:none}.\[\&\:\:-webkit-outer-spin-button\]\:opacity-100::-webkit-outer-spin-button{opacity:1}.\[\&\:has\(\[role\=checkbox\]\)\]\:pr-0:has([role=checkbox]){padding-right:calc(var(--spacing)*0)}.\[\&\>\[role\=checkbox\]\]\:translate-y-\[2px\]>[role=checkbox]{--tw-translate-y:2px;translate:var(--tw-translate-x)var(--tw-translate-y)}.\[\&\>span\]\:line-clamp-1>span{-webkit-line-clamp:1;-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden}.\[\&\>svg\]\:absolute>svg{position:absolute}.\[\&\>svg\]\:top-4>svg{top:calc(var(--spacing)*4)}.\[\&\>svg\]\:left-4>svg{left:calc(var(--spacing)*4)}.\[\&\>svg\]\:text-destructive>svg{color:var(--destructive)}.\[\&\>svg\]\:text-foreground>svg{color:var(--foreground)}.\[\&\>svg\+div\]\:translate-y-\[-3px\]>svg+div{--tw-translate-y:-3px;translate:var(--tw-translate-x)var(--tw-translate-y)}.\[\&\>svg\~\*\]\:pl-7>svg~*{padding-left:calc(var(--spacing)*7)}.\[\&\>tr\]\:last\:border-b-0>tr:last-child{border-bottom-style:var(--tw-border-style);border-bottom-width:0}}:root{--background:#fff;--foreground:#09090b;--card:#fff;--card-foreground:#09090b;--popover:#fff;--popover-foreground:#09090b;--primary:#18181b;--primary-foreground:#fafafa;--secondary:#f4f4f5;--secondary-foreground:#18181b;--muted:#f4f4f5;--muted-foreground:#71717a;--accent:#f4f4f5;--accent-foreground:#18181b;--destructive:#ef4444;--destructive-foreground:#fafafa;--border:#e4e4e7;--input:#e4e4e7;--ring:#09090b;--chart-1:#e76e50;--chart-2:#2a9d90;--chart-3:#274754;--chart-4:#e8c468;--chart-5:#f4a462;--radius:.6rem;--sidebar-background:#fafafa;--sidebar-foreground:#3f3f46;--sidebar-primary:#18181b;--sidebar-primary-foreground:#fafafa;--sidebar-accent:#f4f4f5;--sidebar-accent-foreground:#18181b;--sidebar-border:#e5e7eb;--sidebar-ring:#3b82f6}.dark{--background:#09090b;--foreground:#fafafa;--card:#09090b;--card-foreground:#fafafa;--popover:#09090b;--popover-foreground:#fafafa;--primary:#fafafa;--primary-foreground:#18181b;--secondary:#27272a;--secondary-foreground:#fafafa;--muted:#27272a;--muted-foreground:#a1a1aa;--accent:#27272a;--accent-foreground:#fafafa;--destructive:#7f1d1d;--destructive-foreground:#fafafa;--border:#27272a;--input:#27272a;--ring:#d4d4d8;--chart-1:#2662d9;--chart-2:#2eb88a;--chart-3:#e88c30;--chart-4:#af57db;--chart-5:#e23670;--sidebar-background:#18181b;--sidebar-foreground:#f4f4f5;--sidebar-primary:#1d4ed8;--sidebar-primary-foreground:#fff;--sidebar-accent:#27272a;--sidebar-accent-foreground:#f4f4f5;--sidebar-border:#27272a;--sidebar-ring:#3b82f6}::-webkit-scrollbar{width:10px;height:10px}::-webkit-scrollbar-thumb{background-color:#ccc;border-radius:5px}::-webkit-scrollbar-track{background-color:#f2f2f2}.dark ::-webkit-scrollbar-thumb{background-color:#e6e6e6}.dark ::-webkit-scrollbar-track{background-color:#000}@keyframes enter{0%{opacity:var(--tw-enter-opacity,1);transform:translate3d(var(--tw-enter-translate-x,0),var(--tw-enter-translate-y,0),0)scale3d(var(--tw-enter-scale,1),var(--tw-enter-scale,1),var(--tw-enter-scale,1))rotate(var(--tw-enter-rotate,0))}}@keyframes exit{to{opacity:var(--tw-exit-opacity,1);transform:translate3d(var(--tw-exit-translate-x,0),var(--tw-exit-translate-y,0),0)scale3d(var(--tw-exit-scale,1),var(--tw-exit-scale,1),var(--tw-exit-scale,1))rotate(var(--tw-exit-rotate,0))}}@keyframes spin{to{transform:rotate(360deg)}}@keyframes pulse{50%{opacity:.5}}@property --tw-translate-x{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-y{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-z{syntax:"*";inherits:false;initial-value:0}@property --tw-scale-x{syntax:"*";inherits:false;initial-value:1}@property --tw-scale-y{syntax:"*";inherits:false;initial-value:1}@property --tw-scale-z{syntax:"*";inherits:false;initial-value:1}@property --tw-rotate-x{syntax:"*";inherits:false;initial-value:rotateX(0)}@property --tw-rotate-y{syntax:"*";inherits:false;initial-value:rotateY(0)}@property --tw-rotate-z{syntax:"*";inherits:false;initial-value:rotateZ(0)}@property --tw-skew-x{syntax:"*";inherits:false;initial-value:skewX(0)}@property --tw-skew-y{syntax:"*";inherits:false;initial-value:skewY(0)}@property --tw-space-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-gradient-position{syntax:"*";inherits:false}@property --tw-gradient-from{syntax:"";inherits:false;initial-value:#0000}@property --tw-gradient-via{syntax:"";inherits:false;initial-value:#0000}@property --tw-gradient-to{syntax:"";inherits:false;initial-value:#0000}@property --tw-gradient-stops{syntax:"*";inherits:false}@property --tw-gradient-via-stops{syntax:"*";inherits:false}@property --tw-gradient-from-position{syntax:"";inherits:false;initial-value:0%}@property --tw-gradient-via-position{syntax:"";inherits:false;initial-value:50%}@property --tw-gradient-to-position{syntax:"";inherits:false;initial-value:100%}@property --tw-leading{syntax:"*";inherits:false}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-tracking{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-outline-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-blur{syntax:"*";inherits:false}@property --tw-brightness{syntax:"*";inherits:false}@property --tw-contrast{syntax:"*";inherits:false}@property --tw-grayscale{syntax:"*";inherits:false}@property --tw-hue-rotate{syntax:"*";inherits:false}@property --tw-invert{syntax:"*";inherits:false}@property --tw-opacity{syntax:"*";inherits:false}@property --tw-saturate{syntax:"*";inherits:false}@property --tw-sepia{syntax:"*";inherits:false}@property --tw-drop-shadow{syntax:"*";inherits:false}@property --tw-backdrop-blur{syntax:"*";inherits:false}@property --tw-backdrop-brightness{syntax:"*";inherits:false}@property --tw-backdrop-contrast{syntax:"*";inherits:false}@property --tw-backdrop-grayscale{syntax:"*";inherits:false}@property --tw-backdrop-hue-rotate{syntax:"*";inherits:false}@property --tw-backdrop-invert{syntax:"*";inherits:false}@property --tw-backdrop-opacity{syntax:"*";inherits:false}@property --tw-backdrop-saturate{syntax:"*";inherits:false}@property --tw-backdrop-sepia{syntax:"*";inherits:false}@property --tw-duration{syntax:"*";inherits:false}@property --tw-space-x-reverse{syntax:"*";inherits:false;initial-value:0}:root{--sigma-background-color:#fff;--sigma-controls-background-color:#fff;--sigma-controls-background-color-hover:rgba(0,0,0,.2);--sigma-controls-border-color:rgba(0,0,0,.2);--sigma-controls-color:#000;--sigma-controls-zindex:100;--sigma-controls-margin:5px;--sigma-controls-size:30px}div.react-sigma{height:100%;width:100%;position:relative;background:var(--sigma-background-color)}div.sigma-container{height:100%;width:100%}.react-sigma-controls{position:absolute;z-index:var(--sigma-controls-zindex);border:2px solid var(--sigma-controls-border-color);border-radius:4px;color:var(--sigma-controls-color);background-color:var(--sigma-controls-background-color)}.react-sigma-controls.bottom-right{bottom:var(--sigma-controls-margin);right:var(--sigma-controls-margin)}.react-sigma-controls.bottom-left{bottom:var(--sigma-controls-margin);left:var(--sigma-controls-margin)}.react-sigma-controls.top-right{top:var(--sigma-controls-margin);right:var(--sigma-controls-margin)}.react-sigma-controls.top-left{top:var(--sigma-controls-margin);left:var(--sigma-controls-margin)}.react-sigma-controls:first-child{border-top-left-radius:2px;border-top-right-radius:2px}.react-sigma-controls:last-child{border-bottom-left-radius:2px;border-bottom-right-radius:2px}.react-sigma-control{width:var(--sigma-controls-size);height:var(--sigma-controls-size);line-height:var(--sigma-controls-size);background-color:var(--sigma-controls-background-color);border-bottom:1px solid var(--sigma-controls-border-color)}.react-sigma-control:last-child{border-bottom:none}.react-sigma-control>*{box-sizing:border-box}.react-sigma-control>button{display:block;border:none;margin:0;padding:0;width:var(--sigma-controls-size);height:var(--sigma-controls-size);line-height:var(--sigma-controls-size);background-position:center;background-size:50%;background-repeat:no-repeat;background-color:var(--sigma-controls-background-color);clip:rect(0,0,0,0)}.react-sigma-control>button:hover{background-color:var(--sigma-controls-background-color-hover)}.react-sigma-search{background-color:var(--sigma-controls-background-color)}.react-sigma-search label{visibility:hidden}.react-sigma-search input{color:var(--sigma-controls-color);background-color:var(--sigma-controls-background-color);font-size:1em;width:100%;margin:0;border:none;padding:var(--sigma-controls-margin);box-sizing:border-box}:root{--sigma-grey-color:#ccc}.react-sigma .option.hoverable{cursor:pointer!important}.react-sigma .text-ellipsis{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.react-sigma .react-select__clear-indicator{cursor:pointer!important}.react-sigma .text-muted{color:var(--sigma-grey-color)}.react-sigma .text-italic{font-style:italic}.react-sigma .text-center{text-align:center}.react-sigma .graph-search{min-width:250px}.react-sigma .graph-search .option{padding:2px 8px}.react-sigma .graph-search .dropdown-indicator{font-size:1.25em;padding:4px}.react-sigma .graph-search .option.selected{background-color:var(--sigma-grey-color)}.react-sigma .node .render{position:relative;display:inline-block;width:1em;height:1em;border-radius:1em;background-color:var(--sigma-grey-color);margin-right:8px}.react-sigma .node{display:flex;flex-direction:row;align-items:center}.react-sigma .node .render{flex-grow:0;flex-shrink:0;margin-right:0 .25em}.react-sigma .node .label{flex-grow:1;flex-shrink:1}.react-sigma .edge{display:flex;flex-direction:column;align-items:flex-start;flex-grow:0;flex-shrink:0;flex-wrap:nowrap}.react-sigma .edge .node{font-size:.7em}.react-sigma .edge .body{display:flex;flex-direction:row;flex-grow:1;flex-shrink:1;min-height:.6em}.react-sigma .edge .body .render{display:flex;flex-direction:column;margin:0 2px}.react-sigma .edge .body .render .dash,.react-sigma .edge .body .render .dotted{display:inline-block;width:0;margin:0 2px;border:2px solid #ccc;flex-grow:1;flex-shrink:1}.react-sigma .edge .body .render .dotted{border-style:dotted}.react-sigma .edge .body .render .arrow{width:0;height:0;border-left:.3em solid transparent;border-right:.3em solid transparent;border-top:.6em solid red;flex-shrink:0;flex-grow:0;border-left-width:.3em;border-right-width:.3em}.react-sigma .edge .body .label{flex-grow:1;flex-shrink:1;text-align:center} +/*! tailwindcss v4.0.8 | MIT License | https://tailwindcss.com */@layer theme{:root,:host{--font-sans:ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";--font-mono:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;--color-red-100:oklch(.936 .032 17.717);--color-red-400:oklch(.704 .191 22.216);--color-red-500:oklch(.637 .237 25.331);--color-red-600:oklch(.577 .245 27.325);--color-red-950:oklch(.258 .092 26.042);--color-amber-100:oklch(.962 .059 95.617);--color-amber-200:oklch(.924 .12 95.746);--color-amber-700:oklch(.555 .163 48.998);--color-amber-800:oklch(.473 .137 46.201);--color-amber-900:oklch(.414 .112 45.904);--color-yellow-600:oklch(.681 .162 75.834);--color-green-500:oklch(.723 .219 149.579);--color-green-600:oklch(.627 .194 149.214);--color-emerald-50:oklch(.979 .021 166.113);--color-emerald-400:oklch(.765 .177 163.223);--color-emerald-700:oklch(.508 .118 165.612);--color-teal-100:oklch(.953 .051 180.801);--color-blue-600:oklch(.546 .245 262.881);--color-blue-700:oklch(.488 .243 264.376);--color-violet-700:oklch(.491 .27 292.581);--color-gray-100:oklch(.967 .003 264.542);--color-gray-200:oklch(.928 .006 264.531);--color-gray-300:oklch(.872 .01 258.338);--color-gray-400:oklch(.707 .022 261.325);--color-gray-500:oklch(.551 .027 264.364);--color-gray-600:oklch(.446 .03 256.802);--color-gray-700:oklch(.373 .034 259.733);--color-gray-800:oklch(.278 .033 256.848);--color-gray-900:oklch(.21 .034 264.665);--color-zinc-50:oklch(.985 0 0);--color-zinc-100:oklch(.967 .001 286.375);--color-zinc-200:oklch(.92 .004 286.32);--color-zinc-300:oklch(.871 .006 286.286);--color-zinc-600:oklch(.442 .017 285.786);--color-zinc-700:oklch(.37 .013 285.805);--color-zinc-800:oklch(.274 .006 286.033);--color-black:#000;--color-white:#fff;--spacing:.25rem;--container-xs:20rem;--container-lg:32rem;--container-xl:36rem;--text-xs:.75rem;--text-xs--line-height:calc(1/.75);--text-sm:.875rem;--text-sm--line-height:calc(1.25/.875);--text-base:1rem;--text-base--line-height: 1.5 ;--text-lg:1.125rem;--text-lg--line-height:calc(1.75/1.125);--text-3xl:1.875rem;--text-3xl--line-height: 1.2 ;--font-weight-medium:500;--font-weight-semibold:600;--font-weight-bold:700;--tracking-tight:-.025em;--tracking-wide:.025em;--tracking-widest:.1em;--leading-relaxed:1.625;--radius-xs:.125rem;--animate-spin:spin 1s linear infinite;--animate-pulse:pulse 2s cubic-bezier(.4,0,.6,1)infinite;--blur-sm:8px;--blur-lg:16px;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4,0,.2,1);--default-font-family:var(--font-sans);--default-font-feature-settings:var(--font-sans--font-feature-settings);--default-font-variation-settings:var(--font-sans--font-variation-settings);--default-mono-font-family:var(--font-mono);--default-mono-font-feature-settings:var(--font-mono--font-feature-settings);--default-mono-font-variation-settings:var(--font-mono--font-variation-settings)}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;-moz-tab-size:4;tab-size:4;line-height:1.5;font-family:var(--default-font-family,ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}body{line-height:inherit}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring{outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1;color:color-mix(in oklab,currentColor 50%,transparent)}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){-webkit-appearance:button;-moz-appearance:button;appearance:button}::file-selector-button{-webkit-appearance:button;-moz-appearance:button;appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}*{border-color:var(--border);outline-color:color-mix(in oklab,var(--ring)50%,transparent)}body{background-color:var(--background);color:var(--foreground)}*{scrollbar-color:initial;scrollbar-width:initial}}@layer components;@layer utilities{.pointer-events-none{pointer-events:none}.invisible{visibility:hidden}.visible{visibility:visible}.sr-only{clip:rect(0,0,0,0);white-space:nowrap;border-width:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}.absolute{position:absolute}.fixed{position:fixed}.relative{position:relative}.sticky{position:sticky}.inset-0{inset:calc(var(--spacing)*0)}.top-0{top:calc(var(--spacing)*0)}.top-1\/2{top:50%}.top-2{top:calc(var(--spacing)*2)}.top-4{top:calc(var(--spacing)*4)}.top-\[50\%\]{top:50%}.right-0{right:calc(var(--spacing)*0)}.right-2{right:calc(var(--spacing)*2)}.right-4{right:calc(var(--spacing)*4)}.bottom-0{bottom:calc(var(--spacing)*0)}.bottom-2{bottom:calc(var(--spacing)*2)}.bottom-4{bottom:calc(var(--spacing)*4)}.\!left-1\/2{left:50%!important}.\!left-\[25\%\]{left:25%!important}.\!left-\[75\%\]{left:75%!important}.left-0{left:calc(var(--spacing)*0)}.left-2{left:calc(var(--spacing)*2)}.left-\[50\%\]{left:50%}.left-\[calc\(1rem\+2\.5rem\)\]{left:3.5rem}.z-10{z-index:10}.z-50{z-index:50}.z-60{z-index:60}.z-\[9999\]{z-index:9999}.\!container{width:100%!important}@media (width>=40rem){.\!container{max-width:40rem!important}}@media (width>=48rem){.\!container{max-width:48rem!important}}@media (width>=64rem){.\!container{max-width:64rem!important}}@media (width>=80rem){.\!container{max-width:80rem!important}}@media (width>=96rem){.\!container{max-width:96rem!important}}.container{width:100%}@media (width>=40rem){.container{max-width:40rem}}@media (width>=48rem){.container{max-width:48rem}}@media (width>=64rem){.container{max-width:64rem}}@media (width>=80rem){.container{max-width:80rem}}@media (width>=96rem){.container{max-width:96rem}}.\!m-0{margin:calc(var(--spacing)*0)!important}.m-0{margin:calc(var(--spacing)*0)}.\!mx-4{margin-inline:calc(var(--spacing)*4)!important}.-mx-1{margin-inline:calc(var(--spacing)*-1)}.mx-1{margin-inline:calc(var(--spacing)*1)}.mx-4{margin-inline:calc(var(--spacing)*4)}.my-1{margin-block:calc(var(--spacing)*1)}.mt-1{margin-top:calc(var(--spacing)*1)}.mt-2{margin-top:calc(var(--spacing)*2)}.mt-4{margin-top:calc(var(--spacing)*4)}.mr-1{margin-right:calc(var(--spacing)*1)}.mr-2{margin-right:calc(var(--spacing)*2)}.mr-4{margin-right:calc(var(--spacing)*4)}.mr-8{margin-right:calc(var(--spacing)*8)}.mb-1{margin-bottom:calc(var(--spacing)*1)}.mb-2{margin-bottom:calc(var(--spacing)*2)}.ml-1{margin-left:calc(var(--spacing)*1)}.ml-2{margin-left:calc(var(--spacing)*2)}.ml-auto{margin-left:auto}.line-clamp-1{-webkit-line-clamp:1;-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden}.\!inline{display:inline!important}.block{display:block}.flex{display:flex}.grid{display:grid}.hidden{display:none}.inline{display:inline}.inline-flex{display:inline-flex}.table{display:table}.aspect-square{aspect-ratio:1}.\!size-full{width:100%!important;height:100%!important}.size-4{width:calc(var(--spacing)*4);height:calc(var(--spacing)*4)}.size-6{width:calc(var(--spacing)*6);height:calc(var(--spacing)*6)}.size-7{width:calc(var(--spacing)*7);height:calc(var(--spacing)*7)}.size-8{width:calc(var(--spacing)*8);height:calc(var(--spacing)*8)}.size-10{width:calc(var(--spacing)*10);height:calc(var(--spacing)*10)}.size-full{width:100%;height:100%}.h-1\/2{height:50%}.h-2{height:calc(var(--spacing)*2)}.h-2\.5{height:calc(var(--spacing)*2.5)}.h-3{height:calc(var(--spacing)*3)}.h-3\.5{height:calc(var(--spacing)*3.5)}.h-4{height:calc(var(--spacing)*4)}.h-5{height:calc(var(--spacing)*5)}.h-6{height:calc(var(--spacing)*6)}.h-7{height:calc(var(--spacing)*7)}.h-8{height:calc(var(--spacing)*8)}.h-9{height:calc(var(--spacing)*9)}.h-10{height:calc(var(--spacing)*10)}.h-11{height:calc(var(--spacing)*11)}.h-12{height:calc(var(--spacing)*12)}.h-24{height:calc(var(--spacing)*24)}.h-52{height:calc(var(--spacing)*52)}.h-\[1px\]{height:1px}.h-\[var\(--radix-select-trigger-height\)\]{height:var(--radix-select-trigger-height)}.h-fit{height:fit-content}.h-full{height:100%}.h-px{height:1px}.h-screen{height:100vh}.max-h-8{max-height:calc(var(--spacing)*8)}.max-h-48{max-height:calc(var(--spacing)*48)}.max-h-96{max-height:calc(var(--spacing)*96)}.max-h-\[40vh\]{max-height:40vh}.max-h-\[60vh\]{max-height:60vh}.max-h-\[300px\]{max-height:300px}.max-h-full{max-height:100%}.min-h-0{min-height:calc(var(--spacing)*0)}.min-h-\[7\.5em\]{min-height:7.5em}.w-2{width:calc(var(--spacing)*2)}.w-2\.5{width:calc(var(--spacing)*2.5)}.w-3{width:calc(var(--spacing)*3)}.w-3\.5{width:calc(var(--spacing)*3.5)}.w-4{width:calc(var(--spacing)*4)}.w-5{width:calc(var(--spacing)*5)}.w-6{width:calc(var(--spacing)*6)}.w-7{width:calc(var(--spacing)*7)}.w-8{width:calc(var(--spacing)*8)}.w-9{width:calc(var(--spacing)*9)}.w-12{width:calc(var(--spacing)*12)}.w-16{width:calc(var(--spacing)*16)}.w-24{width:calc(var(--spacing)*24)}.w-56{width:calc(var(--spacing)*56)}.w-\[1px\]{width:1px}.w-\[200px\]{width:200px}.w-auto{width:auto}.w-full{width:100%}.w-screen{width:100vw}.max-w-80{max-width:calc(var(--spacing)*80)}.max-w-\[80\%\]{max-width:80%}.max-w-\[480px\]{max-width:480px}.max-w-\[800px\]{max-width:800px}.max-w-lg{max-width:var(--container-lg)}.max-w-none{max-width:none}.max-w-xs{max-width:var(--container-xs)}.min-w-0{min-width:calc(var(--spacing)*0)}.min-w-24{min-width:calc(var(--spacing)*24)}.min-w-\[8rem\]{min-width:8rem}.min-w-\[180px\]{min-width:180px}.min-w-\[300px\]{min-width:300px}.min-w-\[var\(--radix-select-trigger-width\)\]{min-width:var(--radix-select-trigger-width)}.flex-1{flex:1}.shrink-0{flex-shrink:0}.grow{flex-grow:1}.caption-bottom{caption-side:bottom}.\!-translate-x-1\/2{--tw-translate-x: -50% ;translate:var(--tw-translate-x)var(--tw-translate-y)!important}.\!translate-x-\[-50\%\]{--tw-translate-x:-50%;translate:var(--tw-translate-x)var(--tw-translate-y)!important}.translate-x-\[-50\%\]{--tw-translate-x:-50%;translate:var(--tw-translate-x)var(--tw-translate-y)}.-translate-y-1\/2{--tw-translate-y: -50% ;translate:var(--tw-translate-x)var(--tw-translate-y)}.translate-y-\[-50\%\]{--tw-translate-y:-50%;translate:var(--tw-translate-x)var(--tw-translate-y)}.scale-125{--tw-scale-x:125%;--tw-scale-y:125%;--tw-scale-z:125%;scale:var(--tw-scale-x)var(--tw-scale-y)}.transform{transform:var(--tw-rotate-x)var(--tw-rotate-y)var(--tw-rotate-z)var(--tw-skew-x)var(--tw-skew-y)}.animate-pulse{animation:var(--animate-pulse)}.animate-spin{animation:var(--animate-spin)}.cursor-default{cursor:default}.cursor-help{cursor:help}.cursor-not-allowed{cursor:not-allowed}.cursor-pointer{cursor:pointer}.touch-none{touch-action:none}.\[appearance\:textfield\]{-webkit-appearance:textfield;-moz-appearance:textfield;appearance:textfield}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.flex-col{flex-direction:column}.flex-col-reverse{flex-direction:column-reverse}.flex-row{flex-direction:row}.place-items-center{place-items:center}.items-center{align-items:center}.items-start{align-items:flex-start}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.justify-end{justify-content:flex-end}.justify-start{justify-content:flex-start}.gap-1{gap:calc(var(--spacing)*1)}.gap-1\.5{gap:calc(var(--spacing)*1.5)}.gap-2{gap:calc(var(--spacing)*2)}.gap-2\.5{gap:calc(var(--spacing)*2.5)}.gap-3{gap:calc(var(--spacing)*3)}.gap-4{gap:calc(var(--spacing)*4)}.gap-6{gap:calc(var(--spacing)*6)}.gap-px{gap:1px}:where(.space-y-1>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*1)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*1)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-1\.5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*1.5)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*1.5)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-2>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*2)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*2)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-3>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*3)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*3)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-4>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*4)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*4)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-6>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*6)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*6)*calc(1 - var(--tw-space-y-reverse)))}.self-center{align-self:center}.truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-visible{overflow:visible}.overflow-x-hidden{overflow-x:hidden}.overflow-y-auto{overflow-y:auto}.\!rounded-none{border-radius:0!important}.rounded{border-radius:.25rem}.rounded-\[inherit\]{border-radius:inherit}.rounded-full{border-radius:3.40282e38px}.rounded-lg{border-radius:var(--radius)}.rounded-md{border-radius:calc(var(--radius) - 2px)}.rounded-sm{border-radius:calc(var(--radius) - 4px)}.rounded-xl{border-radius:calc(var(--radius) + 4px)}.rounded-xs{border-radius:var(--radius-xs)}.rounded-l-none{border-top-left-radius:0;border-bottom-left-radius:0}.rounded-tr-none{border-top-right-radius:0}.rounded-br-none{border-bottom-right-radius:0}.border,.border-1{border-style:var(--tw-border-style);border-width:1px}.border-2{border-style:var(--tw-border-style);border-width:2px}.border-4{border-style:var(--tw-border-style);border-width:4px}.border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.border-l{border-left-style:var(--tw-border-style);border-left-width:1px}.\!border-none{--tw-border-style:none;border-style:none!important}.border-dashed{--tw-border-style:dashed;border-style:dashed}.\!border-input{border-color:var(--input)!important}.border-border\/40{border-color:color-mix(in oklab,var(--border)40%,transparent)}.border-destructive\/50{border-color:color-mix(in oklab,var(--destructive)50%,transparent)}.border-gray-200{border-color:var(--color-gray-200)}.border-gray-400{border-color:var(--color-gray-400)}.border-input{border-color:var(--input)}.border-muted-foreground\/25{border-color:color-mix(in oklab,var(--muted-foreground)25%,transparent)}.border-muted-foreground\/50{border-color:color-mix(in oklab,var(--muted-foreground)50%,transparent)}.border-primary{border-color:var(--primary)}.border-transparent{border-color:#0000}.border-t-transparent{border-top-color:#0000}.border-l-transparent{border-left-color:#0000}.\!bg-background{background-color:var(--background)!important}.\!bg-emerald-400{background-color:var(--color-emerald-400)!important}.bg-amber-100{background-color:var(--color-amber-100)}.bg-background{background-color:var(--background)}.bg-background\/60{background-color:color-mix(in oklab,var(--background)60%,transparent)}.bg-background\/80{background-color:color-mix(in oklab,var(--background)80%,transparent)}.bg-background\/95{background-color:color-mix(in oklab,var(--background)95%,transparent)}.bg-black\/10{background-color:color-mix(in oklab,var(--color-black)10%,transparent)}.bg-black\/30{background-color:color-mix(in oklab,var(--color-black)30%,transparent)}.bg-black\/50{background-color:color-mix(in oklab,var(--color-black)50%,transparent)}.bg-black\/95{background-color:color-mix(in oklab,var(--color-black)95%,transparent)}.bg-border{background-color:var(--border)}.bg-card{background-color:var(--card)}.bg-destructive{background-color:var(--destructive)}.bg-foreground\/10{background-color:color-mix(in oklab,var(--foreground)10%,transparent)}.bg-gray-300{background-color:var(--color-gray-300)}.bg-green-500{background-color:var(--color-green-500)}.bg-muted{background-color:var(--muted)}.bg-muted\/50{background-color:color-mix(in oklab,var(--muted)50%,transparent)}.bg-popover{background-color:var(--popover)}.bg-primary{background-color:var(--primary)}.bg-primary-foreground\/60{background-color:color-mix(in oklab,var(--primary-foreground)60%,transparent)}.bg-primary\/5{background-color:color-mix(in oklab,var(--primary)5%,transparent)}.bg-red-100{background-color:var(--color-red-100)}.bg-red-500{background-color:var(--color-red-500)}.bg-secondary{background-color:var(--secondary)}.bg-transparent{background-color:#0000}.bg-white\/30{background-color:color-mix(in oklab,var(--color-white)30%,transparent)}.bg-zinc-200{background-color:var(--color-zinc-200)}.bg-zinc-800{background-color:var(--color-zinc-800)}.bg-gradient-to-br{--tw-gradient-position:to bottom right in oklab;background-image:linear-gradient(var(--tw-gradient-stops))}.from-emerald-50{--tw-gradient-from:var(--color-emerald-50);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.to-teal-100{--tw-gradient-to:var(--color-teal-100);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.object-cover{object-fit:cover}.\!p-0{padding:calc(var(--spacing)*0)!important}.p-0{padding:calc(var(--spacing)*0)}.p-1{padding:calc(var(--spacing)*1)}.p-2{padding:calc(var(--spacing)*2)}.p-3{padding:calc(var(--spacing)*3)}.p-4{padding:calc(var(--spacing)*4)}.p-6{padding:calc(var(--spacing)*6)}.p-16{padding:calc(var(--spacing)*16)}.p-\[1px\]{padding:1px}.px-1{padding-inline:calc(var(--spacing)*1)}.px-2{padding-inline:calc(var(--spacing)*2)}.px-2\.5{padding-inline:calc(var(--spacing)*2.5)}.px-3{padding-inline:calc(var(--spacing)*3)}.px-4{padding-inline:calc(var(--spacing)*4)}.px-5{padding-inline:calc(var(--spacing)*5)}.px-8{padding-inline:calc(var(--spacing)*8)}.py-0\.5{padding-block:calc(var(--spacing)*.5)}.py-1{padding-block:calc(var(--spacing)*1)}.py-1\.5{padding-block:calc(var(--spacing)*1.5)}.py-2{padding-block:calc(var(--spacing)*2)}.py-2\.5{padding-block:calc(var(--spacing)*2.5)}.py-3{padding-block:calc(var(--spacing)*3)}.py-6{padding-block:calc(var(--spacing)*6)}.pt-0{padding-top:calc(var(--spacing)*0)}.pt-1{padding-top:calc(var(--spacing)*1)}.pt-4{padding-top:calc(var(--spacing)*4)}.pt-6{padding-top:calc(var(--spacing)*6)}.pr-1{padding-right:calc(var(--spacing)*1)}.pr-2{padding-right:calc(var(--spacing)*2)}.pb-1{padding-bottom:calc(var(--spacing)*1)}.pb-2{padding-bottom:calc(var(--spacing)*2)}.pb-8{padding-bottom:calc(var(--spacing)*8)}.pb-12{padding-bottom:calc(var(--spacing)*12)}.pl-1{padding-left:calc(var(--spacing)*1)}.pl-8{padding-left:calc(var(--spacing)*8)}.text-center{text-align:center}.text-left{text-align:left}.align-middle{vertical-align:middle}.font-mono{font-family:var(--font-mono)}.text-3xl{font-size:var(--text-3xl);line-height:var(--tw-leading,var(--text-3xl--line-height))}.text-base{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}.text-lg{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.leading-none{--tw-leading:1;line-height:1}.font-bold{--tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold)}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.tracking-tight{--tw-tracking:var(--tracking-tight);letter-spacing:var(--tracking-tight)}.tracking-wide{--tw-tracking:var(--tracking-wide);letter-spacing:var(--tracking-wide)}.tracking-widest{--tw-tracking:var(--tracking-widest);letter-spacing:var(--tracking-widest)}.break-words{overflow-wrap:break-word}.break-all{word-break:break-all}.text-ellipsis{text-overflow:ellipsis}.whitespace-normal{white-space:normal}.whitespace-nowrap{white-space:nowrap}.whitespace-pre-wrap{white-space:pre-wrap}.\!text-zinc-50{color:var(--color-zinc-50)!important}.text-amber-700{color:var(--color-amber-700)}.text-amber-800{color:var(--color-amber-800)}.text-blue-600{color:var(--color-blue-600)}.text-blue-700{color:var(--color-blue-700)}.text-card-foreground{color:var(--card-foreground)}.text-current{color:currentColor}.text-destructive{color:var(--destructive)}.text-destructive-foreground{color:var(--destructive-foreground)}.text-emerald-400{color:var(--color-emerald-400)}.text-emerald-700{color:var(--color-emerald-700)}.text-foreground{color:var(--foreground)}.text-foreground\/80{color:color-mix(in oklab,var(--foreground)80%,transparent)}.text-gray-400{color:var(--color-gray-400)}.text-gray-500{color:var(--color-gray-500)}.text-gray-700{color:var(--color-gray-700)}.text-gray-900{color:var(--color-gray-900)}.text-green-600{color:var(--color-green-600)}.text-muted-foreground{color:var(--muted-foreground)}.text-muted-foreground\/70{color:color-mix(in oklab,var(--muted-foreground)70%,transparent)}.text-popover-foreground{color:var(--popover-foreground)}.text-primary{color:var(--primary)}.text-primary-foreground{color:var(--primary-foreground)}.text-primary\/60{color:color-mix(in oklab,var(--primary)60%,transparent)}.text-red-500{color:var(--color-red-500)}.text-red-600{color:var(--color-red-600)}.text-secondary-foreground{color:var(--secondary-foreground)}.text-violet-700{color:var(--color-violet-700)}.text-white{color:var(--color-white)}.text-yellow-600{color:var(--color-yellow-600)}.text-zinc-100{color:var(--color-zinc-100)}.text-zinc-800{color:var(--color-zinc-800)}.underline-offset-4{text-underline-offset:4px}.opacity-0{opacity:0}.opacity-20{opacity:.2}.opacity-50{opacity:.5}.opacity-60{opacity:.6}.opacity-70{opacity:.7}.opacity-80{opacity:.8}.opacity-100{opacity:1}.shadow{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a),0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-\[0_0_8px_rgba\(0\,0\,0\,0\.2\)\]{--tw-shadow:0 0 8px var(--tw-shadow-color,#0003);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-\[0_0_12px_rgba\(34\,197\,94\,0\.4\)\]{--tw-shadow:0 0 12px var(--tw-shadow-color,#22c55e66);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-\[0_0_12px_rgba\(239\,68\,68\,0\.4\)\]{--tw-shadow:0 0 12px var(--tw-shadow-color,#ef444466);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-lg{--tw-shadow:0 10px 15px -3px var(--tw-shadow-color,#0000001a),0 4px 6px -4px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-md{--tw-shadow:0 4px 6px -1px var(--tw-shadow-color,#0000001a),0 2px 4px -2px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-sm{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a),0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.ring-offset-background{--tw-ring-offset-color:var(--background)}.outline{outline-style:var(--tw-outline-style);outline-width:1px}.blur{--tw-blur:blur(8px);filter:var(--tw-blur,)var(--tw-brightness,)var(--tw-contrast,)var(--tw-grayscale,)var(--tw-hue-rotate,)var(--tw-invert,)var(--tw-saturate,)var(--tw-sepia,)var(--tw-drop-shadow,)}.filter{filter:var(--tw-blur,)var(--tw-brightness,)var(--tw-contrast,)var(--tw-grayscale,)var(--tw-hue-rotate,)var(--tw-invert,)var(--tw-saturate,)var(--tw-sepia,)var(--tw-drop-shadow,)}.backdrop-blur{--tw-backdrop-blur:blur(8px);-webkit-backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,)}.backdrop-blur-lg{--tw-backdrop-blur:blur(var(--blur-lg));-webkit-backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,)}.backdrop-blur-sm{--tw-backdrop-blur:blur(var(--blur-sm));-webkit-backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,)}.transition{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-all{transition-property:all;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-opacity{transition-property:opacity;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.duration-200{--tw-duration:.2s;transition-duration:.2s}.duration-300{--tw-duration:.3s;transition-duration:.3s}.duration-2000{--tw-duration:2s;transition-duration:2s}.animate-in{--tw-enter-opacity:initial;--tw-enter-scale:initial;--tw-enter-rotate:initial;--tw-enter-translate-x:initial;--tw-enter-translate-y:initial;animation-name:enter;animation-duration:.15s}.outline-none{--tw-outline-style:none;outline-style:none}.select-none{-webkit-user-select:none;user-select:none}.duration-200{animation-duration:.2s}.duration-300{animation-duration:.3s}.duration-2000{animation-duration:2s}.fade-in-0{--tw-enter-opacity:0}.running{animation-play-state:running}.zoom-in-95{--tw-enter-scale:.95}@media (hover:hover){.group-hover\:visible:is(:where(.group):hover *){visibility:visible}}.peer-disabled\:cursor-not-allowed:is(:where(.peer):disabled~*){cursor:not-allowed}.peer-disabled\:opacity-70:is(:where(.peer):disabled~*){opacity:.7}.file\:border-0::file-selector-button{border-style:var(--tw-border-style);border-width:0}.file\:bg-transparent::file-selector-button{background-color:#0000}.file\:text-sm::file-selector-button{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.file\:font-medium::file-selector-button{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.file\:text-foreground::file-selector-button{color:var(--foreground)}.placeholder\:text-muted-foreground::placeholder{color:var(--muted-foreground)}@media (hover:hover){.hover\:w-fit:hover{width:fit-content}.hover\:bg-accent:hover{background-color:var(--accent)}.hover\:bg-background\/60:hover{background-color:color-mix(in oklab,var(--background)60%,transparent)}.hover\:bg-destructive\/80:hover{background-color:color-mix(in oklab,var(--destructive)80%,transparent)}.hover\:bg-destructive\/90:hover{background-color:color-mix(in oklab,var(--destructive)90%,transparent)}.hover\:bg-gray-100:hover{background-color:var(--color-gray-100)}.hover\:bg-gray-200:hover{background-color:var(--color-gray-200)}.hover\:bg-muted\/25:hover{background-color:color-mix(in oklab,var(--muted)25%,transparent)}.hover\:bg-muted\/50:hover{background-color:color-mix(in oklab,var(--muted)50%,transparent)}.hover\:bg-primary\/5:hover{background-color:color-mix(in oklab,var(--primary)5%,transparent)}.hover\:bg-primary\/20:hover{background-color:color-mix(in oklab,var(--primary)20%,transparent)}.hover\:bg-primary\/80:hover{background-color:color-mix(in oklab,var(--primary)80%,transparent)}.hover\:bg-primary\/90:hover{background-color:color-mix(in oklab,var(--primary)90%,transparent)}.hover\:bg-secondary\/80:hover{background-color:color-mix(in oklab,var(--secondary)80%,transparent)}.hover\:bg-zinc-300:hover{background-color:var(--color-zinc-300)}.hover\:text-accent-foreground:hover{color:var(--accent-foreground)}.hover\:underline:hover{text-decoration-line:underline}.hover\:opacity-100:hover{opacity:1}}.focus\:bg-accent:focus{background-color:var(--accent)}.focus\:text-accent-foreground:focus{color:var(--accent-foreground)}.focus\:ring-0:focus{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(0px + var(--tw-ring-offset-width))var(--tw-ring-color,currentColor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.focus\:ring-2:focus{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(2px + var(--tw-ring-offset-width))var(--tw-ring-color,currentColor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.focus\:ring-ring:focus{--tw-ring-color:var(--ring)}.focus\:ring-offset-0:focus{--tw-ring-offset-width:0px;--tw-ring-offset-shadow:var(--tw-ring-inset,)0 0 0 var(--tw-ring-offset-width)var(--tw-ring-offset-color)}.focus\:ring-offset-2:focus{--tw-ring-offset-width:2px;--tw-ring-offset-shadow:var(--tw-ring-inset,)0 0 0 var(--tw-ring-offset-width)var(--tw-ring-offset-color)}.focus\:outline-0:focus{outline-style:var(--tw-outline-style);outline-width:0}.focus\:outline-none:focus{--tw-outline-style:none;outline-style:none}.focus-visible\:relative:focus-visible{position:relative}.focus-visible\:ring-1:focus-visible{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(1px + var(--tw-ring-offset-width))var(--tw-ring-color,currentColor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.focus-visible\:ring-2:focus-visible{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(2px + var(--tw-ring-offset-width))var(--tw-ring-color,currentColor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.focus-visible\:ring-ring:focus-visible{--tw-ring-color:var(--ring)}.focus-visible\:ring-offset-2:focus-visible{--tw-ring-offset-width:2px;--tw-ring-offset-shadow:var(--tw-ring-inset,)0 0 0 var(--tw-ring-offset-width)var(--tw-ring-offset-color)}.focus-visible\:outline-none:focus-visible{--tw-outline-style:none;outline-style:none}.active\:right-0:active{right:calc(var(--spacing)*0)}.disabled\:pointer-events-none:disabled{pointer-events:none}.disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\:opacity-50:disabled{opacity:.5}.data-\[disabled\]\:pointer-events-none[data-disabled]{pointer-events:none}.data-\[disabled\]\:opacity-50[data-disabled]{opacity:.5}.data-\[disabled\=true\]\:pointer-events-none[data-disabled=true]{pointer-events:none}.data-\[disabled\=true\]\:opacity-50[data-disabled=true]{opacity:.5}.data-\[selected\=\'true\'\]\:bg-accent[data-selected=true]{background-color:var(--accent)}.data-\[selected\=true\]\:text-accent-foreground[data-selected=true]{color:var(--accent-foreground)}.data-\[side\=bottom\]\:translate-y-1[data-side=bottom]{--tw-translate-y:calc(var(--spacing)*1);translate:var(--tw-translate-x)var(--tw-translate-y)}.data-\[side\=bottom\]\:slide-in-from-top-2[data-side=bottom]{--tw-enter-translate-y:-.5rem}.data-\[side\=left\]\:-translate-x-1[data-side=left]{--tw-translate-x:calc(var(--spacing)*-1);translate:var(--tw-translate-x)var(--tw-translate-y)}.data-\[side\=left\]\:slide-in-from-right-2[data-side=left]{--tw-enter-translate-x:.5rem}.data-\[side\=right\]\:translate-x-1[data-side=right]{--tw-translate-x:calc(var(--spacing)*1);translate:var(--tw-translate-x)var(--tw-translate-y)}.data-\[side\=right\]\:slide-in-from-left-2[data-side=right]{--tw-enter-translate-x:-.5rem}.data-\[side\=top\]\:-translate-y-1[data-side=top]{--tw-translate-y:calc(var(--spacing)*-1);translate:var(--tw-translate-x)var(--tw-translate-y)}.data-\[side\=top\]\:slide-in-from-bottom-2[data-side=top]{--tw-enter-translate-y:.5rem}.data-\[state\=active\]\:visible[data-state=active]{visibility:visible}.data-\[state\=active\]\:bg-background[data-state=active]{background-color:var(--background)}.data-\[state\=active\]\:text-foreground[data-state=active]{color:var(--foreground)}.data-\[state\=active\]\:shadow-sm[data-state=active]{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a),0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.data-\[state\=checked\]\:bg-primary[data-state=checked]{background-color:var(--primary)}.data-\[state\=checked\]\:text-primary-foreground[data-state=checked]{color:var(--primary-foreground)}.data-\[state\=closed\]\:animate-out[data-state=closed]{--tw-exit-opacity:initial;--tw-exit-scale:initial;--tw-exit-rotate:initial;--tw-exit-translate-x:initial;--tw-exit-translate-y:initial;animation-name:exit;animation-duration:.15s}.data-\[state\=closed\]\:fade-out-0[data-state=closed]{--tw-exit-opacity:0}.data-\[state\=closed\]\:slide-out-to-top-\[48\%\][data-state=closed]{--tw-exit-translate-y:-48%}.data-\[state\=closed\]\:zoom-out-95[data-state=closed]{--tw-exit-scale:.95}.data-\[state\=inactive\]\:invisible[data-state=inactive]{visibility:hidden}.data-\[state\=open\]\:bg-accent[data-state=open]{background-color:var(--accent)}.data-\[state\=open\]\:text-muted-foreground[data-state=open]{color:var(--muted-foreground)}.data-\[state\=open\]\:animate-in[data-state=open]{--tw-enter-opacity:initial;--tw-enter-scale:initial;--tw-enter-rotate:initial;--tw-enter-translate-x:initial;--tw-enter-translate-y:initial;animation-name:enter;animation-duration:.15s}.data-\[state\=open\]\:fade-in-0[data-state=open]{--tw-enter-opacity:0}.data-\[state\=open\]\:slide-in-from-top-\[48\%\][data-state=open]{--tw-enter-translate-y:-48%}.data-\[state\=open\]\:zoom-in-95[data-state=open]{--tw-enter-scale:.95}.data-\[state\=selected\]\:bg-muted[data-state=selected]{background-color:var(--muted)}@supports ((-webkit-backdrop-filter:var(--tw)) or (backdrop-filter:var(--tw))){.supports-\[backdrop-filter\]\:bg-background\/60{background-color:color-mix(in oklab,var(--background)60%,transparent)}}@media (width>=40rem){.sm\:mt-0{margin-top:calc(var(--spacing)*0)}.sm\:max-w-\[600px\]{max-width:600px}.sm\:max-w-xl{max-width:var(--container-xl)}.sm\:flex-row{flex-direction:row}.sm\:justify-end{justify-content:flex-end}:where(.sm\:space-x-2>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(calc(var(--spacing)*2)*var(--tw-space-x-reverse));margin-inline-end:calc(calc(var(--spacing)*2)*calc(1 - var(--tw-space-x-reverse)))}.sm\:rounded-lg{border-radius:var(--radius)}.sm\:px-5{padding-inline:calc(var(--spacing)*5)}.sm\:text-left{text-align:left}}@media (width>=48rem){.md\:inline-block{display:inline-block}.md\:text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}}.dark\:border-destructive:is(.dark *){border-color:var(--destructive)}.dark\:border-gray-600:is(.dark *){border-color:var(--color-gray-600)}.dark\:border-gray-700:is(.dark *){border-color:var(--color-gray-700)}.dark\:bg-amber-900:is(.dark *){background-color:var(--color-amber-900)}.dark\:bg-gray-100\/20:is(.dark *){background-color:color-mix(in oklab,var(--color-gray-100)20%,transparent)}.dark\:bg-gray-800\/30:is(.dark *){background-color:color-mix(in oklab,var(--color-gray-800)30%,transparent)}.dark\:bg-red-950:is(.dark *){background-color:var(--color-red-950)}.dark\:bg-white\/95:is(.dark *){background-color:color-mix(in oklab,var(--color-white)95%,transparent)}.dark\:bg-zinc-700:is(.dark *){background-color:var(--color-zinc-700)}.dark\:from-gray-900:is(.dark *){--tw-gradient-from:var(--color-gray-900);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.dark\:to-gray-800:is(.dark *){--tw-gradient-to:var(--color-gray-800);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.dark\:text-amber-200:is(.dark *){color:var(--color-amber-200)}.dark\:text-black:is(.dark *){color:var(--color-black)}.dark\:text-gray-300:is(.dark *){color:var(--color-gray-300)}.dark\:text-gray-400:is(.dark *){color:var(--color-gray-400)}.dark\:text-red-400:is(.dark *){color:var(--color-red-400)}.dark\:text-zinc-200:is(.dark *){color:var(--color-zinc-200)}@media (hover:hover){.dark\:hover\:bg-gray-700:is(.dark *):hover{background-color:var(--color-gray-700)}.dark\:hover\:bg-gray-800:is(.dark *):hover{background-color:var(--color-gray-800)}.dark\:hover\:bg-zinc-600:is(.dark *):hover{background-color:var(--color-zinc-600)}}.\[\&_\[cmdk-group-heading\]\]\:px-2 [cmdk-group-heading]{padding-inline:calc(var(--spacing)*2)}.\[\&_\[cmdk-group-heading\]\]\:py-1\.5 [cmdk-group-heading]{padding-block:calc(var(--spacing)*1.5)}.\[\&_\[cmdk-group-heading\]\]\:text-xs [cmdk-group-heading]{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.\[\&_\[cmdk-group-heading\]\]\:font-medium [cmdk-group-heading]{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.\[\&_\[cmdk-group-heading\]\]\:text-muted-foreground [cmdk-group-heading]{color:var(--muted-foreground)}.\[\&_\[cmdk-group\]\]\:px-2 [cmdk-group]{padding-inline:calc(var(--spacing)*2)}.\[\&_\[cmdk-group\]\:not\(\[hidden\]\)_\~\[cmdk-group\]\]\:pt-0 [cmdk-group]:not([hidden])~[cmdk-group]{padding-top:calc(var(--spacing)*0)}.\[\&_\[cmdk-input-wrapper\]_svg\]\:h-5 [cmdk-input-wrapper] svg{height:calc(var(--spacing)*5)}.\[\&_\[cmdk-input-wrapper\]_svg\]\:w-5 [cmdk-input-wrapper] svg{width:calc(var(--spacing)*5)}.\[\&_\[cmdk-input\]\]\:h-12 [cmdk-input]{height:calc(var(--spacing)*12)}.\[\&_\[cmdk-item\]\]\:px-2 [cmdk-item]{padding-inline:calc(var(--spacing)*2)}.\[\&_\[cmdk-item\]\]\:py-3 [cmdk-item]{padding-block:calc(var(--spacing)*3)}.\[\&_\[cmdk-item\]_svg\]\:h-5 [cmdk-item] svg{height:calc(var(--spacing)*5)}.\[\&_\[cmdk-item\]_svg\]\:w-5 [cmdk-item] svg{width:calc(var(--spacing)*5)}.\[\&_p\]\:leading-relaxed p{--tw-leading:var(--leading-relaxed);line-height:var(--leading-relaxed)}.\[\&_svg\]\:pointer-events-none svg{pointer-events:none}.\[\&_svg\]\:size-4 svg{width:calc(var(--spacing)*4);height:calc(var(--spacing)*4)}.\[\&_svg\]\:shrink-0 svg{flex-shrink:0}.\[\&_tr\]\:border-b tr{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.\[\&_tr\:last-child\]\:border-0 tr:last-child{border-style:var(--tw-border-style);border-width:0}.\[\&\:\:-webkit-inner-spin-button\]\:appearance-none::-webkit-inner-spin-button{-webkit-appearance:none;-moz-appearance:none;appearance:none}.\[\&\:\:-webkit-inner-spin-button\]\:opacity-100::-webkit-inner-spin-button{opacity:1}.\[\&\:\:-webkit-outer-spin-button\]\:appearance-none::-webkit-outer-spin-button{-webkit-appearance:none;-moz-appearance:none;appearance:none}.\[\&\:\:-webkit-outer-spin-button\]\:opacity-100::-webkit-outer-spin-button{opacity:1}.\[\&\:has\(\[role\=checkbox\]\)\]\:pr-0:has([role=checkbox]){padding-right:calc(var(--spacing)*0)}.\[\&\>\[role\=checkbox\]\]\:translate-y-\[2px\]>[role=checkbox]{--tw-translate-y:2px;translate:var(--tw-translate-x)var(--tw-translate-y)}.\[\&\>span\]\:line-clamp-1>span{-webkit-line-clamp:1;-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden}.\[\&\>svg\]\:absolute>svg{position:absolute}.\[\&\>svg\]\:top-4>svg{top:calc(var(--spacing)*4)}.\[\&\>svg\]\:left-4>svg{left:calc(var(--spacing)*4)}.\[\&\>svg\]\:text-destructive>svg{color:var(--destructive)}.\[\&\>svg\]\:text-foreground>svg{color:var(--foreground)}.\[\&\>svg\+div\]\:translate-y-\[-3px\]>svg+div{--tw-translate-y:-3px;translate:var(--tw-translate-x)var(--tw-translate-y)}.\[\&\>svg\~\*\]\:pl-7>svg~*{padding-left:calc(var(--spacing)*7)}.\[\&\>tr\]\:last\:border-b-0>tr:last-child{border-bottom-style:var(--tw-border-style);border-bottom-width:0}}:root{--background:#fff;--foreground:#09090b;--card:#fff;--card-foreground:#09090b;--popover:#fff;--popover-foreground:#09090b;--primary:#18181b;--primary-foreground:#fafafa;--secondary:#f4f4f5;--secondary-foreground:#18181b;--muted:#f4f4f5;--muted-foreground:#71717a;--accent:#f4f4f5;--accent-foreground:#18181b;--destructive:#ef4444;--destructive-foreground:#fafafa;--border:#e4e4e7;--input:#e4e4e7;--ring:#09090b;--chart-1:#e76e50;--chart-2:#2a9d90;--chart-3:#274754;--chart-4:#e8c468;--chart-5:#f4a462;--radius:.6rem;--sidebar-background:#fafafa;--sidebar-foreground:#3f3f46;--sidebar-primary:#18181b;--sidebar-primary-foreground:#fafafa;--sidebar-accent:#f4f4f5;--sidebar-accent-foreground:#18181b;--sidebar-border:#e5e7eb;--sidebar-ring:#3b82f6}.dark{--background:#09090b;--foreground:#fafafa;--card:#09090b;--card-foreground:#fafafa;--popover:#09090b;--popover-foreground:#fafafa;--primary:#fafafa;--primary-foreground:#18181b;--secondary:#27272a;--secondary-foreground:#fafafa;--muted:#27272a;--muted-foreground:#a1a1aa;--accent:#27272a;--accent-foreground:#fafafa;--destructive:#7f1d1d;--destructive-foreground:#fafafa;--border:#27272a;--input:#27272a;--ring:#d4d4d8;--chart-1:#2662d9;--chart-2:#2eb88a;--chart-3:#e88c30;--chart-4:#af57db;--chart-5:#e23670;--sidebar-background:#18181b;--sidebar-foreground:#f4f4f5;--sidebar-primary:#1d4ed8;--sidebar-primary-foreground:#fff;--sidebar-accent:#27272a;--sidebar-accent-foreground:#f4f4f5;--sidebar-border:#27272a;--sidebar-ring:#3b82f6}::-webkit-scrollbar{width:10px;height:10px}::-webkit-scrollbar-thumb{background-color:#ccc;border-radius:5px}::-webkit-scrollbar-track{background-color:#f2f2f2}.dark ::-webkit-scrollbar-thumb{background-color:#e6e6e6}.dark ::-webkit-scrollbar-track{background-color:#000}@keyframes enter{0%{opacity:var(--tw-enter-opacity,1);transform:translate3d(var(--tw-enter-translate-x,0),var(--tw-enter-translate-y,0),0)scale3d(var(--tw-enter-scale,1),var(--tw-enter-scale,1),var(--tw-enter-scale,1))rotate(var(--tw-enter-rotate,0))}}@keyframes exit{to{opacity:var(--tw-exit-opacity,1);transform:translate3d(var(--tw-exit-translate-x,0),var(--tw-exit-translate-y,0),0)scale3d(var(--tw-exit-scale,1),var(--tw-exit-scale,1),var(--tw-exit-scale,1))rotate(var(--tw-exit-rotate,0))}}@keyframes spin{to{transform:rotate(360deg)}}@keyframes pulse{50%{opacity:.5}}@property --tw-translate-x{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-y{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-z{syntax:"*";inherits:false;initial-value:0}@property --tw-scale-x{syntax:"*";inherits:false;initial-value:1}@property --tw-scale-y{syntax:"*";inherits:false;initial-value:1}@property --tw-scale-z{syntax:"*";inherits:false;initial-value:1}@property --tw-rotate-x{syntax:"*";inherits:false;initial-value:rotateX(0)}@property --tw-rotate-y{syntax:"*";inherits:false;initial-value:rotateY(0)}@property --tw-rotate-z{syntax:"*";inherits:false;initial-value:rotateZ(0)}@property --tw-skew-x{syntax:"*";inherits:false;initial-value:skewX(0)}@property --tw-skew-y{syntax:"*";inherits:false;initial-value:skewY(0)}@property --tw-space-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-gradient-position{syntax:"*";inherits:false}@property --tw-gradient-from{syntax:"";inherits:false;initial-value:#0000}@property --tw-gradient-via{syntax:"";inherits:false;initial-value:#0000}@property --tw-gradient-to{syntax:"";inherits:false;initial-value:#0000}@property --tw-gradient-stops{syntax:"*";inherits:false}@property --tw-gradient-via-stops{syntax:"*";inherits:false}@property --tw-gradient-from-position{syntax:"";inherits:false;initial-value:0%}@property --tw-gradient-via-position{syntax:"";inherits:false;initial-value:50%}@property --tw-gradient-to-position{syntax:"";inherits:false;initial-value:100%}@property --tw-leading{syntax:"*";inherits:false}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-tracking{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-outline-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-blur{syntax:"*";inherits:false}@property --tw-brightness{syntax:"*";inherits:false}@property --tw-contrast{syntax:"*";inherits:false}@property --tw-grayscale{syntax:"*";inherits:false}@property --tw-hue-rotate{syntax:"*";inherits:false}@property --tw-invert{syntax:"*";inherits:false}@property --tw-opacity{syntax:"*";inherits:false}@property --tw-saturate{syntax:"*";inherits:false}@property --tw-sepia{syntax:"*";inherits:false}@property --tw-drop-shadow{syntax:"*";inherits:false}@property --tw-backdrop-blur{syntax:"*";inherits:false}@property --tw-backdrop-brightness{syntax:"*";inherits:false}@property --tw-backdrop-contrast{syntax:"*";inherits:false}@property --tw-backdrop-grayscale{syntax:"*";inherits:false}@property --tw-backdrop-hue-rotate{syntax:"*";inherits:false}@property --tw-backdrop-invert{syntax:"*";inherits:false}@property --tw-backdrop-opacity{syntax:"*";inherits:false}@property --tw-backdrop-saturate{syntax:"*";inherits:false}@property --tw-backdrop-sepia{syntax:"*";inherits:false}@property --tw-duration{syntax:"*";inherits:false}@property --tw-space-x-reverse{syntax:"*";inherits:false;initial-value:0}:root{--sigma-background-color:#fff;--sigma-controls-background-color:#fff;--sigma-controls-background-color-hover:rgba(0,0,0,.2);--sigma-controls-border-color:rgba(0,0,0,.2);--sigma-controls-color:#000;--sigma-controls-zindex:100;--sigma-controls-margin:5px;--sigma-controls-size:30px}div.react-sigma{height:100%;width:100%;position:relative;background:var(--sigma-background-color)}div.sigma-container{height:100%;width:100%}.react-sigma-controls{position:absolute;z-index:var(--sigma-controls-zindex);border:2px solid var(--sigma-controls-border-color);border-radius:4px;color:var(--sigma-controls-color);background-color:var(--sigma-controls-background-color)}.react-sigma-controls.bottom-right{bottom:var(--sigma-controls-margin);right:var(--sigma-controls-margin)}.react-sigma-controls.bottom-left{bottom:var(--sigma-controls-margin);left:var(--sigma-controls-margin)}.react-sigma-controls.top-right{top:var(--sigma-controls-margin);right:var(--sigma-controls-margin)}.react-sigma-controls.top-left{top:var(--sigma-controls-margin);left:var(--sigma-controls-margin)}.react-sigma-controls:first-child{border-top-left-radius:2px;border-top-right-radius:2px}.react-sigma-controls:last-child{border-bottom-left-radius:2px;border-bottom-right-radius:2px}.react-sigma-control{width:var(--sigma-controls-size);height:var(--sigma-controls-size);line-height:var(--sigma-controls-size);background-color:var(--sigma-controls-background-color);border-bottom:1px solid var(--sigma-controls-border-color)}.react-sigma-control:last-child{border-bottom:none}.react-sigma-control>*{box-sizing:border-box}.react-sigma-control>button{display:block;border:none;margin:0;padding:0;width:var(--sigma-controls-size);height:var(--sigma-controls-size);line-height:var(--sigma-controls-size);background-position:center;background-size:50%;background-repeat:no-repeat;background-color:var(--sigma-controls-background-color);clip:rect(0,0,0,0)}.react-sigma-control>button:hover{background-color:var(--sigma-controls-background-color-hover)}.react-sigma-search{background-color:var(--sigma-controls-background-color)}.react-sigma-search label{visibility:hidden}.react-sigma-search input{color:var(--sigma-controls-color);background-color:var(--sigma-controls-background-color);font-size:1em;width:100%;margin:0;border:none;padding:var(--sigma-controls-margin);box-sizing:border-box}:root{--sigma-grey-color:#ccc}.react-sigma .option.hoverable{cursor:pointer!important}.react-sigma .text-ellipsis{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.react-sigma .react-select__clear-indicator{cursor:pointer!important}.react-sigma .text-muted{color:var(--sigma-grey-color)}.react-sigma .text-italic{font-style:italic}.react-sigma .text-center{text-align:center}.react-sigma .graph-search{min-width:250px}.react-sigma .graph-search .option{padding:2px 8px}.react-sigma .graph-search .dropdown-indicator{font-size:1.25em;padding:4px}.react-sigma .graph-search .option.selected{background-color:var(--sigma-grey-color)}.react-sigma .node .render{position:relative;display:inline-block;width:1em;height:1em;border-radius:1em;background-color:var(--sigma-grey-color);margin-right:8px}.react-sigma .node{display:flex;flex-direction:row;align-items:center}.react-sigma .node .render{flex-grow:0;flex-shrink:0;margin-right:0 .25em}.react-sigma .node .label{flex-grow:1;flex-shrink:1}.react-sigma .edge{display:flex;flex-direction:column;align-items:flex-start;flex-grow:0;flex-shrink:0;flex-wrap:nowrap}.react-sigma .edge .node{font-size:.7em}.react-sigma .edge .body{display:flex;flex-direction:row;flex-grow:1;flex-shrink:1;min-height:.6em}.react-sigma .edge .body .render{display:flex;flex-direction:column;margin:0 2px}.react-sigma .edge .body .render .dash,.react-sigma .edge .body .render .dotted{display:inline-block;width:0;margin:0 2px;border:2px solid #ccc;flex-grow:1;flex-shrink:1}.react-sigma .edge .body .render .dotted{border-style:dotted}.react-sigma .edge .body .render .arrow{width:0;height:0;border-left:.3em solid transparent;border-right:.3em solid transparent;border-top:.6em solid red;flex-shrink:0;flex-grow:0;border-left-width:.3em;border-right-width:.3em}.react-sigma .edge .body .label{flex-grow:1;flex-shrink:1;text-align:center} diff --git a/lightrag/api/webui/index.html b/lightrag/api/webui/index.html index dd711bb3..c6c44d13 100644 --- a/lightrag/api/webui/index.html +++ b/lightrag/api/webui/index.html @@ -8,8 +8,8 @@ Lightrag - - + +
From b2963b8a9c4d6b0d4bf6ecce8fd485b42627da5e Mon Sep 17 00:00:00 2001 From: yangdx Date: Wed, 26 Mar 2025 18:59:50 +0800 Subject: [PATCH 22/23] Add unit to progress indicator on pipeline status dialog --- .../src/components/documents/PipelineStatusDialog.tsx | 2 +- lightrag_webui/src/locales/ar.json | 1 + lightrag_webui/src/locales/en.json | 1 + lightrag_webui/src/locales/fr.json | 1 + lightrag_webui/src/locales/zh.json | 1 + 5 files changed, 5 insertions(+), 1 deletion(-) diff --git a/lightrag_webui/src/components/documents/PipelineStatusDialog.tsx b/lightrag_webui/src/components/documents/PipelineStatusDialog.tsx index 642285df..3544be27 100644 --- a/lightrag_webui/src/components/documents/PipelineStatusDialog.tsx +++ b/lightrag_webui/src/components/documents/PipelineStatusDialog.tsx @@ -159,7 +159,7 @@ export default function PipelineStatusDialog({
{t('documentPanel.pipelineStatus.jobName')}: {status?.job_name || '-'}
{t('documentPanel.pipelineStatus.startTime')}: {status?.job_start ? new Date(status.job_start).toLocaleString() : '-'} - {t('documentPanel.pipelineStatus.progress')}: {status ? `${status.cur_batch}/${status.batchs}` : '-'} + {t('documentPanel.pipelineStatus.progress')}: {status ? `${status.cur_batch}/${status.batchs} ${t('documentPanel.pipelineStatus.unit')}` : '-'}
diff --git a/lightrag_webui/src/locales/ar.json b/lightrag_webui/src/locales/ar.json index 7c99739c..aa034f4a 100644 --- a/lightrag_webui/src/locales/ar.json +++ b/lightrag_webui/src/locales/ar.json @@ -99,6 +99,7 @@ "jobName": "اسم المهمة", "startTime": "وقت البدء", "progress": "التقدم", + "unit": "دفعة", "latestMessage": "آخر رسالة", "historyMessages": "سجل الرسائل", "errors": { diff --git a/lightrag_webui/src/locales/en.json b/lightrag_webui/src/locales/en.json index 5ec6624c..1f01f397 100644 --- a/lightrag_webui/src/locales/en.json +++ b/lightrag_webui/src/locales/en.json @@ -99,6 +99,7 @@ "jobName": "Job Name", "startTime": "Start Time", "progress": "Progress", + "unit": "batch", "latestMessage": "Latest Message", "historyMessages": "History Message", "errors": { diff --git a/lightrag_webui/src/locales/fr.json b/lightrag_webui/src/locales/fr.json index 5c9975de..c3779328 100644 --- a/lightrag_webui/src/locales/fr.json +++ b/lightrag_webui/src/locales/fr.json @@ -99,6 +99,7 @@ "jobName": "Nom du travail", "startTime": "Heure de début", "progress": "Progression", + "unit": "lot", "latestMessage": "Dernier message", "historyMessages": "Historique des messages", "errors": { diff --git a/lightrag_webui/src/locales/zh.json b/lightrag_webui/src/locales/zh.json index e356404c..ee37fa87 100644 --- a/lightrag_webui/src/locales/zh.json +++ b/lightrag_webui/src/locales/zh.json @@ -99,6 +99,7 @@ "jobName": "作业名称", "startTime": "开始时间", "progress": "进度", + "unit": "批", "latestMessage": "最新消息", "historyMessages": "历史消息", "errors": { From a1dd6437ef4bc50e4097486984cedf86b005cb24 Mon Sep 17 00:00:00 2001 From: yangdx Date: Wed, 26 Mar 2025 19:00:19 +0800 Subject: [PATCH 23/23] Update webui assets --- .../assets/{index-CXCx2b5K.js => index-BX3dHkLt.js} | 10 +++++----- lightrag/api/webui/index.html | 2 +- 2 files changed, 6 insertions(+), 6 deletions(-) rename lightrag/api/webui/assets/{index-CXCx2b5K.js => index-BX3dHkLt.js} (99%) diff --git a/lightrag/api/webui/assets/index-CXCx2b5K.js b/lightrag/api/webui/assets/index-BX3dHkLt.js similarity index 99% rename from lightrag/api/webui/assets/index-CXCx2b5K.js rename to lightrag/api/webui/assets/index-BX3dHkLt.js index f121e1f6..9a451ee3 100644 --- a/lightrag/api/webui/assets/index-CXCx2b5K.js +++ b/lightrag/api/webui/assets/index-BX3dHkLt.js @@ -1093,7 +1093,7 @@ In order to be iterable, non-array objects must have a [Symbol.iterator]() metho - \`null\` or \`undefined\` if the progress is indeterminate. Defaulting to \`null\`.`}var Z5=W5,Sie=K5;const Q5=w.forwardRef(({className:e,value:t,...n},r)=>E.jsx(Z5,{ref:r,className:Me("bg-secondary relative h-4 w-full overflow-hidden rounded-full",e),...n,children:E.jsx(Sie,{className:"bg-primary h-full w-full flex-1 transition-all",style:{transform:`translateX(-${100-(t||0)}%)`}})}));Q5.displayName=Z5.displayName;function Eie(e,t){return w.useReducer((n,r)=>t[n][r]??n,e)}var BT="ScrollArea",[J5,cke]=wr(BT),[wie,Tr]=J5(BT),eG=w.forwardRef((e,t)=>{const{__scopeScrollArea:n,type:r="hover",dir:a,scrollHideDelay:o=600,...s}=e,[u,c]=w.useState(null),[d,p]=w.useState(null),[g,m]=w.useState(null),[b,y]=w.useState(null),[v,k]=w.useState(null),[A,x]=w.useState(0),[R,O]=w.useState(0),[_,C]=w.useState(!1),[N,M]=w.useState(!1),I=mt(t,H=>c(H)),D=pp(a);return E.jsx(wie,{scope:n,type:r,dir:D,scrollHideDelay:o,scrollArea:u,viewport:d,onViewportChange:p,content:g,onContentChange:m,scrollbarX:b,onScrollbarXChange:y,scrollbarXEnabled:_,onScrollbarXEnabledChange:C,scrollbarY:v,onScrollbarYChange:k,scrollbarYEnabled:N,onScrollbarYEnabledChange:M,onCornerWidthChange:x,onCornerHeightChange:O,children:E.jsx(Ze.div,{dir:D,...s,ref:I,style:{position:"relative","--radix-scroll-area-corner-width":A+"px","--radix-scroll-area-corner-height":R+"px",...e.style}})})});eG.displayName=BT;var tG="ScrollAreaViewport",nG=w.forwardRef((e,t)=>{const{__scopeScrollArea:n,children:r,nonce:a,...o}=e,s=Tr(tG,n),u=w.useRef(null),c=mt(t,u,s.onViewportChange);return E.jsxs(E.Fragment,{children:[E.jsx("style",{dangerouslySetInnerHTML:{__html:"[data-radix-scroll-area-viewport]{scrollbar-width:none;-ms-overflow-style:none;-webkit-overflow-scrolling:touch;}[data-radix-scroll-area-viewport]::-webkit-scrollbar{display:none}"},nonce:a}),E.jsx(Ze.div,{"data-radix-scroll-area-viewport":"",...o,ref:c,style:{overflowX:s.scrollbarXEnabled?"scroll":"hidden",overflowY:s.scrollbarYEnabled?"scroll":"hidden",...e.style},children:E.jsx("div",{ref:s.onContentChange,style:{minWidth:"100%",display:"table"},children:r})})]})});nG.displayName=tG;var ca="ScrollAreaScrollbar",UT=w.forwardRef((e,t)=>{const{forceMount:n,...r}=e,a=Tr(ca,e.__scopeScrollArea),{onScrollbarXEnabledChange:o,onScrollbarYEnabledChange:s}=a,u=e.orientation==="horizontal";return w.useEffect(()=>(u?o(!0):s(!0),()=>{u?o(!1):s(!1)}),[u,o,s]),a.type==="hover"?E.jsx(xie,{...r,ref:t,forceMount:n}):a.type==="scroll"?E.jsx(kie,{...r,ref:t,forceMount:n}):a.type==="auto"?E.jsx(rG,{...r,ref:t,forceMount:n}):a.type==="always"?E.jsx(jT,{...r,ref:t}):null});UT.displayName=ca;var xie=w.forwardRef((e,t)=>{const{forceMount:n,...r}=e,a=Tr(ca,e.__scopeScrollArea),[o,s]=w.useState(!1);return w.useEffect(()=>{const u=a.scrollArea;let c=0;if(u){const d=()=>{window.clearTimeout(c),s(!0)},p=()=>{c=window.setTimeout(()=>s(!1),a.scrollHideDelay)};return u.addEventListener("pointerenter",d),u.addEventListener("pointerleave",p),()=>{window.clearTimeout(c),u.removeEventListener("pointerenter",d),u.removeEventListener("pointerleave",p)}}},[a.scrollArea,a.scrollHideDelay]),E.jsx(xr,{present:n||o,children:E.jsx(rG,{"data-state":o?"visible":"hidden",...r,ref:t})})}),kie=w.forwardRef((e,t)=>{const{forceMount:n,...r}=e,a=Tr(ca,e.__scopeScrollArea),o=e.orientation==="horizontal",s=Np(()=>c("SCROLL_END"),100),[u,c]=Eie("hidden",{hidden:{SCROLL:"scrolling"},scrolling:{SCROLL_END:"idle",POINTER_ENTER:"interacting"},interacting:{SCROLL:"interacting",POINTER_LEAVE:"idle"},idle:{HIDE:"hidden",SCROLL:"scrolling",POINTER_ENTER:"interacting"}});return w.useEffect(()=>{if(u==="idle"){const d=window.setTimeout(()=>c("HIDE"),a.scrollHideDelay);return()=>window.clearTimeout(d)}},[u,a.scrollHideDelay,c]),w.useEffect(()=>{const d=a.viewport,p=o?"scrollLeft":"scrollTop";if(d){let g=d[p];const m=()=>{const b=d[p];g!==b&&(c("SCROLL"),s()),g=b};return d.addEventListener("scroll",m),()=>d.removeEventListener("scroll",m)}},[a.viewport,o,c,s]),E.jsx(xr,{present:n||u!=="hidden",children:E.jsx(jT,{"data-state":u==="hidden"?"hidden":"visible",...r,ref:t,onPointerEnter:Ke(e.onPointerEnter,()=>c("POINTER_ENTER")),onPointerLeave:Ke(e.onPointerLeave,()=>c("POINTER_LEAVE"))})})}),rG=w.forwardRef((e,t)=>{const n=Tr(ca,e.__scopeScrollArea),{forceMount:r,...a}=e,[o,s]=w.useState(!1),u=e.orientation==="horizontal",c=Np(()=>{if(n.viewport){const d=n.viewport.offsetWidth{const{orientation:n="vertical",...r}=e,a=Tr(ca,e.__scopeScrollArea),o=w.useRef(null),s=w.useRef(0),[u,c]=w.useState({content:0,viewport:0,scrollbar:{size:0,paddingStart:0,paddingEnd:0}}),d=lG(u.viewport,u.content),p={...r,sizes:u,onSizesChange:c,hasThumb:d>0&&d<1,onThumbChange:m=>o.current=m,onThumbPointerUp:()=>s.current=0,onThumbPointerDown:m=>s.current=m};function g(m,b){return Nie(m,s.current,u,b)}return n==="horizontal"?E.jsx(Tie,{...p,ref:t,onThumbPositionChange:()=>{if(a.viewport&&o.current){const m=a.viewport.scrollLeft,b=ZO(m,u,a.dir);o.current.style.transform=`translate3d(${b}px, 0, 0)`}},onWheelScroll:m=>{a.viewport&&(a.viewport.scrollLeft=m)},onDragScroll:m=>{a.viewport&&(a.viewport.scrollLeft=g(m,a.dir))}}):n==="vertical"?E.jsx(Aie,{...p,ref:t,onThumbPositionChange:()=>{if(a.viewport&&o.current){const m=a.viewport.scrollTop,b=ZO(m,u);o.current.style.transform=`translate3d(0, ${b}px, 0)`}},onWheelScroll:m=>{a.viewport&&(a.viewport.scrollTop=m)},onDragScroll:m=>{a.viewport&&(a.viewport.scrollTop=g(m))}}):null}),Tie=w.forwardRef((e,t)=>{const{sizes:n,onSizesChange:r,...a}=e,o=Tr(ca,e.__scopeScrollArea),[s,u]=w.useState(),c=w.useRef(null),d=mt(t,c,o.onScrollbarXChange);return w.useEffect(()=>{c.current&&u(getComputedStyle(c.current))},[c]),E.jsx(oG,{"data-orientation":"horizontal",...a,ref:d,sizes:n,style:{bottom:0,left:o.dir==="rtl"?"var(--radix-scroll-area-corner-width)":0,right:o.dir==="ltr"?"var(--radix-scroll-area-corner-width)":0,"--radix-scroll-area-thumb-width":_p(n)+"px",...e.style},onThumbPointerDown:p=>e.onThumbPointerDown(p.x),onDragScroll:p=>e.onDragScroll(p.x),onWheelScroll:(p,g)=>{if(o.viewport){const m=o.viewport.scrollLeft+p.deltaX;e.onWheelScroll(m),cG(m,g)&&p.preventDefault()}},onResize:()=>{c.current&&o.viewport&&s&&r({content:o.viewport.scrollWidth,viewport:o.viewport.offsetWidth,scrollbar:{size:c.current.clientWidth,paddingStart:Mf(s.paddingLeft),paddingEnd:Mf(s.paddingRight)}})}})}),Aie=w.forwardRef((e,t)=>{const{sizes:n,onSizesChange:r,...a}=e,o=Tr(ca,e.__scopeScrollArea),[s,u]=w.useState(),c=w.useRef(null),d=mt(t,c,o.onScrollbarYChange);return w.useEffect(()=>{c.current&&u(getComputedStyle(c.current))},[c]),E.jsx(oG,{"data-orientation":"vertical",...a,ref:d,sizes:n,style:{top:0,right:o.dir==="ltr"?0:void 0,left:o.dir==="rtl"?0:void 0,bottom:"var(--radix-scroll-area-corner-height)","--radix-scroll-area-thumb-height":_p(n)+"px",...e.style},onThumbPointerDown:p=>e.onThumbPointerDown(p.y),onDragScroll:p=>e.onDragScroll(p.y),onWheelScroll:(p,g)=>{if(o.viewport){const m=o.viewport.scrollTop+p.deltaY;e.onWheelScroll(m),cG(m,g)&&p.preventDefault()}},onResize:()=>{c.current&&o.viewport&&s&&r({content:o.viewport.scrollHeight,viewport:o.viewport.offsetHeight,scrollbar:{size:c.current.clientHeight,paddingStart:Mf(s.paddingTop),paddingEnd:Mf(s.paddingBottom)}})}})}),[Rie,aG]=J5(ca),oG=w.forwardRef((e,t)=>{const{__scopeScrollArea:n,sizes:r,hasThumb:a,onThumbChange:o,onThumbPointerUp:s,onThumbPointerDown:u,onThumbPositionChange:c,onDragScroll:d,onWheelScroll:p,onResize:g,...m}=e,b=Tr(ca,n),[y,v]=w.useState(null),k=mt(t,I=>v(I)),A=w.useRef(null),x=w.useRef(""),R=b.viewport,O=r.content-r.viewport,_=yn(p),C=yn(c),N=Np(g,10);function M(I){if(A.current){const D=I.clientX-A.current.left,H=I.clientY-A.current.top;d({x:D,y:H})}}return w.useEffect(()=>{const I=D=>{const H=D.target;(y==null?void 0:y.contains(H))&&_(D,O)};return document.addEventListener("wheel",I,{passive:!1}),()=>document.removeEventListener("wheel",I,{passive:!1})},[R,y,O,_]),w.useEffect(C,[r,C]),zs(y,N),zs(b.content,N),E.jsx(Rie,{scope:n,scrollbar:y,hasThumb:a,onThumbChange:yn(o),onThumbPointerUp:yn(s),onThumbPositionChange:C,onThumbPointerDown:yn(u),children:E.jsx(Ze.div,{...m,ref:k,style:{position:"absolute",...m.style},onPointerDown:Ke(e.onPointerDown,I=>{I.button===0&&(I.target.setPointerCapture(I.pointerId),A.current=y.getBoundingClientRect(),x.current=document.body.style.webkitUserSelect,document.body.style.webkitUserSelect="none",b.viewport&&(b.viewport.style.scrollBehavior="auto"),M(I))}),onPointerMove:Ke(e.onPointerMove,M),onPointerUp:Ke(e.onPointerUp,I=>{const D=I.target;D.hasPointerCapture(I.pointerId)&&D.releasePointerCapture(I.pointerId),document.body.style.webkitUserSelect=x.current,b.viewport&&(b.viewport.style.scrollBehavior=""),A.current=null})})})}),Lf="ScrollAreaThumb",iG=w.forwardRef((e,t)=>{const{forceMount:n,...r}=e,a=aG(Lf,e.__scopeScrollArea);return E.jsx(xr,{present:n||a.hasThumb,children:E.jsx(Cie,{ref:t,...r})})}),Cie=w.forwardRef((e,t)=>{const{__scopeScrollArea:n,style:r,...a}=e,o=Tr(Lf,n),s=aG(Lf,n),{onThumbPositionChange:u}=s,c=mt(t,g=>s.onThumbChange(g)),d=w.useRef(void 0),p=Np(()=>{d.current&&(d.current(),d.current=void 0)},100);return w.useEffect(()=>{const g=o.viewport;if(g){const m=()=>{if(p(),!d.current){const b=Oie(g,u);d.current=b,u()}};return u(),g.addEventListener("scroll",m),()=>g.removeEventListener("scroll",m)}},[o.viewport,p,u]),E.jsx(Ze.div,{"data-state":s.hasThumb?"visible":"hidden",...a,ref:c,style:{width:"var(--radix-scroll-area-thumb-width)",height:"var(--radix-scroll-area-thumb-height)",...r},onPointerDownCapture:Ke(e.onPointerDownCapture,g=>{const b=g.target.getBoundingClientRect(),y=g.clientX-b.left,v=g.clientY-b.top;s.onThumbPointerDown({x:y,y:v})}),onPointerUp:Ke(e.onPointerUp,s.onThumbPointerUp)})});iG.displayName=Lf;var GT="ScrollAreaCorner",sG=w.forwardRef((e,t)=>{const n=Tr(GT,e.__scopeScrollArea),r=!!(n.scrollbarX&&n.scrollbarY);return n.type!=="scroll"&&r?E.jsx(_ie,{...e,ref:t}):null});sG.displayName=GT;var _ie=w.forwardRef((e,t)=>{const{__scopeScrollArea:n,...r}=e,a=Tr(GT,n),[o,s]=w.useState(0),[u,c]=w.useState(0),d=!!(o&&u);return zs(a.scrollbarX,()=>{var g;const p=((g=a.scrollbarX)==null?void 0:g.offsetHeight)||0;a.onCornerHeightChange(p),c(p)}),zs(a.scrollbarY,()=>{var g;const p=((g=a.scrollbarY)==null?void 0:g.offsetWidth)||0;a.onCornerWidthChange(p),s(p)}),d?E.jsx(Ze.div,{...r,ref:t,style:{width:o,height:u,position:"absolute",right:a.dir==="ltr"?0:void 0,left:a.dir==="rtl"?0:void 0,bottom:0,...e.style}}):null});function Mf(e){return e?parseInt(e,10):0}function lG(e,t){const n=e/t;return isNaN(n)?0:n}function _p(e){const t=lG(e.viewport,e.content),n=e.scrollbar.paddingStart+e.scrollbar.paddingEnd,r=(e.scrollbar.size-n)*t;return Math.max(r,18)}function Nie(e,t,n,r="ltr"){const a=_p(n),o=a/2,s=t||o,u=a-s,c=n.scrollbar.paddingStart+s,d=n.scrollbar.size-n.scrollbar.paddingEnd-u,p=n.content-n.viewport,g=r==="ltr"?[0,p]:[p*-1,0];return uG([c,d],g)(e)}function ZO(e,t,n="ltr"){const r=_p(t),a=t.scrollbar.paddingStart+t.scrollbar.paddingEnd,o=t.scrollbar.size-a,s=t.content-t.viewport,u=o-r,c=n==="ltr"?[0,s]:[s*-1,0],d=Ik(e,c);return uG([0,s],[0,u])(d)}function uG(e,t){return n=>{if(e[0]===e[1]||t[0]===t[1])return t[0];const r=(t[1]-t[0])/(e[1]-e[0]);return t[0]+r*(n-e[0])}}function cG(e,t){return e>0&&e{})=>{let n={left:e.scrollLeft,top:e.scrollTop},r=0;return function a(){const o={left:e.scrollLeft,top:e.scrollTop},s=n.left!==o.left,u=n.top!==o.top;(s||u)&&t(),n=o,r=window.requestAnimationFrame(a)}(),()=>window.cancelAnimationFrame(r)};function Np(e,t){const n=yn(e),r=w.useRef(0);return w.useEffect(()=>()=>window.clearTimeout(r.current),[]),w.useCallback(()=>{window.clearTimeout(r.current),r.current=window.setTimeout(n,t)},[n,t])}function zs(e,t){const n=yn(t);Rn(()=>{let r=0;if(e){const a=new ResizeObserver(()=>{cancelAnimationFrame(r),r=window.requestAnimationFrame(n)});return a.observe(e),()=>{window.cancelAnimationFrame(r),a.unobserve(e)}}},[e,n])}var dG=eG,Iie=nG,Die=sG;const fG=w.forwardRef(({className:e,children:t,...n},r)=>E.jsxs(dG,{ref:r,className:Me("relative overflow-hidden",e),...n,children:[E.jsx(Iie,{className:"h-full w-full rounded-[inherit]",children:t}),E.jsx(pG,{}),E.jsx(Die,{})]}));fG.displayName=dG.displayName;const pG=w.forwardRef(({className:e,orientation:t="vertical",...n},r)=>E.jsx(UT,{ref:r,orientation:t,className:Me("flex touch-none transition-colors select-none",t==="vertical"&&"h-full w-2.5 border-l border-l-transparent p-[1px]",t==="horizontal"&&"h-2.5 flex-col border-t border-t-transparent p-[1px]",e),...n,children:E.jsx(iG,{className:"bg-border relative flex-1 rounded-full"})}));pG.displayName=UT.displayName;function l0(e,t={}){const{decimals:n=0,sizeType:r="normal"}=t,a=["Bytes","KB","MB","GB","TB"],o=["Bytes","KiB","MiB","GiB","TiB"];if(e===0)return"0 Byte";const s=Math.floor(Math.log(e)/Math.log(1024));return`${(e/Math.pow(1024,s)).toFixed(n)} ${r==="accurate"?o[s]??"Bytes":a[s]??"Bytes"}`}function Lie(e){const{value:t,onValueChange:n,onUpload:r,progresses:a,accept:o=mV,maxSize:s=1024*1024*200,maxFileCount:u=1,multiple:c=!1,disabled:d=!1,description:p,className:g,...m}=e,[b,y]=Ba({prop:t,onChange:n}),v=w.useCallback((x,R)=>{if(!c&&u===1&&x.length>1){Ft.error("Cannot upload more than 1 file at a time");return}if(((b==null?void 0:b.length)??0)+x.length>u){Ft.error(`Cannot upload more than ${u} files`);return}const O=x.map(C=>Object.assign(C,{preview:URL.createObjectURL(C)})),_=b?[...b,...O]:O;if(y(_),R.length>0&&R.forEach(({file:C})=>{Ft.error(`File ${C.name} was rejected`)}),r&&_.length>0&&_.length<=u){const C=_.length>0?`${_.length} files`:"file";Ft.promise(r(_),{loading:`Uploading ${C}...`,success:()=>(y([]),`${C} uploaded`),error:`Failed to upload ${C}`})}},[b,u,c,r,y]);function k(x){if(!b)return;const R=b.filter((O,_)=>_!==x);y(R),n==null||n(R)}w.useEffect(()=>()=>{b&&b.forEach(x=>{gG(x)&&URL.revokeObjectURL(x.preview)})},[]);const A=d||((b==null?void 0:b.length)??0)>=u;return E.jsxs("div",{className:"relative flex flex-col gap-6 overflow-hidden",children:[E.jsx(Cp,{onDrop:v,accept:o,maxSize:s,maxFiles:u,multiple:u>1||c,disabled:A,children:({getRootProps:x,getInputProps:R,isDragActive:O})=>E.jsxs("div",{...x(),className:Me("group border-muted-foreground/25 hover:bg-muted/25 relative grid h-52 w-full cursor-pointer place-items-center rounded-lg border-2 border-dashed px-5 py-2.5 text-center transition","ring-offset-background focus-visible:ring-ring focus-visible:ring-2 focus-visible:ring-offset-2 focus-visible:outline-none",O&&"border-muted-foreground/50",A&&"pointer-events-none opacity-60",g),...m,children:[E.jsx("input",{...R()}),O?E.jsxs("div",{className:"flex flex-col items-center justify-center gap-4 sm:px-5",children:[E.jsx("div",{className:"rounded-full border border-dashed p-3",children:E.jsx(zk,{className:"text-muted-foreground size-7","aria-hidden":"true"})}),E.jsx("p",{className:"text-muted-foreground font-medium",children:"Drop the files here"})]}):E.jsxs("div",{className:"flex flex-col items-center justify-center gap-4 sm:px-5",children:[E.jsx("div",{className:"rounded-full border border-dashed p-3",children:E.jsx(zk,{className:"text-muted-foreground size-7","aria-hidden":"true"})}),E.jsxs("div",{className:"flex flex-col gap-px",children:[E.jsx("p",{className:"text-muted-foreground font-medium",children:"Drag and drop files here, or click to select files"}),p?E.jsx("p",{className:"text-muted-foreground/70 text-sm",children:p}):E.jsxs("p",{className:"text-muted-foreground/70 text-sm",children:["You can upload",u>1?` ${u===1/0?"multiple":u} - files (up to ${l0(s)} each)`:` a file with ${l0(s)}`,"Supported formats: TXT, MD, DOCX, PDF, PPTX, RTF, ODT, EPUB, HTML, HTM, TEX, JSON, XML, YAML, YML, CSV, LOG, CONF, INI, PROPERTIES, SQL, BAT, SH, C, CPP, PY, JAVA, JS, TS, SWIFT, GO, RB, PHP, CSS, SCSS, LESS"]})]})]})]})}),b!=null&&b.length?E.jsx(fG,{className:"h-fit w-full px-3",children:E.jsx("div",{className:"flex max-h-48 flex-col gap-4",children:b==null?void 0:b.map((x,R)=>E.jsx(Mie,{file:x,onRemove:()=>k(R),progress:a==null?void 0:a[x.name]},R))})}):null]})}function Mie({file:e,progress:t,onRemove:n}){return E.jsxs("div",{className:"relative flex items-center gap-2.5",children:[E.jsxs("div",{className:"flex flex-1 gap-2.5",children:[gG(e)?E.jsx(Pie,{file:e}):null,E.jsxs("div",{className:"flex w-full flex-col gap-2",children:[E.jsxs("div",{className:"flex flex-col gap-px",children:[E.jsx("p",{className:"text-foreground/80 line-clamp-1 text-sm font-medium",children:e.name}),E.jsx("p",{className:"text-muted-foreground text-xs",children:l0(e.size)})]}),t?E.jsx(Q5,{value:t}):null]})]}),E.jsx("div",{className:"flex items-center gap-2",children:E.jsxs(pt,{type:"button",variant:"outline",size:"icon",className:"size-7",onClick:n,children:[E.jsx(N3,{className:"size-4","aria-hidden":"true"}),E.jsx("span",{className:"sr-only",children:"Remove file"})]})})]})}function gG(e){return"preview"in e&&typeof e.preview=="string"}function Pie({file:e}){return e.type.startsWith("image/")?E.jsx("div",{className:"aspect-square shrink-0 rounded-md object-cover"}):E.jsx(KZ,{className:"text-muted-foreground size-10","aria-hidden":"true"})}function Fie(){const{t:e}=Dt(),[t,n]=w.useState(!1),[r,a]=w.useState(!1),[o,s]=w.useState({}),u=w.useCallback(async c=>{a(!0);try{await Promise.all(c.map(async d=>{try{const p=await IV(d,g=>{console.debug(e("documentPanel.uploadDocuments.uploading",{name:d.name,percent:g})),s(m=>({...m,[d.name]:g}))});p.status==="success"?Ft.success(e("documentPanel.uploadDocuments.success",{name:d.name})):Ft.error(e("documentPanel.uploadDocuments.failed",{name:d.name,message:p.message}))}catch(p){Ft.error(e("documentPanel.uploadDocuments.error",{name:d.name,error:tr(p)}))}}))}catch(d){Ft.error(e("documentPanel.uploadDocuments.generalError",{error:tr(d)}))}finally{a(!1)}},[a,s]);return E.jsxs(NT,{open:t,onOpenChange:c=>{r&&!c||n(c)},children:[E.jsx(b5,{asChild:!0,children:E.jsxs(pt,{variant:"default",side:"bottom",tooltip:e("documentPanel.uploadDocuments.tooltip"),size:"sm",children:[E.jsx(zk,{})," ",e("documentPanel.uploadDocuments.button")]})}),E.jsxs(Ep,{className:"sm:max-w-xl",onCloseAutoFocus:c=>c.preventDefault(),children:[E.jsxs(wp,{children:[E.jsx(xp,{children:e("documentPanel.uploadDocuments.title")}),E.jsx(kp,{children:e("documentPanel.uploadDocuments.description")})]}),E.jsx(Lie,{maxFileCount:1/0,maxSize:200*1024*1024,description:e("documentPanel.uploadDocuments.fileTypes"),onUpload:u,progresses:o,disabled:r})]})]})}function zie(){const{t:e}=Dt(),[t,n]=w.useState(!1),r=w.useCallback(async()=>{try{const a=await DV();a.status==="success"?(Ft.success(e("documentPanel.clearDocuments.success")),n(!1)):Ft.error(e("documentPanel.clearDocuments.failed",{message:a.message}))}catch(a){Ft.error(e("documentPanel.clearDocuments.error",{error:tr(a)}))}},[n,e]);return E.jsxs(NT,{open:t,onOpenChange:n,children:[E.jsx(b5,{asChild:!0,children:E.jsxs(pt,{variant:"outline",side:"bottom",tooltip:e("documentPanel.clearDocuments.tooltip"),size:"sm",children:[E.jsx(R3,{})," ",e("documentPanel.clearDocuments.button")]})}),E.jsxs(Ep,{className:"sm:max-w-xl",onCloseAutoFocus:a=>a.preventDefault(),children:[E.jsxs(wp,{children:[E.jsx(xp,{children:e("documentPanel.clearDocuments.title")}),E.jsx(kp,{children:e("documentPanel.clearDocuments.confirm")})]}),E.jsx(pt,{variant:"destructive",onClick:r,children:e("documentPanel.clearDocuments.confirmButton")})]})]})}function Bie({open:e,onOpenChange:t}){var g;const{t:n}=Dt(),[r,a]=w.useState(null),[o,s]=w.useState("center"),[u,c]=w.useState(!1),d=w.useRef(null);w.useEffect(()=>{e&&(s("center"),c(!1))},[e]),w.useEffect(()=>{const m=d.current;!m||u||(m.scrollTop=m.scrollHeight)},[r==null?void 0:r.history_messages,u]);const p=()=>{const m=d.current;if(!m)return;const b=Math.abs(m.scrollHeight-m.scrollTop-m.clientHeight)<1;c(!b)};return w.useEffect(()=>{if(!e)return;const m=async()=>{try{const y=await LV();a(y)}catch(y){Ft.error(n("documentPanel.pipelineStatus.errors.fetchFailed",{error:tr(y)}))}};m();const b=setInterval(m,2e3);return()=>clearInterval(b)},[e,n]),E.jsx(NT,{open:e,onOpenChange:t,children:E.jsxs(Ep,{className:Me("sm:max-w-[600px] transition-all duration-200 fixed",o==="left"&&"!left-[25%] !translate-x-[-50%] !mx-4",o==="center"&&"!left-1/2 !-translate-x-1/2",o==="right"&&"!left-[75%] !translate-x-[-50%] !mx-4"),children:[E.jsx(kp,{className:"sr-only",children:r!=null&&r.job_name?`${n("documentPanel.pipelineStatus.jobName")}: ${r.job_name}, ${n("documentPanel.pipelineStatus.progress")}: ${r.cur_batch}/${r.batchs}`:n("documentPanel.pipelineStatus.noActiveJob")}),E.jsxs(wp,{className:"flex flex-row items-center",children:[E.jsx(xp,{className:"flex-1",children:n("documentPanel.pipelineStatus.title")}),E.jsxs("div",{className:"flex items-center gap-2 mr-8",children:[E.jsx(pt,{variant:"ghost",size:"icon",className:Me("h-6 w-6",o==="left"&&"bg-zinc-200 text-zinc-800 hover:bg-zinc-300 dark:bg-zinc-700 dark:text-zinc-200 dark:hover:bg-zinc-600"),onClick:()=>s("left"),children:E.jsx(FZ,{className:"h-4 w-4"})}),E.jsx(pt,{variant:"ghost",size:"icon",className:Me("h-6 w-6",o==="center"&&"bg-zinc-200 text-zinc-800 hover:bg-zinc-300 dark:bg-zinc-700 dark:text-zinc-200 dark:hover:bg-zinc-600"),onClick:()=>s("center"),children:E.jsx(MZ,{className:"h-4 w-4"})}),E.jsx(pt,{variant:"ghost",size:"icon",className:Me("h-6 w-6",o==="right"&&"bg-zinc-200 text-zinc-800 hover:bg-zinc-300 dark:bg-zinc-700 dark:text-zinc-200 dark:hover:bg-zinc-600"),onClick:()=>s("right"),children:E.jsx(BZ,{className:"h-4 w-4"})})]})]}),E.jsxs("div",{className:"space-y-4 pt-4",children:[E.jsxs("div",{className:"flex items-center gap-4",children:[E.jsxs("div",{className:"flex items-center gap-2",children:[E.jsxs("div",{className:"text-sm font-medium",children:[n("documentPanel.pipelineStatus.busy"),":"]}),E.jsx("div",{className:`h-2 w-2 rounded-full ${r!=null&&r.busy?"bg-green-500":"bg-gray-300"}`})]}),E.jsxs("div",{className:"flex items-center gap-2",children:[E.jsxs("div",{className:"text-sm font-medium",children:[n("documentPanel.pipelineStatus.requestPending"),":"]}),E.jsx("div",{className:`h-2 w-2 rounded-full ${r!=null&&r.request_pending?"bg-green-500":"bg-gray-300"}`})]})]}),E.jsxs("div",{className:"rounded-md border p-3 space-y-2",children:[E.jsxs("div",{children:[n("documentPanel.pipelineStatus.jobName"),": ",(r==null?void 0:r.job_name)||"-"]}),E.jsxs("div",{className:"flex justify-between",children:[E.jsxs("span",{children:[n("documentPanel.pipelineStatus.startTime"),": ",r!=null&&r.job_start?new Date(r.job_start).toLocaleString():"-"]}),E.jsxs("span",{children:[n("documentPanel.pipelineStatus.progress"),": ",r?`${r.cur_batch}/${r.batchs}`:"-"]})]})]}),E.jsxs("div",{className:"space-y-2",children:[E.jsxs("div",{className:"text-sm font-medium",children:[n("documentPanel.pipelineStatus.latestMessage"),":"]}),E.jsx("div",{className:"font-mono text-sm rounded-md bg-zinc-800 text-zinc-100 p-3",children:(r==null?void 0:r.latest_message)||"-"})]}),E.jsxs("div",{className:"space-y-2",children:[E.jsxs("div",{className:"text-sm font-medium",children:[n("documentPanel.pipelineStatus.historyMessages"),":"]}),E.jsx("div",{ref:d,onScroll:p,className:"font-mono text-sm rounded-md bg-zinc-800 text-zinc-100 p-3 overflow-y-auto min-h-[7.5em] max-h-[40vh]",children:(g=r==null?void 0:r.history_messages)!=null&&g.length?r.history_messages.map((m,b)=>E.jsx("div",{children:m},b)):"-"})]})]})]})})}const Uie=(e,t=20)=>{if(!e.file_path||typeof e.file_path!="string"||e.file_path.trim()==="")return e.id;const n=e.file_path.split("/"),r=n[n.length-1];return!r||r.trim()===""?e.id:r.length>t?r.slice(0,t)+"...":r},jie=` + files (up to ${l0(s)} each)`:` a file with ${l0(s)}`,"Supported formats: TXT, MD, DOCX, PDF, PPTX, RTF, ODT, EPUB, HTML, HTM, TEX, JSON, XML, YAML, YML, CSV, LOG, CONF, INI, PROPERTIES, SQL, BAT, SH, C, CPP, PY, JAVA, JS, TS, SWIFT, GO, RB, PHP, CSS, SCSS, LESS"]})]})]})]})}),b!=null&&b.length?E.jsx(fG,{className:"h-fit w-full px-3",children:E.jsx("div",{className:"flex max-h-48 flex-col gap-4",children:b==null?void 0:b.map((x,R)=>E.jsx(Mie,{file:x,onRemove:()=>k(R),progress:a==null?void 0:a[x.name]},R))})}):null]})}function Mie({file:e,progress:t,onRemove:n}){return E.jsxs("div",{className:"relative flex items-center gap-2.5",children:[E.jsxs("div",{className:"flex flex-1 gap-2.5",children:[gG(e)?E.jsx(Pie,{file:e}):null,E.jsxs("div",{className:"flex w-full flex-col gap-2",children:[E.jsxs("div",{className:"flex flex-col gap-px",children:[E.jsx("p",{className:"text-foreground/80 line-clamp-1 text-sm font-medium",children:e.name}),E.jsx("p",{className:"text-muted-foreground text-xs",children:l0(e.size)})]}),t?E.jsx(Q5,{value:t}):null]})]}),E.jsx("div",{className:"flex items-center gap-2",children:E.jsxs(pt,{type:"button",variant:"outline",size:"icon",className:"size-7",onClick:n,children:[E.jsx(N3,{className:"size-4","aria-hidden":"true"}),E.jsx("span",{className:"sr-only",children:"Remove file"})]})})]})}function gG(e){return"preview"in e&&typeof e.preview=="string"}function Pie({file:e}){return e.type.startsWith("image/")?E.jsx("div",{className:"aspect-square shrink-0 rounded-md object-cover"}):E.jsx(KZ,{className:"text-muted-foreground size-10","aria-hidden":"true"})}function Fie(){const{t:e}=Dt(),[t,n]=w.useState(!1),[r,a]=w.useState(!1),[o,s]=w.useState({}),u=w.useCallback(async c=>{a(!0);try{await Promise.all(c.map(async d=>{try{const p=await IV(d,g=>{console.debug(e("documentPanel.uploadDocuments.uploading",{name:d.name,percent:g})),s(m=>({...m,[d.name]:g}))});p.status==="success"?Ft.success(e("documentPanel.uploadDocuments.success",{name:d.name})):Ft.error(e("documentPanel.uploadDocuments.failed",{name:d.name,message:p.message}))}catch(p){Ft.error(e("documentPanel.uploadDocuments.error",{name:d.name,error:tr(p)}))}}))}catch(d){Ft.error(e("documentPanel.uploadDocuments.generalError",{error:tr(d)}))}finally{a(!1)}},[a,s]);return E.jsxs(NT,{open:t,onOpenChange:c=>{r&&!c||n(c)},children:[E.jsx(b5,{asChild:!0,children:E.jsxs(pt,{variant:"default",side:"bottom",tooltip:e("documentPanel.uploadDocuments.tooltip"),size:"sm",children:[E.jsx(zk,{})," ",e("documentPanel.uploadDocuments.button")]})}),E.jsxs(Ep,{className:"sm:max-w-xl",onCloseAutoFocus:c=>c.preventDefault(),children:[E.jsxs(wp,{children:[E.jsx(xp,{children:e("documentPanel.uploadDocuments.title")}),E.jsx(kp,{children:e("documentPanel.uploadDocuments.description")})]}),E.jsx(Lie,{maxFileCount:1/0,maxSize:200*1024*1024,description:e("documentPanel.uploadDocuments.fileTypes"),onUpload:u,progresses:o,disabled:r})]})]})}function zie(){const{t:e}=Dt(),[t,n]=w.useState(!1),r=w.useCallback(async()=>{try{const a=await DV();a.status==="success"?(Ft.success(e("documentPanel.clearDocuments.success")),n(!1)):Ft.error(e("documentPanel.clearDocuments.failed",{message:a.message}))}catch(a){Ft.error(e("documentPanel.clearDocuments.error",{error:tr(a)}))}},[n,e]);return E.jsxs(NT,{open:t,onOpenChange:n,children:[E.jsx(b5,{asChild:!0,children:E.jsxs(pt,{variant:"outline",side:"bottom",tooltip:e("documentPanel.clearDocuments.tooltip"),size:"sm",children:[E.jsx(R3,{})," ",e("documentPanel.clearDocuments.button")]})}),E.jsxs(Ep,{className:"sm:max-w-xl",onCloseAutoFocus:a=>a.preventDefault(),children:[E.jsxs(wp,{children:[E.jsx(xp,{children:e("documentPanel.clearDocuments.title")}),E.jsx(kp,{children:e("documentPanel.clearDocuments.confirm")})]}),E.jsx(pt,{variant:"destructive",onClick:r,children:e("documentPanel.clearDocuments.confirmButton")})]})]})}function Bie({open:e,onOpenChange:t}){var g;const{t:n}=Dt(),[r,a]=w.useState(null),[o,s]=w.useState("center"),[u,c]=w.useState(!1),d=w.useRef(null);w.useEffect(()=>{e&&(s("center"),c(!1))},[e]),w.useEffect(()=>{const m=d.current;!m||u||(m.scrollTop=m.scrollHeight)},[r==null?void 0:r.history_messages,u]);const p=()=>{const m=d.current;if(!m)return;const b=Math.abs(m.scrollHeight-m.scrollTop-m.clientHeight)<1;c(!b)};return w.useEffect(()=>{if(!e)return;const m=async()=>{try{const y=await LV();a(y)}catch(y){Ft.error(n("documentPanel.pipelineStatus.errors.fetchFailed",{error:tr(y)}))}};m();const b=setInterval(m,2e3);return()=>clearInterval(b)},[e,n]),E.jsx(NT,{open:e,onOpenChange:t,children:E.jsxs(Ep,{className:Me("sm:max-w-[600px] transition-all duration-200 fixed",o==="left"&&"!left-[25%] !translate-x-[-50%] !mx-4",o==="center"&&"!left-1/2 !-translate-x-1/2",o==="right"&&"!left-[75%] !translate-x-[-50%] !mx-4"),children:[E.jsx(kp,{className:"sr-only",children:r!=null&&r.job_name?`${n("documentPanel.pipelineStatus.jobName")}: ${r.job_name}, ${n("documentPanel.pipelineStatus.progress")}: ${r.cur_batch}/${r.batchs}`:n("documentPanel.pipelineStatus.noActiveJob")}),E.jsxs(wp,{className:"flex flex-row items-center",children:[E.jsx(xp,{className:"flex-1",children:n("documentPanel.pipelineStatus.title")}),E.jsxs("div",{className:"flex items-center gap-2 mr-8",children:[E.jsx(pt,{variant:"ghost",size:"icon",className:Me("h-6 w-6",o==="left"&&"bg-zinc-200 text-zinc-800 hover:bg-zinc-300 dark:bg-zinc-700 dark:text-zinc-200 dark:hover:bg-zinc-600"),onClick:()=>s("left"),children:E.jsx(FZ,{className:"h-4 w-4"})}),E.jsx(pt,{variant:"ghost",size:"icon",className:Me("h-6 w-6",o==="center"&&"bg-zinc-200 text-zinc-800 hover:bg-zinc-300 dark:bg-zinc-700 dark:text-zinc-200 dark:hover:bg-zinc-600"),onClick:()=>s("center"),children:E.jsx(MZ,{className:"h-4 w-4"})}),E.jsx(pt,{variant:"ghost",size:"icon",className:Me("h-6 w-6",o==="right"&&"bg-zinc-200 text-zinc-800 hover:bg-zinc-300 dark:bg-zinc-700 dark:text-zinc-200 dark:hover:bg-zinc-600"),onClick:()=>s("right"),children:E.jsx(BZ,{className:"h-4 w-4"})})]})]}),E.jsxs("div",{className:"space-y-4 pt-4",children:[E.jsxs("div",{className:"flex items-center gap-4",children:[E.jsxs("div",{className:"flex items-center gap-2",children:[E.jsxs("div",{className:"text-sm font-medium",children:[n("documentPanel.pipelineStatus.busy"),":"]}),E.jsx("div",{className:`h-2 w-2 rounded-full ${r!=null&&r.busy?"bg-green-500":"bg-gray-300"}`})]}),E.jsxs("div",{className:"flex items-center gap-2",children:[E.jsxs("div",{className:"text-sm font-medium",children:[n("documentPanel.pipelineStatus.requestPending"),":"]}),E.jsx("div",{className:`h-2 w-2 rounded-full ${r!=null&&r.request_pending?"bg-green-500":"bg-gray-300"}`})]})]}),E.jsxs("div",{className:"rounded-md border p-3 space-y-2",children:[E.jsxs("div",{children:[n("documentPanel.pipelineStatus.jobName"),": ",(r==null?void 0:r.job_name)||"-"]}),E.jsxs("div",{className:"flex justify-between",children:[E.jsxs("span",{children:[n("documentPanel.pipelineStatus.startTime"),": ",r!=null&&r.job_start?new Date(r.job_start).toLocaleString():"-"]}),E.jsxs("span",{children:[n("documentPanel.pipelineStatus.progress"),": ",r?`${r.cur_batch}/${r.batchs} ${n("documentPanel.pipelineStatus.unit")}`:"-"]})]})]}),E.jsxs("div",{className:"space-y-2",children:[E.jsxs("div",{className:"text-sm font-medium",children:[n("documentPanel.pipelineStatus.latestMessage"),":"]}),E.jsx("div",{className:"font-mono text-sm rounded-md bg-zinc-800 text-zinc-100 p-3",children:(r==null?void 0:r.latest_message)||"-"})]}),E.jsxs("div",{className:"space-y-2",children:[E.jsxs("div",{className:"text-sm font-medium",children:[n("documentPanel.pipelineStatus.historyMessages"),":"]}),E.jsx("div",{ref:d,onScroll:p,className:"font-mono text-sm rounded-md bg-zinc-800 text-zinc-100 p-3 overflow-y-auto min-h-[7.5em] max-h-[40vh]",children:(g=r==null?void 0:r.history_messages)!=null&&g.length?r.history_messages.map((m,b)=>E.jsx("div",{children:m},b)):"-"})]})]})]})})}const Uie=(e,t=20)=>{if(!e.file_path||typeof e.file_path!="string"||e.file_path.trim()==="")return e.id;const n=e.file_path.split("/"),r=n[n.length-1];return!r||r.trim()===""?e.id:r.length>t?r.slice(0,t)+"...":r},jie=` @keyframes pulse { 0% { background-color: rgb(255 0 0 / 0.1); @@ -1202,7 +1202,7 @@ ${tr(R)}`,!0)}finally{s(!1),Le.getState().setRetrievalHistory([...v,b,y])}},[r,o {{error}}`,fileTypes:"Supported types: TXT, MD, DOCX, PDF, PPTX, RTF, ODT, EPUB, HTML, HTM, TEX, JSON, XML, YAML, YML, CSV, LOG, CONF, INI, PROPERTIES, SQL, BAT, SH, C, CPP, PY, JAVA, JS, TS, SWIFT, GO, RB, PHP, CSS, SCSS, LESS"},documentManager:{title:"Document Management",scanButton:"Scan",scanTooltip:"Scan documents",pipelineStatusButton:"Pipeline Status",pipelineStatusTooltip:"View pipeline status",uploadedTitle:"Uploaded Documents",uploadedDescription:"List of uploaded documents and their statuses.",emptyTitle:"No Documents",emptyDescription:"There are no uploaded documents yet.",columns:{id:"ID",summary:"Summary",status:"Status",length:"Length",chunks:"Chunks",created:"Created",updated:"Updated",metadata:"Metadata"},status:{completed:"Completed",processing:"Processing",pending:"Pending",failed:"Failed"},errors:{loadFailed:`Failed to load documents {{error}}`,scanFailed:`Failed to scan documents {{error}}`,scanProgressFailed:`Failed to get scan progress -{{error}}`},fileNameLabel:"File Name",showButton:"Show",hideButton:"Hide",showFileNameTooltip:"Show file name",hideFileNameTooltip:"Hide file name"},pipelineStatus:{title:"Pipeline Status",busy:"Pipeline Busy",requestPending:"Reques Pending",jobName:"Job Name",startTime:"Start Time",progress:"Progress",latestMessage:"Latest Message",historyMessages:"History Message",errors:{fetchFailed:`Fail to get pipeline status +{{error}}`},fileNameLabel:"File Name",showButton:"Show",hideButton:"Hide",showFileNameTooltip:"Show file name",hideFileNameTooltip:"Hide file name"},pipelineStatus:{title:"Pipeline Status",busy:"Pipeline Busy",requestPending:"Reques Pending",jobName:"Job Name",startTime:"Start Time",progress:"Progress",unit:"batch",latestMessage:"Latest Message",historyMessages:"History Message",errors:{fetchFailed:`Fail to get pipeline status {{error}}`}}},rxe={sideBar:{settings:{settings:"Settings",healthCheck:"Health Check",showPropertyPanel:"Show Property Panel",showSearchBar:"Show Search Bar",showNodeLabel:"Show Node Label",nodeDraggable:"Node Draggable",showEdgeLabel:"Show Edge Label",hideUnselectedEdges:"Hide Unselected Edges",edgeEvents:"Edge Events",maxQueryDepth:"Max Query Depth",minDegree:"Minimum Degree",maxLayoutIterations:"Max Layout Iterations",depth:"Depth",degree:"Degree",apiKey:"API Key",enterYourAPIkey:"Enter your API key",save:"Save",refreshLayout:"Refresh Layout"},zoomControl:{zoomIn:"Zoom In",zoomOut:"Zoom Out",resetZoom:"Reset Zoom",rotateCamera:"Clockwise Rotate",rotateCameraCounterClockwise:"Counter-Clockwise Rotate"},layoutsControl:{startAnimation:"Continue layout animation",stopAnimation:"Stop layout animation",layoutGraph:"Layout Graph",layouts:{Circular:"Circular",Circlepack:"Circlepack",Random:"Random",Noverlaps:"Noverlaps","Force Directed":"Force Directed","Force Atlas":"Force Atlas"}},fullScreenControl:{fullScreen:"Full Screen",windowed:"Windowed"}},statusIndicator:{connected:"Connected",disconnected:"Disconnected"},statusCard:{unavailable:"Status information unavailable",storageInfo:"Storage Info",workingDirectory:"Working Directory",inputDirectory:"Input Directory",llmConfig:"LLM Configuration",llmBinding:"LLM Binding",llmBindingHost:"LLM Binding Host",llmModel:"LLM Model",maxTokens:"Max Tokens",embeddingConfig:"Embedding Configuration",embeddingBinding:"Embedding Binding",embeddingBindingHost:"Embedding Binding Host",embeddingModel:"Embedding Model",storageConfig:"Storage Configuration",kvStorage:"KV Storage",docStatusStorage:"Doc Status Storage",graphStorage:"Graph Storage",vectorStorage:"Vector Storage"},propertiesView:{node:{title:"Node",id:"ID",labels:"Labels",degree:"Degree",properties:"Properties",relationships:"Relations(within subgraph)",expandNode:"Expand Node",pruneNode:"Prune Node",deleteAllNodesError:"Refuse to delete all nodes in the graph",nodesRemoved:"{{count}} nodes removed, including orphan nodes",noNewNodes:"No expandable nodes found",propertyNames:{description:"Description",entity_id:"Name",entity_type:"Type",source_id:"SrcID",Neighbour:"Neigh"}},edge:{title:"Relationship",id:"ID",type:"Type",source:"Source",target:"Target",properties:"Properties"}},search:{placeholder:"Search nodes...",message:"And {count} others"},graphLabels:{selectTooltip:"Select query label",noLabels:"No labels found",label:"Label",placeholder:"Search labels...",andOthers:"And {count} others",refreshTooltip:"Reload graph data"},emptyGraph:"Graph Is Empty"},axe={chatMessage:{copyTooltip:"Copy to clipboard",copyError:"Failed to copy text to clipboard"},retrieval:{startPrompt:"Start a retrieval by typing your query below",clear:"Clear",send:"Send",placeholder:"Type your query...",error:"Error: Failed to get response"},querySettings:{parametersTitle:"Parameters",parametersDescription:"Configure your query parameters",queryMode:"Query Mode",queryModeTooltip:`Select the retrieval strategy: • Naive: Basic search without advanced techniques • Local: Context-dependent information retrieval @@ -1222,7 +1222,7 @@ ${tr(R)}`,!0)}finally{s(!1),Le.getState().setRetrievalHistory([...v,b,y])}},[r,o {{error}}`,fileTypes:"支持的文件类型:TXT, MD, DOCX, PDF, PPTX, RTF, ODT, EPUB, HTML, HTM, TEX, JSON, XML, YAML, YML, CSV, LOG, CONF, INI, PROPERTIES, SQL, BAT, SH, C, CPP, PY, JAVA, JS, TS, SWIFT, GO, RB, PHP, CSS, SCSS, LESS"},documentManager:{title:"文档管理",scanButton:"扫描",scanTooltip:"扫描文档",pipelineStatusButton:"流水线状态",pipelineStatusTooltip:"查看流水线状态",uploadedTitle:"已上传文档",uploadedDescription:"已上传文档列表及其状态",emptyTitle:"无文档",emptyDescription:"还没有上传任何文档",columns:{id:"ID",summary:"摘要",status:"状态",length:"长度",chunks:"分块",created:"创建时间",updated:"更新时间",metadata:"元数据"},status:{completed:"已完成",processing:"处理中",pending:"等待中",failed:"失败"},errors:{loadFailed:`加载文档失败 {{error}}`,scanFailed:`扫描文档失败 {{error}}`,scanProgressFailed:`获取扫描进度失败 -{{error}}`},fileNameLabel:"文件名",showButton:"显示",hideButton:"隐藏",showFileNameTooltip:"显示文件名",hideFileNameTooltip:"隐藏文件名"},pipelineStatus:{title:"流水线状态",busy:"流水线忙碌",requestPending:"待处理请求",jobName:"作业名称",startTime:"开始时间",progress:"进度",latestMessage:"最新消息",historyMessages:"历史消息",errors:{fetchFailed:`获取流水线状态失败 +{{error}}`},fileNameLabel:"文件名",showButton:"显示",hideButton:"隐藏",showFileNameTooltip:"显示文件名",hideFileNameTooltip:"隐藏文件名"},pipelineStatus:{title:"流水线状态",busy:"流水线忙碌",requestPending:"待处理请求",jobName:"作业名称",startTime:"开始时间",progress:"进度",unit:"批",latestMessage:"最新消息",historyMessages:"历史消息",errors:{fetchFailed:`获取流水线状态失败 {{error}}`}}},fxe={sideBar:{settings:{settings:"设置",healthCheck:"健康检查",showPropertyPanel:"显示属性面板",showSearchBar:"显示搜索栏",showNodeLabel:"显示节点标签",nodeDraggable:"节点可拖动",showEdgeLabel:"显示边标签",hideUnselectedEdges:"隐藏未选中的边",edgeEvents:"边事件",maxQueryDepth:"最大查询深度",minDegree:"最小邻边数",maxLayoutIterations:"最大布局迭代次数",depth:"深度",degree:"邻边",apiKey:"API密钥",enterYourAPIkey:"输入您的API密钥",save:"保存",refreshLayout:"刷新布局"},zoomControl:{zoomIn:"放大",zoomOut:"缩小",resetZoom:"重置缩放",rotateCamera:"顺时针旋转图形",rotateCameraCounterClockwise:"逆时针旋转图形"},layoutsControl:{startAnimation:"继续布局动画",stopAnimation:"停止布局动画",layoutGraph:"图布局",layouts:{Circular:"环形",Circlepack:"圆形打包",Random:"随机",Noverlaps:"无重叠","Force Directed":"力导向","Force Atlas":"力地图"}},fullScreenControl:{fullScreen:"全屏",windowed:"窗口"}},statusIndicator:{connected:"已连接",disconnected:"未连接"},statusCard:{unavailable:"状态信息不可用",storageInfo:"存储信息",workingDirectory:"工作目录",inputDirectory:"输入目录",llmConfig:"LLM配置",llmBinding:"LLM绑定",llmBindingHost:"LLM绑定主机",llmModel:"LLM模型",maxTokens:"最大令牌数",embeddingConfig:"嵌入配置",embeddingBinding:"嵌入绑定",embeddingBindingHost:"嵌入绑定主机",embeddingModel:"嵌入模型",storageConfig:"存储配置",kvStorage:"KV存储",docStatusStorage:"文档状态存储",graphStorage:"图存储",vectorStorage:"向量存储"},propertiesView:{node:{title:"节点",id:"ID",labels:"标签",degree:"度数",properties:"属性",relationships:"关系(子图内)",expandNode:"扩展节点",pruneNode:"修剪节点",deleteAllNodesError:"拒绝删除图中的所有节点",nodesRemoved:"已删除 {{count}} 个节点,包括孤立节点",noNewNodes:"没有发现可以扩展的节点",propertyNames:{description:"描述",entity_id:"名称",entity_type:"类型",source_id:"信源ID",Neighbour:"邻接"}},edge:{title:"关系",id:"ID",type:"类型",source:"源节点",target:"目标节点",properties:"属性"}},search:{placeholder:"搜索节点...",message:"还有 {count} 个"},graphLabels:{selectTooltip:"选择查询标签",noLabels:"未找到标签",label:"标签",placeholder:"搜索标签...",andOthers:"还有 {count} 个",refreshTooltip:"重新加载图形数据"},emptyGraph:"图谱数据为空"},pxe={chatMessage:{copyTooltip:"复制到剪贴板",copyError:"复制文本到剪贴板失败"},retrieval:{startPrompt:"输入查询开始检索",clear:"清空",send:"发送",placeholder:"输入查询...",error:"错误:获取响应失败"},querySettings:{parametersTitle:"参数",parametersDescription:"配置查询参数",queryMode:"查询模式",queryModeTooltip:`选择检索策略: • Naive:基础搜索,无高级技术 • Local:上下文相关信息检索 @@ -1242,7 +1242,7 @@ ${tr(R)}`,!0)}finally{s(!1),Le.getState().setRetrievalHistory([...v,b,y])}},[r,o {{error}}`,fileTypes:"Types pris en charge : TXT, MD, DOCX, PDF, PPTX, RTF, ODT, EPUB, HTML, HTM, TEX, JSON, XML, YAML, YML, CSV, LOG, CONF, INI, PROPERTIES, SQL, BAT, SH, C, CPP, PY, JAVA, JS, TS, SWIFT, GO, RB, PHP, CSS, SCSS, LESS"},documentManager:{title:"Gestion des documents",scanButton:"Scanner",scanTooltip:"Scanner les documents",pipelineStatusButton:"État du Pipeline",pipelineStatusTooltip:"Voir l'état du pipeline",uploadedTitle:"Documents téléchargés",uploadedDescription:"Liste des documents téléchargés et leurs statuts.",emptyTitle:"Aucun document",emptyDescription:"Il n'y a pas encore de documents téléchargés.",columns:{id:"ID",summary:"Résumé",status:"Statut",length:"Longueur",chunks:"Fragments",created:"Créé",updated:"Mis à jour",metadata:"Métadonnées"},status:{completed:"Terminé",processing:"En traitement",pending:"En attente",failed:"Échoué"},errors:{loadFailed:`Échec du chargement des documents {{error}}`,scanFailed:`Échec de la numérisation des documents {{error}}`,scanProgressFailed:`Échec de l'obtention de la progression de la numérisation -{{error}}`},fileNameLabel:"Nom du fichier",showButton:"Afficher",hideButton:"Masquer",showFileNameTooltip:"Afficher le nom du fichier",hideFileNameTooltip:"Masquer le nom du fichier"},pipelineStatus:{title:"État du Pipeline",busy:"Pipeline occupé",requestPending:"Requête en attente",jobName:"Nom du travail",startTime:"Heure de début",progress:"Progression",latestMessage:"Dernier message",historyMessages:"Historique des messages",errors:{fetchFailed:`Échec de la récupération de l'état du pipeline +{{error}}`},fileNameLabel:"Nom du fichier",showButton:"Afficher",hideButton:"Masquer",showFileNameTooltip:"Afficher le nom du fichier",hideFileNameTooltip:"Masquer le nom du fichier"},pipelineStatus:{title:"État du Pipeline",busy:"Pipeline occupé",requestPending:"Requête en attente",jobName:"Nom du travail",startTime:"Heure de début",progress:"Progression",unit:"lot",latestMessage:"Dernier message",historyMessages:"Historique des messages",errors:{fetchFailed:`Échec de la récupération de l'état du pipeline {{error}}`}}},Exe={sideBar:{settings:{settings:"Paramètres",healthCheck:"Vérification de l'état",showPropertyPanel:"Afficher le panneau des propriétés",showSearchBar:"Afficher la barre de recherche",showNodeLabel:"Afficher l'étiquette du nœud",nodeDraggable:"Nœud déplaçable",showEdgeLabel:"Afficher l'étiquette de l'arête",hideUnselectedEdges:"Masquer les arêtes non sélectionnées",edgeEvents:"Événements des arêtes",maxQueryDepth:"Profondeur maximale de la requête",minDegree:"Degré minimum",maxLayoutIterations:"Itérations maximales de mise en page",depth:"Profondeur",degree:"Degré",apiKey:"Clé API",enterYourAPIkey:"Entrez votre clé API",save:"Sauvegarder",refreshLayout:"Actualiser la mise en page"},zoomControl:{zoomIn:"Zoom avant",zoomOut:"Zoom arrière",resetZoom:"Réinitialiser le zoom",rotateCamera:"Rotation horaire",rotateCameraCounterClockwise:"Rotation antihoraire"},layoutsControl:{startAnimation:"Démarrer l'animation de mise en page",stopAnimation:"Arrêter l'animation de mise en page",layoutGraph:"Mettre en page le graphe",layouts:{Circular:"Circulaire",Circlepack:"Paquet circulaire",Random:"Aléatoire",Noverlaps:"Sans chevauchement","Force Directed":"Dirigé par la force","Force Atlas":"Atlas de force"}},fullScreenControl:{fullScreen:"Plein écran",windowed:"Fenêtré"}},statusIndicator:{connected:"Connecté",disconnected:"Déconnecté"},statusCard:{unavailable:"Informations sur l'état indisponibles",storageInfo:"Informations de stockage",workingDirectory:"Répertoire de travail",inputDirectory:"Répertoire d'entrée",llmConfig:"Configuration du modèle de langage",llmBinding:"Liaison du modèle de langage",llmBindingHost:"Hôte de liaison du modèle de langage",llmModel:"Modèle de langage",maxTokens:"Nombre maximum de jetons",embeddingConfig:"Configuration d'incorporation",embeddingBinding:"Liaison d'incorporation",embeddingBindingHost:"Hôte de liaison d'incorporation",embeddingModel:"Modèle d'incorporation",storageConfig:"Configuration de stockage",kvStorage:"Stockage clé-valeur",docStatusStorage:"Stockage de l'état des documents",graphStorage:"Stockage du graphe",vectorStorage:"Stockage vectoriel"},propertiesView:{node:{title:"Nœud",id:"ID",labels:"Étiquettes",degree:"Degré",properties:"Propriétés",relationships:"Relations(dans le sous-graphe)",expandNode:"Développer le nœud",pruneNode:"Élaguer le nœud",deleteAllNodesError:"Refus de supprimer tous les nœuds du graphe",nodesRemoved:"{{count}} nœuds supprimés, y compris les nœuds orphelins",noNewNodes:"Aucun nœud développable trouvé",propertyNames:{description:"Description",entity_id:"Nom",entity_type:"Type",source_id:"ID source",Neighbour:"Voisin"}},edge:{title:"Relation",id:"ID",type:"Type",source:"Source",target:"Cible",properties:"Propriétés"}},search:{placeholder:"Rechercher des nœuds...",message:"Et {{count}} autres"},graphLabels:{selectTooltip:"Sélectionner l'étiquette de la requête",noLabels:"Aucune étiquette trouvée",label:"Étiquette",placeholder:"Rechercher des étiquettes...",andOthers:"Et {{count}} autres",refreshTooltip:"Recharger les données du graphe"},emptyGraph:"Le graphe est vide"},wxe={chatMessage:{copyTooltip:"Copier dans le presse-papiers",copyError:"Échec de la copie du texte dans le presse-papiers"},retrieval:{startPrompt:"Démarrez une récupération en tapant votre requête ci-dessous",clear:"Effacer",send:"Envoyer",placeholder:"Tapez votre requête...",error:"Erreur : Échec de l'obtention de la réponse"},querySettings:{parametersTitle:"Paramètres",parametersDescription:"Configurez vos paramètres de requête",queryMode:"Mode de requête",queryModeTooltip:`Sélectionnez la stratégie de récupération : • Naïf : Recherche de base sans techniques avancées • Local : Récupération d'informations dépendante du contexte @@ -1262,7 +1262,7 @@ ${tr(R)}`,!0)}finally{s(!1),Le.getState().setRetrievalHistory([...v,b,y])}},[r,o {{error}}`,fileTypes:"الأنواع المدعومة: TXT، MD، DOCX، PDF، PPTX، RTF، ODT، EPUB، HTML، HTM، TEX، JSON، XML، YAML، YML، CSV، LOG، CONF، INI، PROPERTIES، SQL، BAT، SH، C، CPP، PY، JAVA، JS، TS، SWIFT، GO، RB، PHP، CSS، SCSS، LESS"},documentManager:{title:"إدارة المستندات",scanButton:"مسح ضوئي",scanTooltip:"مسح المستندات ضوئيًا",pipelineStatusButton:"حالة خط المعالجة",pipelineStatusTooltip:"عرض حالة خط المعالجة",uploadedTitle:"المستندات المرفوعة",uploadedDescription:"قائمة المستندات المرفوعة وحالاتها.",emptyTitle:"لا توجد مستندات",emptyDescription:"لا توجد مستندات مرفوعة بعد.",columns:{id:"المعرف",summary:"الملخص",status:"الحالة",length:"الطول",chunks:"الأجزاء",created:"تم الإنشاء",updated:"تم التحديث",metadata:"البيانات الوصفية"},status:{completed:"مكتمل",processing:"قيد المعالجة",pending:"معلق",failed:"فشل"},errors:{loadFailed:`فشل تحميل المستندات {{error}}`,scanFailed:`فشل مسح المستندات {{error}}`,scanProgressFailed:`فشل الحصول على تقدم المسح -{{error}}`},fileNameLabel:"اسم الملف",showButton:"عرض",hideButton:"إخفاء",showFileNameTooltip:"عرض اسم الملف",hideFileNameTooltip:"إخفاء اسم الملف"},pipelineStatus:{title:"حالة خط المعالجة",busy:"خط المعالجة مشغول",requestPending:"الطلب معلق",jobName:"اسم المهمة",startTime:"وقت البدء",progress:"التقدم",latestMessage:"آخر رسالة",historyMessages:"سجل الرسائل",errors:{fetchFailed:`فشل في جلب حالة خط المعالجة +{{error}}`},fileNameLabel:"اسم الملف",showButton:"عرض",hideButton:"إخفاء",showFileNameTooltip:"عرض اسم الملف",hideFileNameTooltip:"إخفاء اسم الملف"},pipelineStatus:{title:"حالة خط المعالجة",busy:"خط المعالجة مشغول",requestPending:"الطلب معلق",jobName:"اسم المهمة",startTime:"وقت البدء",progress:"التقدم",unit:"دفعة",latestMessage:"آخر رسالة",historyMessages:"سجل الرسائل",errors:{fetchFailed:`فشل في جلب حالة خط المعالجة {{error}}`}}},Nxe={sideBar:{settings:{settings:"الإعدادات",healthCheck:"فحص الحالة",showPropertyPanel:"إظهار لوحة الخصائص",showSearchBar:"إظهار شريط البحث",showNodeLabel:"إظهار تسمية العقدة",nodeDraggable:"العقدة قابلة للسحب",showEdgeLabel:"إظهار تسمية الحافة",hideUnselectedEdges:"إخفاء الحواف غير المحددة",edgeEvents:"أحداث الحافة",maxQueryDepth:"أقصى عمق للاستعلام",minDegree:"الدرجة الدنيا",maxLayoutIterations:"أقصى تكرارات التخطيط",depth:"العمق",degree:"الدرجة",apiKey:"مفتاح واجهة برمجة التطبيقات",enterYourAPIkey:"أدخل مفتاح واجهة برمجة التطبيقات الخاص بك",save:"حفظ",refreshLayout:"تحديث التخطيط"},zoomControl:{zoomIn:"تكبير",zoomOut:"تصغير",resetZoom:"إعادة تعيين التكبير",rotateCamera:"تدوير في اتجاه عقارب الساعة",rotateCameraCounterClockwise:"تدوير عكس اتجاه عقارب الساعة"},layoutsControl:{startAnimation:"بدء حركة التخطيط",stopAnimation:"إيقاف حركة التخطيط",layoutGraph:"تخطيط الرسم البياني",layouts:{Circular:"دائري",Circlepack:"حزمة دائرية",Random:"عشوائي",Noverlaps:"بدون تداخل","Force Directed":"موجه بالقوة","Force Atlas":"أطلس القوة"}},fullScreenControl:{fullScreen:"شاشة كاملة",windowed:"نوافذ"}},statusIndicator:{connected:"متصل",disconnected:"غير متصل"},statusCard:{unavailable:"معلومات الحالة غير متوفرة",storageInfo:"معلومات التخزين",workingDirectory:"دليل العمل",inputDirectory:"دليل الإدخال",llmConfig:"تكوين نموذج اللغة الكبير",llmBinding:"ربط نموذج اللغة الكبير",llmBindingHost:"مضيف ربط نموذج اللغة الكبير",llmModel:"نموذج اللغة الكبير",maxTokens:"أقصى عدد من الرموز",embeddingConfig:"تكوين التضمين",embeddingBinding:"ربط التضمين",embeddingBindingHost:"مضيف ربط التضمين",embeddingModel:"نموذج التضمين",storageConfig:"تكوين التخزين",kvStorage:"تخزين المفتاح-القيمة",docStatusStorage:"تخزين حالة المستند",graphStorage:"تخزين الرسم البياني",vectorStorage:"تخزين المتجهات"},propertiesView:{node:{title:"عقدة",id:"المعرف",labels:"التسميات",degree:"الدرجة",properties:"الخصائص",relationships:"العلاقات (داخل الرسم الفرعي)",expandNode:"توسيع العقدة",pruneNode:"تقليم العقدة",deleteAllNodesError:"رفض حذف جميع العقد في الرسم البياني",nodesRemoved:"تم إزالة {{count}} عقدة، بما في ذلك العقد اليتيمة",noNewNodes:"لم يتم العثور على عقد قابلة للتوسيع",propertyNames:{description:"الوصف",entity_id:"الاسم",entity_type:"النوع",source_id:"معرف المصدر",Neighbour:"الجار"}},edge:{title:"علاقة",id:"المعرف",type:"النوع",source:"المصدر",target:"الهدف",properties:"الخصائص"}},search:{placeholder:"ابحث في العقد...",message:"و {{count}} آخرون"},graphLabels:{selectTooltip:"حدد تسمية الاستعلام",noLabels:"لم يتم العثور على تسميات",label:"التسمية",placeholder:"ابحث في التسميات...",andOthers:"و {{count}} آخرون",refreshTooltip:"إعادة تحميل بيانات الرسم البياني"},emptyGraph:"الرسم البياني فارغ"},Oxe={chatMessage:{copyTooltip:"نسخ إلى الحافظة",copyError:"فشل نسخ النص إلى الحافظة"},retrieval:{startPrompt:"ابدأ الاسترجاع بكتابة استفسارك أدناه",clear:"مسح",send:"إرسال",placeholder:"اكتب استفسارك...",error:"خطأ: فشل الحصول على الرد"},querySettings:{parametersTitle:"المعلمات",parametersDescription:"تكوين معلمات الاستعلام الخاص بك",queryMode:"وضع الاستعلام",queryModeTooltip:`حدد استراتيجية الاسترجاع: • ساذج: بحث أساسي بدون تقنيات متقدمة • محلي: استرجاع معلومات يعتمد على السياق diff --git a/lightrag/api/webui/index.html b/lightrag/api/webui/index.html index c6c44d13..a5a93a46 100644 --- a/lightrag/api/webui/index.html +++ b/lightrag/api/webui/index.html @@ -8,7 +8,7 @@ Lightrag - +