From 2e83f649d02a6e4dc37660fe819dd034b612bbc9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mateusz=20Hordy=C5=84ski?= Date: Fri, 12 Sep 2025 10:39:24 +0200 Subject: [PATCH 01/43] chore: bump versions --- packages/ragbits-agents/pyproject.toml | 4 ++-- packages/ragbits-chat/pyproject.toml | 4 ++-- packages/ragbits-cli/pyproject.toml | 4 ++-- packages/ragbits-core/pyproject.toml | 2 +- packages/ragbits-document-search/pyproject.toml | 4 ++-- packages/ragbits-evaluate/pyproject.toml | 4 ++-- packages/ragbits-guardrails/pyproject.toml | 4 ++-- packages/ragbits/pyproject.toml | 4 ++-- uv.lock | 14 +++++++------- 9 files changed, 22 insertions(+), 22 deletions(-) diff --git a/packages/ragbits-agents/pyproject.toml b/packages/ragbits-agents/pyproject.toml index 77a5137fb..c471c2af5 100644 --- a/packages/ragbits-agents/pyproject.toml +++ b/packages/ragbits-agents/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "ragbits-agents" -version = "1.3.0" +version = "1.4.0.dev202509121038" description = "Building blocks for rapid development of GenAI applications" readme = "README.md" requires-python = ">=3.10" @@ -31,7 +31,7 @@ classifiers = [ "Topic :: Scientific/Engineering :: Artificial Intelligence", "Topic :: Software Development :: Libraries :: Python Modules", ] -dependencies = ["ragbits-core==1.3.0"] +dependencies = ["ragbits-core==1.4.0.dev202509121038"] [project.optional-dependencies] a2a = [ diff --git a/packages/ragbits-chat/pyproject.toml b/packages/ragbits-chat/pyproject.toml index 908e33ba4..21f6c1740 100644 --- a/packages/ragbits-chat/pyproject.toml +++ b/packages/ragbits-chat/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "ragbits-chat" -version = "1.3.0" +version = "1.4.0.dev202509121038" description = "Building blocks for rapid development of GenAI applications" readme = "README.md" requires-python = ">=3.10" @@ -31,7 +31,7 @@ classifiers = [ "Topic :: Scientific/Engineering :: Artificial Intelligence", "Topic :: Software Development :: Libraries :: Python Modules", ] -dependencies = ["fastapi>=0.115.0,<1.0.0", "uvicorn>=0.31.0,<1.0.0", "httpx>=0.28.1,<1.0.0", "bcrypt>=4.2.0", "python-jose[cryptography]>=3.5.0", "ragbits-core==1.3.0"] +dependencies = ["fastapi>=0.115.0,<1.0.0", "uvicorn>=0.31.0,<1.0.0", "httpx>=0.28.1,<1.0.0", "bcrypt>=4.2.0", "python-jose[cryptography]>=3.5.0", "ragbits-core==1.4.0.dev202509121038"] [project.urls] "Homepage" = "https://github.com/deepsense-ai/ragbits" diff --git a/packages/ragbits-cli/pyproject.toml b/packages/ragbits-cli/pyproject.toml index 4ed82fd37..9d56e9174 100644 --- a/packages/ragbits-cli/pyproject.toml +++ b/packages/ragbits-cli/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "ragbits-cli" -version = "1.3.0" +version = "1.4.0.dev202509121038" description = "A CLI application for ragbits - building blocks for rapid development of GenAI applications" readme = "README.md" requires-python = ">=3.10" @@ -31,7 +31,7 @@ classifiers = [ "Topic :: Scientific/Engineering :: Artificial Intelligence", "Topic :: Software Development :: Libraries :: Python Modules", ] -dependencies = ["typer>=0.12.5,<1.0.0", "ragbits-core==1.3.0"] +dependencies = ["typer>=0.12.5,<1.0.0", "ragbits-core==1.4.0.dev202509121038"] [project.urls] "Homepage" = "https://github.com/deepsense-ai/ragbits" diff --git a/packages/ragbits-core/pyproject.toml b/packages/ragbits-core/pyproject.toml index 5274a60f9..036a95b22 100644 --- a/packages/ragbits-core/pyproject.toml +++ b/packages/ragbits-core/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "ragbits-core" -version = "1.3.0" +version = "1.4.0.dev202509121038" description = "Building blocks for rapid development of GenAI applications" readme = "README.md" requires-python = ">=3.10" diff --git a/packages/ragbits-document-search/pyproject.toml b/packages/ragbits-document-search/pyproject.toml index e4ee2ace8..f2e553f10 100644 --- a/packages/ragbits-document-search/pyproject.toml +++ b/packages/ragbits-document-search/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "ragbits-document-search" -version = "1.3.0" +version = "1.4.0.dev202509121038" description = "Document Search module for Ragbits" readme = "README.md" requires-python = ">=3.10" @@ -29,7 +29,7 @@ classifiers = [ "Topic :: Scientific/Engineering :: Artificial Intelligence", "Topic :: Software Development :: Libraries :: Python Modules", ] -dependencies = ["docling>=2.15.1,<3.0.0", "opencv-python>=4.11.0.86,<5.0.0.0", "rerankers>=0.6.1,<1.0.0", "filetype>=1.2.0,<2.0.0", "python-pptx>=1.0.0,<2.0.0", "ragbits-core==1.3.0"] +dependencies = ["docling>=2.15.1,<3.0.0", "opencv-python>=4.11.0.86,<5.0.0.0", "rerankers>=0.6.1,<1.0.0", "filetype>=1.2.0,<2.0.0", "python-pptx>=1.0.0,<2.0.0", "ragbits-core==1.4.0.dev202509121038"] [project.urls] "Homepage" = "https://github.com/deepsense-ai/ragbits" diff --git a/packages/ragbits-evaluate/pyproject.toml b/packages/ragbits-evaluate/pyproject.toml index 35b32d3eb..e9b7f4eeb 100644 --- a/packages/ragbits-evaluate/pyproject.toml +++ b/packages/ragbits-evaluate/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "ragbits-evaluate" -version = "1.3.0" +version = "1.4.0.dev202509121038" description = "Evaluation module for Ragbits components" readme = "README.md" requires-python = ">=3.10" @@ -32,7 +32,7 @@ classifiers = [ "Topic :: Scientific/Engineering :: Artificial Intelligence", "Topic :: Software Development :: Libraries :: Python Modules", ] -dependencies = ["hydra-core>=1.3.2,<2.0.0", "neptune[optuna]>=1.12.0,<2.0.0", "optuna>=4.0.0,<5.0.0", "distilabel>=1.5.0,<2.0.0", "datasets>=3.0.1,<4.0.0", "ragbits-core==1.3.0"] +dependencies = ["hydra-core>=1.3.2,<2.0.0", "neptune[optuna]>=1.12.0,<2.0.0", "optuna>=4.0.0,<5.0.0", "distilabel>=1.5.0,<2.0.0", "datasets>=3.0.1,<4.0.0", "ragbits-core==1.4.0.dev202509121038"] [project.urls] "Homepage" = "https://github.com/deepsense-ai/ragbits" diff --git a/packages/ragbits-guardrails/pyproject.toml b/packages/ragbits-guardrails/pyproject.toml index 78bfedddf..d7e50df0d 100644 --- a/packages/ragbits-guardrails/pyproject.toml +++ b/packages/ragbits-guardrails/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "ragbits-guardrails" -version = "1.3.0" +version = "1.4.0.dev202509121038" description = "Guardrails module for Ragbits components" readme = "README.md" requires-python = ">=3.10" @@ -31,7 +31,7 @@ classifiers = [ "Topic :: Scientific/Engineering :: Artificial Intelligence", "Topic :: Software Development :: Libraries :: Python Modules", ] -dependencies = ["ragbits-core==1.3.0"] +dependencies = ["ragbits-core==1.4.0.dev202509121038"] [project.urls] "Homepage" = "https://github.com/deepsense-ai/ragbits" diff --git a/packages/ragbits/pyproject.toml b/packages/ragbits/pyproject.toml index 69089fd77..2234f6a55 100644 --- a/packages/ragbits/pyproject.toml +++ b/packages/ragbits/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "ragbits" -version = "1.3.0" +version = "1.4.0.dev202509121038" description = "Building blocks for rapid development of GenAI applications" dynamic = ["readme"] requires-python = ">=3.10" @@ -31,7 +31,7 @@ classifiers = [ "Topic :: Scientific/Engineering :: Artificial Intelligence", "Topic :: Software Development :: Libraries :: Python Modules", ] -dependencies = ["ragbits-document-search==1.3.0", "ragbits-cli==1.3.0", "ragbits-evaluate==1.3.0", "ragbits-guardrails==1.3.0", "ragbits-chat==1.3.0", "ragbits-core==1.3.0"] +dependencies = ["ragbits-document-search==1.4.0.dev202509121038", "ragbits-cli==1.4.0.dev202509121038", "ragbits-evaluate==1.4.0.dev202509121038", "ragbits-guardrails==1.4.0.dev202509121038", "ragbits-chat==1.4.0.dev202509121038", "ragbits-core==1.4.0.dev202509121038"] [project.urls] "Homepage" = "https://github.com/deepsense-ai/ragbits" diff --git a/uv.lock b/uv.lock index 92f1817a5..1d42b00cc 100644 --- a/uv.lock +++ b/uv.lock @@ -4917,7 +4917,7 @@ wheels = [ [[package]] name = "ragbits-agents" -version = "1.3.0" +version = "1.4.0.dev202509121038" source = { editable = "packages/ragbits-agents" } dependencies = [ { name = "ragbits-core" }, @@ -4953,7 +4953,7 @@ provides-extras = ["a2a", "mcp", "openai", "cli"] [[package]] name = "ragbits-chat" -version = "1.3.0" +version = "1.4.0.dev202509121038" source = { editable = "packages/ragbits-chat" } dependencies = [ { name = "bcrypt" }, @@ -5001,7 +5001,7 @@ dev = [ [[package]] name = "ragbits-cli" -version = "1.3.0" +version = "1.4.0.dev202509121038" source = { editable = "packages/ragbits-cli" } dependencies = [ { name = "ragbits-core" }, @@ -5016,7 +5016,7 @@ requires-dist = [ [[package]] name = "ragbits-core" -version = "1.3.0" +version = "1.4.0.dev202509121038" source = { editable = "packages/ragbits-core" } dependencies = [ { name = "aiohttp" }, @@ -5154,7 +5154,7 @@ dev = [ [[package]] name = "ragbits-document-search" -version = "1.3.0" +version = "1.4.0.dev202509121038" source = { editable = "packages/ragbits-document-search" } dependencies = [ { name = "docling" }, @@ -5210,7 +5210,7 @@ dev = [ [[package]] name = "ragbits-evaluate" -version = "1.3.0" +version = "1.4.0.dev202509121038" source = { editable = "packages/ragbits-evaluate" } dependencies = [ { name = "datasets" }, @@ -5258,7 +5258,7 @@ dev = [ [[package]] name = "ragbits-guardrails" -version = "1.3.0" +version = "1.4.0.dev202509121038" source = { editable = "packages/ragbits-guardrails" } dependencies = [ { name = "ragbits-core" }, From ee680a44d66b3bd3145fc891ce7175601f24604d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mateusz=20Hordy=C5=84ski?= Date: Fri, 12 Sep 2025 10:44:49 +0200 Subject: [PATCH 02/43] chore: fix docs build --- .github/workflows/publish-docs.yaml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/workflows/publish-docs.yaml b/.github/workflows/publish-docs.yaml index de307fb8e..0dda20d56 100644 --- a/.github/workflows/publish-docs.yaml +++ b/.github/workflows/publish-docs.yaml @@ -15,6 +15,9 @@ jobs: contents: write steps: - uses: actions/checkout@v4 + with: + ref: gh-pages + fetch-depth: 1 - name: Deploy docs shell: bash From ecf3508173d1c7dc51f63a0b2c7a6691dfbe4fac Mon Sep 17 00:00:00 2001 From: jakubduda-dsai Date: Tue, 16 Sep 2025 10:28:21 +0200 Subject: [PATCH 03/43] init: TODO agent --- examples/agents/todo_example.py | 296 ++++++++++++++++++ .../src/ragbits/agents/__init__.py | 4 + .../src/ragbits/agents/todo_agent.py | 149 +++++++++ 3 files changed, 449 insertions(+) create mode 100644 examples/agents/todo_example.py create mode 100644 packages/ragbits-agents/src/ragbits/agents/todo_agent.py diff --git a/examples/agents/todo_example.py b/examples/agents/todo_example.py new file mode 100644 index 000000000..209fad848 --- /dev/null +++ b/examples/agents/todo_example.py @@ -0,0 +1,296 @@ +#!/usr/bin/env python3 +"""Simplified Hiking Trip Planning Agent - Process Under Hood, Stream Final Summary.""" + +import asyncio +import json +import os + +from pydantic import BaseModel + +from ragbits.agents.todo_agent import TodoAgent +from ragbits.core.llms import LiteLLM +from ragbits.core.prompt.prompt import Prompt + + +class HikingPlanInput(BaseModel): + """Simplified input for hiking trip planning.""" + + location: str + duration_days: int + group_size: int + skill_level: str + season: str + preferences: str + + +class PlanningPrompt(Prompt[HikingPlanInput]): + """Unified prompt for all hiking planning tasks.""" + + system_prompt = """ + You are an expert hiking guide with 15+ years of experience. You create comprehensive, + actionable hiking trip plans by working through planning tasks systematically. + + Always prioritize safety while maximizing the adventure experience. + Provide specific recommendations with real names, locations, costs, and practical details. + """ + + user_prompt = """ + Plan a {{ duration_days }}-day hiking trip for {{ group_size }} {{ skill_level }} hikers + in {{ location }} during {{ season }}. + + Preferences: {{ preferences }} + + Complete this specific planning task with detailed, actionable recommendations. + """ + + +class TaskGenerationPrompt(Prompt[HikingPlanInput]): + """Prompt for AI to generate planning tasks.""" + + system_prompt = """ + You are an expert hiking trip planner. Create a JSON array of planning tasks. + + IMPORTANT: Return ONLY the JSON array, no other text or explanations. + + Create 3-5 specific planning tasks. Each task should be actionable and focused. + + Example response: + ["Research trail routes and difficulty levels", "Find accommodation near trailheads", + "Analyze weather and gear needs"] + """ + + user_prompt = """ + Create planning tasks for: + - {{ duration_days }}-day hiking trip in {{ location }} + - {{ group_size }} {{ skill_level }} hikers + - Season: {{ season }} + - Preferences: {{ preferences }} + + Return only the JSON array of task descriptions. + """ + + +class SummaryPrompt(Prompt[HikingPlanInput]): + """Prompt for creating final comprehensive summary.""" + + system_prompt = """ + You are an expert hiking guide creating a comprehensive trip plan summary. + Based on your planning analysis, create a complete, actionable hiking trip plan + that covers all essential aspects of the adventure. + + Structure your response clearly with specific recommendations and practical details. + """ + + user_prompt = """ + Create a comprehensive hiking trip plan for: + - {{ duration_days }}-day trip in {{ location }} + - {{ group_size }} {{ skill_level }} hikers + - Season: {{ season }} + - Preferences: {{ preferences }} + + Provide a complete plan including: + • Trail routes and difficulty assessments + • Accommodation recommendations near trailheads + • Detailed budget breakdown with costs + • Weather analysis and gear recommendations + • Daily schedule with sunrise/sunset times + • Post-hike activities and relaxation options + • Safety protocols and emergency contacts + + Make this a step-by-step plan someone could follow immediately. + """ + + +def clear_console() -> None: + """Clear the console screen.""" + os.system("clear" if os.name == "posix" else "cls") # noqa: S605 + + +def display_task_list(agent: TodoAgent, title: str = "Planning Progress") -> None: + """Display current task list with visual status indicators.""" + clear_console() + print("🏔️ AI Hiking Trip Planner") + print("=" * 50) + print(f"\n📋 {title}") + print("─" * 30) + + for task in agent.tasks: + if task.status.value == "pending": + status_icon = "⏳" + elif task.status.value == "in-progress": + status_icon = "🔄" + else: # done + status_icon = "✅" + + print(f" {status_icon} {task.description}") + + print(f"\n📊 Progress: {len(agent.done_tasks)}/{len(agent.tasks)} completed") + + +async def smart_hiking_planner() -> None: + """Smart hiking planner that processes tasks under the hood and streams final summary.""" + llm = LiteLLM(model_name="gpt-4o-mini") + + clear_console() + print("🏔️ Smart AI Hiking Trip Planner") + print("=" * 50) + + # Trip configuration + trip_input = HikingPlanInput( + location="Tatra Mountains - Poland", + duration_days=1, + group_size=2, + skill_level="intermediate", + season="late September/early October", + preferences="scenic views, no longer than 15km, no crowds, avoid Morskie Oko/Giewont/Kasprowy Wierch", + ) + + print("\n📋 Trip Configuration:") + print(f" 📍 Location: {trip_input.location}") + print(f" 📅 Duration: {trip_input.duration_days} day(s)") + print(f" 👥 Group: {trip_input.group_size} {trip_input.skill_level} hikers") + print(f" 🌤️ Season: {trip_input.season}") + print(f" ⭐ Preferences: {trip_input.preferences}") + + await asyncio.sleep(2) + + # AI creates planning tasks + print("\n🤖 AI analyzing trip requirements and generating tasks...") + + # Create task generation agent + task_generator = TodoAgent(llm=llm, prompt=TaskGenerationPrompt) + + # Generate tasks with AI + task_response = await task_generator.run(trip_input) + + # Parse AI-generated tasks with robust error handling + try: + # Extract response content - AgentResult has .content attribute + if hasattr(task_response, "content"): + response_content = task_response.content.strip() + else: + response_content = str(task_response).strip() + + # Multiple strategies to extract JSON + import re + + # Strategy 1: Try direct JSON parsing + try: + planning_tasks = json.loads(response_content) + except json.JSONDecodeError: + # Strategy 2: Extract JSON array from text + json_patterns = [ + r"\[(?:[^[\]]*(?:\[[^\]]*\])*)*\]", # Complex nested array pattern + r"\[.*?\]", # Simple array pattern + ] + + planning_tasks = None + for pattern in json_patterns: + json_match = re.search(pattern, response_content, re.DOTALL) + if json_match: + json_str = json_match.group(0) + try: + planning_tasks = json.loads(json_str) + break + except json.JSONDecodeError: + continue + + if planning_tasks is None: + raise ValueError("No valid JSON array found in response") from None + + # Validate it's a list of strings + if not isinstance(planning_tasks, list): + raise ValueError(f"Expected list, got {type(planning_tasks)}") + + if not all(isinstance(task, str) for task in planning_tasks): + raise ValueError("All tasks must be strings") + + if len(planning_tasks) == 0: + raise ValueError("No tasks generated") + + except Exception as e: + print(f"⚠️ AI task generation failed ({e}), using fallback tasks...") + planning_tasks = [ + "Research optimal trail routes and scenic viewpoints", + "Find accommodation close to trailheads", + "Analyze weather conditions and gear requirements", + "Plan daily schedule with sunrise/sunset times", + "Research post-hike activities and relaxation spots", + ] + + # Create planning agent + planning_agent = TodoAgent(llm=llm, prompt=PlanningPrompt, keep_history=True) + planning_agent.create_todo_list(planning_tasks) + + await asyncio.sleep(1) + display_task_list(planning_agent, "AI-Generated Planning Tasks") + await asyncio.sleep(2) + + print("\n🚀 Processing tasks under the hood...") + await asyncio.sleep(1) + + # Process all tasks under the hood (user sees progress, not details) + for task in planning_agent.tasks: + # Show current progress + planning_agent.mark_task(task.id, "in-progress") + display_task_list(planning_agent, f"Processing: {task.description[:40]}...") + + # Process task with AI (under the hood) + await planning_agent.run(trip_input) + + # Mark as completed + planning_agent.mark_task(task.id, "done") + await asyncio.sleep(1) + + # Show all tasks completed + display_task_list(planning_agent, "All Planning Tasks Completed!") + await asyncio.sleep(2) + + # Generate and stream comprehensive summary + print("\n🎯 Generating comprehensive trip plan...") + print("🤖 AI compiling all research into actionable plan...") + await asyncio.sleep(2) + + # Create summary agent with all gathered information + summary_agent = TodoAgent(llm=llm, prompt=SummaryPrompt) + + # Clear screen for final summary + clear_console() + print(f"{'='*60}") + print("🏔️ COMPLETE HIKING TRIP PLAN") + print(f"{'='*60}") + print() + + # Stream the comprehensive summary + streaming_result = summary_agent.run_streaming(trip_input) + + async for chunk in streaming_result: + if isinstance(chunk, str): + print(chunk, end="", flush=True) + + print(f"\n\n{'='*60}") + print("✅ Trip planning completed!") + print(f"📊 Agent processed {len(planning_agent.tasks)} planning tasks") + print("🎉 Ready for your adventure!") + + +async def main() -> None: + """Run the smart hiking planner.""" + print("🚀 Smart AI Hiking Trip Planner") + print("AI processes planning tasks under the hood, then streams comprehensive plan") + print("\nPress Ctrl+C to exit...") + await asyncio.sleep(3) + + try: + await smart_hiking_planner() + print("\n✨ Planning completed successfully!") + + except KeyboardInterrupt: + print("\n👋 Planning interrupted") + except Exception as e: + print(f"\n❌ Error: {e}") + print("Make sure OPENAI_API_KEY is set") + + +if __name__ == "__main__": + asyncio.run(main()) diff --git a/packages/ragbits-agents/src/ragbits/agents/__init__.py b/packages/ragbits-agents/src/ragbits/agents/__init__.py index 7a7036895..d1775a117 100644 --- a/packages/ragbits-agents/src/ragbits/agents/__init__.py +++ b/packages/ragbits-agents/src/ragbits/agents/__init__.py @@ -7,6 +7,7 @@ AgentRunContext, ToolCallResult, ) +from ragbits.agents.todo_agent import Task, TaskStatus, TodoAgent from ragbits.agents.types import QuestionAnswerAgent, QuestionAnswerPromptInput, QuestionAnswerPromptOutput __all__ = [ @@ -19,5 +20,8 @@ "QuestionAnswerAgent", "QuestionAnswerPromptInput", "QuestionAnswerPromptOutput", + "Task", + "TaskStatus", + "TodoAgent", "ToolCallResult", ] diff --git a/packages/ragbits-agents/src/ragbits/agents/todo_agent.py b/packages/ragbits-agents/src/ragbits/agents/todo_agent.py new file mode 100644 index 000000000..722b2a83c --- /dev/null +++ b/packages/ragbits-agents/src/ragbits/agents/todo_agent.py @@ -0,0 +1,149 @@ +"""Clean TodoAgent implementation - extends Agent directly.""" + +import uuid +from collections.abc import Callable +from enum import Enum +from typing import Generic, Literal + +from ragbits.agents._main import Agent, AgentOptions +from ragbits.agents.mcp.server import MCPServer +from ragbits.core.llms.base import LLM, LLMClientOptionsT +from ragbits.core.prompt.base import ChatFormat +from ragbits.core.prompt.prompt import Prompt, PromptInputT, PromptOutputT + + +class TaskStatus(str, Enum): + """Task status options.""" + + PENDING = "pending" + IN_PROGRESS = "in-progress" + DONE = "done" + + +class Task: + """Simple task representation with UUID.""" + + def __init__(self, description: str, task_id: str | None = None): + self.id = task_id or str(uuid.uuid4()) + self.description = description + self.status = TaskStatus.PENDING + + def __repr__(self) -> str: + return f"Task(id={self.id[:8]}..., description='{self.description}', status={self.status.value})" + + +class TodoAgent( + Agent[LLMClientOptionsT, PromptInputT, PromptOutputT], Generic[LLMClientOptionsT, PromptInputT, PromptOutputT] +): + """Agent with clean, simple todo functionality.""" + + def __init__( + self, + llm: LLM[LLMClientOptionsT], + prompt: str | type[Prompt[PromptInputT, PromptOutputT]] | Prompt[PromptInputT, PromptOutputT] | None = None, + *, + history: ChatFormat | None = None, + keep_history: bool = False, + tools: list[Callable] | None = None, + mcp_servers: list[MCPServer] | None = None, + default_options: AgentOptions[LLMClientOptionsT] | None = None, + ) -> None: + """Initialize TodoAgent - just like regular Agent but with todo capabilities.""" + super().__init__( + llm=llm, + prompt=prompt, + history=history, + keep_history=keep_history, + tools=tools, + mcp_servers=mcp_servers, + default_options=default_options, + ) + + # Simple todo storage - just a list of tasks + self.tasks: list[Task] = [] + + def create_todo_list(self, tasks: dict[int, str] | list[str]) -> list[Task]: + """ + Create todo list from tasks. + + Args: + tasks: Either dict {1: "task1", 2: "task2"} or list ["task1", "task2"] + + Returns: + List of created Task objects + """ + self.tasks.clear() + + task_descriptions = list(tasks.values()) if isinstance(tasks, dict) else tasks + for description in task_descriptions: + task = Task(description) + self.tasks.append(task) + + return self.tasks.copy() + + def add_task(self, description: str) -> Task: + """Add a single task.""" + task = Task(description) + self.tasks.append(task) + return task + + def mark_task(self, task_id: str | int, status: Literal["pending", "in-progress", "done"]) -> Task: + """ + Mark task status by ID. + + Args: + task_id: Task ID (string UUID) or index (int) + status: New status + + Returns: + Updated task + """ + task = self._find_task(task_id) + task.status = TaskStatus(status) + return task + + def get_task(self, task_id: str | int) -> Task: + """Get task by ID or index.""" + return self._find_task(task_id) + + def get_tasks_by_status(self, status: TaskStatus) -> list[Task]: + """Get all tasks with specific status.""" + return [task for task in self.tasks if task.status == status] + + @property + def pending_tasks(self) -> list[Task]: + """Get pending tasks.""" + return self.get_tasks_by_status(TaskStatus.PENDING) + + @property + def in_progress_tasks(self) -> list[Task]: + """Get in-progress tasks.""" + return self.get_tasks_by_status(TaskStatus.IN_PROGRESS) + + @property + def done_tasks(self) -> list[Task]: + """Get completed tasks.""" + return self.get_tasks_by_status(TaskStatus.DONE) + + def _find_task(self, task_id: str | int) -> Task: + """Find task by ID or index.""" + if isinstance(task_id, int): + # Use as index + if 0 <= task_id < len(self.tasks): + return self.tasks[task_id] + else: + raise ValueError(f"Task index {task_id} out of range") + + # Use as UUID string + for task in self.tasks: + if task.id == task_id or task.id.startswith(str(task_id)): + return task + + raise ValueError(f"Task {task_id} not found") + + def __repr__(self) -> str: + total = len(self.tasks) + pending = len(self.pending_tasks) + in_progress = len(self.in_progress_tasks) + done = len(self.done_tasks) + return f"TodoAgent(tasks={total}, pending={pending}, in_progress={in_progress}, done={done})" From 234ec2c90c917b32e1b1c22d809c2b1609c32f2b Mon Sep 17 00:00:00 2001 From: jakubduda-dsai Date: Tue, 16 Sep 2025 11:25:54 +0200 Subject: [PATCH 04/43] gather tasks results --- examples/agents/todo_example.py | 61 ++++++++++++++++++++++++--------- 1 file changed, 45 insertions(+), 16 deletions(-) diff --git a/examples/agents/todo_example.py b/examples/agents/todo_example.py index 209fad848..5d851d4e2 100644 --- a/examples/agents/todo_example.py +++ b/examples/agents/todo_example.py @@ -43,6 +43,17 @@ class PlanningPrompt(Prompt[HikingPlanInput]): Complete this specific planning task with detailed, actionable recommendations. """ +class SummaryInput(BaseModel): + """Input for summary generation with task results.""" + + location: str + duration_days: int + group_size: int + skill_level: str + season: str + preferences: str + task_results: str # Compiled task results + class TaskGenerationPrompt(Prompt[HikingPlanInput]): """Prompt for AI to generate planning tasks.""" @@ -70,7 +81,7 @@ class TaskGenerationPrompt(Prompt[HikingPlanInput]): """ -class SummaryPrompt(Prompt[HikingPlanInput]): +class SummaryPrompt(Prompt[SummaryInput]): """Prompt for creating final comprehensive summary.""" system_prompt = """ @@ -82,22 +93,18 @@ class SummaryPrompt(Prompt[HikingPlanInput]): """ user_prompt = """ - Create a comprehensive hiking trip plan for: + Create a comprehensive hiking trip plan based on the completed research: + + TRIP DETAILS: - {{ duration_days }}-day trip in {{ location }} - {{ group_size }} {{ skill_level }} hikers - Season: {{ season }} - Preferences: {{ preferences }} - Provide a complete plan including: - • Trail routes and difficulty assessments - • Accommodation recommendations near trailheads - • Detailed budget breakdown with costs - • Weather analysis and gear recommendations - • Daily schedule with sunrise/sunset times - • Post-hike activities and relaxation options - • Safety protocols and emergency contacts + COMPLETED RESEARCH: + {{ task_results }} - Make this a step-by-step plan someone could follow immediately. + Based on this research, provide a complete plan... """ @@ -229,14 +236,19 @@ async def smart_hiking_planner() -> None: print("\n🚀 Processing tasks under the hood...") await asyncio.sleep(1) - # Process all tasks under the hood (user sees progress, not details) + # Process all tasks and capture results + task_results = [] for task in planning_agent.tasks: # Show current progress planning_agent.mark_task(task.id, "in-progress") display_task_list(planning_agent, f"Processing: {task.description[:40]}...") - # Process task with AI (under the hood) - await planning_agent.run(trip_input) + # Process task with AI and CAPTURE results + task_result = await planning_agent.run(trip_input) + task_results.append({ + "task": task.description, + "result": task_result.content if hasattr(task_result, 'content') else str(task_result) + }) # Mark as completed planning_agent.mark_task(task.id, "done") @@ -246,12 +258,29 @@ async def smart_hiking_planner() -> None: display_task_list(planning_agent, "All Planning Tasks Completed!") await asyncio.sleep(2) + # Compile task results + compiled_results = "\n\n".join([ + f"TASK: {result['task']}\nRESULT: {result['result']}" + for result in task_results + ]) + + # Create summary input with all task results + summary_input = SummaryInput( + location=trip_input.location, + duration_days=trip_input.duration_days, + group_size=trip_input.group_size, + skill_level=trip_input.skill_level, + season=trip_input.season, + preferences=trip_input.preferences, + task_results=compiled_results + ) + # Generate and stream comprehensive summary print("\n🎯 Generating comprehensive trip plan...") print("🤖 AI compiling all research into actionable plan...") await asyncio.sleep(2) - # Create summary agent with all gathered information + # Summary agent now has access to all task research! summary_agent = TodoAgent(llm=llm, prompt=SummaryPrompt) # Clear screen for final summary @@ -262,7 +291,7 @@ async def smart_hiking_planner() -> None: print() # Stream the comprehensive summary - streaming_result = summary_agent.run_streaming(trip_input) + streaming_result = summary_agent.run_streaming(summary_input) async for chunk in streaming_result: if isinstance(chunk, str): From 661e4f75b61c673db3f750ce5ad1b06ba131e1eb Mon Sep 17 00:00:00 2001 From: akotyla <79326805+akotyla@users.noreply.github.com> Date: Tue, 16 Sep 2025 15:34:13 +0200 Subject: [PATCH 05/43] feat: support wrapping downstream agents as tools (#819) --- packages/ragbits-agents/CHANGELOG.md | 2 + .../src/ragbits/agents/_main.py | 46 +++++++++++- .../ragbits-agents/src/ragbits/agents/tool.py | 72 ++++++++++++++++++- 3 files changed, 117 insertions(+), 3 deletions(-) diff --git a/packages/ragbits-agents/CHANGELOG.md b/packages/ragbits-agents/CHANGELOG.md index 52949840d..3ebf57e6b 100644 --- a/packages/ragbits-agents/CHANGELOG.md +++ b/packages/ragbits-agents/CHANGELOG.md @@ -2,6 +2,8 @@ ## Unreleased +- Support wrapping downstream agents as tools (#818) + ## 1.3.0 (2025-09-11) ### Changed diff --git a/packages/ragbits-agents/src/ragbits/agents/_main.py b/packages/ragbits-agents/src/ragbits/agents/_main.py index d6e08f7a6..6e15b7027 100644 --- a/packages/ragbits-agents/src/ragbits/agents/_main.py +++ b/packages/ragbits-agents/src/ragbits/agents/_main.py @@ -219,6 +219,8 @@ class Agent( def __init__( self, llm: LLM[LLMClientOptionsT], + name: str | None = None, + description: str | None = None, prompt: str | type[Prompt[PromptInputT, PromptOutputT]] | Prompt[PromptInputT, PromptOutputT] | None = None, *, history: ChatFormat | None = None, @@ -232,6 +234,8 @@ def __init__( Args: llm: The LLM to run the agent. + name: Optional name of the agent. Used to identify the agent instance. + description: Optional description of the agent. prompt: The prompt for the agent. Can be: - str: A string prompt that will be used as system message when combined with string input, or as the user message when no input is provided during run(). @@ -248,7 +252,17 @@ def __init__( self.id = uuid.uuid4().hex[:8] self.llm = llm self.prompt = prompt - self.tools = [Tool.from_callable(tool) for tool in tools or []] + self.name = name + self.description = description + self.tools = [] + for tool in tools or []: + if isinstance(tool, tuple): + agent, kwargs = tool + self.tools.append(Tool.from_agent(agent, **kwargs)) + elif isinstance(tool, Agent): + self.tools.append(Tool.from_agent(tool)) + else: + self.tools.append(Tool.from_callable(tool)) self.mcp_servers = mcp_servers or [] self.history = history or [] self.keep_history = keep_history @@ -555,7 +569,10 @@ async def _get_all_tools(self) -> dict[str, Tool]: return tools_mapping async def _execute_tool( - self, tool_call: ToolCall, tools_mapping: dict[str, Tool], context: AgentRunContext | None = None + self, + tool_call: ToolCall, + tools_mapping: dict[str, Tool], + context: AgentRunContext | None = None, ) -> ToolCallResult: if tool_call.type != "function": raise AgentToolNotSupportedError(tool_call.type) @@ -577,10 +594,22 @@ async def _execute_tool( else tool.on_tool_call(**call_args) ) + if isinstance(tool_output, AgentResultStreaming): + async for _ in tool_output: + pass + + tool_output = { + "content": tool_output.content, + "metadata": tool_output.metadata, + "tool_calls": tool_output.tool_calls, + "usage": tool_output.usage, + } + outputs.result = { "tool_output": tool_output, "tool_call_id": tool_call.id, } + except Exception as e: outputs.result = { "error": str(e), @@ -758,3 +787,16 @@ def from_pydantic_ai(cls, pydantic_ai_agent: "PydanticAIAgent") -> Self: tools=[tool.function for _, tool in pydantic_ai_agent._function_tools.items()], mcp_servers=cast(list[MCPServer], mcp_servers), ) + + def to_tool(self, name: str | None = None, description: str | None = None) -> Tool: + """ + Convert the agent into a Tool instance. + + Args: + name: Optional override for the tool name. + description: Optional override for the tool description. + + Returns: + Tool instance representing the agent. + """ + return Tool.from_agent(self, name=name or self.name, description=description or self.description) diff --git a/packages/ragbits-agents/src/ragbits/agents/tool.py b/packages/ragbits-agents/src/ragbits/agents/tool.py index eebdf5b21..3da403782 100644 --- a/packages/ragbits-agents/src/ragbits/agents/tool.py +++ b/packages/ragbits-agents/src/ragbits/agents/tool.py @@ -1,13 +1,19 @@ from collections.abc import Callable from contextlib import suppress from dataclasses import dataclass -from typing import Any, Literal +from typing import TYPE_CHECKING, Any, Literal +from pydantic import BaseModel from typing_extensions import Self +from ragbits.core.llms.base import LLMClientOptionsT +from ragbits.core.prompt.prompt import PromptInputT, PromptOutputT from ragbits.core.utils.decorators import requires_dependencies from ragbits.core.utils.function_schema import convert_function_to_function_schema, get_context_variable_name +if TYPE_CHECKING: + from ragbits.agents import Agent, AgentResultStreaming + with suppress(ImportError): from pydantic_ai import Tool as PydanticAITool @@ -96,5 +102,69 @@ def to_pydantic_ai(self) -> "PydanticAITool": description=self.description, ) + @classmethod + def from_agent( + cls, + agent: "Agent[LLMClientOptionsT, PromptInputT, PromptOutputT]", + name: str | None = None, + description: str | None = None, + ) -> "Tool": + """ + Wraps a downstream agent as a single tool. The tool parameters are inferred from + the downstream agent's prompt input. + + Args: + agent: The downstream agent to wrap as a tool. + name: Optional override for the tool name. + description: Optional override for the tool description. + + Returns: + Tool instance representing the agent. + """ + display_name = name or agent.name or "agent" + variable_name = display_name.replace(" ", "_").lower() + description = description or agent.description + + input_model_cls = getattr(agent.prompt, "input_type", None) + if input_model_cls and issubclass(input_model_cls, BaseModel): + fields = input_model_cls.model_fields + properties = {} + required = list(fields.keys()) + + for field_name in fields: + param_desc = None + for t in getattr(agent, "tools", []): + t_params = getattr(t, "parameters", {}).get("properties", {}) + if field_name in t_params: + param_desc = t_params[field_name].get("description") + break + + properties[field_name] = { + "type": "string", + "title": field_name.capitalize(), + "description": param_desc, + } + else: + properties = {"input": {"type": "string", "description": "Input for the downstream agent"}} + required = ["input"] + + parameters = {"type": "object", "properties": properties, "required": required} + + def _on_tool_call(**kwargs: dict) -> "AgentResultStreaming": + if input_model_cls and issubclass(input_model_cls, BaseModel): + model_input = input_model_cls(**kwargs) + else: + model_input = kwargs.get("input") + + return agent.run_streaming(model_input) + + return cls( + name=variable_name, + description=description, + parameters=parameters, + on_tool_call=_on_tool_call, + context_var_name=get_context_variable_name(agent.run), + ) + ToolChoice = Literal["auto", "none", "required"] | Callable From 61d673987939529842bd51d7af887dc8a48c468b Mon Sep 17 00:00:00 2001 From: dazy-ds <135028324+dazy-ds@users.noreply.github.com> Date: Wed, 17 Sep 2025 10:57:22 +0200 Subject: [PATCH 06/43] feat: class-based agents (#820) --- docs/how-to/agents/define_and_use_agents.md | 29 ++++- examples/agents/with_decorator.py | 88 +++++++++++++ packages/ragbits-agents/CHANGELOG.md | 1 + .../src/ragbits/agents/_main.py | 117 +++++++++++++++++- .../ragbits-agents/tests/unit/test_agent.py | 44 +++++++ 5 files changed, 273 insertions(+), 6 deletions(-) create mode 100644 examples/agents/with_decorator.py diff --git a/docs/how-to/agents/define_and_use_agents.md b/docs/how-to/agents/define_and_use_agents.md index da3ccb6d5..14f23157f 100644 --- a/docs/how-to/agents/define_and_use_agents.md +++ b/docs/how-to/agents/define_and_use_agents.md @@ -32,7 +32,7 @@ Use a structured prompt to instruct the LLM. For details on writing prompts with from pydantic import BaseModel from ragbits.core.prompt import Prompt ---8<-- "examples/agents/tool_use.py:51:70" +--8<-- "examples/agents/tool_use.py:51:72" ``` ### Run the agent @@ -49,6 +49,33 @@ The result is an [AgentResult][ragbits.agents.AgentResult], which includes the m You can find the complete code example in the Ragbits repository [here](https://github.com/deepsense-ai/ragbits/blob/main/examples/agents/tool_use.py). +### Alternative approach: inheritance with `prompt_config` + +In addition to explicitly attaching a Prompt instance, Ragbits also supports defining agents through a combination of inheritance and the `@Agent.prompt_config` decorator. + +This approach lets you bind input (and optionally output) models directly to your agent class. The agent then derives its prompt structure automatically, without requiring a prompt argument in the constructor. + +```python +from pydantic import BaseModel +from ragbits.agents import Agent + +--8<-- "examples/agents/with_decorator.py:51:71" +``` + +The decorator can also accept an output type, allowing you to strongly type both the inputs and outputs of the agent. If you do not explicitly define a `user_prompt`, Ragbits will default to `{{ input }}`. + +Once defined, the agent class can be used directly, just like any other subclass of Agent: + +```python +import asyncio +from ragbits.agents import Agent +from ragbits.core.llms import LiteLLM + +--8<-- "examples/agents/with_decorator.py:73:84" +``` + +You can find the complete code example in the Ragbits repository [here](https://github.com/deepsense-ai/ragbits/blob/main/examples/agents/with_decorator.py). + ## Tool choice To control what tool is used at first call you could use `tool_choice` parameter. There are the following options: - "auto": let model decide if tool call is needed diff --git a/examples/agents/with_decorator.py b/examples/agents/with_decorator.py new file mode 100644 index 000000000..c1ae47024 --- /dev/null +++ b/examples/agents/with_decorator.py @@ -0,0 +1,88 @@ +""" +Ragbits Agents Example: Syntax Sugar + +This example demonstrates how to use agent with tools by using new syntax sugar. +We provide a single method as a tool to the agent and expect it to call it when answering query. + +To run the script, execute the following command: + + ```bash + uv run examples/agents/tool_use.py + ``` +""" + +# /// script +# requires-python = ">=3.10" +# dependencies = [ +# "ragbits-core", +# "ragbits-agents", +# ] +# /// +import asyncio +import json + +from pydantic import BaseModel + +from ragbits.agents import Agent +from ragbits.agents._main import AgentOptions +from ragbits.core.llms import LiteLLM + + +def get_weather(location: str) -> str: + """ + Returns the current weather for a given location. + + Args: + location: The location to get the weather for. + + Returns: + The current weather for the given location. + """ + if "tokyo" in location.lower(): + return json.dumps({"location": "Tokyo", "temperature": "10", "unit": "celsius"}) + elif "san francisco" in location.lower(): + return json.dumps({"location": "San Francisco", "temperature": "72", "unit": "fahrenheit"}) + elif "paris" in location.lower(): + return json.dumps({"location": "Paris", "temperature": "22", "unit": "celsius"}) + else: + return json.dumps({"location": location, "temperature": "unknown"}) + + +class WeatherAgentInput(BaseModel): + """ + Input format for the WeatherAgent + """ + + location: str + + +@Agent.prompt_config(WeatherAgentInput) +class WeatherAgent(Agent): + """ + Agent that returns weather for a given location. + """ + + system_prompt = """ + You are a helpful assistant that responds to user questions about weather. + """ + user_prompt = """ + Tell me the temperature in {{ location }}. + """ + + +async def main() -> None: + """ + Run the example. + """ + llm = LiteLLM(model_name="gpt-4o-2024-08-06", use_structured_output=True) + agent = WeatherAgent( + llm=llm, + tools=[get_weather], + default_options=AgentOptions(max_total_tokens=500, max_turns=5), + ) + response = await agent.run(WeatherAgentInput(location="Paris"), tool_choice=get_weather) + print(response) + + +if __name__ == "__main__": + asyncio.run(main()) diff --git a/packages/ragbits-agents/CHANGELOG.md b/packages/ragbits-agents/CHANGELOG.md index 3ebf57e6b..2a722f747 100644 --- a/packages/ragbits-agents/CHANGELOG.md +++ b/packages/ragbits-agents/CHANGELOG.md @@ -3,6 +3,7 @@ ## Unreleased - Support wrapping downstream agents as tools (#818) +- Add syntax sugar allowing easier Agents definition (#820) ## 1.3.0 (2025-09-11) ### Changed diff --git a/packages/ragbits-agents/src/ragbits/agents/_main.py b/packages/ragbits-agents/src/ragbits/agents/_main.py index 6e15b7027..6b15a00e6 100644 --- a/packages/ragbits-agents/src/ragbits/agents/_main.py +++ b/packages/ragbits-agents/src/ragbits/agents/_main.py @@ -1,4 +1,5 @@ import asyncio +import types import uuid from collections.abc import AsyncGenerator, AsyncIterator, Callable from contextlib import suppress @@ -7,9 +8,12 @@ from datetime import timedelta from inspect import iscoroutinefunction from types import ModuleType, SimpleNamespace -from typing import ClassVar, Generic, TypeVar, cast, overload +from typing import Any, ClassVar, Generic, TypeVar, cast, overload -from pydantic import BaseModel, Field +from pydantic import ( + BaseModel, + Field, +) from typing_extensions import Self from ragbits import agents @@ -27,7 +31,7 @@ from ragbits.agents.mcp.utils import get_tools from ragbits.agents.tool import Tool, ToolCallResult, ToolChoice from ragbits.core.audit.traces import trace -from ragbits.core.llms.base import LLM, LLMClientOptionsT, LLMResponseWithMetadata, ToolCall, Usage +from ragbits.core.llms.base import LLM, LLMClientOptionsT, LLMOptions, LLMResponseWithMetadata, ToolCall, Usage from ragbits.core.options import Options from ragbits.core.prompt.base import BasePrompt, ChatFormat, SimplePrompt from ragbits.core.prompt.prompt import Prompt, PromptInputT, PromptOutputT @@ -42,6 +46,9 @@ from ragbits.core.llms import LiteLLM +_Input = TypeVar("_Input", bound=BaseModel) +_Output = TypeVar("_Output") + @dataclass class AgentResult(Generic[PromptOutputT]): @@ -215,6 +222,11 @@ class Agent( options_cls: type[AgentOptions] = AgentOptions default_module: ClassVar[ModuleType | None] = agents configuration_key: ClassVar[str] = "agent" + # Syntax sugar fields + user_prompt: ClassVar[str] = "{{ input }}" + system_prompt: ClassVar[str | None] = None + input_type: PromptInputT | None = None + prompt_cls: ClassVar[type[Prompt] | None] = None def __init__( self, @@ -267,6 +279,12 @@ def __init__( self.history = history or [] self.keep_history = keep_history + if getattr(self, "system_prompt", None) and not getattr(self, "input_type", None): + raise ValueError( + f"Agent {type(self).__name__} defines a system_prompt but has no input_type. ", + "Use Agent.prompt decorator to properly assign it.", + ) + @overload async def run( self: "Agent[LLMClientOptionsT, None, PromptOutputT]", @@ -518,14 +536,38 @@ def _get_llm_options( llm_options.max_tokens = min(actual_limits) - usage.total_tokens return llm_options - def _get_prompt_with_history(self, input: PromptInputT) -> SimplePrompt | Prompt[PromptInputT, PromptOutputT]: + def _prepare_synthesized_prompt( + self, input: PromptInputT + ) -> SimplePrompt | Prompt[PromptInputT, PromptOutputT] | None: curr_history = deepcopy(self.history) + if ( + hasattr(self, "prompt_cls") + and self.prompt_cls + and isinstance(self.prompt_cls, type) + and issubclass(self.prompt_cls, Prompt) + ): + prompt_cls = cast(type[Prompt[PromptInputT, PromptOutputT]], self.prompt_cls) + if self.keep_history: + self.prompt = cast(Prompt[PromptInputT, PromptOutputT], prompt_cls(input, curr_history)) + return self.prompt + else: + return cast(Prompt[PromptInputT, PromptOutputT], prompt_cls(input)) + if isinstance(self.prompt, type) and issubclass(self.prompt, Prompt): if self.keep_history: self.prompt = self.prompt(input, curr_history) return self.prompt else: - return self.prompt(input, curr_history) + return self.prompt(input) + + return None + + def _get_prompt_with_history(self, input: PromptInputT) -> SimplePrompt | Prompt[PromptInputT, PromptOutputT]: + curr_history = deepcopy(self.history) + new_prompt = self._prepare_synthesized_prompt(input) + + if new_prompt: + return new_prompt if isinstance(self.prompt, Prompt): self.prompt.add_user_message(input) @@ -800,3 +842,68 @@ def to_tool(self, name: str | None = None, description: str | None = None) -> To Tool instance representing the agent. """ return Tool.from_agent(self, name=name or self.name, description=description or self.description) + + @staticmethod + def _make_prompt_class_for_agent_subclass(agent_cls: type["Agent[Any, Any, Any]"]) -> type[Prompt] | None: + system = getattr(agent_cls, "system_prompt", None) + if not system: + raise ValueError(f"Agent {agent_cls.__name__} has no system_prompt") + user = getattr(agent_cls, "user_prompt", "{{ input }}") + + input_type: type[BaseModel] | None = getattr(agent_cls, "input_type", None) + if input_type is None: + raise ValueError(f"Agent {agent_cls.__name__} cannot build a Prompt without input_type") + + base_generic = Prompt + base = base_generic[input_type] + + attrs = { + "system_prompt": system, + "user_prompt": user, + } + + return types.new_class( + f"_{agent_cls.__name__}Prompt", + (base,), + exec_body=lambda ns: ns.update(attrs), + ) + + @overload + @staticmethod + def prompt_config( + input_model: type[_Input], + ) -> Callable[[type[Any]], type["Agent[LLMOptions, _Input, str]"]]: ... + @overload + @staticmethod + def prompt_config( + input_model: type[_Input], + output_model: type[_Output], + ) -> Callable[[type[Any]], type["Agent[LLMOptions, _Input, _Output]"]]: ... + @staticmethod + def prompt_config( + input_model: type[_Input], + output_model: type[_Output] | type[NotGiven] = NotGiven, + ) -> Callable[[type[Any]], type["Agent[LLMOptions, _Input, _Output]"]]: + """ + Decorator to bind both input and output types of an Agent subclass, with runtime checks. + + Raises: + TypeError: if the decorated class is not a subclass of Agent, + or if input_model is not a Pydantic BaseModel. + """ + if not isinstance(input_model, type) or not issubclass(input_model, BaseModel): + raise TypeError(f"input_model must be a subclass of pydantic.BaseModel, got {input_model}") + + if not isinstance(output_model, type): + raise TypeError(f"output_model must be a type, got {output_model}") + + def decorator(cls: type[Any]) -> type["Agent[LLMOptions, _Input, _Output]"]: + if not isinstance(cls, type) or not issubclass(cls, Agent): + raise TypeError(f"Can only decorate subclasses of Agent, got {cls}") + + cls.input_type = input_model + cls.prompt_cls = Agent._make_prompt_class_for_agent_subclass(cls) + + return cast(type["Agent[LLMOptions, _Input, _Output]"], cls) + + return decorator diff --git a/packages/ragbits-agents/tests/unit/test_agent.py b/packages/ragbits-agents/tests/unit/test_agent.py index 10fd2efbf..4444e4c53 100644 --- a/packages/ragbits-agents/tests/unit/test_agent.py +++ b/packages/ragbits-agents/tests/unit/test_agent.py @@ -769,3 +769,47 @@ async def test_tool_choice_history_preservation(llm_with_tool_call: MockLLM, met # Should include tool call in history tool_call_messages = [msg for msg in agent.history if msg.get("role") == "tool"] assert len(tool_call_messages) >= 1 + + +async def test_explicit_input_type_prompt_creation(): + class CustomInput(BaseModel): + foo: int + bar: str + + @Agent.prompt_config(CustomInput) + class AgentWithExplicitInput(Agent): + system_prompt = "System prompt" + user_prompt = "{{ foo }} {{ bar }}" + + prompt_cls = AgentWithExplicitInput.prompt_cls + assert prompt_cls is not None + assert issubclass(prompt_cls, Prompt) + assert prompt_cls.system_prompt == "System prompt" + assert prompt_cls.user_prompt == "{{ foo }} {{ bar }}" + + +async def test_default_user_prompt_is_input_placeholder(): + class CustomInputModel(BaseModel): + input: int + + @Agent.prompt_config(CustomInputModel) + class AgentExplicitPrompt(Agent): + system_prompt = "Explicit system" + + prompt_cls2 = AgentExplicitPrompt.prompt_cls + assert prompt_cls2 is not None + assert issubclass(prompt_cls2, Prompt) + assert prompt_cls2.user_prompt == "{{ input }}" + + +async def test_input_type_check_with_system_prompt(llm_with_tool_call: MockLLM): + class AgentExplicitPrompt(Agent): + system_prompt = "Explicit system" + + with pytest.raises(ValueError): + AgentExplicitPrompt( + llm=llm_with_tool_call, + prompt="You are a helpful assistant", + tools=[get_weather], + keep_history=True, + ) From 1115edbca5a2276dac7953d899e318d9f38d1792 Mon Sep 17 00:00:00 2001 From: jakubduda-dsai Date: Thu, 18 Sep 2025 11:11:14 +0200 Subject: [PATCH 07/43] save --- examples/agents/todo_example.py | 325 -------------- examples/agents/todo_tools_example.py | 119 ++++++ .../src/ragbits/agents/__init__.py | 7 +- .../src/ragbits/agents/todo_agent.py | 149 ------- .../src/ragbits/agents/tools/__init__.py | 6 +- .../src/ragbits/agents/tools/todo.py | 398 ++++++++++++++++++ 6 files changed, 524 insertions(+), 480 deletions(-) delete mode 100644 examples/agents/todo_example.py create mode 100644 examples/agents/todo_tools_example.py delete mode 100644 packages/ragbits-agents/src/ragbits/agents/todo_agent.py create mode 100644 packages/ragbits-agents/src/ragbits/agents/tools/todo.py diff --git a/examples/agents/todo_example.py b/examples/agents/todo_example.py deleted file mode 100644 index 5d851d4e2..000000000 --- a/examples/agents/todo_example.py +++ /dev/null @@ -1,325 +0,0 @@ -#!/usr/bin/env python3 -"""Simplified Hiking Trip Planning Agent - Process Under Hood, Stream Final Summary.""" - -import asyncio -import json -import os - -from pydantic import BaseModel - -from ragbits.agents.todo_agent import TodoAgent -from ragbits.core.llms import LiteLLM -from ragbits.core.prompt.prompt import Prompt - - -class HikingPlanInput(BaseModel): - """Simplified input for hiking trip planning.""" - - location: str - duration_days: int - group_size: int - skill_level: str - season: str - preferences: str - - -class PlanningPrompt(Prompt[HikingPlanInput]): - """Unified prompt for all hiking planning tasks.""" - - system_prompt = """ - You are an expert hiking guide with 15+ years of experience. You create comprehensive, - actionable hiking trip plans by working through planning tasks systematically. - - Always prioritize safety while maximizing the adventure experience. - Provide specific recommendations with real names, locations, costs, and practical details. - """ - - user_prompt = """ - Plan a {{ duration_days }}-day hiking trip for {{ group_size }} {{ skill_level }} hikers - in {{ location }} during {{ season }}. - - Preferences: {{ preferences }} - - Complete this specific planning task with detailed, actionable recommendations. - """ - -class SummaryInput(BaseModel): - """Input for summary generation with task results.""" - - location: str - duration_days: int - group_size: int - skill_level: str - season: str - preferences: str - task_results: str # Compiled task results - - -class TaskGenerationPrompt(Prompt[HikingPlanInput]): - """Prompt for AI to generate planning tasks.""" - - system_prompt = """ - You are an expert hiking trip planner. Create a JSON array of planning tasks. - - IMPORTANT: Return ONLY the JSON array, no other text or explanations. - - Create 3-5 specific planning tasks. Each task should be actionable and focused. - - Example response: - ["Research trail routes and difficulty levels", "Find accommodation near trailheads", - "Analyze weather and gear needs"] - """ - - user_prompt = """ - Create planning tasks for: - - {{ duration_days }}-day hiking trip in {{ location }} - - {{ group_size }} {{ skill_level }} hikers - - Season: {{ season }} - - Preferences: {{ preferences }} - - Return only the JSON array of task descriptions. - """ - - -class SummaryPrompt(Prompt[SummaryInput]): - """Prompt for creating final comprehensive summary.""" - - system_prompt = """ - You are an expert hiking guide creating a comprehensive trip plan summary. - Based on your planning analysis, create a complete, actionable hiking trip plan - that covers all essential aspects of the adventure. - - Structure your response clearly with specific recommendations and practical details. - """ - - user_prompt = """ - Create a comprehensive hiking trip plan based on the completed research: - - TRIP DETAILS: - - {{ duration_days }}-day trip in {{ location }} - - {{ group_size }} {{ skill_level }} hikers - - Season: {{ season }} - - Preferences: {{ preferences }} - - COMPLETED RESEARCH: - {{ task_results }} - - Based on this research, provide a complete plan... - """ - - -def clear_console() -> None: - """Clear the console screen.""" - os.system("clear" if os.name == "posix" else "cls") # noqa: S605 - - -def display_task_list(agent: TodoAgent, title: str = "Planning Progress") -> None: - """Display current task list with visual status indicators.""" - clear_console() - print("🏔️ AI Hiking Trip Planner") - print("=" * 50) - print(f"\n📋 {title}") - print("─" * 30) - - for task in agent.tasks: - if task.status.value == "pending": - status_icon = "⏳" - elif task.status.value == "in-progress": - status_icon = "🔄" - else: # done - status_icon = "✅" - - print(f" {status_icon} {task.description}") - - print(f"\n📊 Progress: {len(agent.done_tasks)}/{len(agent.tasks)} completed") - - -async def smart_hiking_planner() -> None: - """Smart hiking planner that processes tasks under the hood and streams final summary.""" - llm = LiteLLM(model_name="gpt-4o-mini") - - clear_console() - print("🏔️ Smart AI Hiking Trip Planner") - print("=" * 50) - - # Trip configuration - trip_input = HikingPlanInput( - location="Tatra Mountains - Poland", - duration_days=1, - group_size=2, - skill_level="intermediate", - season="late September/early October", - preferences="scenic views, no longer than 15km, no crowds, avoid Morskie Oko/Giewont/Kasprowy Wierch", - ) - - print("\n📋 Trip Configuration:") - print(f" 📍 Location: {trip_input.location}") - print(f" 📅 Duration: {trip_input.duration_days} day(s)") - print(f" 👥 Group: {trip_input.group_size} {trip_input.skill_level} hikers") - print(f" 🌤️ Season: {trip_input.season}") - print(f" ⭐ Preferences: {trip_input.preferences}") - - await asyncio.sleep(2) - - # AI creates planning tasks - print("\n🤖 AI analyzing trip requirements and generating tasks...") - - # Create task generation agent - task_generator = TodoAgent(llm=llm, prompt=TaskGenerationPrompt) - - # Generate tasks with AI - task_response = await task_generator.run(trip_input) - - # Parse AI-generated tasks with robust error handling - try: - # Extract response content - AgentResult has .content attribute - if hasattr(task_response, "content"): - response_content = task_response.content.strip() - else: - response_content = str(task_response).strip() - - # Multiple strategies to extract JSON - import re - - # Strategy 1: Try direct JSON parsing - try: - planning_tasks = json.loads(response_content) - except json.JSONDecodeError: - # Strategy 2: Extract JSON array from text - json_patterns = [ - r"\[(?:[^[\]]*(?:\[[^\]]*\])*)*\]", # Complex nested array pattern - r"\[.*?\]", # Simple array pattern - ] - - planning_tasks = None - for pattern in json_patterns: - json_match = re.search(pattern, response_content, re.DOTALL) - if json_match: - json_str = json_match.group(0) - try: - planning_tasks = json.loads(json_str) - break - except json.JSONDecodeError: - continue - - if planning_tasks is None: - raise ValueError("No valid JSON array found in response") from None - - # Validate it's a list of strings - if not isinstance(planning_tasks, list): - raise ValueError(f"Expected list, got {type(planning_tasks)}") - - if not all(isinstance(task, str) for task in planning_tasks): - raise ValueError("All tasks must be strings") - - if len(planning_tasks) == 0: - raise ValueError("No tasks generated") - - except Exception as e: - print(f"⚠️ AI task generation failed ({e}), using fallback tasks...") - planning_tasks = [ - "Research optimal trail routes and scenic viewpoints", - "Find accommodation close to trailheads", - "Analyze weather conditions and gear requirements", - "Plan daily schedule with sunrise/sunset times", - "Research post-hike activities and relaxation spots", - ] - - # Create planning agent - planning_agent = TodoAgent(llm=llm, prompt=PlanningPrompt, keep_history=True) - planning_agent.create_todo_list(planning_tasks) - - await asyncio.sleep(1) - display_task_list(planning_agent, "AI-Generated Planning Tasks") - await asyncio.sleep(2) - - print("\n🚀 Processing tasks under the hood...") - await asyncio.sleep(1) - - # Process all tasks and capture results - task_results = [] - for task in planning_agent.tasks: - # Show current progress - planning_agent.mark_task(task.id, "in-progress") - display_task_list(planning_agent, f"Processing: {task.description[:40]}...") - - # Process task with AI and CAPTURE results - task_result = await planning_agent.run(trip_input) - task_results.append({ - "task": task.description, - "result": task_result.content if hasattr(task_result, 'content') else str(task_result) - }) - - # Mark as completed - planning_agent.mark_task(task.id, "done") - await asyncio.sleep(1) - - # Show all tasks completed - display_task_list(planning_agent, "All Planning Tasks Completed!") - await asyncio.sleep(2) - - # Compile task results - compiled_results = "\n\n".join([ - f"TASK: {result['task']}\nRESULT: {result['result']}" - for result in task_results - ]) - - # Create summary input with all task results - summary_input = SummaryInput( - location=trip_input.location, - duration_days=trip_input.duration_days, - group_size=trip_input.group_size, - skill_level=trip_input.skill_level, - season=trip_input.season, - preferences=trip_input.preferences, - task_results=compiled_results - ) - - # Generate and stream comprehensive summary - print("\n🎯 Generating comprehensive trip plan...") - print("🤖 AI compiling all research into actionable plan...") - await asyncio.sleep(2) - - # Summary agent now has access to all task research! - summary_agent = TodoAgent(llm=llm, prompt=SummaryPrompt) - - # Clear screen for final summary - clear_console() - print(f"{'='*60}") - print("🏔️ COMPLETE HIKING TRIP PLAN") - print(f"{'='*60}") - print() - - # Stream the comprehensive summary - streaming_result = summary_agent.run_streaming(summary_input) - - async for chunk in streaming_result: - if isinstance(chunk, str): - print(chunk, end="", flush=True) - - print(f"\n\n{'='*60}") - print("✅ Trip planning completed!") - print(f"📊 Agent processed {len(planning_agent.tasks)} planning tasks") - print("🎉 Ready for your adventure!") - - -async def main() -> None: - """Run the smart hiking planner.""" - print("🚀 Smart AI Hiking Trip Planner") - print("AI processes planning tasks under the hood, then streams comprehensive plan") - print("\nPress Ctrl+C to exit...") - await asyncio.sleep(3) - - try: - await smart_hiking_planner() - print("\n✨ Planning completed successfully!") - - except KeyboardInterrupt: - print("\n👋 Planning interrupted") - except Exception as e: - print(f"\n❌ Error: {e}") - print("Make sure OPENAI_API_KEY is set") - - -if __name__ == "__main__": - asyncio.run(main()) diff --git a/examples/agents/todo_tools_example.py b/examples/agents/todo_tools_example.py new file mode 100644 index 000000000..c26bf904b --- /dev/null +++ b/examples/agents/todo_tools_example.py @@ -0,0 +1,119 @@ +"""Example demonstrating the new single tool-based todo functionality.""" + +import asyncio + +from ragbits.agents import Agent, AgentOptions, ToolCallResult, get_todo_instruction_tpl, todo_manager +from ragbits.core.llms import LiteLLM, ToolCall + + +async def main(): + """Demonstrate the new single tool-based todo approach with streaming and logging.""" + + # Create an agent with higher turn limit and todo capabilities + my_agent = Agent( + llm=LiteLLM("gpt-4o-mini"), + prompt=""" + You are an expert hiking guide. You can either answer questions or + create a comprehensive, detailed hiking trip plan. + + WORKFLOW: + 1. If query is complex you have access to todo_manager tool to create a todo list with specific tasks + 2. If query is simple question, you work without todo_manager tool, just answer the question + 3. If you use todo_manager tool, you must follow the todo workflow below + + For hiking plans include: + - Specific route names, distances, elevation gain + - Detailed gear recommendations with quantities + - Transportation details with times, costs, parking info + - Weather considerations and backup plans + - Safety information and emergency contacts + """ + get_todo_instruction_tpl(task_range=(3, 5), enforce_workflow=True), + tools=[todo_manager], + default_options=AgentOptions(max_turns=30) + ) + + print("=== Enhanced Todo Workflow Example ===\n") + print("🚀 Hiking trip planning with systematic workflow:\n") + + # Simpler query to reduce complexity + query = "Plan a 1-day hiking trip for 2 people in Tatra Mountains, Poland. Focus on scenic routes under 15km, avoiding crowds." + # query = "How long is hike to Giewont from Kuźnice?" + # query = "Is it difficult to finish Orla Perć? Would you recommend me to go there if I've never been in mountains before?" + + stream = my_agent.run_streaming(query) + + async for response in stream: + match response: + case str(): + if response.strip(): + print(response, end="", flush=True) + + case ToolCall(): + if response.name == "todo_manager": + action = response.arguments.get("action", "unknown") + print(f"\n🔧 [TOOL] {action.upper()}", end="", flush=True) + + if action == "create": + tasks = response.arguments.get("tasks", []) + tasks_count = len(tasks) + print(f" - Creating {tasks_count} tasks", flush=True) + for i, task in enumerate(tasks, 1): + print(f" {i}. {task}") + + case ToolCallResult(): + if response.name == "todo_manager": + result = response.result + action = result.get("action", "unknown") + + if action == "create": + total = result.get('total_count', 0) + print(f" ✅ {total} tasks created successfully", flush=True) + current_task = result.get("current_task") + if current_task: + print(f"📋 Next: {current_task['description']}") + elif action == "update": + task = result.get("task", {}) + task_desc = task.get("description", "Unknown task")[:50] + new_status = task.get("status", "unknown") + print(f" ✅ Status changed to '{new_status}'", flush=True) + print(f"📋 Task: {task_desc}{'...' if len(task.get('description', '')) > 50 else ''}") + elif action == "complete_with_summary": + progress = result.get("progress", "unknown") + all_done = result.get("all_completed", False) + completed_task = result.get("completed_task", {}) + task_desc = completed_task.get("description", "Unknown task") + + if all_done: + print(f" ✅ FINAL TASK COMPLETED! Progress: {progress}", flush=True) + print(f"🎉 All tasks finished! Preparing final summary...") + else: + print(f" ✅ Task completed. Progress: {progress}", flush=True) + next_task = result.get("next_task") + if next_task: + print(f"📋 Next: {next_task['description']}") + elif action == "get_final_summary": + total_completed = result.get("total_completed", 0) + print(f" ✅ Final summary ready ({total_completed} tasks)", flush=True) + print("📄 Complete results below:") + elif action == "get_current": + current_task = result.get("current_task") + all_completed = result.get("all_completed", False) + if all_completed: + print(f" ✅ All tasks completed!", flush=True) + elif current_task: + print(f" ✅ Current task identified", flush=True) + print(f"📋 Current: {current_task['description']}") + else: + print(f" ✅ No current task", flush=True) + elif action == "get": + progress = result.get("progress", "unknown") + print(f" ✅ Task overview retrieved (Progress: {progress})", flush=True) + else: + print(f" ✅ {action} completed", flush=True) + + print("\n\n" + "="*50) + print("🎉 Systematic hiking trip planning completed!") + + +if __name__ == "__main__": + asyncio.run(main()) \ No newline at end of file diff --git a/packages/ragbits-agents/src/ragbits/agents/__init__.py b/packages/ragbits-agents/src/ragbits/agents/__init__.py index d1775a117..0551ab543 100644 --- a/packages/ragbits-agents/src/ragbits/agents/__init__.py +++ b/packages/ragbits-agents/src/ragbits/agents/__init__.py @@ -7,7 +7,7 @@ AgentRunContext, ToolCallResult, ) -from ragbits.agents.todo_agent import Task, TaskStatus, TodoAgent +from ragbits.agents.tools import get_todo_instruction_tpl, todo_manager from ragbits.agents.types import QuestionAnswerAgent, QuestionAnswerPromptInput, QuestionAnswerPromptOutput __all__ = [ @@ -20,8 +20,7 @@ "QuestionAnswerAgent", "QuestionAnswerPromptInput", "QuestionAnswerPromptOutput", - "Task", - "TaskStatus", - "TodoAgent", "ToolCallResult", + "get_todo_instruction_tpl", + "todo_manager", ] diff --git a/packages/ragbits-agents/src/ragbits/agents/todo_agent.py b/packages/ragbits-agents/src/ragbits/agents/todo_agent.py deleted file mode 100644 index 722b2a83c..000000000 --- a/packages/ragbits-agents/src/ragbits/agents/todo_agent.py +++ /dev/null @@ -1,149 +0,0 @@ -"""Clean TodoAgent implementation - extends Agent directly.""" - -import uuid -from collections.abc import Callable -from enum import Enum -from typing import Generic, Literal - -from ragbits.agents._main import Agent, AgentOptions -from ragbits.agents.mcp.server import MCPServer -from ragbits.core.llms.base import LLM, LLMClientOptionsT -from ragbits.core.prompt.base import ChatFormat -from ragbits.core.prompt.prompt import Prompt, PromptInputT, PromptOutputT - - -class TaskStatus(str, Enum): - """Task status options.""" - - PENDING = "pending" - IN_PROGRESS = "in-progress" - DONE = "done" - - -class Task: - """Simple task representation with UUID.""" - - def __init__(self, description: str, task_id: str | None = None): - self.id = task_id or str(uuid.uuid4()) - self.description = description - self.status = TaskStatus.PENDING - - def __repr__(self) -> str: - return f"Task(id={self.id[:8]}..., description='{self.description}', status={self.status.value})" - - -class TodoAgent( - Agent[LLMClientOptionsT, PromptInputT, PromptOutputT], Generic[LLMClientOptionsT, PromptInputT, PromptOutputT] -): - """Agent with clean, simple todo functionality.""" - - def __init__( - self, - llm: LLM[LLMClientOptionsT], - prompt: str | type[Prompt[PromptInputT, PromptOutputT]] | Prompt[PromptInputT, PromptOutputT] | None = None, - *, - history: ChatFormat | None = None, - keep_history: bool = False, - tools: list[Callable] | None = None, - mcp_servers: list[MCPServer] | None = None, - default_options: AgentOptions[LLMClientOptionsT] | None = None, - ) -> None: - """Initialize TodoAgent - just like regular Agent but with todo capabilities.""" - super().__init__( - llm=llm, - prompt=prompt, - history=history, - keep_history=keep_history, - tools=tools, - mcp_servers=mcp_servers, - default_options=default_options, - ) - - # Simple todo storage - just a list of tasks - self.tasks: list[Task] = [] - - def create_todo_list(self, tasks: dict[int, str] | list[str]) -> list[Task]: - """ - Create todo list from tasks. - - Args: - tasks: Either dict {1: "task1", 2: "task2"} or list ["task1", "task2"] - - Returns: - List of created Task objects - """ - self.tasks.clear() - - task_descriptions = list(tasks.values()) if isinstance(tasks, dict) else tasks - for description in task_descriptions: - task = Task(description) - self.tasks.append(task) - - return self.tasks.copy() - - def add_task(self, description: str) -> Task: - """Add a single task.""" - task = Task(description) - self.tasks.append(task) - return task - - def mark_task(self, task_id: str | int, status: Literal["pending", "in-progress", "done"]) -> Task: - """ - Mark task status by ID. - - Args: - task_id: Task ID (string UUID) or index (int) - status: New status - - Returns: - Updated task - """ - task = self._find_task(task_id) - task.status = TaskStatus(status) - return task - - def get_task(self, task_id: str | int) -> Task: - """Get task by ID or index.""" - return self._find_task(task_id) - - def get_tasks_by_status(self, status: TaskStatus) -> list[Task]: - """Get all tasks with specific status.""" - return [task for task in self.tasks if task.status == status] - - @property - def pending_tasks(self) -> list[Task]: - """Get pending tasks.""" - return self.get_tasks_by_status(TaskStatus.PENDING) - - @property - def in_progress_tasks(self) -> list[Task]: - """Get in-progress tasks.""" - return self.get_tasks_by_status(TaskStatus.IN_PROGRESS) - - @property - def done_tasks(self) -> list[Task]: - """Get completed tasks.""" - return self.get_tasks_by_status(TaskStatus.DONE) - - def _find_task(self, task_id: str | int) -> Task: - """Find task by ID or index.""" - if isinstance(task_id, int): - # Use as index - if 0 <= task_id < len(self.tasks): - return self.tasks[task_id] - else: - raise ValueError(f"Task index {task_id} out of range") - - # Use as UUID string - for task in self.tasks: - if task.id == task_id or task.id.startswith(str(task_id)): - return task - - raise ValueError(f"Task {task_id} not found") - - def __repr__(self) -> str: - total = len(self.tasks) - pending = len(self.pending_tasks) - in_progress = len(self.in_progress_tasks) - done = len(self.done_tasks) - return f"TodoAgent(tasks={total}, pending={pending}, in_progress={in_progress}, done={done})" diff --git a/packages/ragbits-agents/src/ragbits/agents/tools/__init__.py b/packages/ragbits-agents/src/ragbits/agents/tools/__init__.py index 9bb922491..1e5b1154f 100644 --- a/packages/ragbits-agents/src/ragbits/agents/tools/__init__.py +++ b/packages/ragbits-agents/src/ragbits/agents/tools/__init__.py @@ -1,3 +1,5 @@ -from ragbits.agents.tools.openai import get_code_interpreter_tool, get_image_generation_tool, get_web_search_tool +"""Agent tools for extending functionality.""" -__all__ = ["get_code_interpreter_tool", "get_image_generation_tool", "get_web_search_tool"] +from .todo import get_todo_instruction_tpl, todo_manager + +__all__ = ["todo_manager", "get_todo_instruction_tpl"] \ No newline at end of file diff --git a/packages/ragbits-agents/src/ragbits/agents/tools/todo.py b/packages/ragbits-agents/src/ragbits/agents/tools/todo.py new file mode 100644 index 000000000..d15cfc191 --- /dev/null +++ b/packages/ragbits-agents/src/ragbits/agents/tools/todo.py @@ -0,0 +1,398 @@ +"""Todo list management tool for agents with workflow enforcement.""" + +import uuid +import threading +from dataclasses import dataclass, field +from datetime import datetime +from enum import Enum +from typing import Any, Literal + + +class TaskStatus(str, Enum): + """Task status options.""" + + PENDING = "pending" + IN_PROGRESS = "in_progress" + COMPLETED = "completed" + CANCELLED = "cancelled" + + +@dataclass +class Task: + """Structured task representation.""" + + id: str + description: str + status: TaskStatus = TaskStatus.PENDING + order: int = 0 + created_at: datetime = field(default_factory=datetime.now) + started_at: datetime | None = None + completed_at: datetime | None = None + summary: str | None = None + + def to_dict(self) -> dict[str, Any]: + """Convert to dictionary for JSON serialization.""" + return { + "id": self.id, + "description": self.description, + "status": self.status.value, + "order": self.order, + "created_at": self.created_at.isoformat(), + "started_at": self.started_at.isoformat() if self.started_at else None, + "completed_at": self.completed_at.isoformat() if self.completed_at else None, + "summary": self.summary + } + + +@dataclass +class TodoSession: + """Todo session with workflow enforcement.""" + + session_id: str + tasks: dict[str, Task] = field(default_factory=dict) + current_task_index: int = 0 + created_at: datetime = field(default_factory=datetime.now) + + def get_current_task(self) -> Task | None: + """Get the current task that should be worked on.""" + ordered_tasks = self.get_ordered_tasks() + if self.current_task_index < len(ordered_tasks): + return ordered_tasks[self.current_task_index] + return None + + def get_ordered_tasks(self) -> list[Task]: + """Get tasks in execution order.""" + return sorted(self.tasks.values(), key=lambda t: t.order) + + def can_start_task(self, task_id: str) -> tuple[bool, str]: + """Check if a task can be started (workflow enforcement).""" + task = self.tasks.get(task_id) + if not task: + return False, f"Task {task_id} not found" + + current_task = self.get_current_task() + if current_task and current_task.id != task_id: + return False, f"Must complete current task '{current_task.description}' first" + + if task.status != TaskStatus.PENDING: + return False, f"Task is already {task.status.value}" + + return True, "OK" + + def advance_to_next_task(self): + """Move to next pending task.""" + self.current_task_index += 1 + + +# Thread-safe storage +_storage_lock = threading.Lock() +_SESSIONS: dict[str, TodoSession] = {} + +def _get_or_create_session(session_id: str | None = None) -> str: + """Get existing session or auto-find active session.""" + if session_id: + if session_id in _SESSIONS: + return session_id + else: + raise ValueError(f"Session {session_id} not found") + + # No session_id provided - try to find active session + if len(_SESSIONS) == 1: + # Only one session exists, use it + return list(_SESSIONS.keys())[0] + elif len(_SESSIONS) == 0: + raise ValueError("No active sessions. Create a todo list first.") + else: + raise ValueError(f"Multiple sessions exist ({len(_SESSIONS)}). Please specify session_id.") + + +def todo_manager( + action: Literal["create", "update", "get", "get_current", "complete_with_summary", "get_final_summary"], + session_id: str | None = None, + tasks: list[str] | None = None, + task_id: str | None = None, + status: Literal["pending", "in_progress", "completed", "cancelled"] | None = None, + summary: str | None = None, +) -> dict[str, Any]: + """ + Enhanced todo manager with workflow enforcement. + + Args: + action: Action to perform - "create", "update", "get", "get_current", "complete_with_summary", "get_final_summary" + session_id: Session identifier (auto-generated for create if None) + tasks: List of task descriptions (required for "create" action) + task_id: Task identifier (required for "update" and "complete_with_summary") + status: New status (required for "update" action) + summary: Task completion summary (required for "complete_with_summary") + + Returns: + Dictionary with action results + + Examples: + # Create a structured todo list + todo_manager(action="create", tasks=["Task 1", "Task 2", "Task 3"]) + + # Get the current task that should be worked on + todo_manager(action="get_current", session_id="session123") + + # Start working on current task + todo_manager(action="update", session_id="session123", task_id="task456", status="in_progress") + + # Complete task with summary (enforces workflow) + todo_manager(action="complete_with_summary", session_id="session123", task_id="task456", summary="Completed analysis of requirements") + + # Get full progress + todo_manager(action="get", session_id="session123") + """ + with _storage_lock: + if action == "create": + if not tasks or len(tasks) == 0: + raise ValueError("'tasks' parameter is required and must not be empty") + if len(tasks) > 10: + raise ValueError("Maximum 10 tasks allowed per session") + + session_id = session_id or str(uuid.uuid4()) + + # Create new session + session = TodoSession(session_id=session_id) + + # Create tasks with validation + for i, description in enumerate(tasks): + if not description or not description.strip(): + raise ValueError(f"Task {i+1} description cannot be empty") + + task = Task( + id=str(uuid.uuid4()), + description=description.strip(), + order=i + ) + session.tasks[task.id] = task + + _SESSIONS[session_id] = session + + return { + "action": "create", + "session_id": session_id, + "tasks": [task.to_dict() for task in session.get_ordered_tasks()], + "total_count": len(session.tasks), + "current_task": session.get_current_task().to_dict() if session.get_current_task() else None, + "message": f"Created {len(tasks)} tasks. Use 'get_current' to see what task to work on first." + } + + elif action == "get_current": + session_id = _get_or_create_session(session_id) + + session = _SESSIONS[session_id] + current_task = session.get_current_task() + + if not current_task: + completed_count = sum(1 for t in session.tasks.values() if t.status == TaskStatus.COMPLETED) + completed_tasks = [t for t in session.get_ordered_tasks() if t.status == TaskStatus.COMPLETED] + + # Aggregate all task summaries for final output + final_summary = "" + if completed_tasks: + final_summary = "\n\n".join([ + f"**{i+1}. {task.description}**: {task.summary}" + for i, task in enumerate(completed_tasks) + if task.summary + ]) + + return { + "action": "get_current", + "session_id": session_id, + "current_task": None, + "message": f"All tasks completed! ({completed_count}/{len(session.tasks)})", + "all_completed": True, + "final_summary": final_summary, + "completed_tasks": [task.to_dict() for task in completed_tasks] + } + + return { + "action": "get_current", + "session_id": session_id, + "current_task": current_task.to_dict(), + "progress": f"{session.current_task_index + 1}/{len(session.tasks)}", + "message": f"Current task: '{current_task.description}'. Mark as 'in_progress' to start working." + } + + elif action == "update": + if not all([task_id, status]): + raise ValueError("task_id and status are required for update") + + session_id = _get_or_create_session(session_id) + + session = _SESSIONS[session_id] + task = session.tasks.get(task_id) + if not task: + raise ValueError(f"Task {task_id} not found") + + # Workflow enforcement + if status == "in_progress": + can_start, reason = session.can_start_task(task_id) + if not can_start: + current = session.get_current_task() + raise ValueError(f"Workflow violation: {reason}. Use 'get_current' to see the correct task.") + task.started_at = datetime.now() + + elif status == "completed": + if task.status != TaskStatus.IN_PROGRESS: + raise ValueError("Task must be 'in_progress' before completing. Use 'complete_with_summary' instead for proper completion.") + task.completed_at = datetime.now() + session.advance_to_next_task() + + task.status = TaskStatus(status) + + next_task = session.get_current_task() + return { + "action": "update", + "task": task.to_dict(), + "next_task": next_task.to_dict() if next_task else None, + "message": f"Task '{task.description}' updated to {status}." + } + + elif action == "complete_with_summary": + if not all([task_id, summary]): + raise ValueError("task_id and summary are required for complete_with_summary") + + session_id = _get_or_create_session(session_id) + + session = _SESSIONS[session_id] + task = session.tasks.get(task_id) + if not task: + raise ValueError(f"Task {task_id} not found") + + if task.status != TaskStatus.IN_PROGRESS: + raise ValueError("Task must be 'in_progress' to complete with summary. Start the task first.") + + # Complete task with summary + task.status = TaskStatus.COMPLETED + task.completed_at = datetime.now() + task.summary = summary.strip() + session.advance_to_next_task() + + next_task = session.get_current_task() + completed_count = sum(1 for t in session.tasks.values() if t.status == TaskStatus.COMPLETED) + + return { + "action": "complete_with_summary", + "completed_task": task.to_dict(), + "next_task": next_task.to_dict() if next_task else None, + "progress": f"{completed_count}/{len(session.tasks)}", + "message": f"✅ Task completed: '{task.description}'. Summary: {summary[:100]}..." if len(summary) > 100 else f"✅ Task completed: '{task.description}'. Summary: {summary}", + "all_completed": next_task is None + } + + elif action == "get": + session_id = _get_or_create_session(session_id) + + if not session_id: + return { + "action": "get", + "session_id": session_id, + "tasks": [], + "summary": {"total": 0, "pending": 0, "in_progress": 0, "completed": 0, "cancelled": 0}, + "message": "No active session found." + } + + session = _SESSIONS[session_id] + tasks_list = session.get_ordered_tasks() + + summary = { + "total": len(tasks_list), + "pending": sum(1 for t in tasks_list if t.status == TaskStatus.PENDING), + "in_progress": sum(1 for t in tasks_list if t.status == TaskStatus.IN_PROGRESS), + "completed": sum(1 for t in tasks_list if t.status == TaskStatus.COMPLETED), + "cancelled": sum(1 for t in tasks_list if t.status == TaskStatus.CANCELLED), + } + + current_task = session.get_current_task() + return { + "action": "get", + "session_id": session_id, + "tasks": [task.to_dict() for task in tasks_list], + "summary": summary, + "current_task": current_task.to_dict() if current_task else None, + "progress": f"{summary['completed']}/{summary['total']}", + "message": f"Progress: {summary['completed']}/{summary['total']} tasks completed." + } + + elif action == "get_final_summary": + session_id = _get_or_create_session(session_id) + + session = _SESSIONS[session_id] + completed_tasks = [t for t in session.get_ordered_tasks() if t.status == TaskStatus.COMPLETED] + + if not completed_tasks: + return { + "action": "get_final_summary", + "session_id": session_id, + "final_summary": "", + "message": "No completed tasks found." + } + + # Create comprehensive final summary + final_content = [] + for i, task in enumerate(completed_tasks): + if task.summary: + final_content.append(f"**{i+1}. {task.description}**:\n{task.summary}") + else: + final_content.append(f"**{i+1}. {task.description}**: Completed") + + final_summary = "\n\n".join(final_content) + + return { + "action": "get_final_summary", + "session_id": session_id, + "final_summary": final_summary, + "completed_tasks": [task.to_dict() for task in completed_tasks], + "total_completed": len(completed_tasks), + "message": f"Final summary with {len(completed_tasks)} completed tasks." + } + + else: + raise ValueError(f"Unknown action: {action}. Use 'create', 'update', 'get', 'get_current', 'complete_with_summary', 'get_final_summary'") + + +def get_todo_instruction_tpl( + task_range: tuple[int, int] = (3, 6), + enforce_workflow: bool = True +) -> str: + """Generate system prompt instructions for structured todo workflow.""" + min_tasks, max_tasks = task_range + + if enforce_workflow: + return f""" + + ## Todo Workflow + + 1. Work through each task one by one + 2. For each task: get_current → update to in_progress → do the work → complete_with_summary + 3. When all tasks are done, use get_final_summary to present the complete results + + CRITICAL: When completing tasks with summaries, provide DETAILED, COMPREHENSIVE information. + + Available actions: + - `todo_manager(action="create", tasks=[...])`: Create {min_tasks}-{max_tasks} tasks + - `todo_manager(action="get_current")`: Get current task (session auto-detected) + - `todo_manager(action="update", task_id="...", status="in_progress")`: Start task + - `todo_manager(action="complete_with_summary", task_id="...", summary="...")`: Complete with summary + - `todo_manager(action="get_final_summary")`: Get comprehensive final summary of all completed work + + MANDATORY WORKFLOW: + 1. Create todo list first + 2. For each task: get_current → update(in_progress) → [work] → complete_with_summary + 3. System enforces sequential order + 4. When all tasks done, use get_final_summary to present the complete results + + IMPORTANT: Task summaries should be DETAILED and COMPREHENSIVE (3-5 sentences minimum). + Include specific information, recommendations, and actionable details. + + NOTE: Session ID is auto-detected after creation. Just use the actions as shown. + """ + else: + return f""" + + ## Todo Management + Create {min_tasks}-{max_tasks} tasks for complex requests and track progress systematically. + """ From bd9cb55d54007621335e15927a35b3d0b65173c1 Mon Sep 17 00:00:00 2001 From: jakubduda-dsai Date: Thu, 18 Sep 2025 11:18:34 +0200 Subject: [PATCH 08/43] todo_manager --- examples/agents/todo_tools_example.py | 2 +- .../src/ragbits/agents/tools/todo.py | 444 +++++------------- 2 files changed, 124 insertions(+), 322 deletions(-) diff --git a/examples/agents/todo_tools_example.py b/examples/agents/todo_tools_example.py index c26bf904b..7fd140430 100644 --- a/examples/agents/todo_tools_example.py +++ b/examples/agents/todo_tools_example.py @@ -27,7 +27,7 @@ async def main(): - Transportation details with times, costs, parking info - Weather considerations and backup plans - Safety information and emergency contacts - """ + get_todo_instruction_tpl(task_range=(3, 5), enforce_workflow=True), + """ + get_todo_instruction_tpl(task_range=(3, 5)), tools=[todo_manager], default_options=AgentOptions(max_turns=30) ) diff --git a/packages/ragbits-agents/src/ragbits/agents/tools/todo.py b/packages/ragbits-agents/src/ragbits/agents/tools/todo.py index d15cfc191..5a4441e86 100644 --- a/packages/ragbits-agents/src/ragbits/agents/tools/todo.py +++ b/packages/ragbits-agents/src/ragbits/agents/tools/todo.py @@ -1,7 +1,6 @@ -"""Todo list management tool for agents with workflow enforcement.""" +"""Todo list management tool for agents.""" import uuid -import threading from dataclasses import dataclass, field from datetime import datetime from enum import Enum @@ -10,389 +9,192 @@ class TaskStatus(str, Enum): """Task status options.""" - PENDING = "pending" IN_PROGRESS = "in_progress" COMPLETED = "completed" - CANCELLED = "cancelled" @dataclass class Task: - """Structured task representation.""" - + """Simple task representation.""" id: str description: str status: TaskStatus = TaskStatus.PENDING order: int = 0 - created_at: datetime = field(default_factory=datetime.now) - started_at: datetime | None = None - completed_at: datetime | None = None summary: str | None = None - def to_dict(self) -> dict[str, Any]: - """Convert to dictionary for JSON serialization.""" - return { - "id": self.id, - "description": self.description, - "status": self.status.value, - "order": self.order, - "created_at": self.created_at.isoformat(), - "started_at": self.started_at.isoformat() if self.started_at else None, - "completed_at": self.completed_at.isoformat() if self.completed_at else None, - "summary": self.summary - } - @dataclass -class TodoSession: - """Todo session with workflow enforcement.""" - - session_id: str - tasks: dict[str, Task] = field(default_factory=dict) - current_task_index: int = 0 - created_at: datetime = field(default_factory=datetime.now) +class TodoList: + """Simple todo list for one agent run.""" + tasks: list[Task] = field(default_factory=list) + current_index: int = 0 def get_current_task(self) -> Task | None: - """Get the current task that should be worked on.""" - ordered_tasks = self.get_ordered_tasks() - if self.current_task_index < len(ordered_tasks): - return ordered_tasks[self.current_task_index] + """Get current task to work on.""" + if self.current_index < len(self.tasks): + return self.tasks[self.current_index] return None - def get_ordered_tasks(self) -> list[Task]: - """Get tasks in execution order.""" - return sorted(self.tasks.values(), key=lambda t: t.order) - - def can_start_task(self, task_id: str) -> tuple[bool, str]: - """Check if a task can be started (workflow enforcement).""" - task = self.tasks.get(task_id) - if not task: - return False, f"Task {task_id} not found" - - current_task = self.get_current_task() - if current_task and current_task.id != task_id: - return False, f"Must complete current task '{current_task.description}' first" + def advance_to_next(self): + """Move to next task.""" + self.current_index += 1 - if task.status != TaskStatus.PENDING: - return False, f"Task is already {task.status.value}" - - return True, "OK" - - def advance_to_next_task(self): - """Move to next pending task.""" - self.current_task_index += 1 - - -# Thread-safe storage -_storage_lock = threading.Lock() -_SESSIONS: dict[str, TodoSession] = {} - -def _get_or_create_session(session_id: str | None = None) -> str: - """Get existing session or auto-find active session.""" - if session_id: - if session_id in _SESSIONS: - return session_id - else: - raise ValueError(f"Session {session_id} not found") - - # No session_id provided - try to find active session - if len(_SESSIONS) == 1: - # Only one session exists, use it - return list(_SESSIONS.keys())[0] - elif len(_SESSIONS) == 0: - raise ValueError("No active sessions. Create a todo list first.") - else: - raise ValueError(f"Multiple sessions exist ({len(_SESSIONS)}). Please specify session_id.") +# Storage - just one todo list per agent run +_current_todo: TodoList | None = None def todo_manager( - action: Literal["create", "update", "get", "get_current", "complete_with_summary", "get_final_summary"], - session_id: str | None = None, + action: Literal["create", "get_current", "start_task", "complete_task", "get_final_summary"], tasks: list[str] | None = None, task_id: str | None = None, - status: Literal["pending", "in_progress", "completed", "cancelled"] | None = None, summary: str | None = None, ) -> dict[str, Any]: """ - Enhanced todo manager with workflow enforcement. - - Args: - action: Action to perform - "create", "update", "get", "get_current", "complete_with_summary", "get_final_summary" - session_id: Session identifier (auto-generated for create if None) - tasks: List of task descriptions (required for "create" action) - task_id: Task identifier (required for "update" and "complete_with_summary") - status: New status (required for "update" action) - summary: Task completion summary (required for "complete_with_summary") - - Returns: - Dictionary with action results - - Examples: - # Create a structured todo list - todo_manager(action="create", tasks=["Task 1", "Task 2", "Task 3"]) - - # Get the current task that should be worked on - todo_manager(action="get_current", session_id="session123") - - # Start working on current task - todo_manager(action="update", session_id="session123", task_id="task456", status="in_progress") - - # Complete task with summary (enforces workflow) - todo_manager(action="complete_with_summary", session_id="session123", task_id="task456", summary="Completed analysis of requirements") - - # Get full progress - todo_manager(action="get", session_id="session123") + Simplified todo manager for agent runs. + + Actions: + - create: Create todo list with tasks + - get_current: Get current task to work on + - start_task: Mark current task as in progress + - complete_task: Complete current task with summary + - get_final_summary: Get all completed work """ - with _storage_lock: - if action == "create": - if not tasks or len(tasks) == 0: - raise ValueError("'tasks' parameter is required and must not be empty") - if len(tasks) > 10: - raise ValueError("Maximum 10 tasks allowed per session") - - session_id = session_id or str(uuid.uuid4()) + global _current_todo - # Create new session - session = TodoSession(session_id=session_id) + if action == "create": + if not tasks: + raise ValueError("Tasks required for create action") - # Create tasks with validation - for i, description in enumerate(tasks): - if not description or not description.strip(): - raise ValueError(f"Task {i+1} description cannot be empty") + _current_todo = TodoList() + for i, desc in enumerate(tasks): + task = Task( + id=str(uuid.uuid4()), + description=desc.strip(), + order=i + ) + _current_todo.tasks.append(task) - task = Task( - id=str(uuid.uuid4()), - description=description.strip(), - order=i - ) - session.tasks[task.id] = task - - _SESSIONS[session_id] = session - - return { - "action": "create", - "session_id": session_id, - "tasks": [task.to_dict() for task in session.get_ordered_tasks()], - "total_count": len(session.tasks), - "current_task": session.get_current_task().to_dict() if session.get_current_task() else None, - "message": f"Created {len(tasks)} tasks. Use 'get_current' to see what task to work on first." - } + return { + "action": "create", + "tasks": [{"id": t.id, "description": t.description, "order": t.order} for t in _current_todo.tasks], + "total_count": len(_current_todo.tasks), + "message": f"Created {len(tasks)} tasks" + } - elif action == "get_current": - session_id = _get_or_create_session(session_id) - - session = _SESSIONS[session_id] - current_task = session.get_current_task() - - if not current_task: - completed_count = sum(1 for t in session.tasks.values() if t.status == TaskStatus.COMPLETED) - completed_tasks = [t for t in session.get_ordered_tasks() if t.status == TaskStatus.COMPLETED] - - # Aggregate all task summaries for final output - final_summary = "" - if completed_tasks: - final_summary = "\n\n".join([ - f"**{i+1}. {task.description}**: {task.summary}" - for i, task in enumerate(completed_tasks) - if task.summary - ]) - - return { - "action": "get_current", - "session_id": session_id, - "current_task": None, - "message": f"All tasks completed! ({completed_count}/{len(session.tasks)})", - "all_completed": True, - "final_summary": final_summary, - "completed_tasks": [task.to_dict() for task in completed_tasks] - } + if not _current_todo: + raise ValueError("No todo list exists. Create one first.") + if action == "get_current": + current = _current_todo.get_current_task() + if not current: return { "action": "get_current", - "session_id": session_id, - "current_task": current_task.to_dict(), - "progress": f"{session.current_task_index + 1}/{len(session.tasks)}", - "message": f"Current task: '{current_task.description}'. Mark as 'in_progress' to start working." + "current_task": None, + "all_completed": True, + "message": "All tasks completed!" } - elif action == "update": - if not all([task_id, status]): - raise ValueError("task_id and status are required for update") - - session_id = _get_or_create_session(session_id) - - session = _SESSIONS[session_id] - task = session.tasks.get(task_id) - if not task: - raise ValueError(f"Task {task_id} not found") - - # Workflow enforcement - if status == "in_progress": - can_start, reason = session.can_start_task(task_id) - if not can_start: - current = session.get_current_task() - raise ValueError(f"Workflow violation: {reason}. Use 'get_current' to see the correct task.") - task.started_at = datetime.now() - - elif status == "completed": - if task.status != TaskStatus.IN_PROGRESS: - raise ValueError("Task must be 'in_progress' before completing. Use 'complete_with_summary' instead for proper completion.") - task.completed_at = datetime.now() - session.advance_to_next_task() - - task.status = TaskStatus(status) + return { + "action": "get_current", + "current_task": {"id": current.id, "description": current.description, "status": current.status.value}, + "progress": f"{_current_todo.current_index + 1}/{len(_current_todo.tasks)}", + "message": f"Current task: {current.description}" + } - next_task = session.get_current_task() - return { - "action": "update", - "task": task.to_dict(), - "next_task": next_task.to_dict() if next_task else None, - "message": f"Task '{task.description}' updated to {status}." - } + elif action == "start_task": + current = _current_todo.get_current_task() + if not current: + raise ValueError("No current task to start") - elif action == "complete_with_summary": - if not all([task_id, summary]): - raise ValueError("task_id and summary are required for complete_with_summary") + current.status = TaskStatus.IN_PROGRESS + return { + "action": "start_task", + "task": {"id": current.id, "description": current.description, "status": current.status.value}, + "message": f"Started task: {current.description}" + } - session_id = _get_or_create_session(session_id) + elif action == "complete_task": + if not summary: + raise ValueError("Summary required for complete_task") - session = _SESSIONS[session_id] - task = session.tasks.get(task_id) - if not task: - raise ValueError(f"Task {task_id} not found") + current = _current_todo.get_current_task() + if not current: + raise ValueError("No current task to complete") - if task.status != TaskStatus.IN_PROGRESS: - raise ValueError("Task must be 'in_progress' to complete with summary. Start the task first.") + if current.status != TaskStatus.IN_PROGRESS: + raise ValueError("Task must be started before completing") - # Complete task with summary - task.status = TaskStatus.COMPLETED - task.completed_at = datetime.now() - task.summary = summary.strip() - session.advance_to_next_task() + current.status = TaskStatus.COMPLETED + current.summary = summary.strip() + _current_todo.advance_to_next() - next_task = session.get_current_task() - completed_count = sum(1 for t in session.tasks.values() if t.status == TaskStatus.COMPLETED) + next_task = _current_todo.get_current_task() + completed_count = sum(1 for t in _current_todo.tasks if t.status == TaskStatus.COMPLETED) - return { - "action": "complete_with_summary", - "completed_task": task.to_dict(), - "next_task": next_task.to_dict() if next_task else None, - "progress": f"{completed_count}/{len(session.tasks)}", - "message": f"✅ Task completed: '{task.description}'. Summary: {summary[:100]}..." if len(summary) > 100 else f"✅ Task completed: '{task.description}'. Summary: {summary}", - "all_completed": next_task is None - } + return { + "action": "complete_task", + "completed_task": {"id": current.id, "description": current.description, "summary": current.summary}, + "next_task": {"id": next_task.id, "description": next_task.description} if next_task else None, + "progress": f"{completed_count}/{len(_current_todo.tasks)}", + "all_completed": next_task is None, + "message": f"Completed: {current.description}" + } - elif action == "get": - session_id = _get_or_create_session(session_id) - - if not session_id: - return { - "action": "get", - "session_id": session_id, - "tasks": [], - "summary": {"total": 0, "pending": 0, "in_progress": 0, "completed": 0, "cancelled": 0}, - "message": "No active session found." - } - - session = _SESSIONS[session_id] - tasks_list = session.get_ordered_tasks() - - summary = { - "total": len(tasks_list), - "pending": sum(1 for t in tasks_list if t.status == TaskStatus.PENDING), - "in_progress": sum(1 for t in tasks_list if t.status == TaskStatus.IN_PROGRESS), - "completed": sum(1 for t in tasks_list if t.status == TaskStatus.COMPLETED), - "cancelled": sum(1 for t in tasks_list if t.status == TaskStatus.CANCELLED), - } + elif action == "get_final_summary": + completed_tasks = [t for t in _current_todo.tasks if t.status == TaskStatus.COMPLETED] - current_task = session.get_current_task() + if not completed_tasks: return { - "action": "get", - "session_id": session_id, - "tasks": [task.to_dict() for task in tasks_list], - "summary": summary, - "current_task": current_task.to_dict() if current_task else None, - "progress": f"{summary['completed']}/{summary['total']}", - "message": f"Progress: {summary['completed']}/{summary['total']} tasks completed." + "action": "get_final_summary", + "final_summary": "", + "message": "No completed tasks found." } - elif action == "get_final_summary": - session_id = _get_or_create_session(session_id) - - session = _SESSIONS[session_id] - completed_tasks = [t for t in session.get_ordered_tasks() if t.status == TaskStatus.COMPLETED] + # Create comprehensive final summary + final_content = [] + for i, task in enumerate(completed_tasks): + if task.summary: + final_content.append(f"**{i+1}. {task.description}**:\n{task.summary}") + else: + final_content.append(f"**{i+1}. {task.description}**: Completed") - if not completed_tasks: - return { - "action": "get_final_summary", - "session_id": session_id, - "final_summary": "", - "message": "No completed tasks found." - } + final_summary = "\n\n".join(final_content) - # Create comprehensive final summary - final_content = [] - for i, task in enumerate(completed_tasks): - if task.summary: - final_content.append(f"**{i+1}. {task.description}**:\n{task.summary}") - else: - final_content.append(f"**{i+1}. {task.description}**: Completed") + # Clean up after getting final summary + _current_todo = None - final_summary = "\n\n".join(final_content) - - return { - "action": "get_final_summary", - "session_id": session_id, - "final_summary": final_summary, - "completed_tasks": [task.to_dict() for task in completed_tasks], - "total_completed": len(completed_tasks), - "message": f"Final summary with {len(completed_tasks)} completed tasks." - } + return { + "action": "get_final_summary", + "final_summary": final_summary, + "total_completed": len(completed_tasks), + "message": f"Final summary with {len(completed_tasks)} completed tasks." + } - else: - raise ValueError(f"Unknown action: {action}. Use 'create', 'update', 'get', 'get_current', 'complete_with_summary', 'get_final_summary'") + else: + raise ValueError(f"Unknown action: {action}") -def get_todo_instruction_tpl( - task_range: tuple[int, int] = (3, 6), - enforce_workflow: bool = True -) -> str: - """Generate system prompt instructions for structured todo workflow.""" +def get_todo_instruction_tpl(task_range: tuple[int, int] = (3, 5)) -> str: + """Generate system prompt instructions for todo workflow.""" min_tasks, max_tasks = task_range - if enforce_workflow: - return f""" + return f""" ## Todo Workflow - 1. Work through each task one by one - 2. For each task: get_current → update to in_progress → do the work → complete_with_summary - 3. When all tasks are done, use get_final_summary to present the complete results - - CRITICAL: When completing tasks with summaries, provide DETAILED, COMPREHENSIVE information. - Available actions: - `todo_manager(action="create", tasks=[...])`: Create {min_tasks}-{max_tasks} tasks - - `todo_manager(action="get_current")`: Get current task (session auto-detected) - - `todo_manager(action="update", task_id="...", status="in_progress")`: Start task - - `todo_manager(action="complete_with_summary", task_id="...", summary="...")`: Complete with summary - - `todo_manager(action="get_final_summary")`: Get comprehensive final summary of all completed work - - MANDATORY WORKFLOW: - 1. Create todo list first - 2. For each task: get_current → update(in_progress) → [work] → complete_with_summary - 3. System enforces sequential order - 4. When all tasks done, use get_final_summary to present the complete results - - IMPORTANT: Task summaries should be DETAILED and COMPREHENSIVE (3-5 sentences minimum). - Include specific information, recommendations, and actionable details. + - `todo_manager(action="get_current")`: Get current task + - `todo_manager(action="start_task")`: Start current task + - `todo_manager(action="complete_task", summary="...")`: Complete with detailed summary + - `todo_manager(action="get_final_summary")`: Get comprehensive final results - NOTE: Session ID is auto-detected after creation. Just use the actions as shown. - """ - else: - return f""" + WORKFLOW: + 1. Create todo list + 2. For each task: get_current → start_task → [do work] → complete_task + 3. When done: get_final_summary - ## Todo Management - Create {min_tasks}-{max_tasks} tasks for complex requests and track progress systematically. + IMPORTANT: Task summaries should be DETAILED and COMPREHENSIVE (3-5 sentences). + Include specific information, recommendations, and actionable details. """ From fd87b7f7c04e25a5e1f227c76c41ba8fb8b5e7ab Mon Sep 17 00:00:00 2001 From: jakubduda-dsai Date: Thu, 18 Sep 2025 11:19:44 +0200 Subject: [PATCH 09/43] remove task_id --- packages/ragbits-agents/src/ragbits/agents/tools/todo.py | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/ragbits-agents/src/ragbits/agents/tools/todo.py b/packages/ragbits-agents/src/ragbits/agents/tools/todo.py index 5a4441e86..a5f3db6b0 100644 --- a/packages/ragbits-agents/src/ragbits/agents/tools/todo.py +++ b/packages/ragbits-agents/src/ragbits/agents/tools/todo.py @@ -47,7 +47,6 @@ def advance_to_next(self): def todo_manager( action: Literal["create", "get_current", "start_task", "complete_task", "get_final_summary"], tasks: list[str] | None = None, - task_id: str | None = None, summary: str | None = None, ) -> dict[str, Any]: """ From 63faf9096b0841f202087dbe6ced3353ede138b7 Mon Sep 17 00:00:00 2001 From: jakubduda-dsai Date: Thu, 18 Sep 2025 11:21:15 +0200 Subject: [PATCH 10/43] clear prints --- examples/agents/todo_tools_example.py | 52 --------------------------- 1 file changed, 52 deletions(-) diff --git a/examples/agents/todo_tools_example.py b/examples/agents/todo_tools_example.py index 7fd140430..ffe542a5b 100644 --- a/examples/agents/todo_tools_example.py +++ b/examples/agents/todo_tools_example.py @@ -51,7 +51,6 @@ async def main(): case ToolCall(): if response.name == "todo_manager": action = response.arguments.get("action", "unknown") - print(f"\n🔧 [TOOL] {action.upper()}", end="", flush=True) if action == "create": tasks = response.arguments.get("tasks", []) @@ -60,57 +59,6 @@ async def main(): for i, task in enumerate(tasks, 1): print(f" {i}. {task}") - case ToolCallResult(): - if response.name == "todo_manager": - result = response.result - action = result.get("action", "unknown") - - if action == "create": - total = result.get('total_count', 0) - print(f" ✅ {total} tasks created successfully", flush=True) - current_task = result.get("current_task") - if current_task: - print(f"📋 Next: {current_task['description']}") - elif action == "update": - task = result.get("task", {}) - task_desc = task.get("description", "Unknown task")[:50] - new_status = task.get("status", "unknown") - print(f" ✅ Status changed to '{new_status}'", flush=True) - print(f"📋 Task: {task_desc}{'...' if len(task.get('description', '')) > 50 else ''}") - elif action == "complete_with_summary": - progress = result.get("progress", "unknown") - all_done = result.get("all_completed", False) - completed_task = result.get("completed_task", {}) - task_desc = completed_task.get("description", "Unknown task") - - if all_done: - print(f" ✅ FINAL TASK COMPLETED! Progress: {progress}", flush=True) - print(f"🎉 All tasks finished! Preparing final summary...") - else: - print(f" ✅ Task completed. Progress: {progress}", flush=True) - next_task = result.get("next_task") - if next_task: - print(f"📋 Next: {next_task['description']}") - elif action == "get_final_summary": - total_completed = result.get("total_completed", 0) - print(f" ✅ Final summary ready ({total_completed} tasks)", flush=True) - print("📄 Complete results below:") - elif action == "get_current": - current_task = result.get("current_task") - all_completed = result.get("all_completed", False) - if all_completed: - print(f" ✅ All tasks completed!", flush=True) - elif current_task: - print(f" ✅ Current task identified", flush=True) - print(f"📋 Current: {current_task['description']}") - else: - print(f" ✅ No current task", flush=True) - elif action == "get": - progress = result.get("progress", "unknown") - print(f" ✅ Task overview retrieved (Progress: {progress})", flush=True) - else: - print(f" ✅ {action} completed", flush=True) - print("\n\n" + "="*50) print("🎉 Systematic hiking trip planning completed!") From 2f7146a6a4a27ae52d4d8411fbf0c3cf11e264a0 Mon Sep 17 00:00:00 2001 From: jakubduda-dsai Date: Thu, 18 Sep 2025 11:22:15 +0200 Subject: [PATCH 11/43] clear prints --- examples/agents/todo_tools_example.py | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/examples/agents/todo_tools_example.py b/examples/agents/todo_tools_example.py index ffe542a5b..9bcaabd6c 100644 --- a/examples/agents/todo_tools_example.py +++ b/examples/agents/todo_tools_example.py @@ -32,10 +32,6 @@ async def main(): default_options=AgentOptions(max_turns=30) ) - print("=== Enhanced Todo Workflow Example ===\n") - print("🚀 Hiking trip planning with systematic workflow:\n") - - # Simpler query to reduce complexity query = "Plan a 1-day hiking trip for 2 people in Tatra Mountains, Poland. Focus on scenic routes under 15km, avoiding crowds." # query = "How long is hike to Giewont from Kuźnice?" # query = "Is it difficult to finish Orla Perć? Would you recommend me to go there if I've never been in mountains before?" @@ -53,6 +49,9 @@ async def main(): action = response.arguments.get("action", "unknown") if action == "create": + print("=== Enhanced Todo Workflow Example ===\n") + print("🚀 Hiking trip planning with systematic workflow:\n") + tasks = response.arguments.get("tasks", []) tasks_count = len(tasks) print(f" - Creating {tasks_count} tasks", flush=True) From 2d29e5b06280b378af5ba04dfe93dba114cd48bd Mon Sep 17 00:00:00 2001 From: jakubduda-dsai Date: Fri, 19 Sep 2025 08:52:31 +0200 Subject: [PATCH 12/43] remove global container for todo list --- examples/agents/todo_tools_example.py | 13 +- .../src/ragbits/agents/__init__.py | 4 +- .../src/ragbits/agents/tools/__init__.py | 4 +- .../src/ragbits/agents/tools/todo.py | 126 ++++++++++-------- 4 files changed, 86 insertions(+), 61 deletions(-) diff --git a/examples/agents/todo_tools_example.py b/examples/agents/todo_tools_example.py index 9bcaabd6c..c811a12a2 100644 --- a/examples/agents/todo_tools_example.py +++ b/examples/agents/todo_tools_example.py @@ -1,13 +1,18 @@ -"""Example demonstrating the new single tool-based todo functionality.""" +"""Example demonstrating the new instance-based todo functionality.""" import asyncio -from ragbits.agents import Agent, AgentOptions, ToolCallResult, get_todo_instruction_tpl, todo_manager +from ragbits.agents import Agent, AgentOptions +from ragbits.agents.tools.todo import TodoList, create_todo_manager, get_todo_instruction_tpl from ragbits.core.llms import LiteLLM, ToolCall async def main(): - """Demonstrate the new single tool-based todo approach with streaming and logging.""" + """Demonstrate the new instance-based todo approach with streaming and logging.""" + + # Create a dedicated TodoList instance for this agent + my_todo_list = TodoList() + my_todo_manager = create_todo_manager(my_todo_list) # Create an agent with higher turn limit and todo capabilities my_agent = Agent( @@ -28,7 +33,7 @@ async def main(): - Weather considerations and backup plans - Safety information and emergency contacts """ + get_todo_instruction_tpl(task_range=(3, 5)), - tools=[todo_manager], + tools=[my_todo_manager], # Use the instance-specific todo manager default_options=AgentOptions(max_turns=30) ) diff --git a/packages/ragbits-agents/src/ragbits/agents/__init__.py b/packages/ragbits-agents/src/ragbits/agents/__init__.py index 0551ab543..1b8b22fbb 100644 --- a/packages/ragbits-agents/src/ragbits/agents/__init__.py +++ b/packages/ragbits-agents/src/ragbits/agents/__init__.py @@ -7,7 +7,7 @@ AgentRunContext, ToolCallResult, ) -from ragbits.agents.tools import get_todo_instruction_tpl, todo_manager +from ragbits.agents.tools import get_todo_instruction_tpl, create_todo_manager from ragbits.agents.types import QuestionAnswerAgent, QuestionAnswerPromptInput, QuestionAnswerPromptOutput __all__ = [ @@ -22,5 +22,5 @@ "QuestionAnswerPromptOutput", "ToolCallResult", "get_todo_instruction_tpl", - "todo_manager", + "create_todo_manager", ] diff --git a/packages/ragbits-agents/src/ragbits/agents/tools/__init__.py b/packages/ragbits-agents/src/ragbits/agents/tools/__init__.py index 1e5b1154f..6960f5396 100644 --- a/packages/ragbits-agents/src/ragbits/agents/tools/__init__.py +++ b/packages/ragbits-agents/src/ragbits/agents/tools/__init__.py @@ -1,5 +1,5 @@ """Agent tools for extending functionality.""" -from .todo import get_todo_instruction_tpl, todo_manager +from .todo import get_todo_instruction_tpl, create_todo_manager -__all__ = ["todo_manager", "get_todo_instruction_tpl"] \ No newline at end of file +__all__ = ["create_todo_manager", "get_todo_instruction_tpl"] \ No newline at end of file diff --git a/packages/ragbits-agents/src/ragbits/agents/tools/todo.py b/packages/ragbits-agents/src/ragbits/agents/tools/todo.py index a5f3db6b0..4213e5b84 100644 --- a/packages/ragbits-agents/src/ragbits/agents/tools/todo.py +++ b/packages/ragbits-agents/src/ragbits/agents/tools/todo.py @@ -2,9 +2,8 @@ import uuid from dataclasses import dataclass, field -from datetime import datetime from enum import Enum -from typing import Any, Literal +from typing import Any, Literal, Callable class TaskStatus(str, Enum): @@ -40,52 +39,33 @@ def advance_to_next(self): """Move to next task.""" self.current_index += 1 - -# Storage - just one todo list per agent run -_current_todo: TodoList | None = None - -def todo_manager( - action: Literal["create", "get_current", "start_task", "complete_task", "get_final_summary"], - tasks: list[str] | None = None, - summary: str | None = None, -) -> dict[str, Any]: - """ - Simplified todo manager for agent runs. - - Actions: - - create: Create todo list with tasks - - get_current: Get current task to work on - - start_task: Mark current task as in progress - - complete_task: Complete current task with summary - - get_final_summary: Get all completed work - """ - global _current_todo - - if action == "create": - if not tasks: + def create_tasks(self, task_descriptions: list[str]) -> dict[str, Any]: + """Create tasks from descriptions.""" + if not task_descriptions: raise ValueError("Tasks required for create action") - _current_todo = TodoList() - for i, desc in enumerate(tasks): + # Clear existing tasks + self.tasks.clear() + self.current_index = 0 + + for i, desc in enumerate(task_descriptions): task = Task( id=str(uuid.uuid4()), description=desc.strip(), order=i ) - _current_todo.tasks.append(task) + self.tasks.append(task) return { "action": "create", - "tasks": [{"id": t.id, "description": t.description, "order": t.order} for t in _current_todo.tasks], - "total_count": len(_current_todo.tasks), - "message": f"Created {len(tasks)} tasks" + "tasks": [{"id": t.id, "description": t.description, "order": t.order} for t in self.tasks], + "total_count": len(self.tasks), + "message": f"Created {len(task_descriptions)} tasks" } - if not _current_todo: - raise ValueError("No todo list exists. Create one first.") - - if action == "get_current": - current = _current_todo.get_current_task() + def get_current(self) -> dict[str, Any]: + """Get current task information.""" + current = self.get_current_task() if not current: return { "action": "get_current", @@ -97,12 +77,13 @@ def todo_manager( return { "action": "get_current", "current_task": {"id": current.id, "description": current.description, "status": current.status.value}, - "progress": f"{_current_todo.current_index + 1}/{len(_current_todo.tasks)}", + "progress": f"{self.current_index + 1}/{len(self.tasks)}", "message": f"Current task: {current.description}" } - elif action == "start_task": - current = _current_todo.get_current_task() + def start_current_task(self) -> dict[str, Any]: + """Start the current task.""" + current = self.get_current_task() if not current: raise ValueError("No current task to start") @@ -113,11 +94,12 @@ def todo_manager( "message": f"Started task: {current.description}" } - elif action == "complete_task": + def complete_current_task(self, summary: str) -> dict[str, Any]: + """Complete the current task with summary.""" if not summary: raise ValueError("Summary required for complete_task") - current = _current_todo.get_current_task() + current = self.get_current_task() if not current: raise ValueError("No current task to complete") @@ -126,22 +108,23 @@ def todo_manager( current.status = TaskStatus.COMPLETED current.summary = summary.strip() - _current_todo.advance_to_next() + self.advance_to_next() - next_task = _current_todo.get_current_task() - completed_count = sum(1 for t in _current_todo.tasks if t.status == TaskStatus.COMPLETED) + next_task = self.get_current_task() + completed_count = sum(1 for t in self.tasks if t.status == TaskStatus.COMPLETED) return { "action": "complete_task", "completed_task": {"id": current.id, "description": current.description, "summary": current.summary}, "next_task": {"id": next_task.id, "description": next_task.description} if next_task else None, - "progress": f"{completed_count}/{len(_current_todo.tasks)}", + "progress": f"{completed_count}/{len(self.tasks)}", "all_completed": next_task is None, "message": f"Completed: {current.description}" } - elif action == "get_final_summary": - completed_tasks = [t for t in _current_todo.tasks if t.status == TaskStatus.COMPLETED] + def get_final_summary(self) -> dict[str, Any]: + """Get comprehensive final summary of all completed work.""" + completed_tasks = [t for t in self.tasks if t.status == TaskStatus.COMPLETED] if not completed_tasks: return { @@ -160,9 +143,6 @@ def todo_manager( final_summary = "\n\n".join(final_content) - # Clean up after getting final summary - _current_todo = None - return { "action": "get_final_summary", "final_summary": final_summary, @@ -170,8 +150,48 @@ def todo_manager( "message": f"Final summary with {len(completed_tasks)} completed tasks." } - else: - raise ValueError(f"Unknown action: {action}") + +def create_todo_manager(todo_list: TodoList) -> Callable[..., dict[str, Any]]: + """ + Create a todo_manager function bound to a specific TodoList instance. + + This allows each agent to have its own isolated todo list. + + Args: + todo_list: The TodoList instance to bind to + + Returns: + A todo_manager function that operates on the provided TodoList + """ + def todo_manager( + action: Literal["create", "get_current", "start_task", "complete_task", "get_final_summary"], + tasks: list[str] | None = None, + summary: str | None = None, + ) -> dict[str, Any]: + """ + Todo manager bound to a specific TodoList instance. + + Actions: + - create: Create todo list with tasks + - get_current: Get current task to work on + - start_task: Mark current task as in progress + - complete_task: Complete current task with summary + - get_final_summary: Get all completed work + """ + if action == "create": + return todo_list.create_tasks(tasks or []) + elif action == "get_current": + return todo_list.get_current() + elif action == "start_task": + return todo_list.start_current_task() + elif action == "complete_task": + return todo_list.complete_current_task(summary or "") + elif action == "get_final_summary": + return todo_list.get_final_summary() + else: + raise ValueError(f"Unknown action: {action}") + + return todo_manager def get_todo_instruction_tpl(task_range: tuple[int, int] = (3, 5)) -> str: @@ -196,4 +216,4 @@ def get_todo_instruction_tpl(task_range: tuple[int, int] = (3, 5)) -> str: IMPORTANT: Task summaries should be DETAILED and COMPREHENSIVE (3-5 sentences). Include specific information, recommendations, and actionable details. - """ + """ \ No newline at end of file From dc1d068ba1a95c323ac320433bfb3d22b45f1059 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mateusz=20Hordy=C5=84ski?= Date: Mon, 22 Sep 2025 08:08:11 +0200 Subject: [PATCH 13/43] fix: nightly builds --- .github/workflows/nightly-build.yml | 46 +++------- scripts/check_nightly_build.py | 137 ++++++++++++++++++++++++++++ 2 files changed, 148 insertions(+), 35 deletions(-) create mode 100755 scripts/check_nightly_build.py diff --git a/.github/workflows/nightly-build.yml b/.github/workflows/nightly-build.yml index 53c3923f9..ce4b884bc 100644 --- a/.github/workflows/nightly-build.yml +++ b/.github/workflows/nightly-build.yml @@ -19,43 +19,19 @@ jobs: ref: develop fetch-depth: 0 - - name: Check if nightly build needed - id: check - run: | - # Get the latest commit hash on develop - COMMIT_HASH=$(git rev-parse --short HEAD) - echo "commit-hash=$COMMIT_HASH" >> "$GITHUB_OUTPUT" - - # Check if we already built this commit as nightly - LAST_NIGHTLY_TAG=$(git tag -l "*dev*" --sort=-version:refname | head -1) - if [ -n "$LAST_NIGHTLY_TAG" ]; then - # Get the commit that the last nightly tag points to - LAST_NIGHTLY_COMMIT=$(git rev-list -n 1 $LAST_NIGHTLY_TAG) - CURRENT_COMMIT=$(git rev-parse HEAD) - if [ "$CURRENT_COMMIT" = "$LAST_NIGHTLY_COMMIT" ]; then - echo "should-build=false" >> "$GITHUB_OUTPUT" - echo "No new commits since last nightly build" - exit 0 - fi - fi + - name: Install uv + uses: astral-sh/setup-uv@v2 + with: + version: ${{ vars.UV_VERSION || '0.6.9' }} - # Generate nightly version - BASE_VERSION=$(python -c " - try: - import tomllib - except ImportError: - import tomli as tomllib - with open('packages/ragbits/pyproject.toml', 'rb') as f: - data = tomllib.load(f) - print(data['project']['version']) - ") - # Use timestamp for unique nightly version (PEP 440 compliant) - TIMESTAMP=$(date +%Y%m%d%H%M) - NIGHTLY_VERSION="${BASE_VERSION}.dev${TIMESTAMP}" + - name: Set up Python + uses: actions/setup-python@v4 + with: + python-version: "3.10" - echo "should-build=true" >> "$GITHUB_OUTPUT" - echo "nightly-version=$NIGHTLY_VERSION" >> "$GITHUB_OUTPUT" - echo "Will build nightly version: $NIGHTLY_VERSION" + - name: Check if nightly build needed + id: check + run: uv run scripts/check_nightly_build.py build-and-publish: needs: check-for-changes diff --git a/scripts/check_nightly_build.py b/scripts/check_nightly_build.py new file mode 100755 index 000000000..346176085 --- /dev/null +++ b/scripts/check_nightly_build.py @@ -0,0 +1,137 @@ +# /// script +# requires-python = ">=3.10" +# dependencies = [ +# "tomli", +# ] +# /// +# To run this script and check if a nightly build is needed, run the following command: +# +# uv run scripts/check_nightly_build.py +# +# This script: +# 1. Gets the current commit hash +# 2. Checks if we already built this commit as a nightly +# 3. Generates a nightly version if build is needed +# 4. Outputs results in GitHub Actions format +# + +import os +import subprocess +import sys +from datetime import datetime +from pathlib import Path + +import tomli + + +def run_git_command(cmd: list[str]) -> str: + """Run a git command and return the output.""" + try: + result = subprocess.run(cmd, capture_output=True, text=True, check=True) # noqa: S603 + return result.stdout.strip() + except subprocess.CalledProcessError as e: + print(f"Git command failed: {' '.join(cmd)}") + print(f"Error: {e.stderr}") + sys.exit(1) + + +def get_current_commit_hash() -> str: + """Get the current short commit hash.""" + return run_git_command(["git", "rev-parse", "--short", "HEAD"]) + + +def get_current_full_commit_hash() -> str: + """Get the current full commit hash.""" + return run_git_command(["git", "rev-parse", "HEAD"]) + + +def get_last_nightly_tag() -> str | None: + """Get the last nightly tag (contains 'dev').""" + try: + tags = run_git_command(["git", "tag", "-l", "*dev*", "--sort=-version:refname"]) + if tags: + return tags.split("\n")[0] + return None + except subprocess.CalledProcessError: + return None + + +def get_commit_for_tag(tag: str) -> str: + """Get the commit hash that a tag points to.""" + return run_git_command(["git", "rev-list", "-n", "1", tag]) + + +def get_base_version() -> str: + """Get the base version from pyproject.toml, stripping any .dev part.""" + pyproject_path = Path("packages/ragbits/pyproject.toml") + + if not pyproject_path.exists(): + print(f"Error: {pyproject_path} not found") + sys.exit(1) + + try: + with open(pyproject_path, "rb") as f: + data = tomli.load(f) + version = data["project"]["version"] + + if ".dev" in version: + version = version.split(".dev")[0] + + return version + except (KeyError, tomli.TOMLDecodeError) as e: + print(f"Error reading version from {pyproject_path}: {e}") + sys.exit(1) + + +def generate_nightly_version(base_version: str) -> str: + """Generate a nightly version using timestamp (PEP 440 compliant).""" + timestamp = datetime.now().strftime("%Y%m%d%H%M") + return f"{base_version}.dev{timestamp}" + + +def set_github_output(name: str, value: str) -> None: + """Set GitHub Actions output variable.""" + github_output = os.environ.get("GITHUB_OUTPUT") + if github_output: + with open(github_output, "a") as f: + f.write(f"{name}={value}\n") + + print(f"OUTPUT: {name}={value}") + + +def main() -> None: + """Main function to check if nightly build is needed.""" + # Get current commit info + commit_hash = get_current_commit_hash() + current_commit = get_current_full_commit_hash() + + set_github_output("commit-hash", commit_hash) + + print(f"Current commit: {commit_hash} ({current_commit})") + + # Check if we already built this commit as nightly + last_nightly_tag = get_last_nightly_tag() + + if last_nightly_tag: + print(f"Last nightly tag: {last_nightly_tag}") + last_nightly_commit = get_commit_for_tag(last_nightly_tag) + + if current_commit == last_nightly_commit: + print("No new commits since last nightly build") + set_github_output("should-build", "false") + return + else: + print("No previous nightly tags found") + + # Generate nightly version + base_version = get_base_version() + nightly_version = generate_nightly_version(base_version) + + print(f"Will build nightly version: {nightly_version}") + + set_github_output("should-build", "true") + set_github_output("nightly-version", nightly_version) + + +if __name__ == "__main__": + main() From 3ca9cd4fb5032e012509e5f1b290a72d7360dd38 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mateusz=20Hordy=C5=84ski?= Date: Mon, 22 Sep 2025 08:20:59 +0200 Subject: [PATCH 14/43] fix: docs deployments --- .github/workflows/nightly-build.yml | 4 +++- .github/workflows/publish-pypi.yml | 3 ++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/.github/workflows/nightly-build.yml b/.github/workflows/nightly-build.yml index ce4b884bc..ff73b58a2 100644 --- a/.github/workflows/nightly-build.yml +++ b/.github/workflows/nightly-build.yml @@ -90,7 +90,9 @@ jobs: - name: Deploy nightly documentation shell: bash - run: uv run mike deploy --push nightly + run: | + git fetch origin gh-pages + uv run mike deploy --push --alias-type copy nightly env: GH_TOKEN: ${{ secrets.GH_TOKEN }} diff --git a/.github/workflows/publish-pypi.yml b/.github/workflows/publish-pypi.yml index 2f6068dec..a0d81276a 100644 --- a/.github/workflows/publish-pypi.yml +++ b/.github/workflows/publish-pypi.yml @@ -56,6 +56,7 @@ jobs: - name: Deploy documentation run: | - uv run mike deploy --push stable + git fetch origin gh-pages + uv run mike deploy --push --alias-type copy stable env: GH_TOKEN: ${{ secrets.GH_TOKEN }} From 30269294cbfa1e26754c7f58d129df919afbd7b5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mateusz=20Hordy=C5=84ski?= Date: Mon, 22 Sep 2025 08:56:29 +0200 Subject: [PATCH 15/43] fix: add docs login --- .github/workflows/nightly-build.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/workflows/nightly-build.yml b/.github/workflows/nightly-build.yml index ff73b58a2..807129178 100644 --- a/.github/workflows/nightly-build.yml +++ b/.github/workflows/nightly-build.yml @@ -76,6 +76,7 @@ jobs: git commit -m "chore: update package versions for nightly build ${{ env.NIGHTLY_VERSION }}" git tag "${{ env.NIGHTLY_VERSION }}" git push origin "${{ env.NIGHTLY_VERSION }}" + git push origin develop env: GH_TOKEN: ${{ secrets.GH_TOKEN }} NIGHTLY_VERSION: ${{ needs.check-for-changes.outputs.nightly-version }} @@ -91,6 +92,8 @@ jobs: - name: Deploy nightly documentation shell: bash run: | + git config user.name "ds-ragbits-robot" + git config user.email "ds-ragbits-robot@users.noreply.github.com" git fetch origin gh-pages uv run mike deploy --push --alias-type copy nightly env: From 759f59e57e584b2992c5df8ed7ef1e067acb8285 Mon Sep 17 00:00:00 2001 From: Maciej Kurzawa <68014263+mackurzawa@users.noreply.github.com> Date: Mon, 22 Sep 2025 15:22:14 +0200 Subject: [PATCH 16/43] feat: introduce post processors (#821) --- docs/api_reference/agents/index.md | 2 + docs/how-to/agents/use_post_processors.md | 64 +++++++ examples/README.md | 4 + examples/agents/post_processors.py | 97 ++++++++++ mkdocs.yml | 1 + packages/ragbits-agents/CHANGELOG.md | 1 + .../src/ragbits/agents/__init__.py | 3 + .../src/ragbits/agents/_main.py | 107 +++++++++-- .../src/ragbits/agents/exceptions.py | 10 ++ .../agents/post_processors/__init__.py | 7 + .../ragbits/agents/post_processors/base.py | 153 ++++++++++++++++ .../tests/unit/test_post_processors.py | 167 ++++++++++++++++++ 12 files changed, 602 insertions(+), 14 deletions(-) create mode 100644 docs/how-to/agents/use_post_processors.md create mode 100644 examples/agents/post_processors.py create mode 100644 packages/ragbits-agents/src/ragbits/agents/post_processors/__init__.py create mode 100644 packages/ragbits-agents/src/ragbits/agents/post_processors/base.py create mode 100644 packages/ragbits-agents/tests/unit/test_post_processors.py diff --git a/docs/api_reference/agents/index.md b/docs/api_reference/agents/index.md index 2608a8eb4..ec2a0d655 100644 --- a/docs/api_reference/agents/index.md +++ b/docs/api_reference/agents/index.md @@ -9,3 +9,5 @@ ::: ragbits.agents.AgentResultStreaming ::: ragbits.agents.a2a.server.create_agent_server + +::: ragbits.agents.post_processors.base diff --git a/docs/how-to/agents/use_post_processors.md b/docs/how-to/agents/use_post_processors.md new file mode 100644 index 000000000..aef223be7 --- /dev/null +++ b/docs/how-to/agents/use_post_processors.md @@ -0,0 +1,64 @@ +# How-To: Use Post-Processors with Ragbits Agents + +Ragbits Agents can be enhanced with post-processors to intercept, log, filter, and modify their outputs. This guide explains how to implement and use post-processors to customize agent responses. + +## Post-Processors Overview + +Ragbits provides two types of post-processors: + +- **PostProcessor**: Processes the final output after generation, ideal for batch processing. +- **StreamingPostProcessor**: Processes outputs as they are generated, suitable for real-time applications. + +### Implementing a custom Post-Processor + +To create a custom post-processor, inherit from the appropriate base class ([`PostProcessor`][ragbits.agents.post_processors.base.PostProcessor] or [`StreamingPostProcessor`][ragbits.agents.post_processors.base.StreamingPostProcessor]) and implement the required method. + +#### Post-Processor Example + +A non-streaming post-processor applies transformations after the entire content is generated. + +```python +class TruncateProcessor(PostProcessor): + def __init__(self, max_length: int = 50) -> None: + self.max_length = max_length + + async def process(self, result, agent): + content = result.content + if len(content) > self.max_length: + content = content[:self.max_length] + "... [TRUNCATED]" + result.content = content + return result +``` + +#### Streaming Post-Processor Example + +A streaming post-processor can manipulate all information returned during generation, including text, tool calls, etc. + +```python +class UpperCaseStreamingProcessor(StreamingPostProcessor): + async def process_streaming(self, chunk, agent): + if isinstance(chunk, str): + return chunk.upper() + return chunk +``` + +## Using Post-Processors + +To use post-processors, pass them to the `run` or `run_streaming` methods of the `Agent` class. If you pass a non-streaming processor to `run_streaming`, set `allow_non_streaming=True`. This allows streaming processors to handle content piece by piece during generation, while non-streaming processors apply transformations after the entire output is generated. + +```python +async def main() -> None: + llm = LiteLLM("gpt-4.1-mini") + agent = Agent(llm=llm, prompt="You are a helpful assistant.") + post_processors = [ + UpperCaseStreamingProcessor(), + TruncateProcessor(max_length=50), + ] + stream_result = agent.run_streaming("Tell me about the history of AI.", post_processors=post_processors, allow_non_streaming=True) + async for chunk in stream_result: + if isinstance(chunk, str): + print(chunk, end="") + print(f"\nFinal answer:\n{stream_result.content}") +``` + +Post-processors offer a flexible way to tailor agent outputs, whether filtering content in real-time or transforming final outputs. diff --git a/examples/README.md b/examples/README.md index 981a2dc7a..a5291f3a0 100644 --- a/examples/README.md +++ b/examples/README.md @@ -20,6 +20,7 @@ All necessary details are provided in the comments at the top of each script. | [Multimodal Prompt with PDF Input](/examples/core/prompt/multimodal_with_pdf.py) | [ragbits-core](/packages/ragbits-core) | Example of how to use the `Prompt` class to answer the question using an LLM with both text and PDF inputs. | | [Multimodal Prompt with Few Shots](/examples/core/prompt/multimodal_with_few_shots.py) | [ragbits-core](/packages/ragbits-core) | Example of how to use the `Prompt` class to generate themed text using an LLM with multimodal inputs and few-shot examples. | | [Tool Use with LLM](/examples/core/llms/tool_use.py) | [ragbits-core](/packages/ragbits-core) | Example of how to provide tools and return tool calls from LLM. | +| [Reasoning with LLM](/examples/core/llms/reasoning.py) | [ragbits-core](/packages/ragbits-core) | Example of how to use reasoning with LLM. | | [OpenTelemetry Audit](/examples/core/audit/otel.py) | [ragbits-core](/packages/ragbits-core) | Example of how to collect traces and metrics using Ragbits audit module with OpenTelemetry. | | [Logfire Audit](/examples/core/audit/logfire_.py) | [ragbits-core](/packages/ragbits-core) | Example of how to collect traces and metrics using Ragbits audit module with Logfire. | | [Basic Document Search](/examples/document-search/basic.py) | [ragbits-document-search](/packages/ragbits-document-search) | Example of how to use the `DocumentSearch` class to search for documents with the `InMemoryVectorStore` class to store the embeddings. | @@ -38,6 +39,9 @@ All necessary details are provided in the comments at the top of each script. | [Recontextualize Last Message](/examples/chat/recontextualize_message.py) | [ragbits-chat](/packages/ragbits-chat) | Example of how to use the `StandaloneMessageCompressor` compressor to recontextualize the last message in a conversation history. | | [Agents Tool Use](/examples/agents/tool_use.py) | [ragbits-agents](/packages/ragbits-agents) | Example of how to use agent with tools. | | [Agents OpenAI Native Tool Use](/examples/agents/openai_native_tool_use.py) | [ragbits-agents](/packages/ragbits-agents) | Example of how to use agent with OpenAI native tools. | +| [Agents Post Processors](/examples/agents/post_processors.py) | [ragbits-agents](/packages/ragbits-agents) | Example of how to use post-processors with agent. | +| [Agents CLI](/examples/agents/cli_agent.py) | [ragbits-agents](/packages/ragbits-agents) | Example of how to use agent in CLI. | | [MCP Local](/examples/agents/mcp/local.py) | [ragbits-agents](/packages/ragbits-agents) | Example of how to use the `Agent` class to connect with a local MCP server. | | [MCP SSE](/examples/agents/mcp/sse.py) | [ragbits-agents](/packages/ragbits-agents) | Example of how to use the `Agent` class to connect with a remote MCP server via SSE. | | [MCP Streamable HTTP](/examples/agents/mcp/streamable_http.py) | [ragbits-agents](/packages/ragbits-agents) | Example of how to use the `Agent` class to connect with a remote MCP server via HTTP. | +| [A2A Orchestration](/examples/agents/a2a/run_orchestrator.py) | [ragbits-agents](/packages/ragbits-agents) | Example of how to setup A2A orchestration. | diff --git a/examples/agents/post_processors.py b/examples/agents/post_processors.py new file mode 100644 index 000000000..5e2e00695 --- /dev/null +++ b/examples/agents/post_processors.py @@ -0,0 +1,97 @@ +""" +Ragbits Agents Example: Post-Processors + +This example demonstrates how to use post-processors with Agent.run() and Agent.run_streaming() methods. + +To run the script, execute the following command: + + ```bash + uv run examples/agents/post_processors.py + ``` +""" + +# /// script +# requires-python = ">=3.10" +# dependencies = [ +# "ragbits-core", +# "ragbits-agents", +# ] +# /// + +import asyncio +from types import SimpleNamespace + +from ragbits.agents import Agent, AgentResult, PostProcessor, StreamingPostProcessor, ToolCallResult +from ragbits.core.llms.base import BasePrompt, ToolCall, Usage +from ragbits.core.llms.litellm import LiteLLM + + +class CustomStreamingPostProcessor(StreamingPostProcessor): + """ + Streaming post-processor that checks for forbidden words. + """ + + def __init__(self, forbidden_words: list[str]) -> None: + self.forbidden_words = forbidden_words + + async def process_streaming( + self, chunk: str | ToolCall | ToolCallResult | SimpleNamespace | BasePrompt | Usage, agent: Agent + ) -> str | ToolCall | ToolCallResult | SimpleNamespace | BasePrompt | Usage: + """ + Process chunks during streaming. + """ + if isinstance(chunk, str) and chunk.lower().strip() in self.forbidden_words: + return "[FORBIDDEN_WORD]" + return chunk + + +class CustomPostProcessor(PostProcessor): + """ + Non-streaming post-processor that truncates the content. + """ + + def __init__(self, max_length: int = 200) -> None: + self.max_length = max_length + + async def process(self, result: AgentResult, agent: Agent) -> AgentResult: + """ + Process the agent result. + """ + content = result.content + content_length = len(content) + + if content_length > self.max_length: + content = content[: self.max_length] + content += f"... [TRUNCATED] ({content_length} > {self.max_length} chars)" + + return AgentResult( + content=content, + metadata=result.metadata, + tool_calls=result.tool_calls, + history=result.history, + usage=result.usage, + ) + + +async def main() -> None: + """ + Run the example. + """ + llm = LiteLLM("gpt-4.1-mini") + agent: Agent = Agent(llm=llm, prompt="You are a helpful assistant.") + stream_result = agent.run_streaming( + "What is Python?", + post_processors=[ + CustomStreamingPostProcessor(forbidden_words=["python"]), + CustomPostProcessor(max_length=200), + ], + allow_non_streaming=True, + ) + async for chunk in stream_result: + if isinstance(chunk, str): + print(chunk, end="") + print(f"\n\nFinal answer:\n{stream_result.content}") + + +if __name__ == "__main__": + asyncio.run(main()) diff --git a/mkdocs.yml b/mkdocs.yml index e90e422ad..8c534094d 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -40,6 +40,7 @@ nav: - "Define and use agents": how-to/agents/define_and_use_agents.md - "Provide tools with MCP": how-to/agents/provide_mcp_tools.md - "Serve agents with A2A": how-to/agents/serve_ragbits_agents.md + - "Use post-processors": how-to/agents/use_post_processors.md - Guardrails: - "Setup guardrails": how-to/guardrails/use_guardrails.md - Chatbots: diff --git a/packages/ragbits-agents/CHANGELOG.md b/packages/ragbits-agents/CHANGELOG.md index 2a722f747..c0eef472b 100644 --- a/packages/ragbits-agents/CHANGELOG.md +++ b/packages/ragbits-agents/CHANGELOG.md @@ -4,6 +4,7 @@ - Support wrapping downstream agents as tools (#818) - Add syntax sugar allowing easier Agents definition (#820) +- Add post-processors (#821) ## 1.3.0 (2025-09-11) ### Changed diff --git a/packages/ragbits-agents/src/ragbits/agents/__init__.py b/packages/ragbits-agents/src/ragbits/agents/__init__.py index 7a7036895..bd1809337 100644 --- a/packages/ragbits-agents/src/ragbits/agents/__init__.py +++ b/packages/ragbits-agents/src/ragbits/agents/__init__.py @@ -7,6 +7,7 @@ AgentRunContext, ToolCallResult, ) +from ragbits.agents.post_processors.base import PostProcessor, StreamingPostProcessor from ragbits.agents.types import QuestionAnswerAgent, QuestionAnswerPromptInput, QuestionAnswerPromptOutput __all__ = [ @@ -16,8 +17,10 @@ "AgentResult", "AgentResultStreaming", "AgentRunContext", + "PostProcessor", "QuestionAnswerAgent", "QuestionAnswerPromptInput", "QuestionAnswerPromptOutput", + "StreamingPostProcessor", "ToolCallResult", ] diff --git a/packages/ragbits-agents/src/ragbits/agents/_main.py b/packages/ragbits-agents/src/ragbits/agents/_main.py index 6b15a00e6..b98b06245 100644 --- a/packages/ragbits-agents/src/ragbits/agents/_main.py +++ b/packages/ragbits-agents/src/ragbits/agents/_main.py @@ -8,7 +8,7 @@ from datetime import timedelta from inspect import iscoroutinefunction from types import ModuleType, SimpleNamespace -from typing import Any, ClassVar, Generic, TypeVar, cast, overload +from typing import Any, ClassVar, Generic, Literal, TypeVar, cast, overload from pydantic import ( BaseModel, @@ -18,6 +18,7 @@ from ragbits import agents from ragbits.agents.exceptions import ( + AgentInvalidPostProcessorError, AgentInvalidPromptInputError, AgentMaxTokensExceededError, AgentMaxTurnsExceededError, @@ -29,6 +30,12 @@ ) from ragbits.agents.mcp.server import MCPServer, MCPServerStdio, MCPServerStreamableHttp from ragbits.agents.mcp.utils import get_tools +from ragbits.agents.post_processors.base import ( + BasePostProcessor, + PostProcessor, + StreamingPostProcessor, + stream_with_post_processing, +) from ragbits.agents.tool import Tool, ToolCallResult, ToolChoice from ragbits.core.audit.traces import trace from ragbits.core.llms.base import LLM, LLMClientOptionsT, LLMOptions, LLMResponseWithMetadata, ToolCall, Usage @@ -157,7 +164,7 @@ class AgentRunContext(BaseModel, Generic[DepsT]): """The usage of the agent.""" -class AgentResultStreaming(AsyncIterator[str | ToolCall | ToolCallResult]): +class AgentResultStreaming(AsyncIterator[str | ToolCall | ToolCallResult | BasePrompt | Usage | SimpleNamespace]): """ An async iterator that will collect all yielded items by LLM.generate_streaming(). This object is returned by `run_streaming`. It can be used in an `async for` loop to process items as they arrive. After the loop completes, @@ -174,38 +181,40 @@ def __init__( self.history: ChatFormat self.usage: Usage = Usage() - def __aiter__(self) -> AsyncIterator[str | ToolCall | ToolCallResult]: + def __aiter__(self) -> AsyncIterator[str | ToolCall | ToolCallResult | BasePrompt | Usage | SimpleNamespace]: return self - async def __anext__(self) -> str | ToolCall | ToolCallResult: + async def __anext__(self) -> str | ToolCall | ToolCallResult | BasePrompt | Usage | SimpleNamespace: try: item = await self._generator.__anext__() + match item: case str(): self.content += item + return item case ToolCall(): - pass + return item case ToolCallResult(): if self.tool_calls is None: self.tool_calls = [] self.tool_calls.append(item) + return item case BasePrompt(): item.add_assistant_message(self.content) self.history = item.chat - item = await self._generator.__anext__() - item = cast(SimpleNamespace, item) - item.result = { - "content": self.content, - "metadata": self.metadata, - "tool_calls": self.tool_calls, - } - raise StopAsyncIteration + return item case Usage(): self.usage = item return await self.__anext__() + case SimpleNamespace(): + result_dict = getattr(item, "result", {}) + self.content = result_dict.get("content", self.content) + self.metadata = result_dict.get("metadata", self.metadata) + self.tool_calls = result_dict.get("tool_calls", self.tool_calls) + return item case _: raise ValueError(f"Unexpected item: {item}") - return item + except StopAsyncIteration: raise @@ -292,6 +301,7 @@ async def run( options: AgentOptions[LLMClientOptionsT] | None = None, context: AgentRunContext | None = None, tool_choice: ToolChoice | None = None, + post_processors: list[PostProcessor[LLMClientOptionsT, PromptInputT, PromptOutputT]] | None = None, ) -> AgentResult[PromptOutputT]: ... @overload @@ -301,6 +311,7 @@ async def run( options: AgentOptions[LLMClientOptionsT] | None = None, context: AgentRunContext | None = None, tool_choice: ToolChoice | None = None, + post_processors: list[PostProcessor[LLMClientOptionsT, PromptInputT, PromptOutputT]] | None = None, ) -> AgentResult[PromptOutputT]: ... async def run( @@ -309,6 +320,7 @@ async def run( options: AgentOptions[LLMClientOptionsT] | None = None, context: AgentRunContext | None = None, tool_choice: ToolChoice | None = None, + post_processors: list[PostProcessor[LLMClientOptionsT, PromptInputT, PromptOutputT]] | None = None, ) -> AgentResult[PromptOutputT]: """ Run the agent. The method is experimental, inputs and outputs may change in the future. @@ -325,6 +337,7 @@ async def run( - "none": do not call tool - "required: enforce tool usage (model decides which one) - Callable: one of provided tools + post_processors: List of post-processors to apply to the response in order. Returns: The result of the agent run. @@ -336,6 +349,24 @@ async def run( AgentInvalidPromptInputError: If the prompt/input combination is invalid. AgentMaxTurnsExceededError: If the maximum number of turns is exceeded. """ + result = await self._run_without_post_processing(input, options, context, tool_choice) + + if post_processors: + for processor in post_processors: + result = await processor.process(result, self) + + return result + + async def _run_without_post_processing( + self, + input: str | PromptInputT | None, + options: AgentOptions[LLMClientOptionsT] | None = None, + context: AgentRunContext | None = None, + tool_choice: ToolChoice | None = None, + ) -> AgentResult[PromptOutputT]: + """ + Run the agent without applying post-processors. + """ if context is None: context = AgentRunContext() @@ -403,6 +434,33 @@ def run_streaming( options: AgentOptions[LLMClientOptionsT] | None = None, context: AgentRunContext | None = None, tool_choice: ToolChoice | None = None, + post_processors: list[StreamingPostProcessor[LLMClientOptionsT, PromptInputT, PromptOutputT]] | None = None, + *, + allow_non_streaming: bool = False, + ) -> AgentResultStreaming: ... + + @overload + def run_streaming( + self: "Agent[LLMClientOptionsT, None, PromptOutputT]", + input: str | None = None, + options: AgentOptions[LLMClientOptionsT] | None = None, + context: AgentRunContext | None = None, + tool_choice: ToolChoice | None = None, + post_processors: list[BasePostProcessor[LLMClientOptionsT, PromptInputT, PromptOutputT]] | None = None, + *, + allow_non_streaming: Literal[True], + ) -> AgentResultStreaming: ... + + @overload + def run_streaming( + self: "Agent[LLMClientOptionsT, PromptInputT, PromptOutputT]", + input: PromptInputT, + options: AgentOptions[LLMClientOptionsT] | None = None, + context: AgentRunContext | None = None, + tool_choice: ToolChoice | None = None, + post_processors: list[StreamingPostProcessor[LLMClientOptionsT, PromptInputT, PromptOutputT]] | None = None, + *, + allow_non_streaming: bool = False, ) -> AgentResultStreaming: ... @overload @@ -412,6 +470,9 @@ def run_streaming( options: AgentOptions[LLMClientOptionsT] | None = None, context: AgentRunContext | None = None, tool_choice: ToolChoice | None = None, + post_processors: list[BasePostProcessor[LLMClientOptionsT, PromptInputT, PromptOutputT]] | None = None, + *, + allow_non_streaming: Literal[True], ) -> AgentResultStreaming: ... def run_streaming( @@ -420,6 +481,13 @@ def run_streaming( options: AgentOptions[LLMClientOptionsT] | None = None, context: AgentRunContext | None = None, tool_choice: ToolChoice | None = None, + post_processors: ( + list[StreamingPostProcessor[LLMClientOptionsT, PromptInputT, PromptOutputT]] + | list[BasePostProcessor[LLMClientOptionsT, PromptInputT, PromptOutputT]] + | None + ) = None, + *, + allow_non_streaming: bool = False, ) -> AgentResultStreaming: """ This method returns an `AgentResultStreaming` object that can be asynchronously @@ -434,6 +502,8 @@ def run_streaming( - "none": do not call tool - "required: enforce tool usage (model decides which one) - Callable: one of provided tools + post_processors: List of post-processors to apply to the response in order. + allow_non_streaming: Whether to allow non-streaming post-processors. Returns: A `StreamingResult` object for iteration and collection. @@ -444,8 +514,17 @@ def run_streaming( AgentToolNotAvailableError: If the selected tool is not available. AgentInvalidPromptInputError: If the prompt/input combination is invalid. AgentMaxTurnsExceededError: If the maximum number of turns is exceeded. + AgentInvalidPostProcessorError: If the post-processor is invalid. """ generator = self._stream_internal(input, options, context, tool_choice) + + if post_processors: + if not allow_non_streaming and any(not p.supports_streaming for p in post_processors): + raise AgentInvalidPostProcessorError( + reason="Non-streaming post-processors are not allowed when allow_non_streaming is False" + ) + generator = stream_with_post_processing(generator, post_processors, self) + return AgentResultStreaming(generator) async def _stream_internal( diff --git a/packages/ragbits-agents/src/ragbits/agents/exceptions.py b/packages/ragbits-agents/src/ragbits/agents/exceptions.py index c474e6ac7..a80e76314 100644 --- a/packages/ragbits-agents/src/ragbits/agents/exceptions.py +++ b/packages/ragbits-agents/src/ragbits/agents/exceptions.py @@ -106,3 +106,13 @@ def __init__( self.limit = limit self.actual = actual self.next_prompt_tokens = next_prompt_tokens + + +class AgentInvalidPostProcessorError(AgentError): + """ + Raised when the post-processor is invalid. + """ + + def __init__(self, reason: str) -> None: + super().__init__(f"Invalid post-processor: {reason}") + self.reason = reason diff --git a/packages/ragbits-agents/src/ragbits/agents/post_processors/__init__.py b/packages/ragbits-agents/src/ragbits/agents/post_processors/__init__.py new file mode 100644 index 000000000..a00a4d209 --- /dev/null +++ b/packages/ragbits-agents/src/ragbits/agents/post_processors/__init__.py @@ -0,0 +1,7 @@ +""" +Post-processors for agent responses. +""" + +from .base import BasePostProcessor, PostProcessor, StreamingPostProcessor + +__all__ = ["BasePostProcessor", "PostProcessor", "StreamingPostProcessor"] diff --git a/packages/ragbits-agents/src/ragbits/agents/post_processors/base.py b/packages/ragbits-agents/src/ragbits/agents/post_processors/base.py new file mode 100644 index 000000000..4f38e13ca --- /dev/null +++ b/packages/ragbits-agents/src/ragbits/agents/post_processors/base.py @@ -0,0 +1,153 @@ +from abc import ABC, abstractmethod +from collections.abc import AsyncGenerator +from types import SimpleNamespace +from typing import TYPE_CHECKING, Generic, TypeVar, cast + +from ragbits.agents.tool import ToolCallResult +from ragbits.core.llms.base import LLMOptions, ToolCall, Usage +from ragbits.core.prompt.base import BasePrompt +from ragbits.core.prompt.prompt import PromptInputT, PromptOutputT + +if TYPE_CHECKING: + from ragbits.agents._main import Agent, AgentResult + + +LLMOptionsT = TypeVar("LLMOptionsT", bound=LLMOptions) + + +class BasePostProcessor(Generic[LLMOptionsT, PromptInputT, PromptOutputT]): + """Base class for post-processors.""" + + @property + @abstractmethod + def supports_streaming(self) -> bool: + """ + Whether this post-processor supports streaming mode. + + If True, the processor can work with content during streaming + via process_streaming() method. + + If False, the processor will only be called after streaming is complete + with the full result via process() method. + """ + + +class PostProcessor(ABC, BasePostProcessor[LLMOptionsT, PromptInputT, PromptOutputT]): + """Base class for non-streaming post-processors.""" + + @property + def supports_streaming(self) -> bool: + """Whether this post-processor supports streaming mode.""" + return False + + @abstractmethod + async def process( + self, + result: "AgentResult[PromptOutputT]", + agent: "Agent[LLMOptionsT, PromptInputT, PromptOutputT]", + ) -> "AgentResult[PromptOutputT]": + """ + Process the complete agent result. + + Args: + result: The complete AgentResult from the agent or previous post-processor. + agent: The Agent instance that generated the result. Can be used to re-run + the agent with modified input if needed. + + Returns: + Modified AgentResult to pass to the next processor or return as final result. + """ + + +class StreamingPostProcessor(ABC, BasePostProcessor[LLMOptionsT, PromptInputT, PromptOutputT]): + """Base class for streaming post-processors.""" + + @property + def supports_streaming(self) -> bool: + """Whether this post-processor supports streaming mode.""" + return True + + @abstractmethod + async def process_streaming( + self, + chunk: str | ToolCall | ToolCallResult | SimpleNamespace | BasePrompt | Usage, + agent: "Agent[LLMOptionsT, PromptInputT, PromptOutputT]", + ) -> str | ToolCall | ToolCallResult | SimpleNamespace | BasePrompt | Usage: + """ + Process chunks during streaming. + + Args: + chunk: The current chunk being streamed. + agent: The Agent instance generating the content. + + Returns: + Modified chunk to yield, or None to suppress this chunk. + Return the same chunk if no modification needed. + """ + + +async def stream_with_post_processing( + generator: AsyncGenerator[str | ToolCall | ToolCallResult | SimpleNamespace | BasePrompt | Usage], + post_processors: ( + list[StreamingPostProcessor[LLMOptionsT, PromptInputT, PromptOutputT]] + | list[BasePostProcessor[LLMOptionsT, PromptInputT, PromptOutputT]] + ), + agent: "Agent[LLMOptionsT, PromptInputT, PromptOutputT]", +) -> AsyncGenerator[str | ToolCall | ToolCallResult | SimpleNamespace | BasePrompt | Usage]: + """ + Stream with support for both streaming and non-streaming post-processors. + + Streaming processors get chunks in real-time via process_streaming(). + Non-streaming processors get the complete result via process(). + """ + from ragbits.agents import AgentResult + + streaming_processors = [p for p in post_processors or [] if isinstance(p, StreamingPostProcessor)] + non_streaming_processors = [p for p in post_processors or [] if isinstance(p, PostProcessor)] + + accumulated_content = "" + tool_call_results: list[ToolCallResult] = [] + usage: Usage = Usage() + prompt_with_history: BasePrompt | None = None + + async for chunk in generator: + processed_chunk = chunk + for streaming_processor in streaming_processors: + processed_chunk = await streaming_processor.process_streaming(chunk=processed_chunk, agent=agent) + if processed_chunk is None: + break + + if isinstance(processed_chunk, str): + accumulated_content += processed_chunk + elif isinstance(processed_chunk, ToolCallResult): + tool_call_results.append(processed_chunk) + elif isinstance(processed_chunk, Usage): + usage = processed_chunk + elif isinstance(processed_chunk, BasePrompt): + prompt_with_history = processed_chunk + + if processed_chunk is not None: + yield processed_chunk + + if non_streaming_processors and prompt_with_history: + agent_result = AgentResult( + content=cast(PromptOutputT, accumulated_content), + metadata={}, + tool_calls=tool_call_results or None, + history=prompt_with_history.chat, + usage=usage, + ) + + current_result = agent_result + for non_streaming_processor in non_streaming_processors: + current_result = await non_streaming_processor.process(current_result, agent) + + yield current_result.usage + yield prompt_with_history + yield SimpleNamespace( + result={ + "content": current_result.content, + "metadata": current_result.metadata, + "tool_calls": current_result.tool_calls, + } + ) diff --git a/packages/ragbits-agents/tests/unit/test_post_processors.py b/packages/ragbits-agents/tests/unit/test_post_processors.py new file mode 100644 index 000000000..b71216267 --- /dev/null +++ b/packages/ragbits-agents/tests/unit/test_post_processors.py @@ -0,0 +1,167 @@ +from types import SimpleNamespace + +import pytest + +from ragbits.agents import Agent, AgentResult, ToolCallResult +from ragbits.agents.exceptions import AgentInvalidPostProcessorError +from ragbits.agents.post_processors.base import PostProcessor, StreamingPostProcessor +from ragbits.core.llms.base import BasePrompt, ToolCall, Usage +from ragbits.core.llms.mock import MockLLM, MockLLMOptions + + +class MockPostProcessor(PostProcessor): + def __init__(self, append_content: str = " - processed"): + self.append_content = append_content + + async def process(self, result: AgentResult, agent: Agent) -> AgentResult: + result.content += self.append_content + return result + + +class MockStreamingPostProcessor(StreamingPostProcessor): + def __init__(self, append_content: str = " - streamed"): + self.append_content = append_content + + async def process_streaming( + self, chunk: str | ToolCall | ToolCallResult | SimpleNamespace | BasePrompt | Usage, agent: Agent + ): + if isinstance(chunk, str): + return chunk + self.append_content + return chunk + + +@pytest.fixture +def mock_llm() -> MockLLM: + options = MockLLMOptions(response="Initial response") + return MockLLM(default_options=options) + + +@pytest.mark.asyncio +async def test_non_streaming_post_processor(mock_llm: MockLLM): + agent: Agent = Agent(llm=mock_llm, prompt="Test prompt") + post_processor = MockPostProcessor() + + result = await agent.run(post_processors=[post_processor]) + + assert result.content == "Initial response - processed" + + +@pytest.mark.asyncio +async def test_streaming_post_processor(mock_llm: MockLLM): + agent: Agent = Agent(llm=mock_llm, prompt="Test prompt") + post_processor = MockStreamingPostProcessor() + + result = agent.run_streaming(post_processors=[post_processor]) + async for chunk in result: + if isinstance(chunk, str): + assert chunk.endswith(" - streamed") + + +@pytest.mark.asyncio +async def test_non_streaming_processor_in_streaming_mode_raises_error(mock_llm: MockLLM): + agent: Agent = Agent(llm=mock_llm, prompt="Test prompt") + post_processor = MockPostProcessor() + + with pytest.raises(AgentInvalidPostProcessorError): + await anext(agent.run_streaming(post_processors=[post_processor])) # type: ignore # ignore type-checking to test raising the error + + +@pytest.mark.asyncio +async def test_non_streaming_processor_in_streaming_mode_with_allow_non_streaming(mock_llm: MockLLM): + agent: Agent = Agent(llm=mock_llm, prompt="Test prompt") + post_processor = MockPostProcessor() + + result = agent.run_streaming(post_processors=[post_processor], allow_non_streaming=True) + + async for _ in result: + pass + + assert result.content == "Initial response - processed" + + +@pytest.mark.asyncio +async def test_streaming_and_non_streaming_processors(mock_llm: MockLLM): + agent: Agent = Agent(llm=mock_llm, prompt="Test prompt") + non_streaming_processor = MockPostProcessor() + streaming_processor = MockStreamingPostProcessor() + + result = agent.run_streaming( + post_processors=[streaming_processor, non_streaming_processor], allow_non_streaming=True + ) + + async for _ in result: + pass + + assert result.content == "Initial response - streamed - processed" + + +@pytest.mark.asyncio +async def test_streaming_processor_always_runs_before_non_streaming_processor(mock_llm: MockLLM): + agent: Agent = Agent(llm=mock_llm, prompt="Test prompt") + non_streaming_processor = MockPostProcessor() + streaming_processor = MockStreamingPostProcessor() + + result = agent.run_streaming( + post_processors=[streaming_processor, non_streaming_processor], allow_non_streaming=True + ) + async for _ in result: + pass + + assert result.content == "Initial response - streamed - processed" + + result = agent.run_streaming( + post_processors=[non_streaming_processor, streaming_processor], allow_non_streaming=True + ) + async for _ in result: + pass + + assert result.content == "Initial response - streamed - processed" + + +@pytest.mark.asyncio +async def test_multiple_non_streaming_processors_order(mock_llm: MockLLM): + agent: Agent = Agent(llm=mock_llm, prompt="Test prompt") + non_streaming_processor_1 = MockPostProcessor(append_content=" - processed 1") + non_streaming_processor_2 = MockPostProcessor(append_content=" - processed 2") + + result = await agent.run(post_processors=[non_streaming_processor_2, non_streaming_processor_1]) + + assert result.content == "Initial response - processed 2 - processed 1" + + +@pytest.mark.asyncio +async def test_multiple_streaming_processors_order(mock_llm: MockLLM): + agent: Agent = Agent(llm=mock_llm, prompt="Test prompt") + streaming_processor_1 = MockStreamingPostProcessor(append_content=" - streamed 1") + streaming_processor_2 = MockStreamingPostProcessor(append_content=" - streamed 2") + + result = agent.run_streaming( + post_processors=[streaming_processor_2, streaming_processor_1], + ) + async for _ in result: + pass + + assert result.content == "Initial response - streamed 2 - streamed 1" + + +@pytest.mark.asyncio +async def test_multiple_streaming_and_non_streaming_processors_order(mock_llm: MockLLM): + agent: Agent = Agent(llm=mock_llm, prompt="Test prompt") + streaming_processor_1 = MockStreamingPostProcessor(append_content=" - streamed 1") + streaming_processor_2 = MockStreamingPostProcessor(append_content=" - streamed 2") + non_streaming_processor_1 = MockPostProcessor(append_content=" - processed 1") + non_streaming_processor_2 = MockPostProcessor(append_content=" - processed 2") + + result = agent.run_streaming( + post_processors=[ + non_streaming_processor_2, + streaming_processor_1, + non_streaming_processor_1, + streaming_processor_2, + ], + allow_non_streaming=True, + ) + async for _ in result: + pass + + assert result.content == "Initial response - streamed 1 - streamed 2 - processed 2 - processed 1" From f67ab9127f03f7101c3482a6583d86f0e7169dc3 Mon Sep 17 00:00:00 2001 From: ds-radoslaw-izak Date: Wed, 24 Sep 2025 14:50:26 +0200 Subject: [PATCH 17/43] add humaneval pipeline files --- .../code-generation/human_eval/run.py | 88 +++++ .../evaluate/dataloaders/human_eval.py | 66 ++++ .../ragbits/evaluate/metrics/human_eval.py | 102 ++++++ .../ragbits/evaluate/pipelines/__init__.py | 3 +- .../ragbits/evaluate/pipelines/human_eval.py | 319 ++++++++++++++++++ 5 files changed, 577 insertions(+), 1 deletion(-) create mode 100644 examples/evaluate/code-generation/human_eval/run.py create mode 100644 packages/ragbits-evaluate/src/ragbits/evaluate/dataloaders/human_eval.py create mode 100644 packages/ragbits-evaluate/src/ragbits/evaluate/metrics/human_eval.py create mode 100644 packages/ragbits-evaluate/src/ragbits/evaluate/pipelines/human_eval.py diff --git a/examples/evaluate/code-generation/human_eval/run.py b/examples/evaluate/code-generation/human_eval/run.py new file mode 100644 index 000000000..686347eb4 --- /dev/null +++ b/examples/evaluate/code-generation/human_eval/run.py @@ -0,0 +1,88 @@ +import asyncio +import logging +from pathlib import Path + +from ragbits.agents import Agent, AgentOptions +from ragbits.agents.tools.todo import TodoList, create_todo_manager, get_todo_instruction_tpl +from ragbits.core.llms import LiteLLM +from ragbits.core.sources.hf import HuggingFaceSource +from ragbits.evaluate.dataloaders.human_eval import HumanEvalDataLoader +from ragbits.evaluate.evaluator import Evaluator +from ragbits.evaluate.metrics.base import MetricSet +from ragbits.evaluate.metrics.human_eval import HumanEvalPassAtK, HumanEvalQualityPerf +from ragbits.evaluate.pipelines.human_eval import HumanEvalPipeline + + +async def main() -> None: + """Run HumanEval example with an Agent and print aggregate metrics.""" + logging.getLogger("LiteLLM").setLevel(logging.ERROR) + + todo_list = TodoList() + todo_manager = create_todo_manager(todo_list) + + prompt_text = "\n".join( + [ + """ + You are an expert Python engineer. + Your task is to implement exactly one function that solves the problem. + Return ONLY the function as plain Python (no markdown). Include all necessary imports. + + WORKFLOW: + 1. If query is complex you have access to todo_manager tool to create a todo list with specific tasks + 2. If query is simple question, you work without todo_manager tool, just answer the question + 3. If you use todo_manager tool, you must follow the todo workflow + + Tool policy: + - If the problem is complex, follow this strict TODO workflow: + 1) todo_manager(action="create", tasks=[...]) with 3-5 concrete tasks + 2) For EACH task: + - todo_manager(action="get_current") + - todo_manager(action="start_task") + - do the work + - todo_manager(action="complete_task", summary="...") + 3) Finally: todo_manager(action="get_final_summary") + - Never call complete_task before start_task. + - If you decide to skip tools, do not call them at all. + """, + get_todo_instruction_tpl(task_range=(3, 5)), + ] + ) + + agent: Agent = Agent( + llm=LiteLLM("gpt-4.1-mini"), + prompt=prompt_text, + tools=[todo_manager], + default_options=AgentOptions(max_turns=30), + ) + + # Data + source = HuggingFaceSource(path="openai/openai_humaneval", split="test") + dataloader = HumanEvalDataLoader(source=source, split="data[:2]") + + # Pipeline + log_path = Path(__file__).with_name("humaneval_examples.ndjson") + pipeline = HumanEvalPipeline( + evaluation_target=agent, + n_samples=1, + timeout_sec=30, + temperature=0.7, + seed=42, + per_example_log_file=log_path, + # agent specific ext. logs + extended_logs=False, # includes traces, tool usage, etc. + ) + + # Metrics + metrics = MetricSet(HumanEvalPassAtK(k=1), HumanEvalPassAtK(k=5), HumanEvalQualityPerf()) + + # Evaluate + evaluator = Evaluator(batch_size=5, parallelize_batches=True) + results = await evaluator.compute(pipeline=pipeline, dataloader=dataloader, metricset=metrics) + + print("Metrics:") + for key, value in results.metrics.items(): + print(f" {key}: {value:.4f}") + + +if __name__ == "__main__": + asyncio.run(main()) diff --git a/packages/ragbits-evaluate/src/ragbits/evaluate/dataloaders/human_eval.py b/packages/ragbits-evaluate/src/ragbits/evaluate/dataloaders/human_eval.py new file mode 100644 index 000000000..a63b30594 --- /dev/null +++ b/packages/ragbits-evaluate/src/ragbits/evaluate/dataloaders/human_eval.py @@ -0,0 +1,66 @@ +from collections.abc import Iterable + +from ragbits.core.sources.base import Source +from ragbits.evaluate.dataloaders.base import DataLoader +from ragbits.evaluate.pipelines.human_eval import HumanEvalData + + +class HumanEvalDataLoader(DataLoader[HumanEvalData]): + """ + HumanEval evaluation data loader. + + The source should point to a local/remote JSONL file in HumanEval format, where each line is a JSON object + with at least the following keys: "task_id", "prompt", "entry_point", and "test". + """ + + def __init__( + self, + source: Source, + *, + split: str = "data", + task_id_key: str = "task_id", + prompt_key: str = "prompt", + entry_point_key: str = "entry_point", + test_key: str = "test", + canonical_solution_key: str | None = "canonical_solution", + ) -> None: + """ + Initialize the HumanEval data loader. + + Args: + source: The source to load the data from. + split: The split to load the data from. + task_id_key: Dataset column with the HumanEval task identifier. + prompt_key: Dataset column with the Python prompt (function signature and docstring). + entry_point_key: Dataset column with the function name to evaluate. + test_key: Dataset column with the Python test harness defining `check(candidate)`. + canonical_solution_key: Optional dataset column with the reference solution (not used for scoring). + """ + required = {task_id_key, prompt_key, entry_point_key, test_key} + super().__init__(source=source, split=split, required_keys=required) + self.task_id_key = task_id_key + self.prompt_key = prompt_key + self.entry_point_key = entry_point_key + self.test_key = test_key + self.canonical_solution_key = canonical_solution_key + + async def map(self, dataset: Iterable[dict]) -> Iterable[HumanEvalData]: + """ + Map the dataset to the HumanEval evaluation data schema. + + Args: + dataset: The dataset to map. + + Returns: + The HumanEval evaluation data rows. + """ + return [ + HumanEvalData( + task_id=row.get(self.task_id_key, ""), + prompt=row.get(self.prompt_key, ""), + entry_point=row.get(self.entry_point_key, ""), + test=row.get(self.test_key, ""), + canonical_solution=(row.get(self.canonical_solution_key) if self.canonical_solution_key else None), + ) + for row in dataset + ] diff --git a/packages/ragbits-evaluate/src/ragbits/evaluate/metrics/human_eval.py b/packages/ragbits-evaluate/src/ragbits/evaluate/metrics/human_eval.py new file mode 100644 index 000000000..53ec91f5f --- /dev/null +++ b/packages/ragbits-evaluate/src/ragbits/evaluate/metrics/human_eval.py @@ -0,0 +1,102 @@ +from __future__ import annotations + +import math +from statistics import mean + +from ragbits.evaluate.metrics.base import Metric +from ragbits.evaluate.pipelines.human_eval import HumanEvalResult + + +class HumanEvalPassAtK(Metric[HumanEvalResult]): + """ + Computes pass@k over HumanEval tasks given binary pass masks per task. + When multiple samples per task exist, pass@k is defined as average over tasks of indicator that + at least one of k samples passes. For n>=k, approximate with: 1 - C(n-m, k) / C(n, k), where m is successes. + """ + + def __init__(self, k: int = 1, weight: float = 1.0) -> None: + super().__init__(weight=weight) + self.k = k + + async def compute(self, results: list[HumanEvalResult]) -> dict: # noqa: PLR6301 + """Compute pass@k averaged over tasks. + + For each task with n samples and m passes, uses 1 - C(n-m, k) / C(n, k). + """ + values = [] + for r in results: + n = len(r.passed_mask) + m = sum(1 for x in r.passed_mask if x) + k = min(self.k, n) + if n == 0 or k == 0: + values.append(0.0) + continue + if m == 0: + values.append(0.0) + continue + if m == n: + values.append(1.0) + continue + # 1 - C(n-m, k) / C(n, k) + denom = math.comb(n, k) + numer = math.comb(n - m, k) if n - m >= k else 0 + values.append(1.0 - (numer / denom)) + return {f"humaneval_pass@{self.k}": float(mean(values)) if values else 0.0} + + +class HumanEvalQualityPerf(Metric[HumanEvalResult]): + """ + Quality/performance aggregates with error breakdown: + - humaneval_compile_rate: fraction of samples that compiled + - humaneval_syntax_error_rate: fraction of samples with syntax error (compile failed) + - humaneval_assert_fail_rate: fraction of samples that ran but failed assertions + - humaneval_runtime_error_rate: fraction of samples with other runtime errors + - humaneval_timeout_rate: fraction of samples that timed out + - humaneval_tasks_solved: fraction of tasks with any passing sample + - humaneval_avg_exec_time_sec: average exec time over compilable runs + """ + + async def compute(self, results: list[HumanEvalResult]) -> dict: # noqa: PLR6301 + """Compute compile rate, error rate, tasks solved rate, and average exec time.""" + total_samples = sum(len(r.passed_mask) for r in results) + compiled = 0 + syntax_errors = 0 + assert_fails = 0 + runtime_errors = 0 + timeouts = 0 + any_pass = sum(1 for r in results if any(r.passed_mask)) + durations: list[float] = [] + + for r in results: + for ok, err, dur in zip(r.compile_ok_mask, r.errors, r.exec_durations_sec, strict=False): + if ok: + compiled += 1 + durations.append(dur) + if err: + if err.startswith("AssertionError"): + assert_fails += 1 + elif err.startswith("TimeoutError"): + timeouts += 1 + else: + runtime_errors += 1 + else: + # Compile failed: count as syntax error + syntax_errors += 1 + + compile_rate = (compiled / total_samples) if total_samples else 0.0 + syntax_error_rate = (syntax_errors / total_samples) if total_samples else 0.0 + assert_fail_rate = (assert_fails / total_samples) if total_samples else 0.0 + runtime_error_rate = (runtime_errors / total_samples) if total_samples else 0.0 + timeout_rate = (timeouts / total_samples) if total_samples else 0.0 + tasks_solved = (any_pass / len(results)) if results else 0.0 + avg_exec_time = float(mean(durations)) if durations else 0.0 + + return { + "humaneval_compile_rate": float(compile_rate), + "humaneval_syntax_error_rate": float(syntax_error_rate), + "humaneval_assert_fail_rate": float(assert_fail_rate), + "humaneval_runtime_error_rate": float(runtime_error_rate), + "humaneval_timeout_rate": float(timeout_rate), + "humaneval_tasks_solved": float(tasks_solved), + "humaneval_avg_exec_time_sec": avg_exec_time, + } diff --git a/packages/ragbits-evaluate/src/ragbits/evaluate/pipelines/__init__.py b/packages/ragbits-evaluate/src/ragbits/evaluate/pipelines/__init__.py index bdd5aee9d..39f47f1c8 100644 --- a/packages/ragbits-evaluate/src/ragbits/evaluate/pipelines/__init__.py +++ b/packages/ragbits-evaluate/src/ragbits/evaluate/pipelines/__init__.py @@ -2,8 +2,9 @@ from ragbits.document_search import DocumentSearch from ragbits.evaluate.pipelines.base import EvaluationData, EvaluationPipeline, EvaluationResult from ragbits.evaluate.pipelines.document_search import DocumentSearchPipeline +from ragbits.evaluate.pipelines.human_eval import HumanEvalPipeline -__all__ = ["DocumentSearchPipeline", "EvaluationData", "EvaluationPipeline", "EvaluationResult"] +__all__ = ["DocumentSearchPipeline", "EvaluationData", "EvaluationPipeline", "EvaluationResult", "HumanEvalPipeline"] _target_to_evaluation_pipeline: dict[type[WithConstructionConfig], type[EvaluationPipeline]] = { DocumentSearch: DocumentSearchPipeline, diff --git a/packages/ragbits-evaluate/src/ragbits/evaluate/pipelines/human_eval.py b/packages/ragbits-evaluate/src/ragbits/evaluate/pipelines/human_eval.py new file mode 100644 index 000000000..ba680b7dd --- /dev/null +++ b/packages/ragbits-evaluate/src/ragbits/evaluate/pipelines/human_eval.py @@ -0,0 +1,319 @@ +import asyncio +import contextlib +import io +import json +import multiprocessing +import textwrap +import time +from collections.abc import Iterable +from dataclasses import dataclass +from multiprocessing.connection import Connection +from pathlib import Path +from typing import Any + +from typing_extensions import Self + +from ragbits.agents import Agent +from ragbits.core.llms.base import LLM, LLMClientOptionsT +from ragbits.evaluate.pipelines.base import EvaluationData, EvaluationPipeline, EvaluationResult + + +class HumanEvalData(EvaluationData): + """ + Represents a single HumanEval task. + """ + + task_id: str + prompt: str + entry_point: str + test: str + canonical_solution: str | None = None + + +@dataclass +class HumanEvalResult(EvaluationResult): + """ + Represents the result of evaluating a single HumanEval task. + """ + + task_id: str + entry_point: str + samples: list[str] + passed_mask: list[bool] + exec_durations_sec: list[float] + compile_ok_mask: list[bool] + errors: list[str | None] + + +def _execute_in_subprocess( + source: str, entry_point: str, test_code: str, timeout_sec: int = 10, memory_limit_mb: int | None = 512 +) -> tuple[bool, float, str | None]: + """Run candidate against HumanEval test in a subprocess with timeout.""" + + def _runner(pipe: Connection) -> None: + captured_out = io.StringIO() + start = time.perf_counter() + + try: + with contextlib.redirect_stdout(captured_out), contextlib.redirect_stderr(captured_out): + # Apply soft resource limits -> NOT A SANDBOX + with contextlib.suppress(Exception): + import os # type: ignore + import resource # type: ignore + import tempfile # type: ignore + + cpu_secs = max(1, timeout_sec) + resource.setrlimit(resource.RLIMIT_CPU, (cpu_secs, cpu_secs)) + + if memory_limit_mb is not None: + mem_bytes = int(memory_limit_mb) * 1024 * 1024 + resource.setrlimit(resource.RLIMIT_AS, (mem_bytes, mem_bytes)) + + # Minimal extra security + for rlim, val in ( + (getattr(resource, "RLIMIT_NOFILE", None), 256), + (getattr(resource, "RLIMIT_NPROC", None), 64), + (getattr(resource, "RLIMIT_FSIZE", None), 10 * 1024 * 1024), + ): + if rlim is not None: + with contextlib.suppress(Exception): + resource.setrlimit(rlim, (val, val)) + + # Temporary working directory for solution + tmp = tempfile.TemporaryDirectory() + with contextlib.suppress(Exception): + os.chdir(tmp.name) + + globals_dict: dict[str, Any] = {"__name__": "__main__"} + exec(compile(source, filename="candidate.py", mode="exec"), globals_dict) # noqa: S102 + + if entry_point not in globals_dict: + raise NameError(f"Entry point '{entry_point}' not defined") + + harness = textwrap.dedent(f"candidate = {entry_point}\n").lstrip() + test_code_clean = textwrap.dedent(test_code).lstrip() + compiled_test = compile( + harness + "\n" + test_code_clean + "\ncheck(candidate)", filename="test.py", mode="exec" + ) + exec(compiled_test, globals_dict) # noqa: S102 + + duration = time.perf_counter() - start + pipe.send((True, duration, None)) + + except Exception as e: + duration = time.perf_counter() - start + pipe.send((False, duration, f"{e.__class__.__name__}: {e}")) + + parent_conn, child_conn = multiprocessing.Pipe() + proc = multiprocessing.Process(target=_runner, args=(child_conn,)) + proc.start() + proc.join(timeout=timeout_sec) + + if proc.is_alive(): + proc.terminate() + proc.join() + return False, float(timeout_sec), "TimeoutError: execution exceeded time limit" + + passed, duration, err = parent_conn.recv() + return bool(passed), float(duration), (str(err) if err is not None else None) + + +class HumanEvalPipeline( + EvaluationPipeline[Agent[LLMClientOptionsT, None, str] | LLM[LLMClientOptionsT], HumanEvalData, HumanEvalResult] +): + """HumanEval evaluation pipeline for code generation models/agents.""" + + def __init__( + self, + evaluation_target: Agent[LLMClientOptionsT, None, str] | LLM[LLMClientOptionsT], + *, + n_samples: int = 1, + timeout_sec: int = 10, + temperature: float | None = None, + seed: int | None = None, + memory_limit_mb: int | None = 512, + per_example_log_file: Path | None = None, + extended_logs: bool = False, + ) -> None: + super().__init__(evaluation_target=evaluation_target) + self.n_samples = n_samples + self.timeout_sec = timeout_sec + self.temperature = temperature + self.seed = seed + self.memory_limit_mb = memory_limit_mb + self.per_example_log_file = per_example_log_file + self.extended_logs = extended_logs + self._init_log_file() + + @classmethod + def from_config(cls, config: dict) -> Self: + """Create pipeline from config. + Attempts Agent first, falls back to raw LLM construction. + """ + if "evaluation_target" not in config: + try: + config["evaluation_target"] = Agent.from_config(config) + except Exception: + config["evaluation_target"] = LLM.subclass_from_config(config) + return super().from_config(config) + + async def __call__(self, data: Iterable[HumanEvalData]) -> Iterable[HumanEvalResult]: + """Generate code completions per task and evaluate them. + Returns list of `HumanEvalResult`, one per input task. + """ + results: list[HumanEvalResult] = [] + + for row in data: + prompt_input = row.prompt + samples: list[str] = [] + compile_ok: list[bool] = [] + pass_mask: list[bool] = [] + durations: list[float] = [] + errors: list[str | None] = [] + + # Produce n samples + gen_tasks = [] + for _ in range(self.n_samples): + if self.extended_logs: + gen_tasks.append(self._generate_with_debug(prompt_input)) + else: + gen_tasks.append(self._generate_code(prompt_input)) + generations = await asyncio.gather(*gen_tasks, return_exceptions=True) + + debug_traces: list[dict | None] | None = [] if self.extended_logs else None + + for _, raw in enumerate(generations): + if isinstance(raw, Exception): + samples.append("") + compile_ok.append(False) + pass_mask.append(False) + durations.append(0.0) + err_msg = f"GenerationError: {raw.__class__.__name__}: {raw}" + errors.append(err_msg) + if self.extended_logs and debug_traces is not None: + debug_traces.append({"error": err_msg}) + continue + + if self.extended_logs: + # Raw is (content, debug) + content, dbg = raw + code = self._sanitize_code(content) + samples.append(code) + if debug_traces is not None: + debug_traces.append(dbg) + else: + # Raw is a simple string + code = self._sanitize_code(raw) + samples.append(code) + + # Compile check + try: + compile(code, filename="candidate.py", mode="exec") + compile_ok.append(True) + except Exception as e: # noqa: BLE001 + compile_ok.append(False) + pass_mask.append(False) + durations.append(0.0) + errors.append(f"SyntaxError: {e}") + continue + + ok, dur, err = _execute_in_subprocess( + code, + row.entry_point, + row.test, + timeout_sec=self.timeout_sec, + memory_limit_mb=self.memory_limit_mb, + ) + pass_mask.append(ok) + durations.append(dur) + errors.append(err) + + result = HumanEvalResult( + task_id=row.task_id, + entry_point=row.entry_point, + samples=samples, + passed_mask=pass_mask, + exec_durations_sec=durations, + compile_ok_mask=compile_ok, + errors=errors, + ) + results.append(result) + ext_log_str = ( + json.dumps(debug_traces, ensure_ascii=False, default=str) if (self.extended_logs and debug_traces is not None) else None + ) + self._log_example(row, result, ext_log_str) + return results + + @staticmethod + def _sanitize_code(text: str) -> str: + """Basic cleanup for LLM answers. + + - Trim whitespace and normalize newlines + - If fenced with ```...```, take the first fence block, drop language tag + """ + cleaned = text.replace("\r\n", "\n").replace("\r", "\n").strip() + if "```" in cleaned: + start = cleaned.find("```") + end = cleaned.find("```", start + 3) + if end != -1: + inside = cleaned[start + 3 : end].lstrip() + # drop a possible language tag line + if "\n" in inside: + first, rest = inside.split("\n", 1) + cleaned = rest if first.strip().lower().startswith("python") else inside + else: + cleaned = inside + return cleaned.strip() + + def _init_log_file(self) -> None: + """Ensure the per-example log file exists if logging is enabled.""" + if self.per_example_log_file is None: + return + self.per_example_log_file.parent.mkdir(parents=True, exist_ok=True) + self.per_example_log_file.touch(exist_ok=True) + + def _log_example(self, row: HumanEvalData, result: HumanEvalResult, extended_log: str | None = None) -> None: + """Append a single NDJSON record for debugging if enabled.""" + if self.per_example_log_file is None: + return + record: dict[str, object] = { + "task_id": row.task_id, + "entry_point": row.entry_point, + "n_samples": len(result.samples), + "samples": result.samples, + "compile_ok_mask": result.compile_ok_mask, + "passed_mask": result.passed_mask, + "exec_durations_sec": result.exec_durations_sec, + "errors": result.errors, + } + record["extended_debug_logging"] = extended_log or "[]" + with open(self.per_example_log_file, "a", encoding="utf-8") as f: + f.write(json.dumps(record, ensure_ascii=False) + "\n") + + async def _generate_code(self, prompt: str) -> str: + """Generate final answer code from Agent or raw LLM. + + Sampling/temperature/seed should be configured on the Agent/LLM itself. + """ + target = self.evaluation_target + if isinstance(target, Agent): + res = await target.run(prompt) + return str(res.content) + + resp = await target.generate(prompt) + return str(resp) + + async def _generate_with_debug(self, prompt: str) -> tuple[str, dict | None]: + """Generate code and capture tool/history/usage for logging (as raw content).""" + target = self.evaluation_target + if isinstance(target, Agent): + res = await target.run(prompt) + dbg = { + "history": res.history, + "tool_calls": res.tool_calls, + "usage": res.usage, + "metadata": res.metadata, + } + return str(res.content), dbg + resp = await target.generate(prompt) + return str(resp), None From 769551f4f84bb4c3fdf7443825b4fecd01a95811 Mon Sep 17 00:00:00 2001 From: akotyla <79326805+akotyla@users.noreply.github.com> Date: Thu, 25 Sep 2025 08:40:28 +0200 Subject: [PATCH 18/43] feat: streaming from downstream agents (#825) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Mateusz Hordyński <26008518+mhordynski@users.noreply.github.com> --- docs/api_reference/agents/index.md | 2 + .../how-to/agents/stream_downstream_agents.md | 48 ++++++ examples/README.md | 3 +- .../agents/downstream_agents_streaming.py | 133 +++++++++++++++++ mkdocs.yml | 1 + packages/ragbits-agents/CHANGELOG.md | 1 + .../src/ragbits/agents/__init__.py | 4 + .../src/ragbits/agents/_main.py | 137 ++++++++++++++---- .../ragbits-agents/src/ragbits/agents/tool.py | 17 ++- 9 files changed, 315 insertions(+), 31 deletions(-) create mode 100644 docs/how-to/agents/stream_downstream_agents.md create mode 100644 examples/agents/downstream_agents_streaming.py diff --git a/docs/api_reference/agents/index.md b/docs/api_reference/agents/index.md index ec2a0d655..a1d59bd0f 100644 --- a/docs/api_reference/agents/index.md +++ b/docs/api_reference/agents/index.md @@ -11,3 +11,5 @@ ::: ragbits.agents.a2a.server.create_agent_server ::: ragbits.agents.post_processors.base + +::: ragbits.agents.AgentRunContext diff --git a/docs/how-to/agents/stream_downstream_agents.md b/docs/how-to/agents/stream_downstream_agents.md new file mode 100644 index 000000000..1cbaccb62 --- /dev/null +++ b/docs/how-to/agents/stream_downstream_agents.md @@ -0,0 +1,48 @@ +# How-To: Stream downstream agents with Ragbits + +Ragbits [Agent][ragbits.agents.Agent] can call other agents as tools, creating a chain of reasoning where downstream agents provide structured results to the parent agent. + +Using the streaming API, you can observe every chunk of output as it is generated, including tool calls, tool results, and final text - perfect for real-time monitoring or chat interfaces. + +## Define a simple tool + +A tool is just a Python function returning a JSON-serializable result. Here’s an example tool returning the current time for a given location: + +```python +import json + +--8<-- "examples/agents/downstream_agents_streaming.py:33:51" +``` + +## Create a downstream agent + +The downstream agent wraps the tool with a prompt, allowing the LLM to use it as a function. + +```python +from pydantic import BaseModel +from ragbits.core.prompt import Prompt +from ragbits.agents import Agent +from ragbits.agents._main import AgentOptions +from ragbits.core.llms import LiteLLM + +--8<-- "examples/agents/downstream_agents_streaming.py:54:82" +``` + +## Create a parent QA agent + +The parent agent can call downstream agents as tools. This lets the LLM reason and decide when to invoke the downstream agent. + +```python +--8<-- "examples/agents/downstream_agents_streaming.py:85:111" +``` + +## Streaming output from downstream agents + +Use `run_streaming` with an [AgentRunContext][ragbits.agents.AgentRunContext] to see output as it happens. Each chunk contains either text, a tool call, or a tool result. You can print agent names when they change and handle downstream agent events. + +```python +import asyncio +from ragbits.agents import DownstreamAgentResult + +--8<-- "examples/agents/downstream_agents_streaming.py:114:133" +``` diff --git a/examples/README.md b/examples/README.md index a5291f3a0..e8fdbcb7b 100644 --- a/examples/README.md +++ b/examples/README.md @@ -39,7 +39,8 @@ All necessary details are provided in the comments at the top of each script. | [Recontextualize Last Message](/examples/chat/recontextualize_message.py) | [ragbits-chat](/packages/ragbits-chat) | Example of how to use the `StandaloneMessageCompressor` compressor to recontextualize the last message in a conversation history. | | [Agents Tool Use](/examples/agents/tool_use.py) | [ragbits-agents](/packages/ragbits-agents) | Example of how to use agent with tools. | | [Agents OpenAI Native Tool Use](/examples/agents/openai_native_tool_use.py) | [ragbits-agents](/packages/ragbits-agents) | Example of how to use agent with OpenAI native tools. | -| [Agents Post Processors](/examples/agents/post_processors.py) | [ragbits-agents](/packages/ragbits-agents) | Example of how to use post-processors with agent. | +| [Agents Post Processors](/examples/agents/post_processors.py) | [ragbits-agents](/packages/ragbits-agents) | Example of how to use post-processors with agent. +| [Agents Downstream Streaming](/examples/agents/downstream_agents_streaming.py) | [ragbits-agents](/packages/ragbits-agents) | Example of how to stream outputs from downstream agents in real time. | | | [Agents CLI](/examples/agents/cli_agent.py) | [ragbits-agents](/packages/ragbits-agents) | Example of how to use agent in CLI. | | [MCP Local](/examples/agents/mcp/local.py) | [ragbits-agents](/packages/ragbits-agents) | Example of how to use the `Agent` class to connect with a local MCP server. | | [MCP SSE](/examples/agents/mcp/sse.py) | [ragbits-agents](/packages/ragbits-agents) | Example of how to use the `Agent` class to connect with a remote MCP server via SSE. | diff --git a/examples/agents/downstream_agents_streaming.py b/examples/agents/downstream_agents_streaming.py new file mode 100644 index 000000000..b68fb8dc3 --- /dev/null +++ b/examples/agents/downstream_agents_streaming.py @@ -0,0 +1,133 @@ +""" +Ragbits Agents Example: Multi-agent setup (QA agent + Time agent) + +This example demonstrates how to build a setup with two agents: +1. A Time Agent that returns the current time for a given location. +2. A QA Agent that answers user questions and can delegate to the Time Agent. + +To run the script, execute the following command: + + ```bash + uv run examples/agents/downstream_agents_streaming.py + ``` +""" + +# /// script +# requires-python = ">=3.10" +# dependencies = [ +# "ragbits-core", +# "ragbits-agents", +# ] +# /// + +import asyncio +import json + +from pydantic import BaseModel + +from ragbits.agents import Agent, AgentOptions, AgentRunContext, DownstreamAgentResult +from ragbits.core.llms import LiteLLM +from ragbits.core.prompt import Prompt + + +def get_time(location: str) -> str: + """ + Returns the current time for a given location. + + Args: + location: The location to get the time for. + + Returns: + The current time for the given location. + """ + loc = location.lower() + if "tokyo" in loc: + return json.dumps({"location": "Tokyo", "time": "10:00 AM"}) + elif "paris" in loc: + return json.dumps({"location": "Paris", "time": "04:00 PM"}) + elif "san francisco" in loc: + return json.dumps({"location": "San Francisco", "time": "07:00 PM"}) + else: + return json.dumps({"location": location, "time": "unknown"}) + + +class TimePromptInput(BaseModel): + """Input schema for the TimePrompt, containing the target location.""" + + location: str + + +class TimePrompt(Prompt[TimePromptInput]): + """ + Provides instructions for generating the current time in a user-specified + location. + """ + + system_prompt = """ + You are a helpful assistant that tells the current time in a given city. + """ + user_prompt = """ + What time is it in {{ location }}? + """ + + +llm = LiteLLM(model_name="gpt-4o-2024-08-06", use_structured_output=True) +time_agent = Agent( + name="time_agent", + description="Returns current time for a given location", + llm=llm, + prompt=TimePrompt, + tools=[get_time], + default_options=AgentOptions(max_total_tokens=1000, max_turns=5), +) + + +class QAPromptInput(BaseModel): + """Input schema for the QA agent, containing a natural-language question.""" + + question: str + + +class QAPrompt(Prompt[QAPromptInput]): + """ + Guides the agent to respond to user questions. + """ + + system_prompt = """ + You are a helpful assistant that responds to user questions. + """ + user_prompt = """ + {{ question }}. + """ + + +llm = LiteLLM(model_name="gpt-4o-2024-08-06", use_structured_output=True) +qa_agent = Agent( + name="qa_agent", + llm=llm, + prompt=QAPrompt, + tools=[(time_agent, {"name": "time_agent"})], + default_options=AgentOptions(max_total_tokens=1000, max_turns=5), +) + + +async def main() -> None: + """ + Run the QA agent with downstream streaming enabled. + + The QA agent processes a sample question ("What time is it in Paris?") and delegates to + the Time Agent when necessary. Streamed results from both agents are printed in real time, + tagged by the agent that produced them. + """ + context = AgentRunContext(stream_downstream_events=True) + + async for chunk in qa_agent.run_streaming(QAPromptInput(question="What time is it in Paris?"), context=context): + if isinstance(chunk, DownstreamAgentResult): + agent_name = context.get_agent(chunk.agent_id).name + print(f"[{agent_name}] {chunk.item}") + else: + print(f"[{qa_agent.name}] {chunk}") + + +if __name__ == "__main__": + asyncio.run(main()) diff --git a/mkdocs.yml b/mkdocs.yml index 8c534094d..a62180d7c 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -41,6 +41,7 @@ nav: - "Provide tools with MCP": how-to/agents/provide_mcp_tools.md - "Serve agents with A2A": how-to/agents/serve_ragbits_agents.md - "Use post-processors": how-to/agents/use_post_processors.md + - "Stream downstream agents": how-to/agents/stream_downstream_agents.md - Guardrails: - "Setup guardrails": how-to/guardrails/use_guardrails.md - Chatbots: diff --git a/packages/ragbits-agents/CHANGELOG.md b/packages/ragbits-agents/CHANGELOG.md index c0eef472b..3d0e2b2a3 100644 --- a/packages/ragbits-agents/CHANGELOG.md +++ b/packages/ragbits-agents/CHANGELOG.md @@ -5,6 +5,7 @@ - Support wrapping downstream agents as tools (#818) - Add syntax sugar allowing easier Agents definition (#820) - Add post-processors (#821) +- Support streaming from downstream agents (#812) ## 1.3.0 (2025-09-11) ### Changed diff --git a/packages/ragbits-agents/src/ragbits/agents/__init__.py b/packages/ragbits-agents/src/ragbits/agents/__init__.py index bd1809337..edd8226cf 100644 --- a/packages/ragbits-agents/src/ragbits/agents/__init__.py +++ b/packages/ragbits-agents/src/ragbits/agents/__init__.py @@ -5,6 +5,8 @@ AgentResult, AgentResultStreaming, AgentRunContext, + DownstreamAgentResult, + ToolCall, ToolCallResult, ) from ragbits.agents.post_processors.base import PostProcessor, StreamingPostProcessor @@ -17,10 +19,12 @@ "AgentResult", "AgentResultStreaming", "AgentRunContext", + "DownstreamAgentResult", "PostProcessor", "QuestionAnswerAgent", "QuestionAnswerPromptInput", "QuestionAnswerPromptOutput", "StreamingPostProcessor", + "ToolCall", "ToolCallResult", ] diff --git a/packages/ragbits-agents/src/ragbits/agents/_main.py b/packages/ragbits-agents/src/ragbits/agents/_main.py index b98b06245..e7c347100 100644 --- a/packages/ragbits-agents/src/ragbits/agents/_main.py +++ b/packages/ragbits-agents/src/ragbits/agents/_main.py @@ -2,13 +2,14 @@ import types import uuid from collections.abc import AsyncGenerator, AsyncIterator, Callable +from collections.abc import AsyncGenerator as _AG from contextlib import suppress from copy import deepcopy from dataclasses import dataclass from datetime import timedelta from inspect import iscoroutinefunction from types import ModuleType, SimpleNamespace -from typing import Any, ClassVar, Generic, Literal, TypeVar, cast, overload +from typing import Any, ClassVar, Generic, Literal, TypeVar, Union, cast, overload from pydantic import ( BaseModel, @@ -57,6 +58,26 @@ _Output = TypeVar("_Output") +@dataclass +class DownstreamAgentResult: + """ + Represents a streamed item from a downstream agent while executing a tool. + """ + + agent_id: str | None + """ID of the downstream agent.""" + item: Union[ + str, + ToolCall, + ToolCallResult, + "DownstreamAgentResult", + BasePrompt, + Usage, + SimpleNamespace, + ] + """The streamed item from the downstream agent.""" + + @dataclass class AgentResult(Generic[PromptOutputT]): """ @@ -158,13 +179,42 @@ def __contains__(self, key: str) -> bool: class AgentRunContext(BaseModel, Generic[DepsT]): """Context for the agent run.""" + model_config = {"arbitrary_types_allowed": True} + deps: AgentDependencies[DepsT] = Field(default_factory=lambda: AgentDependencies()) """Container for external dependencies.""" usage: Usage = Field(default_factory=Usage) """The usage of the agent.""" + stream_downstream_events: bool = False + """Whether to stream events from downstream agents when tools execute other agents.""" + downstream_agents: dict[str, "Agent"] = Field(default_factory=dict) + """Registry of all agents that participated in this run""" + + def register_agent(self, agent: "Agent") -> None: + """ + Register a downstream agent in this context. + + Args: + agent: The agent instance to register. + """ + self.downstream_agents[agent.id] = agent + + def get_agent(self, agent_id: str) -> "Agent | None": + """ + Retrieve a registered downstream agent by its ID. + + Args: + agent_id: The unique identifier of the agent. + + Returns: + The Agent instance if found, otherwise None. + """ + return self.downstream_agents.get(agent_id) -class AgentResultStreaming(AsyncIterator[str | ToolCall | ToolCallResult | BasePrompt | Usage | SimpleNamespace]): +class AgentResultStreaming( + AsyncIterator[str | ToolCall | ToolCallResult | BasePrompt | Usage | SimpleNamespace | DownstreamAgentResult] +): """ An async iterator that will collect all yielded items by LLM.generate_streaming(). This object is returned by `run_streaming`. It can be used in an `async for` loop to process items as they arrive. After the loop completes, @@ -172,49 +222,61 @@ class AgentResultStreaming(AsyncIterator[str | ToolCall | ToolCallResult | BaseP """ def __init__( - self, generator: AsyncGenerator[str | ToolCall | ToolCallResult | SimpleNamespace | BasePrompt | Usage] + self, + generator: AsyncGenerator[ + str | ToolCall | ToolCallResult | DownstreamAgentResult | SimpleNamespace | BasePrompt | Usage + ], ): self._generator = generator self.content: str = "" self.tool_calls: list[ToolCallResult] | None = None + self.downstream: dict[str | None, list[str | ToolCall | ToolCallResult]] = {} self.metadata: dict = {} self.history: ChatFormat self.usage: Usage = Usage() - def __aiter__(self) -> AsyncIterator[str | ToolCall | ToolCallResult | BasePrompt | Usage | SimpleNamespace]: + def __aiter__( + self, + ) -> AsyncIterator[str | ToolCall | ToolCallResult | BasePrompt | Usage | SimpleNamespace | DownstreamAgentResult]: return self - async def __anext__(self) -> str | ToolCall | ToolCallResult | BasePrompt | Usage | SimpleNamespace: + async def __anext__( + self, + ) -> str | ToolCall | ToolCallResult | BasePrompt | Usage | SimpleNamespace | DownstreamAgentResult: try: item = await self._generator.__anext__() match item: case str(): self.content += item - return item case ToolCall(): - return item + pass case ToolCallResult(): if self.tool_calls is None: self.tool_calls = [] self.tool_calls.append(item) - return item + case DownstreamAgentResult(): + if item.agent_id not in self.downstream: + self.downstream[item.agent_id] = [] + if isinstance(item.item, str | ToolCall | ToolCallResult): + self.downstream[item.agent_id].append(item.item) case BasePrompt(): item.add_assistant_message(self.content) self.history = item.chat - return item case Usage(): self.usage = item + # continue loop instead of tail recursion return await self.__anext__() case SimpleNamespace(): result_dict = getattr(item, "result", {}) self.content = result_dict.get("content", self.content) self.metadata = result_dict.get("metadata", self.metadata) self.tool_calls = result_dict.get("tool_calls", self.tool_calls) - return item case _: raise ValueError(f"Unexpected item: {item}") + return item + except StopAsyncIteration: raise @@ -399,10 +461,12 @@ async def _run_without_post_processing( break for tool_call in response.tool_calls: - result = await self._execute_tool(tool_call=tool_call, tools_mapping=tools_mapping, context=context) - tool_calls.append(result) - - prompt_with_history = prompt_with_history.add_tool_use_message(**result.__dict__) + async for result in self._execute_tool( + tool_call=tool_call, tools_mapping=tools_mapping, context=context + ): + if isinstance(result, ToolCallResult): + tool_calls.append(result) + prompt_with_history = prompt_with_history.add_tool_use_message(**result.__dict__) turn_count += 1 else: @@ -516,13 +580,23 @@ def run_streaming( AgentMaxTurnsExceededError: If the maximum number of turns is exceeded. AgentInvalidPostProcessorError: If the post-processor is invalid. """ - generator = self._stream_internal(input, options, context, tool_choice) + generator = self._stream_internal( + input=input, + options=options, + context=context, + tool_choice=tool_choice, + ) if post_processors: if not allow_non_streaming and any(not p.supports_streaming for p in post_processors): raise AgentInvalidPostProcessorError( reason="Non-streaming post-processors are not allowed when allow_non_streaming is False" ) + + generator = cast( + _AG[str | ToolCall | ToolCallResult | SimpleNamespace | BasePrompt | Usage], + generator, + ) generator = stream_with_post_processing(generator, post_processors, self) return AgentResultStreaming(generator) @@ -533,10 +607,12 @@ async def _stream_internal( options: AgentOptions[LLMClientOptionsT] | None = None, context: AgentRunContext | None = None, tool_choice: ToolChoice | None = None, - ) -> AsyncGenerator[str | ToolCall | ToolCallResult | SimpleNamespace | BasePrompt | Usage]: + ) -> AsyncGenerator[str | ToolCall | ToolCallResult | DownstreamAgentResult | SimpleNamespace | BasePrompt | Usage]: if context is None: context = AgentRunContext() + context.register_agent(cast(Agent[Any, Any, str], self)) + input = cast(PromptInputT, input) merged_options = (self.default_options | options) if options else self.default_options llm_options = merged_options.llm_options or self.llm.default_options @@ -546,24 +622,33 @@ async def _stream_internal( turn_count = 0 max_turns = merged_options.max_turns max_turns = 10 if max_turns is NOT_GIVEN else max_turns + with trace(input=input, options=merged_options) as outputs: while not max_turns or turn_count < max_turns: returned_tool_call = False self._check_token_limits(merged_options, context.usage, prompt_with_history, self.llm) + streaming_result = self.llm.generate_streaming( prompt=prompt_with_history, tools=[tool.to_function_schema() for tool in tools_mapping.values()], tool_choice=tool_choice if tool_choice and turn_count == 0 else None, options=self._get_llm_options(llm_options, merged_options, context.usage), ) + async for chunk in streaming_result: yield chunk if isinstance(chunk, ToolCall): - result = await self._execute_tool(tool_call=chunk, tools_mapping=tools_mapping, context=context) - yield result - prompt_with_history = prompt_with_history.add_tool_use_message(**result.__dict__) - returned_tool_call = True + async for result in self._execute_tool( + tool_call=chunk, + tools_mapping=tools_mapping, + context=context, + ): + yield result + if isinstance(result, ToolCallResult): + prompt_with_history = prompt_with_history.add_tool_use_message(**result.__dict__) + returned_tool_call = True + turn_count += 1 if streaming_result.usage: context.usage += streaming_result.usage @@ -693,11 +778,10 @@ async def _execute_tool( self, tool_call: ToolCall, tools_mapping: dict[str, Tool], - context: AgentRunContext | None = None, - ) -> ToolCallResult: + context: AgentRunContext, + ) -> AsyncGenerator[ToolCallResult | DownstreamAgentResult, None]: if tool_call.type != "function": raise AgentToolNotSupportedError(tool_call.type) - if tool_call.name not in tools_mapping: raise AgentToolNotAvailableError(tool_call.name) @@ -716,8 +800,9 @@ async def _execute_tool( ) if isinstance(tool_output, AgentResultStreaming): - async for _ in tool_output: - pass + async for downstream_item in tool_output: + if context.stream_downstream_events: + yield DownstreamAgentResult(agent_id=tool.id, item=downstream_item) tool_output = { "content": tool_output.content, @@ -738,7 +823,7 @@ async def _execute_tool( } raise AgentToolExecutionError(tool_call.name, e) from e - return ToolCallResult( + yield ToolCallResult( id=tool_call.id, name=tool_call.name, arguments=tool_call.arguments, diff --git a/packages/ragbits-agents/src/ragbits/agents/tool.py b/packages/ragbits-agents/src/ragbits/agents/tool.py index 3da403782..c8e279f29 100644 --- a/packages/ragbits-agents/src/ragbits/agents/tool.py +++ b/packages/ragbits-agents/src/ragbits/agents/tool.py @@ -1,7 +1,7 @@ from collections.abc import Callable from contextlib import suppress from dataclasses import dataclass -from typing import TYPE_CHECKING, Any, Literal +from typing import TYPE_CHECKING, Any, Literal, cast from pydantic import BaseModel from typing_extensions import Self @@ -12,7 +12,7 @@ from ragbits.core.utils.function_schema import convert_function_to_function_schema, get_context_variable_name if TYPE_CHECKING: - from ragbits.agents import Agent, AgentResultStreaming + from ragbits.agents import Agent, AgentResultStreaming, AgentRunContext with suppress(ImportError): from pydantic_ai import Tool as PydanticAITool @@ -50,6 +50,7 @@ class Tool: """The actual callable function to execute when the tool is called.""" context_var_name: str | None = None """The name of the context variable that this tool accepts.""" + id: str | None = None @classmethod def from_callable(cls, callable: Callable) -> Self: @@ -150,20 +151,28 @@ def from_agent( parameters = {"type": "object", "properties": properties, "required": required} + context_var_name = get_context_variable_name(agent.run) + def _on_tool_call(**kwargs: dict) -> "AgentResultStreaming": + if context_var_name: + context = cast("AgentRunContext[Any] | None", kwargs.get(context_var_name)) + if context is not None: + context.register_agent(cast("Agent[Any, Any, str]", agent)) + if input_model_cls and issubclass(input_model_cls, BaseModel): model_input = input_model_cls(**kwargs) else: model_input = kwargs.get("input") - return agent.run_streaming(model_input) + return agent.run_streaming(model_input, context=context) return cls( name=variable_name, + id=agent.id, description=description, parameters=parameters, on_tool_call=_on_tool_call, - context_var_name=get_context_variable_name(agent.run), + context_var_name=context_var_name, ) From 51c95a9ba7583a2e8a701345433c827a0cf1fe7d Mon Sep 17 00:00:00 2001 From: ds-radoslaw-izak Date: Thu, 25 Sep 2025 14:56:22 +0200 Subject: [PATCH 19/43] minor humaneval changes --- .../{code-generation => }/human_eval/run.py | 21 ++++++- .../evaluate/dataloaders/human_eval.py | 6 +- .../ragbits/evaluate/metrics/human_eval.py | 26 +++++---- .../ragbits/evaluate/pipelines/human_eval.py | 55 ++++++++----------- 4 files changed, 60 insertions(+), 48 deletions(-) rename examples/evaluate/{code-generation => }/human_eval/run.py (81%) diff --git a/examples/evaluate/code-generation/human_eval/run.py b/examples/evaluate/human_eval/run.py similarity index 81% rename from examples/evaluate/code-generation/human_eval/run.py rename to examples/evaluate/human_eval/run.py index 686347eb4..095ee3159 100644 --- a/examples/evaluate/code-generation/human_eval/run.py +++ b/examples/evaluate/human_eval/run.py @@ -61,15 +61,30 @@ async def main() -> None: # Pipeline log_path = Path(__file__).with_name("humaneval_examples.ndjson") + + # Code sanitazation function + def sanitize_code(text: str) -> str: + cleaned = text.replace("\r\n", "\n").replace("\r", "\n").strip() + if "```" in cleaned: + start = cleaned.find("```") + end = cleaned.find("```", start + 3) + if end != -1: + inside = cleaned[start + 3 : end].lstrip() + if "\n" in inside: + first, rest = inside.split("\n", 1) + cleaned = rest if first.strip().lower().startswith("python") else inside + else: + cleaned = inside + return cleaned.strip() + pipeline = HumanEvalPipeline( evaluation_target=agent, n_samples=1, timeout_sec=30, - temperature=0.7, - seed=42, per_example_log_file=log_path, # agent specific ext. logs - extended_logs=False, # includes traces, tool usage, etc. + extended_logs=True, # includes traces, tool usage, etc. + code_sanitize_fn=sanitize_code, ) # Metrics diff --git a/packages/ragbits-evaluate/src/ragbits/evaluate/dataloaders/human_eval.py b/packages/ragbits-evaluate/src/ragbits/evaluate/dataloaders/human_eval.py index a63b30594..21760336f 100644 --- a/packages/ragbits-evaluate/src/ragbits/evaluate/dataloaders/human_eval.py +++ b/packages/ragbits-evaluate/src/ragbits/evaluate/dataloaders/human_eval.py @@ -10,7 +10,11 @@ class HumanEvalDataLoader(DataLoader[HumanEvalData]): HumanEval evaluation data loader. The source should point to a local/remote JSONL file in HumanEval format, where each line is a JSON object - with at least the following keys: "task_id", "prompt", "entry_point", and "test". + with at least the following keys: " + - task_id" (str) + - "prompt" (str) + - "entry_point" (str) + - "test" (str) """ def __init__( diff --git a/packages/ragbits-evaluate/src/ragbits/evaluate/metrics/human_eval.py b/packages/ragbits-evaluate/src/ragbits/evaluate/metrics/human_eval.py index 53ec91f5f..fd5eeda8d 100644 --- a/packages/ragbits-evaluate/src/ragbits/evaluate/metrics/human_eval.py +++ b/packages/ragbits-evaluate/src/ragbits/evaluate/metrics/human_eval.py @@ -9,19 +9,19 @@ class HumanEvalPassAtK(Metric[HumanEvalResult]): """ - Computes pass@k over HumanEval tasks given binary pass masks per task. - When multiple samples per task exist, pass@k is defined as average over tasks of indicator that - at least one of k samples passes. For n>=k, approximate with: 1 - C(n-m, k) / C(n, k), where m is successes. + Computes pass@k over HumanEval tasks. + Measures the fraction of tasks with at least one passing sample out of k attempts. """ - def __init__(self, k: int = 1, weight: float = 1.0) -> None: - super().__init__(weight=weight) + def __init__(self, k: int = 1) -> None: + super().__init__() self.k = k - async def compute(self, results: list[HumanEvalResult]) -> dict: # noqa: PLR6301 + async def compute(self, results: list[HumanEvalResult]) -> dict: """Compute pass@k averaged over tasks. - - For each task with n samples and m passes, uses 1 - C(n-m, k) / C(n, k). + + Returns: + Dictionary with humaneval_pass@k: fraction of tasks with at least one passing sample. """ values = [] for r in results: @@ -46,7 +46,7 @@ async def compute(self, results: list[HumanEvalResult]) -> dict: # noqa: PLR630 class HumanEvalQualityPerf(Metric[HumanEvalResult]): """ - Quality/performance aggregates with error breakdown: + Code quality and execution performance metrics: - humaneval_compile_rate: fraction of samples that compiled - humaneval_syntax_error_rate: fraction of samples with syntax error (compile failed) - humaneval_assert_fail_rate: fraction of samples that ran but failed assertions @@ -56,8 +56,12 @@ class HumanEvalQualityPerf(Metric[HumanEvalResult]): - humaneval_avg_exec_time_sec: average exec time over compilable runs """ - async def compute(self, results: list[HumanEvalResult]) -> dict: # noqa: PLR6301 - """Compute compile rate, error rate, tasks solved rate, and average exec time.""" + async def compute(self, results: list[HumanEvalResult]) -> dict: + """Compute code quality and execution performance metrics. + + Returns: + Dictionary with compile rates, error rates, tasks solved rate, and average execution time. + """ total_samples = sum(len(r.passed_mask) for r in results) compiled = 0 syntax_errors = 0 diff --git a/packages/ragbits-evaluate/src/ragbits/evaluate/pipelines/human_eval.py b/packages/ragbits-evaluate/src/ragbits/evaluate/pipelines/human_eval.py index ba680b7dd..d888ff4d6 100644 --- a/packages/ragbits-evaluate/src/ragbits/evaluate/pipelines/human_eval.py +++ b/packages/ragbits-evaluate/src/ragbits/evaluate/pipelines/human_eval.py @@ -2,10 +2,11 @@ import contextlib import io import json +import logging import multiprocessing import textwrap import time -from collections.abc import Iterable +from collections.abc import Callable, Iterable from dataclasses import dataclass from multiprocessing.connection import Connection from pathlib import Path @@ -85,7 +86,7 @@ def _runner(pipe: Connection) -> None: os.chdir(tmp.name) globals_dict: dict[str, Any] = {"__name__": "__main__"} - exec(compile(source, filename="candidate.py", mode="exec"), globals_dict) # noqa: S102 + exec(compile(source, filename="candidate.py", mode="exec"), globals_dict) if entry_point not in globals_dict: raise NameError(f"Entry point '{entry_point}' not defined") @@ -95,7 +96,7 @@ def _runner(pipe: Connection) -> None: compiled_test = compile( harness + "\n" + test_code_clean + "\ncheck(candidate)", filename="test.py", mode="exec" ) - exec(compiled_test, globals_dict) # noqa: S102 + exec(compiled_test, globals_dict) duration = time.perf_counter() - start pipe.send((True, duration, None)) @@ -129,20 +130,18 @@ def __init__( *, n_samples: int = 1, timeout_sec: int = 10, - temperature: float | None = None, - seed: int | None = None, memory_limit_mb: int | None = 512, per_example_log_file: Path | None = None, extended_logs: bool = False, + code_sanitize_fn: Callable[[str], str] | None = None, ) -> None: super().__init__(evaluation_target=evaluation_target) self.n_samples = n_samples self.timeout_sec = timeout_sec - self.temperature = temperature - self.seed = seed self.memory_limit_mb = memory_limit_mb self.per_example_log_file = per_example_log_file self.extended_logs = extended_logs + self.code_sanitize_fn = code_sanitize_fn self._init_log_file() @classmethod @@ -197,13 +196,13 @@ async def __call__(self, data: Iterable[HumanEvalData]) -> Iterable[HumanEvalRes if self.extended_logs: # Raw is (content, debug) content, dbg = raw - code = self._sanitize_code(content) + code = self._sanitize(content) samples.append(code) if debug_traces is not None: debug_traces.append(dbg) else: # Raw is a simple string - code = self._sanitize_code(raw) + code = self._sanitize(raw) samples.append(code) # Compile check @@ -239,31 +238,24 @@ async def __call__(self, data: Iterable[HumanEvalData]) -> Iterable[HumanEvalRes ) results.append(result) ext_log_str = ( - json.dumps(debug_traces, ensure_ascii=False, default=str) if (self.extended_logs and debug_traces is not None) else None + json.dumps(debug_traces, ensure_ascii=False, default=str) + if (self.extended_logs and debug_traces is not None) + else None ) self._log_example(row, result, ext_log_str) return results - @staticmethod - def _sanitize_code(text: str) -> str: - """Basic cleanup for LLM answers. - - - Trim whitespace and normalize newlines - - If fenced with ```...```, take the first fence block, drop language tag + def _sanitize(self, text: str) -> str: + """Optionally sanitize cpde from text using provided function. + If no parser provided, returns the original text. """ - cleaned = text.replace("\r\n", "\n").replace("\r", "\n").strip() - if "```" in cleaned: - start = cleaned.find("```") - end = cleaned.find("```", start + 3) - if end != -1: - inside = cleaned[start + 3 : end].lstrip() - # drop a possible language tag line - if "\n" in inside: - first, rest = inside.split("\n", 1) - cleaned = rest if first.strip().lower().startswith("python") else inside - else: - cleaned = inside - return cleaned.strip() + if self.code_sanitize_fn is None: + return text + try: + return self.code_sanitize_fn(text) + except Exception as exc: + logging.getLogger(__name__).debug("Code sanitize error: %s", exc) + return text def _init_log_file(self) -> None: """Ensure the per-example log file exists if logging is enabled.""" @@ -291,10 +283,7 @@ def _log_example(self, row: HumanEvalData, result: HumanEvalResult, extended_log f.write(json.dumps(record, ensure_ascii=False) + "\n") async def _generate_code(self, prompt: str) -> str: - """Generate final answer code from Agent or raw LLM. - - Sampling/temperature/seed should be configured on the Agent/LLM itself. - """ + """Generate final answer code from Agent or raw LLM.""" target = self.evaluation_target if isinstance(target, Agent): res = await target.run(prompt) From a21efb5ddfd88a1f09dbb46bf12c4b9f6a33eafc Mon Sep 17 00:00:00 2001 From: ds-radoslaw-izak Date: Thu, 25 Sep 2025 16:47:31 +0200 Subject: [PATCH 20/43] add GAIA pipeline + basic extra tools for benchmarking --- examples/evaluate/gaia/run.py | 121 +++++++++ .../src/ragbits/agents/tools/extra.py | 216 +++++++++++++++ .../src/ragbits/evaluate/dataloaders/gaia.py | 74 ++++++ .../src/ragbits/evaluate/metrics/gaia.py | 90 +++++++ .../ragbits/evaluate/pipelines/__init__.py | 3 +- .../src/ragbits/evaluate/pipelines/gaia.py | 251 ++++++++++++++++++ 6 files changed, 754 insertions(+), 1 deletion(-) create mode 100644 examples/evaluate/gaia/run.py create mode 100644 packages/ragbits-agents/src/ragbits/agents/tools/extra.py create mode 100644 packages/ragbits-evaluate/src/ragbits/evaluate/dataloaders/gaia.py create mode 100644 packages/ragbits-evaluate/src/ragbits/evaluate/metrics/gaia.py create mode 100644 packages/ragbits-evaluate/src/ragbits/evaluate/pipelines/gaia.py diff --git a/examples/evaluate/gaia/run.py b/examples/evaluate/gaia/run.py new file mode 100644 index 000000000..d97de4e83 --- /dev/null +++ b/examples/evaluate/gaia/run.py @@ -0,0 +1,121 @@ +import asyncio +import logging +from pathlib import Path + +from ragbits.agents import Agent, AgentOptions +from ragbits.agents.tools.openai import get_web_search_tool +from ragbits.agents.tools.todo import TodoList, create_todo_manager, get_todo_instruction_tpl +from ragbits.agents.tools.extra import ( + add, + subtract, + multiply, + divide, + modulus, + arxiv_search, + wiki_search, + get_extra_instruction_tpl, +) +from ragbits.core.llms import LiteLLM +from ragbits.core.sources.hf import HuggingFaceSource +from ragbits.evaluate.dataloaders.gaia import GaiaDataLoader +from ragbits.evaluate.evaluator import Evaluator +from ragbits.evaluate.metrics.base import MetricSet +from ragbits.evaluate.metrics.gaia import GaiaEfficiency, GaiaOutcome, GaiaTooling +from ragbits.evaluate.pipelines.gaia import GaiaPipeline + + +async def main() -> None: + """Run GAIA example with an Agent and print aggregate metrics.""" + logging.getLogger("LiteLLM").setLevel(logging.ERROR) + + todo_list = TodoList() + todo_manager = create_todo_manager(todo_list) + + gaia_prompt = ( + "You are a general AI assistant. I will ask you a question. " + "Report your thoughts, and finish your answer with the following template: " + "FINAL ANSWER: [YOUR FINAL ANSWER]. YOUR FINAL ANSWER should be a number OR as few words as possible " + "OR a comma separated list of numbers and/or strings. If you are asked for a number, don't use comma to write " + "your number neither use units such as $ or percent sign unless specified otherwise. If you are asked for a " + "string, don't use articles, neither abbreviations (e.g. for cities), and write the digits in plain text " + "unless specified otherwise. If you are asked for a comma separated list, apply the above rules depending of " + "whether the element to be put in the list is a number or a string. If you are asked for a number, make sure " + "you respond using digits not text, and ensure the answer is in appropriate unit context wise " + "(e.g. if asked for thousands of meters and your answer is 31000, answer 31)." + ) + + system_prompt = "\n".join( + [ + gaia_prompt, + ( + "Tool usage:\n" + "- Use arithmetic tools for calculations.\n" + "- Use arxiv_search/wiki_search to retrieve relevant facts when needed or explicitly asked.\n" + "- For multi-step/complex requests, start and manage work with the todo_manager workflow.\n" + "- For general web-search questions, use search_web tool and gather information." + ), + get_todo_instruction_tpl(task_range=(3, 5)), + get_extra_instruction_tpl(), + ] + ) + + web_search = get_web_search_tool(model_name="gpt-4.1-mini") + + agent: Agent = Agent( + llm=LiteLLM("gpt-4.1-mini"), + prompt=system_prompt, + tools=[ + todo_manager, + web_search, + add, + subtract, + multiply, + divide, + modulus, + arxiv_search, + wiki_search, + ], + default_options=AgentOptions(max_turns=30), + ) + + # Data: pick level 1, 2, or 3 -> higher level <-> harder questions + level = 1 + # GAIA config name:'2023_all', '2023_level1', '2023_level2', '2023_level3' + config_name = {1: "2023_level1", 2: "2023_level2", 3: "2023_level3"}[level] + source = HuggingFaceSource(path="gaia-benchmark/GAIA", name=config_name, split="validation") + dataloader = GaiaDataLoader(source=source, split="data[:30]", skip_file_attachments=True) + + log_path = Path(__file__).with_name("gaia_examples.ndjson") + + def parse_final_answer(text: str) -> str: + marker = "FINAL ANSWER:" + idx = text.rfind(marker) + if idx == -1: + return text.strip() + candidate = text[idx + len(marker) :].strip() + if candidate.startswith("[") and candidate.endswith("]"): + candidate = candidate[1:-1].strip() + return candidate + + pipeline = GaiaPipeline( + evaluation_target=agent, + per_example_log_file=log_path, + # agent specific ext. logs + extended_logs=False, # includes traces, tool usage, etc. + parse_answer_fn=parse_final_answer, + ) + + # Metrics + metrics = MetricSet(GaiaOutcome(), GaiaTooling(), GaiaEfficiency()) + + # Evaluate + evaluator = Evaluator(batch_size=5, parallelize_batches=True) + results = await evaluator.compute(pipeline=pipeline, dataloader=dataloader, metricset=metrics) + + print("Metrics:") + for key, value in results.metrics.items(): + print(f" {key}: {value:.4f}") + + +if __name__ == "__main__": + asyncio.run(main()) diff --git a/packages/ragbits-agents/src/ragbits/agents/tools/extra.py b/packages/ragbits-agents/src/ragbits/agents/tools/extra.py new file mode 100644 index 000000000..a54df55fa --- /dev/null +++ b/packages/ragbits-agents/src/ragbits/agents/tools/extra.py @@ -0,0 +1,216 @@ +from __future__ import annotations + +from typing import Any +import json +import urllib.parse +import urllib.request +import xml.etree.ElementTree as ET + + +def add(a: int, b: int) -> int: + """Add two integers and return the result. + + Args: + a: First integer. + b: Second integer. + + Returns: + Sum of a and b. + """ + + return a + b + + +def subtract(a: int, b: int) -> int: + """Subtract two integers and return the result (a - b). + + Args: + a: Minuend integer. + b: Subtrahend integer. + + Returns: + Difference a - b. + """ + + return a - b + + +def multiply(a: int, b: int) -> int: + """Multiply two integers and return the result. + + Args: + a: First integer. + b: Second integer. + + Returns: + Product a * b. + """ + + return a * b + + +def divide(a: int, b: int) -> float: + """Divide two integers and return the result as float. + + Args: + a: Dividend integer. + b: Divisor integer (must be non-zero). + + Returns: + Quotient a / b as float. + + Raises: + ValueError: If b == 0. + """ + + if b == 0: + raise ValueError("Cannot divide by zero.") + return a / b + + +def modulus(a: int, b: int) -> int: + """Compute remainder of a divided by b (a % b). + + Args: + a: Dividend integer. + b: Divisor integer (must be non-zero). + + Returns: + Remainder a % b. + + Raises: + ValueError: If b == 0. + """ + + if b == 0: + raise ValueError("Cannot divide by zero.") + return a % b + + +def _http_get(url: str, timeout: float = 10.0) -> bytes: + req = urllib.request.Request(url, headers={"User-Agent": "ragbits-agents/extra-tools"}) + with urllib.request.urlopen(req, timeout=timeout) as resp: + return resp.read() + + +def arxiv_search(query: str, max_results: int = 3) -> dict[str, Any]: + """Search arXiv and return up to `max_results` entries. + + Args: + query: Search query (e.g., "quantum computing") + max_results: Max number of results to return (default 3) + + Returns: + Dict with a list of results: title, summary, link. + """ + + if max_results <= 0: + return {"results": []} + + base = "https://export.arxiv.org/api/query" + params = { + "search_query": urllib.parse.quote_plus(query), + "start": "0", + "max_results": str(max_results), + "sortBy": "relevance", + "sortOrder": "descending", + } + url = f"{base}?search_query={params['search_query']}&start={params['start']}&max_results={params['max_results']}&sortBy={params['sortBy']}&sortOrder={params['sortOrder']}" + + raw = _http_get(url) + root = ET.fromstring(raw) + ns = {"atom": "http://www.w3.org/2005/Atom"} + results: list[dict[str, str]] = [] + for entry in root.findall("atom:entry", ns): + title_el = entry.find("atom:title", ns) + summary_el = entry.find("atom:summary", ns) + link_el = entry.find("atom:link[@rel='alternate']", ns) + title = (title_el.text or "").strip() if title_el is not None else "" + summary = (summary_el.text or "").strip() if summary_el is not None else "" + link = link_el.get("href") if link_el is not None else "" + # Trim overly long summaries for brevity + if len(summary) > 1200: + summary = summary[:1200] + "..." + results.append({"title": title, "summary": summary, "link": link}) + + return {"results": results} + + +def wiki_search(query: str, max_results: int = 2, language: str = "en") -> dict[str, Any]: + """Search Wikipedia and return up to `max_results` entries with extracts. + + Args: + query: Search query (e.g., "Alan Turing") + max_results: Max number of results (default 2) + language: Wikipedia language code (default "en") + + Returns: + Dict with list of results: title, pageid, extract, url. + """ + + if max_results <= 0: + return {"results": []} + + api = f"https://{language}.wikipedia.org/w/api.php" + search_params = { + "action": "query", + "list": "search", + "srsearch": query, + "srlimit": str(max_results), + "format": "json", + } + search_url = f"{api}?{urllib.parse.urlencode(search_params)}" + raw = _http_get(search_url) + data = json.loads(raw.decode("utf-8")) + hits = data.get("query", {}).get("search", []) + if not hits: + return {"results": []} + + page_ids = [str(h.get("pageid")) for h in hits if "pageid" in h] + extract_params = { + "action": "query", + "prop": "extracts", + "explaintext": "1", + "exintro": "1", + "pageids": "|".join(page_ids), + "format": "json", + } + extract_url = f"{api}?{urllib.parse.urlencode(extract_params)}" + raw2 = _http_get(extract_url) + data2 = json.loads(raw2.decode("utf-8")) + pages = data2.get("query", {}).get("pages", {}) + + results: list[dict[str, Any]] = [] + for pid in page_ids: + page = pages.get(pid) + if not page: + continue + title = page.get("title", "") + extract = (page.get("extract", "") or "").strip() + if len(extract) > 1200: + extract = extract[:1200] + "..." + url = f"https://{language}.wikipedia.org/?curid={pid}" + results.append({"title": title, "pageid": int(pid), "extract": extract, "url": url}) + + return {"results": results} + + +def get_extra_instruction_tpl() -> str: + """Generate tool usage instructions template for arithmetic and lookups. + + Returns: + Instruction template string to include in system prompts. + """ + + return ( + "\n\n" + "## Tools Workflow (Arithmetic, arXiv, Wikipedia)\n\n" + "Available actions:\n" + "- `add(a, b)`, `subtract(a, b)`, `multiply(a, b)`, `divide(a, b)`, `modulus(a, b)`\n" + "- `arxiv_search(query, max_results=3)`\n" + "- `wiki_search(query, max_results=2, language='en')`\n\n" + "POLICY:\n" + "1) Use arithmetic tools for calculations instead of inline math when non-trivial.\n" + "2) Use arXiv/Wikipedia tools when scholarly/general knowledge retrieval is needed.\n" + "3) Keep outputs concise; provide FINAL ANSWER after any intermediate reasoning.\n" + ) \ No newline at end of file diff --git a/packages/ragbits-evaluate/src/ragbits/evaluate/dataloaders/gaia.py b/packages/ragbits-evaluate/src/ragbits/evaluate/dataloaders/gaia.py new file mode 100644 index 000000000..6e553e4e3 --- /dev/null +++ b/packages/ragbits-evaluate/src/ragbits/evaluate/dataloaders/gaia.py @@ -0,0 +1,74 @@ +from collections.abc import Iterable + +from ragbits.core.sources.base import Source +from ragbits.evaluate.dataloaders.base import DataLoader +from ragbits.evaluate.pipelines.gaia import GaiaData + + +class GaiaDataLoader(DataLoader[GaiaData]): + """ + GAIA benchmark evaluation data loader. + + The source should point to a local/remote JSON or JSONL file exported from the + Hugging Face dataset `gaia-benchmark/GAIA`. Rows are expected to contain at least: + - "task_id" (str) + - "Question" (str) + - "Level" (int) + - "Final answer" (str) + """ + + def __init__( + self, + source: Source, + *, + split: str = "data", + task_id_key: str = "task_id", + question_key: str = "Question", + level_key: str = "Level", + final_answer_key: str = "Final answer", + file_name_key: str = "file_name", + skip_file_attachments: bool = False, + ) -> None: + """ + Initialize the GAIA data loader. + + Args: + source: The source to load the data from. + split: The split to load the data from (file name generated by the source helper). + task_id_key: Column name for GAIA task identifier. + question_key: Column name for the natural language question. + level_key: Column name for numeric difficulty level (1, 2, 3). + final_answer_key: Column name for the final ground-truth answer. + file_name_key: Column name with optional associated file name (may be empty). + skip_file_attachments: If True, skip rows that have a non-empty file attachment. + """ + required = {task_id_key, question_key, level_key, final_answer_key} + super().__init__(source=source, split=split, required_keys=required) + self.task_id_key = task_id_key + self.question_key = question_key + self.level_key = level_key + self.final_answer_key = final_answer_key + self.file_name_key = file_name_key + self.skip_file_attachments = skip_file_attachments + + async def map(self, dataset: Iterable[dict]) -> Iterable[GaiaData]: + """ + Map the dataset to the GAIA evaluation data schema. + + Args: + dataset: The dataset to map. + + Returns: + The GAIA evaluation data rows. + """ + return [ + GaiaData( + task_id=str(row.get(self.task_id_key, "")), + question=str(row.get(self.question_key, "")), + level=int(row.get(self.level_key, 1)), + reference_answer=str(row.get(self.final_answer_key, "")), + file_name=(row.get(self.file_name_key) or None), + ) + for row in dataset + if (not self.skip_file_attachments or not row.get(self.file_name_key) or str(row.get(self.file_name_key)).strip() == "") + ] diff --git a/packages/ragbits-evaluate/src/ragbits/evaluate/metrics/gaia.py b/packages/ragbits-evaluate/src/ragbits/evaluate/metrics/gaia.py new file mode 100644 index 000000000..3c28f6f66 --- /dev/null +++ b/packages/ragbits-evaluate/src/ragbits/evaluate/metrics/gaia.py @@ -0,0 +1,90 @@ +from __future__ import annotations + +from statistics import mean + +from ragbits.evaluate.metrics.base import Metric +from ragbits.evaluate.pipelines.gaia import GaiaResult + + +class GaiaOutcome(Metric[GaiaResult]): + """ + Computes task success rate over GAIA tasks. + Measures the fraction of tasks that were successfully solved. + """ + + async def compute(self, results: list[GaiaResult]) -> dict: + """Compute task success rate. + + Returns: + Dictionary with gaia_task_success_rate: fraction of successfully solved tasks. + """ + success_count = sum(1 for r in results if r.task_success) + success_rate = (success_count / len(results)) if results else 0.0 + + return {"gaia_task_success_rate": float(success_rate)} + + +class GaiaTooling(Metric[GaiaResult]): + """ + Tool utilization and performance metrics: + - gaia_tool_trigger_rate: fraction of tasks where tools were used + - gaia_avg_num_tool_calls: average number of tool calls per task + - gaia_avg_tool_error_count: average number of tool errors per task + - averaged_freq: average tool usage/calls per task + """ + + async def compute(self, results: list[GaiaResult]) -> dict: + """Compute tool utilization and performance metrics. + + Returns: + Dictionary with tool trigger rate, average tool calls, average errors, + and flattened tool frequency usage as numeric metrics. + """ + tool_triggered_count = sum(1 for r in results if r.tool_triggered) + tool_trigger_rate = (tool_triggered_count / len(results)) if results else 0.0 + avg_tool_calls = float(mean(r.num_tool_calls for r in results)) if results else 0.0 + avg_tool_errors = float(mean(r.tool_error_count for r in results)) if results else 0.0 + + # tool frequency as average per task (mean calls per task per tool) + total_tasks = len(results) if results else 1 + aggregated_counts: dict[str, int] = {} + for r in results: + if r.tool_names: + for name in r.tool_names: + aggregated_counts[name] = aggregated_counts.get(name, 0) + 1 + averaged_freq: dict[str, float] = { + f"gaia_tool_frequency_usage.{name}": (count / total_tasks) + for name, count in aggregated_counts.items() + } + + return { + "gaia_tool_trigger_rate": float(tool_trigger_rate), + "gaia_avg_num_tool_calls": avg_tool_calls, + "gaia_avg_tool_error_count": avg_tool_errors, + **averaged_freq, + } + + +class GaiaEfficiency(Metric[GaiaResult]): + """ + Efficiency and resource usage metrics: + - gaia_avg_latency_ms: average response latency in milliseconds + - gaia_avg_cost_usd: average cost per task in USD + - gaia_avg_total_tokens: average total tokens used per task + """ + + async def compute(self, results: list[GaiaResult]) -> dict: + """Compute efficiency and resource usage metrics. + + Returns: + Dictionary with average latency, cost, and token usage. + """ + avg_latency = float(mean(r.total_latency_ms for r in results)) if results else 0.0 + avg_cost = float(mean(r.cost_usd for r in results)) if results else 0.0 + avg_tokens = float(mean(r.total_tokens for r in results)) if results else 0.0 + + return { + "gaia_avg_latency_ms": avg_latency, + "gaia_avg_cost_usd": avg_cost, + "gaia_avg_total_tokens": avg_tokens, + } diff --git a/packages/ragbits-evaluate/src/ragbits/evaluate/pipelines/__init__.py b/packages/ragbits-evaluate/src/ragbits/evaluate/pipelines/__init__.py index 39f47f1c8..f86254bcc 100644 --- a/packages/ragbits-evaluate/src/ragbits/evaluate/pipelines/__init__.py +++ b/packages/ragbits-evaluate/src/ragbits/evaluate/pipelines/__init__.py @@ -2,9 +2,10 @@ from ragbits.document_search import DocumentSearch from ragbits.evaluate.pipelines.base import EvaluationData, EvaluationPipeline, EvaluationResult from ragbits.evaluate.pipelines.document_search import DocumentSearchPipeline +from ragbits.evaluate.pipelines.gaia import GaiaPipeline from ragbits.evaluate.pipelines.human_eval import HumanEvalPipeline -__all__ = ["DocumentSearchPipeline", "EvaluationData", "EvaluationPipeline", "EvaluationResult", "HumanEvalPipeline"] +__all__ = ["DocumentSearchPipeline", "EvaluationData", "EvaluationPipeline", "EvaluationResult", "GaiaPipeline", "HumanEvalPipeline"] _target_to_evaluation_pipeline: dict[type[WithConstructionConfig], type[EvaluationPipeline]] = { DocumentSearch: DocumentSearchPipeline, diff --git a/packages/ragbits-evaluate/src/ragbits/evaluate/pipelines/gaia.py b/packages/ragbits-evaluate/src/ragbits/evaluate/pipelines/gaia.py new file mode 100644 index 000000000..2ac041aa3 --- /dev/null +++ b/packages/ragbits-evaluate/src/ragbits/evaluate/pipelines/gaia.py @@ -0,0 +1,251 @@ +import json +import logging +import time +from collections.abc import Callable, Iterable +from dataclasses import dataclass +from pathlib import Path +from typing import cast + +from typing_extensions import Self + +from ragbits.agents import Agent +from ragbits.core.llms.base import LLM, LLMClientOptionsT, LLMResponseWithMetadata, Usage +from ragbits.evaluate.pipelines.base import EvaluationData, EvaluationPipeline, EvaluationResult + + +class GaiaData(EvaluationData): + """ + Represents a single GAIA task. + """ + + task_id: str + question: str + level: int + reference_answer: str + file_name: str | None = None + + +@dataclass +class GaiaResult(EvaluationResult): + """ + Represents the result of evaluating a single GAIA task. + """ + + task_id: str + level: int + question: str + reference_answer: str + predicted_result: str + task_success: bool + tool_triggered: bool + num_tool_calls: int + tool_error_count: int + total_latency_ms: int + total_tokens: int + cost_usd: float + tool_names: list[str] | None = None + + +class GaiaPipeline( + EvaluationPipeline[Agent[LLMClientOptionsT, None, str] | LLM[LLMClientOptionsT], GaiaData, GaiaResult] +): + """GAIA evaluation pipeline for question answering models/agents.""" + + def __init__( + self, + evaluation_target: Agent[LLMClientOptionsT, None, str] | LLM[LLMClientOptionsT], + *, + system_prompt: str | None = None, + per_example_log_file: Path | None = None, + extended_logs: bool = False, + parse_answer_fn: Callable[[str], str] | None = None, + ) -> None: + super().__init__(evaluation_target=evaluation_target) + self.system_prompt = system_prompt + self.per_example_log_file = per_example_log_file + self.extended_logs = extended_logs + self.parse_answer_fn = parse_answer_fn + self._init_log_file() + + @classmethod + def from_config(cls, config: dict) -> Self: + """Create pipeline from config. + Attempts Agent first, falls back to raw LLM construction. + """ + if "evaluation_target" not in config: + try: + config["evaluation_target"] = Agent.from_config(config) + except Exception: + config["evaluation_target"] = LLM.subclass_from_config(config) + return super().from_config(config) + + async def __call__(self, data: Iterable[GaiaData]) -> Iterable[GaiaResult]: + """Generate answer completions per task and evaluate them. + Returns list of `GaiaResult`, one per input task. + """ + results: list[GaiaResult] = [] + + for row in data: + start_time = time.perf_counter() + + prompt_input = row.question + debug_traces: list[dict | None] | None = [] if self.extended_logs else None + + try: + if self.extended_logs: + content, dbg = await self._generate_with_debug(prompt_input) + if debug_traces is not None: + debug_traces.append(dbg) + usage = cast(Usage, (dbg or {}).get("usage") or Usage()) + tool_calls = cast(list, (dbg or {}).get("tool_calls") or []) + else: + content, usage, tool_calls = await self._generate_answer(prompt_input) + + except Exception as generation_exc: + content = "" + usage = Usage() + tool_calls = [] + err_msg = f"GenerationError: {generation_exc.__class__.__name__}: {generation_exc}" + if self.extended_logs and debug_traces is not None: + debug_traces.append({"error": err_msg}) + + end_time = time.perf_counter() + + # Compute metrics + predicted_raw = str(content).strip() + predicted = self._parse_answer(predicted_raw) + reference = (row.reference_answer or "").strip() + task_success = self._normalize(predicted) == self._normalize(reference) if reference else False + + tool_triggered = bool(tool_calls) + num_tool_calls = len(tool_calls) + + # Count tool errors from AgentResult.tool_calls metadata if present + tool_error_count = 0 + for call in tool_calls: + try: + if isinstance(call.result, dict) and "error" in call.result: + tool_error_count += 1 + except Exception as exc: + logging.getLogger(__name__).debug("Error while parsing tool call result: %s", exc) + + total_latency_ms = int((end_time - start_time) * 1000) + total_tokens = usage.total_tokens if usage else 0 + cost_usd = usage.estimated_cost if usage else 0.0 + + # Extract tool names (if any) from tool_calls + tool_names: list[str] | None = None + if tool_calls: + tool_names = [] + for call in tool_calls: + try: + name = getattr(call, "name", None) + if name is None and isinstance(call, dict): + name = call.get("name") + if name: + tool_names.append(str(name)) + except Exception as exc: + logging.getLogger(__name__).debug("Tool name extraction error: %s", exc) + + result = GaiaResult( + task_id=row.task_id, + level=row.level, + question=row.question, + reference_answer=row.reference_answer, + predicted_result=content, + task_success=task_success, + tool_triggered=tool_triggered, + num_tool_calls=num_tool_calls, + tool_error_count=tool_error_count, + total_latency_ms=total_latency_ms, + total_tokens=total_tokens, + cost_usd=float(cost_usd), + tool_names=tool_names, + ) + results.append(result) + ext_log_str = ( + json.dumps(debug_traces, ensure_ascii=False, default=str) + if (self.extended_logs and debug_traces is not None) + else None + ) + self._log_example(row, result, ext_log_str) + + return results + + def _init_log_file(self) -> None: + """Ensure the per-example log file exists if logging is enabled.""" + if self.per_example_log_file is None: + return + self.per_example_log_file.parent.mkdir(parents=True, exist_ok=True) + self.per_example_log_file.touch(exist_ok=True) + + def _log_example(self, row: GaiaData, result: GaiaResult, extended_log: str | None = None) -> None: + """Append a single NDJSON record for debugging if enabled.""" + if self.per_example_log_file is None: + return + # per-task tool frequency map from tool names + tool_frequency_usage: dict[str, int] = {} + if result.tool_names: + for name in result.tool_names: + tool_frequency_usage[name] = tool_frequency_usage.get(name, 0) + 1 + record: dict[str, object] = { + "task_id": row.task_id, + "level": row.level, + "question": row.question, + "predicted": str(result.predicted_result), + "predicted_extracted": self._parse_answer(str(result.predicted_result)), + "reference": row.reference_answer, + "task_success": result.task_success, + "tool_triggered": result.tool_triggered, + "num_tool_calls": result.num_tool_calls, + "tool_error_count": result.tool_error_count, + "total_latency_ms": result.total_latency_ms, + "total_tokens": result.total_tokens, + "cost_usd": result.cost_usd, + "tool_frequency_usage": tool_frequency_usage, + } + record["extended_debug_logging"] = extended_log or "[]" + with open(self.per_example_log_file, "a", encoding="utf-8") as f: + f.write(json.dumps(record, ensure_ascii=False) + "\n") + + async def _generate_answer(self, prompt: str) -> tuple[str, Usage, list]: + """Generate final answer from Agent or raw LLM and capture usage and tool calls.""" + target = self.evaluation_target + if isinstance(target, Agent): + res = await target.run(prompt) + return str(res.content), res.usage, (res.tool_calls or []) + + resp = cast(LLMResponseWithMetadata[str], await target.generate_with_metadata(prompt)) + return str(resp.content), (resp.usage or Usage()), [] + + async def _generate_with_debug(self, prompt: str) -> tuple[str, dict | None]: + """Generate answer and capture tool/history/usage for logging (as raw content).""" + target = self.evaluation_target + if isinstance(target, Agent): + res = await target.run(prompt) + dbg = { + "history": res.history, + "tool_calls": res.tool_calls, + "usage": res.usage, + "metadata": res.metadata, + } + return str(res.content), dbg + resp = await target.generate(prompt) + return str(resp), None + + @staticmethod + def _normalize(text: str) -> str: + """Basic normalization for answer equality checks: lowercase, strip spaces.""" + return "".join(ch.lower() for ch in text.strip() if not ch.isspace()) + + def _parse_answer(self, text: str) -> str: + """Optionally parse final answer from text using provided function. + If no parser provided, returns the original text. + """ + if self.parse_answer_fn is None: + return text + try: + return self.parse_answer_fn(text) + except Exception as exc: + logging.getLogger(__name__).debug("Answer parse error: %s", exc) + return text From b9673fb302ebd950342736641a46326de94f82ec Mon Sep 17 00:00:00 2001 From: ds-radoslaw-izak Date: Thu, 25 Sep 2025 16:53:32 +0200 Subject: [PATCH 21/43] remove temp comment for lint --- .../src/ragbits/evaluate/pipelines/human_eval.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/ragbits-evaluate/src/ragbits/evaluate/pipelines/human_eval.py b/packages/ragbits-evaluate/src/ragbits/evaluate/pipelines/human_eval.py index d888ff4d6..20b933ca8 100644 --- a/packages/ragbits-evaluate/src/ragbits/evaluate/pipelines/human_eval.py +++ b/packages/ragbits-evaluate/src/ragbits/evaluate/pipelines/human_eval.py @@ -209,7 +209,7 @@ async def __call__(self, data: Iterable[HumanEvalData]) -> Iterable[HumanEvalRes try: compile(code, filename="candidate.py", mode="exec") compile_ok.append(True) - except Exception as e: # noqa: BLE001 + except Exception as e: compile_ok.append(False) pass_mask.append(False) durations.append(0.0) From d45415f00c23f53bb2b4f4ac81b8c866562c16ee Mon Sep 17 00:00:00 2001 From: jakubduda-dsai <148433294+jakubduda-dsai@users.noreply.github.com> Date: Fri, 26 Sep 2025 11:12:26 +0200 Subject: [PATCH 22/43] feat: todo list for agent (#823) --- examples/agents/todo_tools_example.py | 120 +++++ packages/ragbits-agents/CHANGELOG.md | 6 + .../src/ragbits/agents/tools/__init__.py | 3 +- .../src/ragbits/agents/tools/todo.py | 484 ++++++++++++++++++ 4 files changed, 612 insertions(+), 1 deletion(-) create mode 100644 examples/agents/todo_tools_example.py create mode 100644 packages/ragbits-agents/src/ragbits/agents/tools/todo.py diff --git a/examples/agents/todo_tools_example.py b/examples/agents/todo_tools_example.py new file mode 100644 index 000000000..691d5f9af --- /dev/null +++ b/examples/agents/todo_tools_example.py @@ -0,0 +1,120 @@ +"""Example demonstrating the new orchestrator-based todo functionality with streaming.""" + +import asyncio +from types import SimpleNamespace + +from ragbits.agents import Agent, ToolCallResult +from ragbits.agents._main import DownstreamAgentResult +from ragbits.agents.tools.todo import TodoOrchestrator, TodoResult +from ragbits.core.llms import LiteLLM, ToolCall +from ragbits.core.llms.base import Usage +from ragbits.core.prompt.base import BasePrompt + +# Type alias for response types +ResponseType = ( + str | ToolCall | ToolCallResult | TodoResult | BasePrompt | Usage | SimpleNamespace | DownstreamAgentResult +) + + +def _handle_response(response: ResponseType) -> None: + """Handle different types of responses from the orchestrator.""" + match response: + case str(): + if response.strip(): + print(response, end="", flush=True) + case ToolCall(): + print(f"\n🔧 Tool Call: {response.name}") + if response.arguments: + print(f" Arguments: {response.arguments}") + case ToolCallResult(): + print(f"🔧 Tool Result: {response.result}") + case TodoResult(): + _handle_streaming_response(response) + + +def _handle_streaming_response(response: TodoResult) -> None: + """Handle TodoResult from the orchestrator.""" + if response.type in ("status", "task_list"): + print(response.message or "") + elif response.type in ("task_summary_start", "final_summary_start"): + print(response.message or "", end="", flush=True) + elif response.type in ("task_completed", "final_summary_end"): + print(response.message or "") + + +async def hiking_guide() -> None: + """Demonstrate the new orchestrator-based todo approach with streaming.""" + # Define the system prompt for hiking guide + hiking_system_prompt = """ + You are an expert hiking guide. Provide detailed, comprehensive information + about hiking routes, gear, transportation, and safety considerations. + """ + + # Create generic orchestrator with hiking domain context + todo_orchestrator = TodoOrchestrator(domain_context="hiking guide") + + # Create a simple agent - orchestrator handles the workflow + agent: Agent = Agent( + llm=LiteLLM("gpt-4o-mini"), + prompt=hiking_system_prompt, + ) + + # Test queries + query = ( + "Plan a 1-day hiking trip for 2 people in Tatra Mountains, Poland. " + "Focus on scenic routes under 15km, avoiding crowds." + ) + # query = "How long is hike to Giewont from Kuźnice?" + + print("=== Generic Todo Orchestrator - Hiking Example ===\n") + + # Run the complete workflow with orchestrator streaming + async for response in todo_orchestrator.run_todo_workflow_streaming(agent, query): + _handle_response(response) + + print("\n🎯 Workflow completed successfully!") + + +async def software_architecture_example() -> None: + """Example showing the orchestrator used for software architecture.""" + software_system_prompt = """ + You are an expert software architect. Provide detailed technical analysis, + system design recommendations, and implementation guidance. + + Always be specific with: + - Technology stack recommendations with versions + - Architecture patterns and design principles + - Performance and scalability considerations + - Security best practices + - Implementation roadmap with timelines + """ + + todo_orchestrator = TodoOrchestrator(domain_context="software architect") + + agent: Agent = Agent( + llm=LiteLLM("gpt-4o-mini"), + prompt=software_system_prompt, + ) + + query = ( + "Design a scalable e-commerce platform for 100k+ users with " + "real-time inventory management and payment processing." + ) + + print("\n" + "=" * 60) + print("=== Generic Todo Orchestrator - Software Architecture Example ===\n") + + async for response in todo_orchestrator.run_todo_workflow_streaming(agent, query): + _handle_response(response) + + print("\n🎯 Software architecture workflow completed!") + + +async def demonstrate_both() -> None: + """Demonstrate both hiking and software architecture examples.""" + await hiking_guide() + # await software_architecture_example() + + +if __name__ == "__main__": + asyncio.run(demonstrate_both()) diff --git a/packages/ragbits-agents/CHANGELOG.md b/packages/ragbits-agents/CHANGELOG.md index 3d0e2b2a3..2d89419cd 100644 --- a/packages/ragbits-agents/CHANGELOG.md +++ b/packages/ragbits-agents/CHANGELOG.md @@ -1,6 +1,12 @@ # CHANGELOG ## Unreleased +- TodoOrchestrator & Todo list for agent (#823) + +- Support wrapping downstream agents as tools (#818) +- Add syntax sugar allowing easier Agents definition (#820) +- Add post-processors (#821) +- Support streaming from downstream agents (#812) - Support wrapping downstream agents as tools (#818) - Add syntax sugar allowing easier Agents definition (#820) diff --git a/packages/ragbits-agents/src/ragbits/agents/tools/__init__.py b/packages/ragbits-agents/src/ragbits/agents/tools/__init__.py index 9bb922491..182f1d405 100644 --- a/packages/ragbits-agents/src/ragbits/agents/tools/__init__.py +++ b/packages/ragbits-agents/src/ragbits/agents/tools/__init__.py @@ -1,3 +1,4 @@ from ragbits.agents.tools.openai import get_code_interpreter_tool, get_image_generation_tool, get_web_search_tool +from ragbits.agents.tools.todo import TodoOrchestrator -__all__ = ["get_code_interpreter_tool", "get_image_generation_tool", "get_web_search_tool"] +__all__ = ["TodoOrchestrator", "get_code_interpreter_tool", "get_image_generation_tool", "get_web_search_tool"] diff --git a/packages/ragbits-agents/src/ragbits/agents/tools/todo.py b/packages/ragbits-agents/src/ragbits/agents/tools/todo.py new file mode 100644 index 000000000..aeb9552fa --- /dev/null +++ b/packages/ragbits-agents/src/ragbits/agents/tools/todo.py @@ -0,0 +1,484 @@ +"""Todo list management tool for agents.""" + +import uuid +from collections.abc import AsyncGenerator +from dataclasses import dataclass, field +from enum import Enum +from types import SimpleNamespace + +from ragbits.agents import Agent +from ragbits.agents._main import DownstreamAgentResult +from ragbits.agents.tool import ToolCallResult +from ragbits.core.llms import ToolCall +from ragbits.core.llms.base import Usage +from ragbits.core.prompt.base import BasePrompt + +# Constants +MAX_SUMMARY_LENGTH = 300 + + +class TaskStatus(str, Enum): + """Task status options.""" + + PENDING = "pending" + IN_PROGRESS = "in_progress" + COMPLETED = "completed" + FAILED = "failed" + CANCELLED = "cancelled" + RETRYING = "retrying" + + +@dataclass +class Task: + """Simple task representation.""" + + id: str + description: str + status: TaskStatus = TaskStatus.PENDING + order: int = 0 + summary: str | None = None + full_response: str | None = None + dependencies: list[str] = field(default_factory=list) + + +@dataclass +class TodoResult: + """Result type for todo workflow.""" + + type: str + message: str | None = None + current_task: Task | None = None + next_task: Task | None = None + tasks: list[Task] | None = None + tasks_count: int | None = None + progress: str | None = None + + +# Type alias for the streaming response union +StreamingResponseType = ( + str | TodoResult | ToolCall | ToolCallResult | BasePrompt | Usage | SimpleNamespace | DownstreamAgentResult +) + + +@dataclass +class TodoList: + """Simple todo list for one agent run.""" + + tasks: list[Task] = field(default_factory=list) + current_index: int = 0 + + def get_current_task(self) -> Task | None: + """Get current task to work on.""" + if self.current_index < len(self.tasks): + return self.tasks[self.current_index] + return None + + def advance_to_next(self) -> None: + """Move to next task.""" + self.current_index += 1 + + def create_tasks(self, task_descriptions: list[str]) -> TodoResult: + """Create tasks from descriptions.""" + if not task_descriptions: + raise ValueError("Tasks required for create action") + + # Clear existing tasks + self.tasks.clear() + self.current_index = 0 + + for i, desc in enumerate(task_descriptions): + task = Task(id=str(uuid.uuid4()), description=desc.strip(), order=i) + self.tasks.append(task) + + return TodoResult( + type="create", + message=f"Created {len(task_descriptions)} tasks", + tasks=self.tasks.copy(), + tasks_count=len(self.tasks), + ) + + def get_current(self) -> TodoResult: + """Get current task information.""" + current = self.get_current_task() + if not current: + return TodoResult(type="get_current", message="All tasks completed!", current_task=None) + + return TodoResult( + type="get_current", + message=f"Current task: {current.description}", + current_task=current, + progress=f"{self.current_index + 1}/{len(self.tasks)}", + ) + + def start_current_task(self) -> TodoResult: + """Start the current task.""" + current = self.get_current_task() + if not current: + raise ValueError("No current task to start") + + current.status = TaskStatus.IN_PROGRESS + return TodoResult(type="start_task", message=f"Started task: {current.description}", current_task=current) + + def complete_current_task(self, summary: str) -> TodoResult: + """Complete the current task with summary.""" + if not summary: + raise ValueError("Summary required for complete_task") + + current = self.get_current_task() + if not current: + raise ValueError("No current task to complete") + + if current.status != TaskStatus.IN_PROGRESS: + raise ValueError("Task must be started before completing") + + current.status = TaskStatus.COMPLETED + current.summary = summary.strip() + self.advance_to_next() + + next_task = self.get_current_task() + completed_count = sum(1 for t in self.tasks if t.status == TaskStatus.COMPLETED) + + return TodoResult( + type="complete_task", + message=f"Completed: {current.description}", + current_task=current, + next_task=next_task, + progress=f"{completed_count}/{len(self.tasks)}", + ) + + def get_completed_context(self) -> str: + """Get context from all completed tasks.""" + completed_tasks = [t for t in self.tasks if t.status == TaskStatus.COMPLETED] + if not completed_tasks: + return "No previous tasks completed yet." + + context_parts = [] + for i, task in enumerate(completed_tasks, 1): + context_parts.append(f"{i}. {task.description}: {task.summary or 'Completed'}") + + return "Previous completed tasks:\n" + "\n".join(context_parts) + + +@dataclass +class TodoOrchestrator: + """High-level orchestrator for managing todo workflow with context passing.""" + + todo_list: TodoList = field(default_factory=TodoList) + domain_context: str = "" + + def __init__(self, domain_context: str = ""): + """ + Initialize TodoOrchestrator with domain-specific prompts. + + Args: + domain_context: Additional context about the domain (e.g., "hiking guide", "software architect", etc.) + """ + self.todo_list = TodoList() + self.domain_context = domain_context + + async def run_todo_workflow_streaming( + self, agent: Agent, initial_query: str + ) -> AsyncGenerator[StreamingResponseType, None]: + """ + Run complete todo workflow with streaming responses. + + Yields: + Various response types: str, ToolCall, ToolResult, dict (status updates) + """ + yield TodoResult(type="status", message="🚀 Starting todo workflow...") + + # Step 1: Analyze complexity and create tasks if needed + yield TodoResult(type="status", message="🔍 Analyzing query complexity...") + + tasks = await self._create_tasks_simple(agent, initial_query) + + if not tasks: + # Query is simple - answer directly without task breakdown + yield TodoResult(type="status", message="💡 Simple query detected - providing direct answer...") + + # Create a focused prompt for direct answering + direct_prompt = f""" + Answer this query directly and comprehensively: + + "{initial_query}" + + {f"Context: You are working as a {self.domain_context}." if self.domain_context else ""} + + Provide a clear, complete answer without unnecessary complexity. + """ + + # Stream the direct answer + async for response in agent.run_streaming(direct_prompt): + if isinstance(response, str): + yield response + else: + yield response # Pass through tool calls, etc. + + yield TodoResult(type="status", message="\n🎯 Direct answer completed!") + return + + # Complex query - proceed with task breakdown + yield TodoResult(type="status", message=f"📋 Complex query - created {len(tasks)} tasks:") + for i, task in enumerate(tasks, 1): + yield TodoResult(type="task_list", message=f" {i}. {task}") + + # Step 2: Execute each task with context from previous tasks + task_summaries = [] + + while True: + current_task_info = self.todo_list.get_current() + current_task = current_task_info.current_task + if current_task is None: + break + + yield TodoResult( + type="task_summary_start", + message=f"\n🔧 Task {current_task_info.progress}: {current_task.description}\n", + ) + + # Get context from previous completed tasks + context = self.todo_list.get_completed_context() + + # Execute single task with focused context and stream summary + async for task_response in self._execute_single_task_focused(agent, current_task, context, initial_query): + yield task_response + + # Get the completed task summary + completed_tasks = [t for t in self.todo_list.tasks if t.status == TaskStatus.COMPLETED] + if completed_tasks: + latest_summary = completed_tasks[-1].summary + task_summaries.append(latest_summary) + yield TodoResult(type="task_completed", message="\n✅ Task completed\n") + + # Step 3: Generate comprehensive final summary with streaming + yield TodoResult(type="status", message="📝 Generating comprehensive final summary...") + yield TodoResult( + type="final_summary_start", + message=f"\n📊 COMPREHENSIVE {self.domain_context.upper()} SUMMARY:\n" + "=" * 60 + "\n", + ) + + async for summary_response in self._generate_comprehensive_summary_streaming( + agent, initial_query, task_summaries + ): + yield summary_response + + yield TodoResult(type="final_summary_end", message="\n" + "=" * 60) + yield TodoResult(type="status", message="🎉 All tasks completed!") + + @staticmethod + async def _analyze_query_complexity(agent: Agent, query: str) -> bool: + """ + Analyze if the query requires task breakdown or can be answered directly. + Returns True if complex (needs tasks), False if simple (direct answer). + """ + complexity_prompt = f""" + Analyze this query and determine if it requires a multi-step breakdown or can be answered directly. + + Query: "{query}" + + Consider these factors: + - Simple factual questions (What is...? Who is...? When did...?) = SIMPLE + - Yes/No questions = SIMPLE + - Single concept explanations = SIMPLE + - Questions requiring research, planning, or multiple steps = COMPLEX + - Questions asking for comprehensive analysis, comparisons, or detailed guides = COMPLEX + - Questions with multiple parts or requiring extensive information = COMPLEX + + Respond with ONLY one word: "SIMPLE" or "COMPLEX" + """ + + agent_result = await agent.run(complexity_prompt) + response = agent_result.content.strip().upper() + + # Default to COMPLEX if we can't determine (safer approach) + return response != "SIMPLE" + + async def _create_tasks_simple(self, agent: Agent, initial_query: str) -> list[str]: + """Create tasks based on initial query - simple, non-streaming.""" + # First, analyze if the query actually needs task breakdown + is_complex = await TodoOrchestrator._analyze_query_complexity(agent, initial_query) + + if not is_complex: + # Query is simple enough to answer directly - return empty task list + return [] + + task_creation_prompt = f""" + Based on this query: "{initial_query}" + + Create 3-5 specific, actionable tasks that will comprehensively address this query. + Each task should be clear and focused on one specific aspect. + + {f"Context: You are working as a {self.domain_context}." if self.domain_context else ""} + + CRITICAL: Respond with ONLY a Python list of task descriptions, nothing else: + ["Task 1: Specific description", "Task 2: Specific description", "Task 3: Specific description"] + """ + + agent_result = await agent.run(task_creation_prompt) + response = agent_result.content + + # Parse tasks from the response + tasks = self._parse_tasks_from_response(response) + if tasks: + self.todo_list.create_tasks(tasks) + return tasks + + return [] + + async def _execute_single_task_focused( + self, agent: Agent, current_task: Task, context: str, original_query: str + ) -> AsyncGenerator[StreamingResponseType, None]: + """Execute a single task with focused context - stream only essential info.""" + task_prompt = f""" + You are working on ONE SPECIFIC TASK as part of a larger workflow. + + ORIGINAL QUERY: {original_query} + + YOUR CURRENT TASK: {current_task.description} + + CONTEXT FROM PREVIOUS TASKS: + {context} + + CRITICAL INSTRUCTIONS: + 1. Focus EXCLUSIVELY on your current task - do not overlap with other tasks + 2. Use previous context to avoid repetition but DO NOT duplicate their work + 3. Be comprehensive but stay within your task scope + 4. End with: TASK SUMMARY: [2-3 sentence summary] + + Complete ONLY your assigned task now. + """ + + # Mark task as started + self.todo_list.start_current_task() + + full_response = "" + last_summary_length = 0 + + # Stream the task execution but only show summary parts + async for response in agent.run_streaming(task_prompt): + if isinstance(response, str): + full_response += response + # Only stream text that comes after "TASK SUMMARY:" marker + if "TASK SUMMARY:" in full_response: + summary_start = full_response.find("TASK SUMMARY:") + len("TASK SUMMARY:") + summary_text = full_response[summary_start:].strip() + if summary_text and len(summary_text) > last_summary_length: + # Stream only new characters + new_chars = summary_text[last_summary_length:] + if new_chars: + yield new_chars + last_summary_length = len(summary_text) + else: + yield response # Pass through tool calls, etc. + + # Extract final summary and complete task + summary = self._extract_summary_from_response(full_response) + + # Store the full response for final summary generation + current_task_obj = self.todo_list.get_current_task() + if current_task_obj: + current_task_obj.full_response = full_response + + self.todo_list.complete_current_task(summary) + + async def _generate_comprehensive_summary_streaming( + self, agent: Agent, original_query: str, task_summaries: list[str | None] + ) -> AsyncGenerator[StreamingResponseType, None]: + """Generate a comprehensive final summary with streaming.""" + # Get full responses from completed tasks + full_responses = [] + for task in self.todo_list.tasks: + if task.status == TaskStatus.COMPLETED and hasattr(task, "full_response"): + full_responses.append(f"**{task.description}**:\n{task.full_response}") + + # Create domain-specific summary instructions + domain_instructions = "" + if self.domain_context: + domain_instructions = ( + f"Format as a comprehensive {self.domain_context} response that someone " + "could use to address their needs." + ) + else: + domain_instructions = "Format as a comprehensive, well-structured response." + + summary_prompt = f""" + You need to create a comprehensive final summary for this query: "{original_query}" + + Here are the detailed results from all completed tasks: + + {chr(10).join(full_responses)} + + Create a comprehensive, well-structured final summary that: + 1. Directly answers the original query + 2. Combines all the detailed information from the tasks + 3. Organizes information logically and coherently + 4. Provides actionable recommendations + 5. Is complete and self-contained + + {domain_instructions} + """ + + # Stream the comprehensive summary generation + async for response in agent.run_streaming(summary_prompt): + if isinstance(response, str): + yield response # Stream each character as it comes + else: + yield response # Pass through tool calls, etc. + + @staticmethod + def _parse_tasks_from_response(response: str) -> list[str]: + """Parse task list from agent response.""" + try: + import ast + + # The prompt asks for ONLY a Python list, so try direct parsing first + response = response.strip() + + # Try to parse the entire response as a Python literal + try: + tasks = ast.literal_eval(response) + if isinstance(tasks, list) and all(isinstance(t, str) for t in tasks): + return tasks + except (ValueError, SyntaxError): + pass + + # Fallback: Look for the first list in the response + import re + + list_pattern = r"\[.*?\]" + match = re.search(list_pattern, response, re.DOTALL) + if match: + try: + tasks = ast.literal_eval(match.group()) + if isinstance(tasks, list) and all(isinstance(t, str) for t in tasks): + return tasks + except (ValueError, SyntaxError): + pass + + print(f"Could not parse tasks from response: {response[:200]}...") + + except Exception as e: + print(f"Failed to parse tasks: {e}") + + return [] + + @staticmethod + def _extract_summary_from_response(response: str) -> str: + """Extract task summary from agent response.""" + summary_marker = "TASK SUMMARY:" + if summary_marker in response: + parts = response.split(summary_marker) + summary = parts[-1].strip() + # Clean up the summary (remove extra formatting) + summary = summary.replace("\n", " ").strip() + return summary + else: + # Fallback: use last paragraph as summary + paragraphs = [p.strip() for p in response.split("\n\n") if p.strip()] + if paragraphs: + summary = paragraphs[-1] + # Limit length and clean up + if len(summary) > MAX_SUMMARY_LENGTH: + summary = summary[:MAX_SUMMARY_LENGTH] + "..." + return summary + return "Task completed" From 09f94e4ce3ff04130d46923e479d626bec307bd0 Mon Sep 17 00:00:00 2001 From: Maciej Kurzawa <68014263+mackurzawa@users.noreply.github.com> Date: Fri, 26 Sep 2025 18:34:08 +0200 Subject: [PATCH 23/43] feat: introduce supervisor post processor (#830) --- docs/api_reference/agents/index.md | 2 + docs/how-to/agents/use_post_processors.md | 111 +++++++- packages/ragbits-agents/CHANGELOG.md | 1 + .../src/ragbits/agents/_main.py | 2 +- .../agents/post_processors/__init__.py | 3 +- .../ragbits/agents/post_processors/base.py | 29 +- .../agents/post_processors/exceptions.py | 17 ++ .../agents/post_processors/supervisor.py | 236 ++++++++++++++++ .../test_base_post_processors.py} | 10 +- .../unit/post_processors/test_supervisor.py | 263 ++++++++++++++++++ 10 files changed, 652 insertions(+), 22 deletions(-) create mode 100644 packages/ragbits-agents/src/ragbits/agents/post_processors/exceptions.py create mode 100644 packages/ragbits-agents/src/ragbits/agents/post_processors/supervisor.py rename packages/ragbits-agents/tests/unit/{test_post_processors.py => post_processors/test_base_post_processors.py} (95%) create mode 100644 packages/ragbits-agents/tests/unit/post_processors/test_supervisor.py diff --git a/docs/api_reference/agents/index.md b/docs/api_reference/agents/index.md index a1d59bd0f..70fbb771a 100644 --- a/docs/api_reference/agents/index.md +++ b/docs/api_reference/agents/index.md @@ -12,4 +12,6 @@ ::: ragbits.agents.post_processors.base +::: ragbits.agents.post_processors.supervisor + ::: ragbits.agents.AgentRunContext diff --git a/docs/how-to/agents/use_post_processors.md b/docs/how-to/agents/use_post_processors.md index aef223be7..33893e63e 100644 --- a/docs/how-to/agents/use_post_processors.md +++ b/docs/how-to/agents/use_post_processors.md @@ -1,12 +1,16 @@ # How-To: Use Post-Processors with Ragbits Agents -Ragbits Agents can be enhanced with post-processors to intercept, log, filter, and modify their outputs. This guide explains how to implement and use post-processors to customize agent responses. +Ragbits Agents can be enhanced with post-processors to intercept, validate, log, filter, and modify their outputs. In this guide you will learn how to: + +- Create custom post-processors (streaming and non-streaming) +- Attach post-processors to agents in run and streaming modes +- Use and configure the built-in Supervisor post-processor ## Post-Processors Overview Ragbits provides two types of post-processors: -- **PostProcessor**: Processes the final output after generation, ideal for batch processing. +- **PostProcessor**: Processes the final output after generation, ideal for end-of-run processing. - **StreamingPostProcessor**: Processes outputs as they are generated, suitable for real-time applications. ### Implementing a custom Post-Processor @@ -22,7 +26,7 @@ class TruncateProcessor(PostProcessor): def __init__(self, max_length: int = 50) -> None: self.max_length = max_length - async def process(self, result, agent): + async def process(self, result, agent, options=None, context=None): content = result.content if len(content) > self.max_length: content = content[:self.max_length] + "... [TRUNCATED]" @@ -54,7 +58,11 @@ async def main() -> None: UpperCaseStreamingProcessor(), TruncateProcessor(max_length=50), ] - stream_result = agent.run_streaming("Tell me about the history of AI.", post_processors=post_processors, allow_non_streaming=True) + stream_result = agent.run_streaming( + "Tell me about the history of AI.", + post_processors=post_processors, + allow_non_streaming=True + ) async for chunk in stream_result: if isinstance(chunk, str): print(chunk, end="") @@ -62,3 +70,98 @@ async def main() -> None: ``` Post-processors offer a flexible way to tailor agent outputs, whether filtering content in real-time or transforming final outputs. + +## Built-in Post-Processors + +### Supervisor + +The [`SupervisorPostProcessor`][ragbits.agents.post_processors.supervisor.SupervisorPostProcessor] validates the agent’s final response against the executed tool calls and, if needed, triggers an automatic rerun with a correction prompt. It helps catch inconsistencies (e.g., when the response contradicts tool output) and guide the agent to refine its answer. The Supervisor is a non-streaming post-processor: it runs after generation has completed, validating the final output before optionally issuing a correction rerun. + +Key capabilities: + +- Validates the last assistant response using an LLM-powered validation prompt +- Optionally reruns the agent with a formatted correction prompt derived from validation feedback +- Supports preserving or pruning intermediate history +- Attaches validation metadata to the final `AgentResult` + +#### Quick start + +```python +from ragbits.agents import Agent +from ragbits.agents.post_processors import SupervisorPostProcessor +from ragbits.agents.post_processors.supervisor import HistoryStrategy +from ragbits.core.llms.litellm import LiteLLM + +llm = LiteLLM("gpt-4o-mini", use_structured_output=True) +supervisor = SupervisorPostProcessor( + llm=llm, + max_retries=2, + fail_on_exceed=False, + history_strategy=HistoryStrategy.PRESERVE, # Default HistoryStrategy is REMOVE +) + +agent = Agent( + llm=llm, + prompt="You are a helpful assistant.", +) + +result = await agent.run( + "What is the weather in Tokyo?", + post_processors=[supervisor], +) +``` + +#### Configuration + +- **llm**: LLM used for validation and formatting structured outputs +- **validation_prompt**: Optional custom prompt class describing the validation output schema +- **correction_prompt**: Optional format string used to create a correction message from validation output +- **max_retries**: How many times to attempt correction-driven reruns +- **fail_on_exceed**: If `True`, raises when retries are exhausted; otherwise returns last result with metadata +- **history_strategy**: + - `PRESERVE`: keep all messages, including the correction user message and rerun assistant message + - `REMOVE`: prune the invalid assistant message and the correction user message, keeping the final assistant response succinctly + +#### Custom structured validation and correction + +You can define a custom validation output model and prompt to shape the supervisor feedback and correction message: + +```python +from pydantic import BaseModel +from ragbits.core.prompt.prompt import Prompt +from ragbits.agents.post_processors.supervisor import ValidationInput + +class MyValidationOutput(BaseModel): + is_valid: bool + errors: list[str] + fixes: list[str] + confidence: float + +class MyValidationPrompt(Prompt[ValidationInput, MyValidationOutput]): + system_prompt = "You are an expert validator. Provide clear, actionable feedback." + user_prompt = ( + "Chat History:\n" + "{% for message in chat_history %}" + "\n{{ message.role | title }}: {{ message.content }} (if None it means it's a tool call)" + "{% endfor %}" + "\n\nList all errors, possible fixes, and provide a confidence score (0.0-1.0) for your assessment.\n" + ) + +correction_prompt = ( + "Previous answer had issues:\n" + "Errors: {errors}\n" + "Fixes: {fixes}\n" + "Confidence: {confidence}\n" + "Please answer again using the fixes." +) + +supervisor = SupervisorPostProcessor( + llm=llm, + validation_prompt=MyValidationPrompt, + correction_prompt=correction_prompt, + max_retries=1, + history_strategy=HistoryStrategy.PRESERVE, +) +``` + +The Supervisor appends validation records to `result.metadata` under the `post_processors.supervisor` key as a list of dicts; each entry corresponds to a validation step. diff --git a/packages/ragbits-agents/CHANGELOG.md b/packages/ragbits-agents/CHANGELOG.md index 2d89419cd..a1fb79a83 100644 --- a/packages/ragbits-agents/CHANGELOG.md +++ b/packages/ragbits-agents/CHANGELOG.md @@ -12,6 +12,7 @@ - Add syntax sugar allowing easier Agents definition (#820) - Add post-processors (#821) - Support streaming from downstream agents (#812) +- Add supervisor post-processor (#830) ## 1.3.0 (2025-09-11) ### Changed diff --git a/packages/ragbits-agents/src/ragbits/agents/_main.py b/packages/ragbits-agents/src/ragbits/agents/_main.py index e7c347100..ed994310e 100644 --- a/packages/ragbits-agents/src/ragbits/agents/_main.py +++ b/packages/ragbits-agents/src/ragbits/agents/_main.py @@ -415,7 +415,7 @@ async def run( if post_processors: for processor in post_processors: - result = await processor.process(result, self) + result = await processor.process(result, self, options, context) return result diff --git a/packages/ragbits-agents/src/ragbits/agents/post_processors/__init__.py b/packages/ragbits-agents/src/ragbits/agents/post_processors/__init__.py index a00a4d209..f291a1d99 100644 --- a/packages/ragbits-agents/src/ragbits/agents/post_processors/__init__.py +++ b/packages/ragbits-agents/src/ragbits/agents/post_processors/__init__.py @@ -3,5 +3,6 @@ """ from .base import BasePostProcessor, PostProcessor, StreamingPostProcessor +from .supervisor import SupervisorPostProcessor -__all__ = ["BasePostProcessor", "PostProcessor", "StreamingPostProcessor"] +__all__ = ["BasePostProcessor", "PostProcessor", "StreamingPostProcessor", "SupervisorPostProcessor"] diff --git a/packages/ragbits-agents/src/ragbits/agents/post_processors/base.py b/packages/ragbits-agents/src/ragbits/agents/post_processors/base.py index 4f38e13ca..c1e46b1e7 100644 --- a/packages/ragbits-agents/src/ragbits/agents/post_processors/base.py +++ b/packages/ragbits-agents/src/ragbits/agents/post_processors/base.py @@ -1,21 +1,18 @@ from abc import ABC, abstractmethod from collections.abc import AsyncGenerator from types import SimpleNamespace -from typing import TYPE_CHECKING, Generic, TypeVar, cast +from typing import TYPE_CHECKING, Generic, Optional, cast from ragbits.agents.tool import ToolCallResult -from ragbits.core.llms.base import LLMOptions, ToolCall, Usage +from ragbits.core.llms.base import LLMClientOptionsT, ToolCall, Usage from ragbits.core.prompt.base import BasePrompt from ragbits.core.prompt.prompt import PromptInputT, PromptOutputT if TYPE_CHECKING: - from ragbits.agents._main import Agent, AgentResult + from ragbits.agents._main import Agent, AgentOptions, AgentResult, AgentRunContext -LLMOptionsT = TypeVar("LLMOptionsT", bound=LLMOptions) - - -class BasePostProcessor(Generic[LLMOptionsT, PromptInputT, PromptOutputT]): +class BasePostProcessor(Generic[LLMClientOptionsT, PromptInputT, PromptOutputT]): """Base class for post-processors.""" @property @@ -32,7 +29,7 @@ def supports_streaming(self) -> bool: """ -class PostProcessor(ABC, BasePostProcessor[LLMOptionsT, PromptInputT, PromptOutputT]): +class PostProcessor(ABC, BasePostProcessor[LLMClientOptionsT, PromptInputT, PromptOutputT]): """Base class for non-streaming post-processors.""" @property @@ -44,7 +41,9 @@ def supports_streaming(self) -> bool: async def process( self, result: "AgentResult[PromptOutputT]", - agent: "Agent[LLMOptionsT, PromptInputT, PromptOutputT]", + agent: "Agent[LLMClientOptionsT, PromptInputT, PromptOutputT]", + options: Optional["AgentOptions[LLMClientOptionsT]"] = None, + context: Optional["AgentRunContext"] = None, ) -> "AgentResult[PromptOutputT]": """ Process the complete agent result. @@ -53,13 +52,15 @@ async def process( result: The complete AgentResult from the agent or previous post-processor. agent: The Agent instance that generated the result. Can be used to re-run the agent with modified input if needed. + options: The options for the agent run. + context: The context for the agent run. Returns: Modified AgentResult to pass to the next processor or return as final result. """ -class StreamingPostProcessor(ABC, BasePostProcessor[LLMOptionsT, PromptInputT, PromptOutputT]): +class StreamingPostProcessor(ABC, BasePostProcessor[LLMClientOptionsT, PromptInputT, PromptOutputT]): """Base class for streaming post-processors.""" @property @@ -71,7 +72,7 @@ def supports_streaming(self) -> bool: async def process_streaming( self, chunk: str | ToolCall | ToolCallResult | SimpleNamespace | BasePrompt | Usage, - agent: "Agent[LLMOptionsT, PromptInputT, PromptOutputT]", + agent: "Agent[LLMClientOptionsT, PromptInputT, PromptOutputT]", ) -> str | ToolCall | ToolCallResult | SimpleNamespace | BasePrompt | Usage: """ Process chunks during streaming. @@ -89,10 +90,10 @@ async def process_streaming( async def stream_with_post_processing( generator: AsyncGenerator[str | ToolCall | ToolCallResult | SimpleNamespace | BasePrompt | Usage], post_processors: ( - list[StreamingPostProcessor[LLMOptionsT, PromptInputT, PromptOutputT]] - | list[BasePostProcessor[LLMOptionsT, PromptInputT, PromptOutputT]] + list[StreamingPostProcessor[LLMClientOptionsT, PromptInputT, PromptOutputT]] + | list[BasePostProcessor[LLMClientOptionsT, PromptInputT, PromptOutputT]] ), - agent: "Agent[LLMOptionsT, PromptInputT, PromptOutputT]", + agent: "Agent[LLMClientOptionsT, PromptInputT, PromptOutputT]", ) -> AsyncGenerator[str | ToolCall | ToolCallResult | SimpleNamespace | BasePrompt | Usage]: """ Stream with support for both streaming and non-streaming post-processors. diff --git a/packages/ragbits-agents/src/ragbits/agents/post_processors/exceptions.py b/packages/ragbits-agents/src/ragbits/agents/post_processors/exceptions.py new file mode 100644 index 000000000..f7588038d --- /dev/null +++ b/packages/ragbits-agents/src/ragbits/agents/post_processors/exceptions.py @@ -0,0 +1,17 @@ +class SupervisorMaxRetriesExceededError(Exception): + """Raised when SupervisorPostProcessor exceeds the maximum number of retries.""" + + def __init__(self, max_retries: int, last_validations: list | None = None) -> None: + self.max_retries = max_retries + self.last_validations = last_validations or [] + super().__init__(f"Supervisor: maximum retries ({max_retries}) exceeded.") + + +class SupervisorCorrectionPromptFormatError(Exception): + """Raised when SupervisorPostProcessor cannot format the correction prompt.""" + + def __init__(self, missing_keys: list[str] | None = None, original_error: Exception | None = None) -> None: + self.missing_keys = missing_keys or [] + self.original_error = original_error + details = f" Missing keys: {', '.join(self.missing_keys)}." if self.missing_keys else "" + super().__init__(f"Supervisor: failed to format correction prompt.{details}") diff --git a/packages/ragbits-agents/src/ragbits/agents/post_processors/supervisor.py b/packages/ragbits-agents/src/ragbits/agents/post_processors/supervisor.py new file mode 100644 index 000000000..4eece4b24 --- /dev/null +++ b/packages/ragbits-agents/src/ragbits/agents/post_processors/supervisor.py @@ -0,0 +1,236 @@ +from enum import Enum +from typing import TYPE_CHECKING, Any, Generic, Optional, Protocol, TypeVar, cast + +from pydantic import BaseModel + +from ragbits.agents.post_processors.base import PostProcessor +from ragbits.agents.post_processors.exceptions import ( + SupervisorCorrectionPromptFormatError, + SupervisorMaxRetriesExceededError, +) +from ragbits.core.llms.base import LLM, LLMClientOptionsT +from ragbits.core.prompt.prompt import ChatFormat, Prompt, PromptInputT, PromptOutputT + +if TYPE_CHECKING: + from ragbits.agents._main import Agent, AgentOptions, AgentResult, AgentRunContext + + +class HistoryStrategy(str, Enum): + """Strategy for handling the chat history.""" + + PRESERVE = "preserve" + REMOVE = "remove" + + +class SupportsValidation(Protocol): + """Protocol for post-processors that support validation.""" + + is_valid: bool + + def model_dump(self, *args: Any, **kwargs: Any) -> dict[str, Any]: + """Return a dict of model fields (compatible with BaseModel.model_dump).""" + ... + + +ValidationOutputT = TypeVar("ValidationOutputT", bound=SupportsValidation) + + +class ValidationOutput(BaseModel): + """Result of the validation process for agent responses.""" + + is_valid: bool + """Whether the response is valid based on tool calls.""" + + reasoning: str + """Explanation of the validation decision.""" + + suggestion: str + """Suggestion for correction.""" + + +class ValidationInput(BaseModel): + """Input data for the validation prompt.""" + + chat_history: ChatFormat + """The complete chat history for context.""" + + +class DefaultSupervisorPrompt(Prompt[ValidationInput, ValidationOutput]): + """ + Default prompt for validating agent responses against tool call results. + """ + + system_prompt = """ + You are an expert validator that analyzes whether an AI agent's response is logically consistent + with the tool calls it executed and their results. Your job is to determine if the response + could reasonably be generated based on the available information from the tools. + + Analyze the following: + 1. Whether the response content is supported by the tool call results + 2. If any claims in the response contradict the tool data + 3. If the response makes assumptions not supported by the tool results + 4. Whether the response appropriately handles cases where tools failed or returned no data + 5. Whether the response actually answers the user's question + 6. Whether the response is factually correct based on available evidence + + IMPORTANT VALIDATION RULES: + - Only flag as INVALID if the answer is clearly incorrect or contradicts the tool results + - If the answer cannot be determined to be true because it's basic/common knowledge not covered by tools, + consider it as VALID + - If the response doesn't directly answer the user's question, flag as INVALID + - Be strict but fair - flag clear inconsistencies while allowing for reasonable inference + and interpretation of the tool results + """ + + user_prompt = ( + "Chat History:\n" + "{% for message in chat_history %}\n" + "{{ message.role | title }}: " + "{% if message.content is none %}" + "{% for tool_call in message.tool_calls %}" + "called tool: " + "{{ tool_call.function.name }}({{ tool_call.function.arguments | tojson }})" + "{% if not loop.last %} {% endif %}" + "{% endfor %}" + "{% else %}{{ message.content }}{% endif %}" + "{% endfor %}\n" + "\nPlease validate whether the last assistant's response is logically consistent with the tool call results " + "and the conversation context." + ) + + +DEFAULT_CORRECTION_PROMPT = ( + "Your answer is incorrect. Below you will find the reasoning and suggestion for correction.\n" + "Reasoning: {reasoning}\n" + "Suggestion: {suggestion}\n" + "Please answer again, considering the reasoning and suggestion.\n" +) + + +class SupervisorPostProcessor( + PostProcessor[LLMClientOptionsT, PromptInputT, PromptOutputT], + Generic[LLMClientOptionsT, PromptInputT, ValidationOutputT, PromptOutputT], +): + """ + Post-processor that validates agent responses against executed tool calls. + + This supervisor uses an LLM to analyze whether the agent's final response + is logically consistent with the results of the tool calls it executed. + """ + + def __init__( + self, + llm: LLM[LLMClientOptionsT], + validation_prompt: type[Prompt[ValidationInput, ValidationOutputT]] | None = None, + correction_prompt: str | None = None, + max_retries: int = 3, + fail_on_exceed: bool = True, + history_strategy: HistoryStrategy = HistoryStrategy.REMOVE, + ) -> None: + self.llm = llm + self.validation_prompt: type[Prompt[ValidationInput, ValidationOutputT]] = cast( + type[Prompt[ValidationInput, ValidationOutputT]], + validation_prompt or DefaultSupervisorPrompt, + ) + self.correction_prompt = correction_prompt or DEFAULT_CORRECTION_PROMPT + self.max_retries = max_retries + self.fail_on_exceed = fail_on_exceed + self.history_strategy = history_strategy + + async def process( + self, + result: "AgentResult[PromptOutputT]", + agent: "Agent[LLMClientOptionsT, PromptInputT, PromptOutputT]", + options: Optional["AgentOptions[LLMClientOptionsT]"] = None, + context: Optional["AgentRunContext"] = None, + ) -> "AgentResult[PromptOutputT]": + """ + Validate the agent's response and, if necessary, rerun with corrections. + """ + retries = 0 + current_result = result + validations: list[ValidationOutputT] = [] + accumulated_tool_calls: list = [] + agent.history = result.history + + while retries <= self.max_retries: + validation = await self._validate(current_result) + validations.append(validation) + accumulated_tool_calls.extend(current_result.tool_calls or []) + current_result.tool_calls = accumulated_tool_calls + + if validation.is_valid: + if not agent.keep_history: + agent.history = [] + return self._attach_metadata(current_result, validations) + + if retries == self.max_retries: + if self.fail_on_exceed: + raise SupervisorMaxRetriesExceededError(self.max_retries, validations) + if not agent.keep_history: + agent.history = [] + return self._attach_metadata(current_result, validations) + + last_assistant_index = len(current_result.history) - 1 + current_result = await self._rerun(agent, validation, options, context) + current_result = self._handle_history(current_result, last_assistant_index) + retries += 1 + + if not agent.keep_history: + agent.history = [] + return self._attach_metadata(current_result, validations) + + async def _validate(self, result: "AgentResult[PromptOutputT]") -> ValidationOutputT: + """ + Run the validation prompt on the agent result. + """ + input_data = ValidationInput(chat_history=result.history) + prompt = self.validation_prompt(input_data) + return await self.llm.generate(prompt) + + async def _rerun( + self, + agent: "Agent[LLMClientOptionsT, PromptInputT, PromptOutputT]", + validation: ValidationOutputT, + options: Optional["AgentOptions[LLMClientOptionsT]"] = None, + context: Optional["AgentRunContext"] = None, + ) -> "AgentResult[PromptOutputT]": + """ + Rerun the agent with a correction prompt based on validation feedback. + """ + try: + correction_prompt = self.correction_prompt.format(**validation.model_dump()) + except KeyError as exc: + missing = [str(exc).strip("'\"")] + raise SupervisorCorrectionPromptFormatError(missing_keys=missing, original_error=exc) from exc + except Exception as exc: + raise SupervisorCorrectionPromptFormatError(original_error=exc) from exc + + return await agent._run_without_post_processing(correction_prompt, options, context) + + @staticmethod + def _attach_metadata( + result: "AgentResult[PromptOutputT]", + validations: list[ValidationOutputT], + ) -> "AgentResult[PromptOutputT]": + """ + Attach validation metadata to the agent result. + """ + result.metadata.setdefault("post_processors", {}).setdefault("supervisor", []).extend( + [v.model_dump() for v in validations] + ) + return result + + def _handle_history( + self, + result: "AgentResult[PromptOutputT]", + last_assistant_index: int, + ) -> "AgentResult[PromptOutputT]": + """ + Handle the chat history according to the configured strategy. + """ + if self.history_strategy == HistoryStrategy.REMOVE: + result.history.pop(last_assistant_index + 1) + result.history.pop(last_assistant_index) + + return result diff --git a/packages/ragbits-agents/tests/unit/test_post_processors.py b/packages/ragbits-agents/tests/unit/post_processors/test_base_post_processors.py similarity index 95% rename from packages/ragbits-agents/tests/unit/test_post_processors.py rename to packages/ragbits-agents/tests/unit/post_processors/test_base_post_processors.py index b71216267..1fa0d592b 100644 --- a/packages/ragbits-agents/tests/unit/test_post_processors.py +++ b/packages/ragbits-agents/tests/unit/post_processors/test_base_post_processors.py @@ -2,7 +2,7 @@ import pytest -from ragbits.agents import Agent, AgentResult, ToolCallResult +from ragbits.agents import Agent, AgentOptions, AgentResult, AgentRunContext, ToolCallResult from ragbits.agents.exceptions import AgentInvalidPostProcessorError from ragbits.agents.post_processors.base import PostProcessor, StreamingPostProcessor from ragbits.core.llms.base import BasePrompt, ToolCall, Usage @@ -13,7 +13,13 @@ class MockPostProcessor(PostProcessor): def __init__(self, append_content: str = " - processed"): self.append_content = append_content - async def process(self, result: AgentResult, agent: Agent) -> AgentResult: + async def process( + self, + result: AgentResult, + agent: Agent, + options: AgentOptions | None = None, + context: AgentRunContext | None = None, + ) -> AgentResult: result.content += self.append_content return result diff --git a/packages/ragbits-agents/tests/unit/post_processors/test_supervisor.py b/packages/ragbits-agents/tests/unit/post_processors/test_supervisor.py new file mode 100644 index 000000000..96057248c --- /dev/null +++ b/packages/ragbits-agents/tests/unit/post_processors/test_supervisor.py @@ -0,0 +1,263 @@ +import pytest +from pydantic import BaseModel + +from ragbits.agents import Agent +from ragbits.agents.post_processors.exceptions import ( + SupervisorCorrectionPromptFormatError, + SupervisorMaxRetriesExceededError, +) +from ragbits.agents.post_processors.supervisor import ( + HistoryStrategy, + SupervisorPostProcessor, + ValidationInput, + ValidationOutput, +) +from ragbits.core.llms.mock import MockLLM, MockLLMOptions +from ragbits.core.prompt.prompt import Prompt + + +class AlwaysValidPrompt(Prompt[ValidationInput, ValidationOutput]): + system_prompt = "You are a validator." + user_prompt = "Validate last response." + + +class AlwaysInvalidPrompt(Prompt[ValidationInput, ValidationOutput]): + system_prompt = "You are a validator." + user_prompt = "Validate last response." + + +@pytest.fixture +def agent_llm() -> MockLLM: + return MockLLM(default_options=MockLLMOptions(response="Agent answer")) + + +@pytest.mark.asyncio +async def test_supervisor_accepts_valid_response_and_attaches_metadata(agent_llm: MockLLM) -> None: + agent: Agent = Agent(llm=agent_llm, prompt="System prompt for agent") + + validation_llm = MockLLM( + default_options=MockLLMOptions(response='{"is_valid": true, "reasoning": "ok", "suggestion": ""}') + ) + + supervisor: SupervisorPostProcessor = SupervisorPostProcessor( + llm=validation_llm, + validation_prompt=AlwaysValidPrompt, + max_retries=2, + ) + + result = await agent.run("What is the weather in Tokyo?", post_processors=[supervisor]) + + assert result.content == "Agent answer" + assert "post_processors" in result.metadata + assert "supervisor" in result.metadata["post_processors"] + + validations = result.metadata["post_processors"]["supervisor"] + assert isinstance(validations, list) + assert len(validations) == 1 + assert validations[0]["is_valid"] is True + + +@pytest.mark.asyncio +async def test_supervisor_returns_after_retry_limit_when_fail_on_exceed_false(agent_llm: MockLLM) -> None: + agent: Agent = Agent(llm=agent_llm, prompt="System prompt for agent") + + validation_llm = MockLLM( + default_options=MockLLMOptions(response='{"is_valid": false, "reasoning": "bad", "suggestion": "fix"}') + ) + + supervisor: SupervisorPostProcessor = SupervisorPostProcessor( + llm=validation_llm, + validation_prompt=AlwaysInvalidPrompt, + max_retries=2, + fail_on_exceed=False, + history_strategy=HistoryStrategy.REMOVE, + ) + + result = await agent.run("Q?", post_processors=[supervisor]) + + assert "post_processors" in result.metadata + validations = result.metadata["post_processors"]["supervisor"] + assert isinstance(validations, list) + assert len(validations) == 3 + assert all(v["is_valid"] is False for v in validations) + + +@pytest.mark.asyncio +async def test_supervisor_raises_after_retry_limit_when_fail_on_exceed_true(agent_llm: MockLLM) -> None: + agent: Agent = Agent(llm=agent_llm, prompt="System prompt for agent") + + validation_llm = MockLLM( + default_options=MockLLMOptions(response='{"is_valid": false, "reasoning": "bad", "suggestion": "fix"}') + ) + + supervisor: SupervisorPostProcessor = SupervisorPostProcessor( + llm=validation_llm, + validation_prompt=AlwaysInvalidPrompt, + max_retries=2, + fail_on_exceed=True, + ) + + with pytest.raises(SupervisorMaxRetriesExceededError) as exc: + await agent.run("Q?", post_processors=[supervisor]) + + err = exc.value + assert err.max_retries == 2 + assert len(err.last_validations) == 3 + assert all(v.is_valid is False for v in err.last_validations) + + +@pytest.mark.asyncio +async def test_supervisor_history_remove_prunes_invalid_and_correction_user(agent_llm: MockLLM) -> None: + agent: Agent = Agent(llm=agent_llm, prompt="System prompt for agent") + + validation_llm = MockLLM( + default_options=MockLLMOptions(response='{"is_valid": false, "reasoning": "bad", "suggestion": "fix"}') + ) + + supervisor: SupervisorPostProcessor = SupervisorPostProcessor( + llm=validation_llm, + validation_prompt=AlwaysInvalidPrompt, + max_retries=1, + fail_on_exceed=False, + history_strategy=HistoryStrategy.REMOVE, + ) + + result = await agent.run("Q?", post_processors=[supervisor]) + + history = result.history + assert len(history) == 3 + assert history[0]["role"] == "system" + assert history[1]["role"] == "user" + assert history[1]["content"] == "Q?" + assert history[2]["role"] == "assistant" + assert history[2]["content"] == "Agent answer" + + +@pytest.mark.asyncio +async def test_supervisor_history_preserve_keeps_invalid_and_correction_user(agent_llm: MockLLM) -> None: + agent: Agent = Agent(llm=agent_llm, prompt="System prompt for agent") + + validation_llm = MockLLM( + default_options=MockLLMOptions(response='{"is_valid": false, "reasoning": "bad", "suggestion": "fix"}') + ) + + supervisor: SupervisorPostProcessor = SupervisorPostProcessor( + llm=validation_llm, + validation_prompt=AlwaysInvalidPrompt, + max_retries=1, + fail_on_exceed=False, + history_strategy=HistoryStrategy.PRESERVE, + ) + + result = await agent.run("Q?", post_processors=[supervisor]) + + history = result.history + assert len(history) == 5 + assert history[0]["role"] == "system" + assert history[1]["role"] == "user" + assert history[1]["content"] == "Q?" + assert history[2]["role"] == "assistant" + assert history[2]["content"] == "Agent answer" + assert history[3]["role"] == "user" + assert isinstance(history[3]["content"], str) + assert "Your answer is incorrect" in history[3]["content"] + assert history[4]["role"] == "assistant" + assert history[4]["content"] == "Agent answer" + + +class MyValidationOutput(BaseModel): + is_valid: bool + errors: list[str] + fixes: list[str] + confidence: float + + +class MyValidationPrompt(Prompt[ValidationInput, MyValidationOutput]): + system_prompt = "Mocked system prompt" + user_prompt = "Mocked user prompt" + + +@pytest.mark.asyncio +async def test_supervisor_custom_validation_and_correction_prompt_preserve_history(agent_llm: MockLLM) -> None: + agent: Agent = Agent(llm=agent_llm, prompt="You are a professional weather reporter.") + + validation_llm = MockLLM( + default_options=MockLLMOptions( + response=( + '{"is_valid": false, "errors": ["not detailed enough"], ' + '"fixes": ["add more details"], "confidence": 0.9}' + ) + ) + ) + + correction_prompt = ( + "Previous answer had issues:\n" + "Errors: {errors}\n" + "Fixes: {fixes}\n" + "Confidence: {confidence}\n" + "Please answer again using the fixes." + ) + + supervisor: SupervisorPostProcessor = SupervisorPostProcessor( + llm=validation_llm, + validation_prompt=MyValidationPrompt, + correction_prompt=correction_prompt, + max_retries=1, + fail_on_exceed=False, + history_strategy=HistoryStrategy.PRESERVE, + ) + + result = await agent.run("What is the weather in Tokyo?", post_processors=[supervisor]) + + validations = result.metadata["post_processors"]["supervisor"] + assert isinstance(validations, list) + assert len(validations) == 2 + assert all("errors" in v and "fixes" in v and v["is_valid"] is False for v in validations) + + history = result.history + assert len(history) == 5 + assert history[0]["role"] == "system" + assert history[0]["content"] + assert history[1]["role"] == "user" + assert history[1]["content"] + assert history[2]["role"] == "assistant" + assert history[3]["role"] == "user" + assert history[3]["content"] + + corr = history[3]["content"] + assert "Previous answer had issues:" in corr + assert "Errors:" in corr + assert "not detailed enough" in corr + assert "Fixes:" in corr + assert "add more details" in corr + assert "Confidence: 0.9" in corr + assert history[4]["role"] == "assistant" + + +@pytest.mark.asyncio +async def test_supervisor_raises_when_correction_prompt_has_missing_fields(agent_llm: MockLLM) -> None: + agent: Agent = Agent(llm=agent_llm, prompt="System prompt for agent") + + validation_llm = MockLLM( + default_options=MockLLMOptions(response='{"is_valid": false, "reasoning": "bad", "suggestion": "fix"}') + ) + + bad_correction_prompt = "Missing field here: {nonexistent}" + + supervisor: SupervisorPostProcessor = SupervisorPostProcessor( + llm=validation_llm, + validation_prompt=AlwaysInvalidPrompt, + correction_prompt=bad_correction_prompt, + max_retries=1, + fail_on_exceed=False, + history_strategy=HistoryStrategy.PRESERVE, + ) + + with pytest.raises(SupervisorCorrectionPromptFormatError) as exc: + await agent.run("Q?", post_processors=[supervisor]) + + err = exc.value + msg = str(err) + assert "failed to format correction prompt" in msg.lower() + assert "nonexistent" in msg.lower() + assert err.missing_keys == ["nonexistent"] From 8c8697d6d5b503270b93cb58c99584979232d3c6 Mon Sep 17 00:00:00 2001 From: ds-radoslaw-izak Date: Mon, 29 Sep 2025 18:25:20 +0200 Subject: [PATCH 24/43] add hotpotqa+rag pipeline files --- examples/evaluate/hotpot_qa/run.py | 95 ++++++ .../ragbits/evaluate/dataloaders/hotpot_qa.py | 100 ++++++ .../src/ragbits/evaluate/metrics/hotpot_qa.py | 51 +++ .../ragbits/evaluate/pipelines/__init__.py | 11 +- .../ragbits/evaluate/pipelines/hotpot_qa.py | 322 ++++++++++++++++++ 5 files changed, 578 insertions(+), 1 deletion(-) create mode 100644 examples/evaluate/hotpot_qa/run.py create mode 100644 packages/ragbits-evaluate/src/ragbits/evaluate/dataloaders/hotpot_qa.py create mode 100644 packages/ragbits-evaluate/src/ragbits/evaluate/metrics/hotpot_qa.py create mode 100644 packages/ragbits-evaluate/src/ragbits/evaluate/pipelines/hotpot_qa.py diff --git a/examples/evaluate/hotpot_qa/run.py b/examples/evaluate/hotpot_qa/run.py new file mode 100644 index 000000000..93d76deb8 --- /dev/null +++ b/examples/evaluate/hotpot_qa/run.py @@ -0,0 +1,95 @@ +import asyncio +import logging +from pathlib import Path + +from ragbits.agents import Agent, AgentOptions +from ragbits.agents.tools.todo import TodoList, create_todo_manager, get_todo_instruction_tpl +from ragbits.core.llms import LiteLLM +from ragbits.core.sources.hf import HuggingFaceSource +from ragbits.evaluate.dataloaders.hotpot_qa import HotpotQADataLoader +from ragbits.evaluate.evaluator import Evaluator +from ragbits.evaluate.metrics.base import MetricSet +from ragbits.evaluate.metrics.hotpot_qa import HotpotQAExactMatch, HotpotQAF1 +from ragbits.evaluate.pipelines.hotpot_qa import HotpotQAPipeline +from ragbits.core.vector_stores import VectorStoreOptions +from ragbits.core.vector_stores.in_memory import InMemoryVectorStore +from ragbits.core.embeddings import LiteLLMEmbedder +from ragbits.document_search import DocumentSearch +from ragbits.document_search.ingestion.strategies import BatchedIngestStrategy + + +async def main() -> None: + """Run HotpotQA example with an Agent and print aggregate metrics.""" + logging.getLogger("LiteLLM").setLevel(logging.ERROR) + + todo_list = TodoList() + todo_manager = create_todo_manager(todo_list) + + hotpot_prompt = ( + "You are a helpful assistant. Use the given context to answer.\n" + "Respond on a single line as: 'Answer: '.\n" + "- If yes/no, respond 'Answer: yes' or 'Answer: no'.\n" + "- If a name/title is required, respond only the name/title after 'Answer:'.\n" + "- Do not add any extra text beyond the Answer line.\n" + "- Your answer should as concise and minimal as possible, while still answering the question.\n" + "- For complex questions, use the planning tool as described." + ) + + system_prompt = "\n".join( + [ + hotpot_prompt, + get_todo_instruction_tpl(task_range=(3, 5)), + ] + ) + agent: Agent = Agent( + llm=LiteLLM("gpt-4.1-mini"), + prompt=system_prompt, + tools=[todo_manager], + default_options=AgentOptions(max_turns=5), + ) + + source = HuggingFaceSource(path="hotpotqa/hotpot_qa", name="distractor", split="train") + dataloader = HotpotQADataLoader(source=source, split="data[:10]", level_filter="hard") + + log_path = Path(__file__).with_name("hotpot_examples.ndjson") + + def parse_final_answer(text: str) -> str: + marker = "Answer:" + idx = text.rfind(marker) + if idx == -1: + return text.strip() + candidate = text[idx + len(marker) :].strip() + if candidate.startswith("<") and candidate.endswith(">"): + candidate = candidate[1:-1].strip() + return candidate + + retriever = DocumentSearch( + vector_store=InMemoryVectorStore( + embedder=LiteLLMEmbedder(model_name="text-embedding-3-small"), + default_options=VectorStoreOptions(k=5), + ), + ingest_strategy=BatchedIngestStrategy(index_batch_size=1000), + ) + + pipeline = HotpotQAPipeline( + evaluation_target=agent, + retriever=retriever, + hops=3, + per_example_log_file=log_path, + # agent specific ext. logs + extended_logs=False, # includes traces, tool usage, etc. + parse_answer_fn=parse_final_answer, + ) + + metrics = MetricSet(HotpotQAExactMatch(), HotpotQAF1()) + + evaluator = Evaluator(batch_size=5, parallelize_batches=True) + results = await evaluator.compute(pipeline=pipeline, dataloader=dataloader, metricset=metrics) + + print("Metrics:") + for key, value in results.metrics.items(): + print(f" {key}: {value:.4f}") + + +if __name__ == "__main__": + asyncio.run(main()) diff --git a/packages/ragbits-evaluate/src/ragbits/evaluate/dataloaders/hotpot_qa.py b/packages/ragbits-evaluate/src/ragbits/evaluate/dataloaders/hotpot_qa.py new file mode 100644 index 000000000..6977aade3 --- /dev/null +++ b/packages/ragbits-evaluate/src/ragbits/evaluate/dataloaders/hotpot_qa.py @@ -0,0 +1,100 @@ +from __future__ import annotations + +from collections.abc import Iterable +from typing import Any + +from ragbits.core.sources.base import Source +from ragbits.evaluate.dataloaders.base import DataLoader +from ragbits.evaluate.pipelines.hotpot_qa import HotpotQAData + + +class HotpotQADataLoader(DataLoader[HotpotQAData]): + """ + HotpotQA evaluation data loader. + + The source should point to a local/remote JSON file exported from Hugging Face, where each example includes at + least the following keys: + - "id" (str) + - "question" (str) + - "answer" (str) + - "type" ("bridge" | "comparison") + - "level" ("easy" | "medium" | "hard") + - "context" (object with keys: "title": list[str], "sentences": list[list[str]]) + """ + + def __init__( + self, + source: Source, + *, + split: str = "data", + id_key: str = "id", + question_key: str = "question", + answer_key: str = "answer", + type_key: str = "type", + level_key: str = "level", + context_key: str = "context", + # filter + level_filter: str | None = None, # one of: easy|medium|hard + subset: str | None = None, # one of: distractor|fullwiki (if present in dataset path/metadata) + ) -> None: + """ + Initialize the HotpotQA data loader. + + Args: + source: The source to load the data from. + split: The split to load the data from. + id_key: Column with unique id. + question_key: Column with question text. + answer_key: Column with ground truth answer. + type_key: Column with question type ("bridge" | "comparison"). + level_key: Column with difficulty ("easy" | "medium" | "hard"). + context_key: Column with context object containing titles and sentences. + level_filter: If provided, return only examples with this level. + subset: Unused in mapping; keep for symmetry with dataset organization. + """ + required = {id_key, question_key, answer_key, type_key, level_key, context_key} + super().__init__(source=source, split=split, required_keys=required) + self.id_key = id_key + self.question_key = question_key + self.answer_key = answer_key + self.type_key = type_key + self.level_key = level_key + self.context_key = context_key + self.level_filter = level_filter + self.subset = subset + + async def map(self, dataset: Iterable[dict]) -> Iterable[HotpotQAData]: + """ + Map the dataset to the HotpotQA evaluation data schema. + + Args: + dataset: The dataset to map. + + Returns: + The HotpotQA evaluation data rows. + """ + + def to_context_rows(context: dict[str, Any]) -> list[str]: + titles = context.get("title", []) or [] + sentences = context.get("sentences", []) or [] + rows: list[str] = [] + for title, sent_list in zip(titles, sentences, strict=False): + doc_text = "\n".join(sent_list) if isinstance(sent_list, list) else str(sent_list) + rows.append(f"{title}\n{doc_text}") + if not rows and isinstance(sentences, list): + flat = "\n".join([" ".join(s) if isinstance(s, list) else str(s) for s in sentences]) + rows = [flat] + return rows + + return [ + HotpotQAData( + id=row.get(self.id_key, ""), + question=row.get(self.question_key, ""), + reference_answer=str(row.get(self.answer_key, "")), + qtype=str(row.get(self.type_key, "")), + level=(row.get(self.level_key) or "").lower(), + reference_context=to_context_rows(row.get(self.context_key, {}) or {}), + ) + for row in dataset + if not self.level_filter or (row.get(self.level_key, "").lower() == self.level_filter) + ] diff --git a/packages/ragbits-evaluate/src/ragbits/evaluate/metrics/hotpot_qa.py b/packages/ragbits-evaluate/src/ragbits/evaluate/metrics/hotpot_qa.py new file mode 100644 index 000000000..aafc96b0d --- /dev/null +++ b/packages/ragbits-evaluate/src/ragbits/evaluate/metrics/hotpot_qa.py @@ -0,0 +1,51 @@ +from __future__ import annotations + +from collections import defaultdict +from collections.abc import Iterable + +from ragbits.evaluate.metrics.base import Metric +from ragbits.evaluate.pipelines.hotpot_qa import HotpotQAResult + + +class HotpotQAExactMatch(Metric[HotpotQAResult]): + """Computes EM over HotpotQA by type and overall.""" + + async def compute(self, results: list[HotpotQAResult]) -> dict: + """Compute EM. Returns hotpotqa__em and hotpotqa_overall_em.""" + buckets: dict[str, list[float]] = defaultdict(list) + for r in results: + em = r.em_value + t = r.qtype or "unknown" + buckets[t].append(em) + buckets["overall"].append(em) + + def avg(vals: Iterable[float]) -> float: + lst = list(vals) + return float(sum(lst) / len(lst)) if lst else 0.0 + + metrics: dict[str, float] = {} + for t, vals in buckets.items(): + metrics[f"hotpotqa_{t}_em"] = avg(vals) + return metrics + + +class HotpotQAF1(Metric[HotpotQAResult]): + """Computes token-level F1 over HotpotQA by type and overall.""" + + async def compute(self, results: list[HotpotQAResult]) -> dict: + """Compute F1. Returns hotpotqa__f1 and hotpotqa_overall_f1.""" + buckets: dict[str, list[float]] = defaultdict(list) + for r in results: + f1v = r.f1_value + t = r.qtype or "unknown" + buckets[t].append(f1v) + buckets["overall"].append(f1v) + + def avg(vals: Iterable[float]) -> float: + lst = list(vals) + return float(sum(lst) / len(lst)) if lst else 0.0 + + metrics: dict[str, float] = {} + for t, vals in buckets.items(): + metrics[f"hotpotqa_{t}_f1"] = avg(vals) + return metrics diff --git a/packages/ragbits-evaluate/src/ragbits/evaluate/pipelines/__init__.py b/packages/ragbits-evaluate/src/ragbits/evaluate/pipelines/__init__.py index f86254bcc..0fe914943 100644 --- a/packages/ragbits-evaluate/src/ragbits/evaluate/pipelines/__init__.py +++ b/packages/ragbits-evaluate/src/ragbits/evaluate/pipelines/__init__.py @@ -4,8 +4,17 @@ from ragbits.evaluate.pipelines.document_search import DocumentSearchPipeline from ragbits.evaluate.pipelines.gaia import GaiaPipeline from ragbits.evaluate.pipelines.human_eval import HumanEvalPipeline +from ragbits.evaluate.pipelines.hotpot_qa import HotpotQAPipeline -__all__ = ["DocumentSearchPipeline", "EvaluationData", "EvaluationPipeline", "EvaluationResult", "GaiaPipeline", "HumanEvalPipeline"] +__all__ = [ + "DocumentSearchPipeline", + "EvaluationData", + "EvaluationPipeline", + "EvaluationResult", + "GaiaPipeline", + "HumanEvalPipeline", + "HotpotQAPipeline", +] _target_to_evaluation_pipeline: dict[type[WithConstructionConfig], type[EvaluationPipeline]] = { DocumentSearch: DocumentSearchPipeline, diff --git a/packages/ragbits-evaluate/src/ragbits/evaluate/pipelines/hotpot_qa.py b/packages/ragbits-evaluate/src/ragbits/evaluate/pipelines/hotpot_qa.py new file mode 100644 index 000000000..bd1532f7a --- /dev/null +++ b/packages/ragbits-evaluate/src/ragbits/evaluate/pipelines/hotpot_qa.py @@ -0,0 +1,322 @@ +from __future__ import annotations + +import json +from collections.abc import Callable, Iterable +from dataclasses import dataclass +from pathlib import Path +from typing import cast + +from typing_extensions import Self + +from ragbits.agents import Agent +from ragbits.core.llms.base import LLM, LLMClientOptionsT, LLMResponseWithMetadata, Usage +from ragbits.document_search import DocumentSearch +from ragbits.document_search.documents.document import Document, DocumentMeta, DocumentType +from ragbits.document_search.documents.element import TextElement +from ragbits.document_search.ingestion.parsers.base import DocumentParser +from ragbits.document_search.ingestion.parsers.router import DocumentParserRouter +from ragbits.document_search.ingestion.strategies.batched import BatchedIngestStrategy +from ragbits.evaluate.pipelines.base import EvaluationData, EvaluationPipeline, EvaluationResult + + +class ContextListParser(DocumentParser): + """ + Parser for in-memory context strings (treated as a single TXT document). + """ + + supported_document_types = {DocumentType.TXT} + + async def parse(self, document: Document) -> list[TextElement]: + content = document.local_path.read_text() + return [TextElement(content=content, document_meta=document.metadata)] + + +class HotpotQAData(EvaluationData): + """ + Represents a single HotpotQA example. + """ + + id: str + question: str + reference_answer: str + qtype: str + level: str + reference_context: list[str] + + +@dataclass +class HotpotQAResult(EvaluationResult): + """ + Represents the result of evaluating a single HotpotQA example. + """ + + id: str + predicted_result: str + reference_answer: str + question: str + qtype: str + level: str + predicted_parsed: str | None = None + reference_normalized: str | None = None + em_value: float = 0.0 + f1_value: float = 0.0 + + +class HotpotQAPipeline( + EvaluationPipeline[ + Agent[LLMClientOptionsT, None, str] | LLM[LLMClientOptionsT], + HotpotQAData, + HotpotQAResult, + ] +): + """ + HotpotQA evaluation pipeline with simple RAG ingestion per batch and multi-hop retrieval. + """ + + def __init__( + self, + evaluation_target: Agent[LLMClientOptionsT, None, str] | LLM[LLMClientOptionsT], + *, + retriever: DocumentSearch, + hops: int = 3, + per_example_log_file: Path | None = None, + extended_logs: bool = False, + parse_answer_fn: Callable[[str], str] | None = None, + retrieval_k: int = 3, + element_max_chars: int = 500, + hop_context_max_chars: int = 1200, + ) -> None: + super().__init__(evaluation_target=evaluation_target) + self.retriever = retriever + self.hops = max(1, min(hops, 5)) + self.per_example_log_file = per_example_log_file + self.extended_logs = extended_logs + self.parse_answer_fn = parse_answer_fn + self.retrieval_k = max(1, int(retrieval_k)) + self.element_max_chars = max(50, int(element_max_chars)) + self.hop_context_max_chars = max(100, int(hop_context_max_chars)) + self._init_log_file() + + @classmethod + def from_config(cls, config: dict) -> Self: + """Create pipeline from config. + Attempts Agent first, falls back to raw LLM construction. + """ + if "evaluation_target" not in config: + try: + config["evaluation_target"] = Agent.from_config(config) + except Exception: + config["evaluation_target"] = LLM.subclass_from_config(config) + config["retriever"] = DocumentSearch.from_config(config["document_search"]) + config["hops"] = int(config.get("hops", 3)) + config["retrieval_k"] = int(config.get("retrieval_k", 3)) + config["element_max_chars"] = int(config.get("element_max_chars", 500)) + config["hop_context_max_chars"] = int(config.get("hop_context_max_chars", 1200)) + return super().from_config(config) + + async def __call__(self, data: Iterable[HotpotQAData]) -> Iterable[HotpotQAResult]: + """Ingest contexts, perform multi-hop retrieval, and answer HotpotQA questions.""" + documents: list[DocumentMeta] = [] + for row in data: + for content in row.reference_context: + documents.append(DocumentMeta.from_literal(content)) + + parser_router = DocumentParserRouter({DocumentType.TXT: ContextListParser()}) + self.retriever.ingest_strategy = BatchedIngestStrategy(index_batch_size=1000) + self.retriever.parser_router = parser_router + await self.retriever.ingest(documents) + + async def answer_with_retrieval( + example: HotpotQAData, + ) -> tuple[str, Usage, list, list[dict]]: + accumulated_context: list[str] = [] + hop_logs: list[dict] = [] + last_query = example.question + for hop_idx in range(self.hops): + elements = await self.retriever.search(last_query) + text_parts: list[str] = [] + consumed = 0 + for element in elements[: self.retrieval_k]: + content = getattr(element, "content", "") if hasattr(element, "content") else "" + if isinstance(content, str) and content: + snippet = content.strip().replace("\n\n", "\n")[: self.element_max_chars] + budget = max(0, self.hop_context_max_chars - consumed) + take = snippet[:budget] + if take: + text_parts.append(take) + consumed += len(take) + if consumed >= self.hop_context_max_chars: + break + hop_text = "\n\n".join(text_parts) + hop_logs.append({"hop": hop_idx + 1, "question": last_query, "retrieved": hop_text}) + if hop_text: + accumulated_context.append(hop_text) + last_query = f"{example.question}\n\nContext so far:\n{hop_text}" + else: + break + + full_context = "\n\n".join(accumulated_context) + # append retrieved context to user question + prompt_input = example.question if not full_context else f"{example.question}\n\nContext:\n{full_context}" + + if self.extended_logs: + content, dbg = await self._generate_with_debug(prompt_input) + usage = cast(Usage, (dbg or {}).get("usage") or Usage()) + tool_calls = cast(list, (dbg or {}).get("tool_calls") or []) + else: + content, usage, tool_calls = await self._generate_answer(prompt_input) + + return str(content), usage, tool_calls, hop_logs + + results: list[HotpotQAResult] = [] + for row in data: + try: + predicted_text, usage, tool_calls, hop_logs = await answer_with_retrieval(row) + except Exception: + predicted_text = "" + usage = Usage() + tool_calls = [] + hop_logs = [] + predicted_extracted = self._parse_answer(predicted_text) + ref_norm = self._normalize(row.reference_answer) + + # Compute normalized fields and sample metrics once + em = 1.0 if self._normalize(predicted_extracted) == ref_norm else 0.0 + f1 = self._f1(self._normalize(predicted_extracted), ref_norm) + + result = HotpotQAResult( + id=row.id, + predicted_result=predicted_text, + reference_answer=row.reference_answer, + question=row.question, + qtype=row.qtype, + level=row.level, + predicted_parsed=self._normalize(predicted_extracted), + reference_normalized=ref_norm, + em_value=float(em), + f1_value=float(f1), + ) + results.append(result) + + ext_log_str = None + if self.extended_logs: + ext_log_str = json.dumps( + { + "usage": usage, + "tool_calls": tool_calls, + "hops": hop_logs, + }, + ensure_ascii=False, + default=str, + ) + self._log_example(row=row, predicted_text=predicted_text, predicted_extracted=predicted_extracted, em=result.em_value, f1=result.f1_value, extended_log=ext_log_str) + + return results + + def _init_log_file(self) -> None: + """Ensure the per-example log file exists if logging is enabled.""" + if self.per_example_log_file is None: + return + self.per_example_log_file.parent.mkdir(parents=True, exist_ok=True) + self.per_example_log_file.touch(exist_ok=True) + + def _log_example( + self, + *, + row: HotpotQAData, + predicted_text: str, + predicted_extracted: str, + em: float, + f1: float, + extended_log: str | None = None, + ) -> None: + """Append a single NDJSON record for debugging if enabled.""" + if self.per_example_log_file is None: + return + record: dict[str, object] = { + "id": row.id, + "question": row.question, + "reference": row.reference_answer, + "predicted": predicted_text, + "predicted_extracted": predicted_extracted, + "type": row.qtype, + "level": row.level, + "em": float(em), + "f1": float(f1), + } + record["extended_debug_logging"] = extended_log or "[]" + with open(self.per_example_log_file, "a", encoding="utf-8") as file: + file.write(json.dumps(record, ensure_ascii=False) + "\n") + + def _parse_answer(self, text: str) -> str: + """Optionally parse final answer from text using provided function. + If no parser provided, returns the original text. + """ + if self.parse_answer_fn is None: + return text + try: + return self.parse_answer_fn(text) + except Exception as exc: + import logging as _logging + + _logging.getLogger(__name__).debug("Answer parse error: %s", exc) + return text + + async def _generate_answer(self, prompt: str) -> tuple[str, Usage, list]: + """Generate final answer from Agent or raw LLM and capture usage and tool calls.""" + target = self.evaluation_target + if isinstance(target, Agent): + res = await target.run(prompt) + return str(res.content), res.usage, (res.tool_calls or []) + + resp = cast(LLMResponseWithMetadata[str], await target.generate_with_metadata(prompt)) + return str(resp.content), (resp.usage or Usage()), [] + + async def _generate_with_debug(self, prompt: str) -> tuple[str, dict | None]: + """Generate answer and capture tool/history/usage for logging (as raw content).""" + target = self.evaluation_target + if isinstance(target, Agent): + res = await target.run(prompt) + dbg = { + "history": res.history, + "tool_calls": res.tool_calls, + "usage": res.usage, + "metadata": res.metadata, + } + return str(res.content), dbg + resp = await target.generate(prompt) + return str(resp), None + + @staticmethod + def _normalize(text: str) -> str: + """Basic normalization for answer equality checks: lowercase, strip spaces.""" + return "".join(ch.lower() for ch in (text or "").strip() if not ch.isspace()) + + @staticmethod + def _f1(prediction: str, ground_truth: str) -> float: + import re as _re + from collections import Counter as _Counter + + def tokens(value: str) -> list[str]: + value = (value or "").lower() + value = _re.sub(r"[^a-z0-9\s]", " ", value) + value = _re.sub(r"\b(a|an|the)\b", " ", value) + value = _re.sub(r"\s+", " ", value).strip() + return value.split() + + pred_tokens = tokens(prediction) + gt_tokens = tokens(ground_truth) + if not pred_tokens and not gt_tokens: + return 1.0 + if not pred_tokens or not gt_tokens: + return 0.0 + + pred_counts = _Counter(pred_tokens) + gt_counts = _Counter(gt_tokens) + common = sum((pred_counts & gt_counts).values()) + if common == 0: + return 0.0 + + precision = common / len(pred_tokens) + recall = common / len(gt_tokens) + return 2 * precision * recall / (precision + recall) From 8ac24d8ec9c4f8684295fe3aeef6f5f08ae1ce9e Mon Sep 17 00:00:00 2001 From: ds-radoslaw-izak Date: Mon, 29 Sep 2025 18:28:00 +0200 Subject: [PATCH 25/43] small lint changes --- examples/evaluate/gaia/run.py | 16 ++++++---------- .../src/ragbits/agents/tools/extra.py | 12 ++---------- .../src/ragbits/evaluate/dataloaders/gaia.py | 6 +++++- .../src/ragbits/evaluate/metrics/gaia.py | 9 ++++----- .../src/ragbits/evaluate/metrics/human_eval.py | 4 ++-- 5 files changed, 19 insertions(+), 28 deletions(-) diff --git a/examples/evaluate/gaia/run.py b/examples/evaluate/gaia/run.py index d97de4e83..4b492d191 100644 --- a/examples/evaluate/gaia/run.py +++ b/examples/evaluate/gaia/run.py @@ -3,18 +3,18 @@ from pathlib import Path from ragbits.agents import Agent, AgentOptions -from ragbits.agents.tools.openai import get_web_search_tool -from ragbits.agents.tools.todo import TodoList, create_todo_manager, get_todo_instruction_tpl from ragbits.agents.tools.extra import ( add, - subtract, - multiply, + arxiv_search, divide, + get_extra_instruction_tpl, modulus, - arxiv_search, + multiply, + subtract, wiki_search, - get_extra_instruction_tpl, ) +from ragbits.agents.tools.openai import get_web_search_tool +from ragbits.agents.tools.todo import TodoList, create_todo_manager, get_todo_instruction_tpl from ragbits.core.llms import LiteLLM from ragbits.core.sources.hf import HuggingFaceSource from ragbits.evaluate.dataloaders.gaia import GaiaDataLoader @@ -78,9 +78,7 @@ async def main() -> None: default_options=AgentOptions(max_turns=30), ) - # Data: pick level 1, 2, or 3 -> higher level <-> harder questions level = 1 - # GAIA config name:'2023_all', '2023_level1', '2023_level2', '2023_level3' config_name = {1: "2023_level1", 2: "2023_level2", 3: "2023_level3"}[level] source = HuggingFaceSource(path="gaia-benchmark/GAIA", name=config_name, split="validation") dataloader = GaiaDataLoader(source=source, split="data[:30]", skip_file_attachments=True) @@ -105,10 +103,8 @@ def parse_final_answer(text: str) -> str: parse_answer_fn=parse_final_answer, ) - # Metrics metrics = MetricSet(GaiaOutcome(), GaiaTooling(), GaiaEfficiency()) - # Evaluate evaluator = Evaluator(batch_size=5, parallelize_batches=True) results = await evaluator.compute(pipeline=pipeline, dataloader=dataloader, metricset=metrics) diff --git a/packages/ragbits-agents/src/ragbits/agents/tools/extra.py b/packages/ragbits-agents/src/ragbits/agents/tools/extra.py index a54df55fa..de8d5e069 100644 --- a/packages/ragbits-agents/src/ragbits/agents/tools/extra.py +++ b/packages/ragbits-agents/src/ragbits/agents/tools/extra.py @@ -1,10 +1,10 @@ from __future__ import annotations -from typing import Any import json import urllib.parse import urllib.request import xml.etree.ElementTree as ET +from typing import Any def add(a: int, b: int) -> int: @@ -17,7 +17,6 @@ def add(a: int, b: int) -> int: Returns: Sum of a and b. """ - return a + b @@ -31,7 +30,6 @@ def subtract(a: int, b: int) -> int: Returns: Difference a - b. """ - return a - b @@ -45,7 +43,6 @@ def multiply(a: int, b: int) -> int: Returns: Product a * b. """ - return a * b @@ -62,7 +59,6 @@ def divide(a: int, b: int) -> float: Raises: ValueError: If b == 0. """ - if b == 0: raise ValueError("Cannot divide by zero.") return a / b @@ -81,7 +77,6 @@ def modulus(a: int, b: int) -> int: Raises: ValueError: If b == 0. """ - if b == 0: raise ValueError("Cannot divide by zero.") return a % b @@ -103,7 +98,6 @@ def arxiv_search(query: str, max_results: int = 3) -> dict[str, Any]: Returns: Dict with a list of results: title, summary, link. """ - if max_results <= 0: return {"results": []} @@ -147,7 +141,6 @@ def wiki_search(query: str, max_results: int = 2, language: str = "en") -> dict[ Returns: Dict with list of results: title, pageid, extract, url. """ - if max_results <= 0: return {"results": []} @@ -201,7 +194,6 @@ def get_extra_instruction_tpl() -> str: Returns: Instruction template string to include in system prompts. """ - return ( "\n\n" "## Tools Workflow (Arithmetic, arXiv, Wikipedia)\n\n" @@ -213,4 +205,4 @@ def get_extra_instruction_tpl() -> str: "1) Use arithmetic tools for calculations instead of inline math when non-trivial.\n" "2) Use arXiv/Wikipedia tools when scholarly/general knowledge retrieval is needed.\n" "3) Keep outputs concise; provide FINAL ANSWER after any intermediate reasoning.\n" - ) \ No newline at end of file + ) diff --git a/packages/ragbits-evaluate/src/ragbits/evaluate/dataloaders/gaia.py b/packages/ragbits-evaluate/src/ragbits/evaluate/dataloaders/gaia.py index 6e553e4e3..638d85a23 100644 --- a/packages/ragbits-evaluate/src/ragbits/evaluate/dataloaders/gaia.py +++ b/packages/ragbits-evaluate/src/ragbits/evaluate/dataloaders/gaia.py @@ -70,5 +70,9 @@ async def map(self, dataset: Iterable[dict]) -> Iterable[GaiaData]: file_name=(row.get(self.file_name_key) or None), ) for row in dataset - if (not self.skip_file_attachments or not row.get(self.file_name_key) or str(row.get(self.file_name_key)).strip() == "") + if ( + not self.skip_file_attachments + or not row.get(self.file_name_key) + or str(row.get(self.file_name_key)).strip() == "" + ) ] diff --git a/packages/ragbits-evaluate/src/ragbits/evaluate/metrics/gaia.py b/packages/ragbits-evaluate/src/ragbits/evaluate/metrics/gaia.py index 3c28f6f66..0f6a85267 100644 --- a/packages/ragbits-evaluate/src/ragbits/evaluate/metrics/gaia.py +++ b/packages/ragbits-evaluate/src/ragbits/evaluate/metrics/gaia.py @@ -14,7 +14,7 @@ class GaiaOutcome(Metric[GaiaResult]): async def compute(self, results: list[GaiaResult]) -> dict: """Compute task success rate. - + Returns: Dictionary with gaia_task_success_rate: fraction of successfully solved tasks. """ @@ -35,7 +35,7 @@ class GaiaTooling(Metric[GaiaResult]): async def compute(self, results: list[GaiaResult]) -> dict: """Compute tool utilization and performance metrics. - + Returns: Dictionary with tool trigger rate, average tool calls, average errors, and flattened tool frequency usage as numeric metrics. @@ -53,8 +53,7 @@ async def compute(self, results: list[GaiaResult]) -> dict: for name in r.tool_names: aggregated_counts[name] = aggregated_counts.get(name, 0) + 1 averaged_freq: dict[str, float] = { - f"gaia_tool_frequency_usage.{name}": (count / total_tasks) - for name, count in aggregated_counts.items() + f"gaia_tool_frequency_usage.{name}": (count / total_tasks) for name, count in aggregated_counts.items() } return { @@ -75,7 +74,7 @@ class GaiaEfficiency(Metric[GaiaResult]): async def compute(self, results: list[GaiaResult]) -> dict: """Compute efficiency and resource usage metrics. - + Returns: Dictionary with average latency, cost, and token usage. """ diff --git a/packages/ragbits-evaluate/src/ragbits/evaluate/metrics/human_eval.py b/packages/ragbits-evaluate/src/ragbits/evaluate/metrics/human_eval.py index fd5eeda8d..dae1a901a 100644 --- a/packages/ragbits-evaluate/src/ragbits/evaluate/metrics/human_eval.py +++ b/packages/ragbits-evaluate/src/ragbits/evaluate/metrics/human_eval.py @@ -19,7 +19,7 @@ def __init__(self, k: int = 1) -> None: async def compute(self, results: list[HumanEvalResult]) -> dict: """Compute pass@k averaged over tasks. - + Returns: Dictionary with humaneval_pass@k: fraction of tasks with at least one passing sample. """ @@ -58,7 +58,7 @@ class HumanEvalQualityPerf(Metric[HumanEvalResult]): async def compute(self, results: list[HumanEvalResult]) -> dict: """Compute code quality and execution performance metrics. - + Returns: Dictionary with compile rates, error rates, tasks solved rate, and average execution time. """ From 009c1d55add9afe45e97bae11cfcfd4824fcf10c Mon Sep 17 00:00:00 2001 From: ds-radoslaw-izak Date: Mon, 29 Sep 2025 18:35:35 +0200 Subject: [PATCH 26/43] wrong conflict resolution --- packages/ragbits-agents/src/ragbits/agents/__init__.py | 4 +--- packages/ragbits-agents/src/ragbits/agents/tools/__init__.py | 4 +--- 2 files changed, 2 insertions(+), 6 deletions(-) diff --git a/packages/ragbits-agents/src/ragbits/agents/__init__.py b/packages/ragbits-agents/src/ragbits/agents/__init__.py index 9001ee0b1..55d758712 100644 --- a/packages/ragbits-agents/src/ragbits/agents/__init__.py +++ b/packages/ragbits-agents/src/ragbits/agents/__init__.py @@ -27,6 +27,4 @@ "StreamingPostProcessor", "ToolCall", "ToolCallResult", - "get_todo_instruction_tpl", - "create_todo_manager", -] +] \ No newline at end of file diff --git a/packages/ragbits-agents/src/ragbits/agents/tools/__init__.py b/packages/ragbits-agents/src/ragbits/agents/tools/__init__.py index 5f101cd76..3f9bc4ec3 100644 --- a/packages/ragbits-agents/src/ragbits/agents/tools/__init__.py +++ b/packages/ragbits-agents/src/ragbits/agents/tools/__init__.py @@ -1,6 +1,4 @@ from ragbits.agents.tools.openai import get_code_interpreter_tool, get_image_generation_tool, get_web_search_tool from ragbits.agents.tools.todo import TodoOrchestrator -__all__ = ["TodoOrchestrator", "get_code_interpreter_tool", "get_image_generation_tool", "get_web_search_tool"] - -__all__ = ["create_todo_manager", "get_todo_instruction_tpl"] \ No newline at end of file +__all__ = ["TodoOrchestrator", "get_code_interpreter_tool", "get_image_generation_tool", "get_web_search_tool"] \ No newline at end of file From fef337664d9f584e88630c4b36355b45d1bbbd22 Mon Sep 17 00:00:00 2001 From: ds-radoslaw-izak Date: Mon, 29 Sep 2025 20:43:53 +0200 Subject: [PATCH 27/43] adjust parser for hotpotqa; remove previous TODO usage and adjust prompts; add name to HF loader; minor lint fixes --- examples/evaluate/gaia/run.py | 37 ++++++++----------- examples/evaluate/hotpot_qa/run.py | 25 +++++-------- examples/evaluate/human_eval/run.py | 28 +++----------- .../src/ragbits/agents/__init__.py | 2 +- .../src/ragbits/agents/tools/__init__.py | 2 +- .../src/ragbits/core/sources/hf.py | 11 +++++- .../ragbits/evaluate/dataloaders/hotpot_qa.py | 3 -- .../ragbits/evaluate/pipelines/__init__.py | 4 +- .../ragbits/evaluate/pipelines/hotpot_qa.py | 29 +++++---------- 9 files changed, 52 insertions(+), 89 deletions(-) diff --git a/examples/evaluate/gaia/run.py b/examples/evaluate/gaia/run.py index 4b492d191..fb2244a9d 100644 --- a/examples/evaluate/gaia/run.py +++ b/examples/evaluate/gaia/run.py @@ -1,4 +1,5 @@ import asyncio +import os import logging from pathlib import Path @@ -14,7 +15,6 @@ wiki_search, ) from ragbits.agents.tools.openai import get_web_search_tool -from ragbits.agents.tools.todo import TodoList, create_todo_manager, get_todo_instruction_tpl from ragbits.core.llms import LiteLLM from ragbits.core.sources.hf import HuggingFaceSource from ragbits.evaluate.dataloaders.gaia import GaiaDataLoader @@ -28,9 +28,6 @@ async def main() -> None: """Run GAIA example with an Agent and print aggregate metrics.""" logging.getLogger("LiteLLM").setLevel(logging.ERROR) - todo_list = TodoList() - todo_manager = create_todo_manager(todo_list) - gaia_prompt = ( "You are a general AI assistant. I will ask you a question. " "Report your thoughts, and finish your answer with the following template: " @@ -51,36 +48,32 @@ async def main() -> None: "Tool usage:\n" "- Use arithmetic tools for calculations.\n" "- Use arxiv_search/wiki_search to retrieve relevant facts when needed or explicitly asked.\n" - "- For multi-step/complex requests, start and manage work with the todo_manager workflow.\n" + "- For complex requests, plan your steps internally before answering concisely.\n" "- For general web-search questions, use search_web tool and gather information." ), - get_todo_instruction_tpl(task_range=(3, 5)), get_extra_instruction_tpl(), ] ) - web_search = get_web_search_tool(model_name="gpt-4.1-mini") + tools = [ + add, + subtract, + multiply, + divide, + modulus, + arxiv_search, + wiki_search, + get_web_search_tool(model_name="gpt-4.1-mini") + ] agent: Agent = Agent( llm=LiteLLM("gpt-4.1-mini"), prompt=system_prompt, - tools=[ - todo_manager, - web_search, - add, - subtract, - multiply, - divide, - modulus, - arxiv_search, - wiki_search, - ], + tools=tools, default_options=AgentOptions(max_turns=30), ) - level = 1 - config_name = {1: "2023_level1", 2: "2023_level2", 3: "2023_level3"}[level] - source = HuggingFaceSource(path="gaia-benchmark/GAIA", name=config_name, split="validation") + source = HuggingFaceSource(path="gaia-benchmark/GAIA", name="2023_level1", split="validation") dataloader = GaiaDataLoader(source=source, split="data[:30]", skip_file_attachments=True) log_path = Path(__file__).with_name("gaia_examples.ndjson") @@ -99,7 +92,7 @@ def parse_final_answer(text: str) -> str: evaluation_target=agent, per_example_log_file=log_path, # agent specific ext. logs - extended_logs=False, # includes traces, tool usage, etc. + extended_logs=False, # includes traces, tool usage, etc. parse_answer_fn=parse_final_answer, ) diff --git a/examples/evaluate/hotpot_qa/run.py b/examples/evaluate/hotpot_qa/run.py index 93d76deb8..6e65fce3e 100644 --- a/examples/evaluate/hotpot_qa/run.py +++ b/examples/evaluate/hotpot_qa/run.py @@ -3,28 +3,24 @@ from pathlib import Path from ragbits.agents import Agent, AgentOptions -from ragbits.agents.tools.todo import TodoList, create_todo_manager, get_todo_instruction_tpl +from ragbits.core.embeddings import LiteLLMEmbedder from ragbits.core.llms import LiteLLM from ragbits.core.sources.hf import HuggingFaceSource +from ragbits.core.vector_stores import VectorStoreOptions +from ragbits.core.vector_stores.in_memory import InMemoryVectorStore +from ragbits.document_search import DocumentSearch +from ragbits.document_search.ingestion.strategies import BatchedIngestStrategy from ragbits.evaluate.dataloaders.hotpot_qa import HotpotQADataLoader from ragbits.evaluate.evaluator import Evaluator from ragbits.evaluate.metrics.base import MetricSet from ragbits.evaluate.metrics.hotpot_qa import HotpotQAExactMatch, HotpotQAF1 from ragbits.evaluate.pipelines.hotpot_qa import HotpotQAPipeline -from ragbits.core.vector_stores import VectorStoreOptions -from ragbits.core.vector_stores.in_memory import InMemoryVectorStore -from ragbits.core.embeddings import LiteLLMEmbedder -from ragbits.document_search import DocumentSearch -from ragbits.document_search.ingestion.strategies import BatchedIngestStrategy async def main() -> None: """Run HotpotQA example with an Agent and print aggregate metrics.""" logging.getLogger("LiteLLM").setLevel(logging.ERROR) - todo_list = TodoList() - todo_manager = create_todo_manager(todo_list) - hotpot_prompt = ( "You are a helpful assistant. Use the given context to answer.\n" "Respond on a single line as: 'Answer: '.\n" @@ -32,24 +28,23 @@ async def main() -> None: "- If a name/title is required, respond only the name/title after 'Answer:'.\n" "- Do not add any extra text beyond the Answer line.\n" "- Your answer should as concise and minimal as possible, while still answering the question.\n" - "- For complex questions, use the planning tool as described." + "- Think step-by-step internally for complex questions before answering concisely." ) system_prompt = "\n".join( [ hotpot_prompt, - get_todo_instruction_tpl(task_range=(3, 5)), ] ) agent: Agent = Agent( llm=LiteLLM("gpt-4.1-mini"), prompt=system_prompt, - tools=[todo_manager], + tools=[], default_options=AgentOptions(max_turns=5), ) - source = HuggingFaceSource(path="hotpotqa/hotpot_qa", name="distractor", split="train") - dataloader = HotpotQADataLoader(source=source, split="data[:10]", level_filter="hard") + source = HuggingFaceSource(path="hotpotqa/hotpot_qa", name="distractor", split="validation") + dataloader = HotpotQADataLoader(source=source, split="data[:25]", level_filter="hard") log_path = Path(__file__).with_name("hotpot_examples.ndjson") @@ -77,7 +72,7 @@ def parse_final_answer(text: str) -> str: hops=3, per_example_log_file=log_path, # agent specific ext. logs - extended_logs=False, # includes traces, tool usage, etc. + extended_logs=False, # includes traces, tool usage, etc. parse_answer_fn=parse_final_answer, ) diff --git a/examples/evaluate/human_eval/run.py b/examples/evaluate/human_eval/run.py index 095ee3159..ec9d8057c 100644 --- a/examples/evaluate/human_eval/run.py +++ b/examples/evaluate/human_eval/run.py @@ -3,7 +3,6 @@ from pathlib import Path from ragbits.agents import Agent, AgentOptions -from ragbits.agents.tools.todo import TodoList, create_todo_manager, get_todo_instruction_tpl from ragbits.core.llms import LiteLLM from ragbits.core.sources.hf import HuggingFaceSource from ragbits.evaluate.dataloaders.human_eval import HumanEvalDataLoader @@ -17,9 +16,6 @@ async def main() -> None: """Run HumanEval example with an Agent and print aggregate metrics.""" logging.getLogger("LiteLLM").setLevel(logging.ERROR) - todo_list = TodoList() - todo_manager = create_todo_manager(todo_list) - prompt_text = "\n".join( [ """ @@ -27,31 +23,17 @@ async def main() -> None: Your task is to implement exactly one function that solves the problem. Return ONLY the function as plain Python (no markdown). Include all necessary imports. - WORKFLOW: - 1. If query is complex you have access to todo_manager tool to create a todo list with specific tasks - 2. If query is simple question, you work without todo_manager tool, just answer the question - 3. If you use todo_manager tool, you must follow the todo workflow - - Tool policy: - - If the problem is complex, follow this strict TODO workflow: - 1) todo_manager(action="create", tasks=[...]) with 3-5 concrete tasks - 2) For EACH task: - - todo_manager(action="get_current") - - todo_manager(action="start_task") - - do the work - - todo_manager(action="complete_task", summary="...") - 3) Finally: todo_manager(action="get_final_summary") - - Never call complete_task before start_task. - - If you decide to skip tools, do not call them at all. + POLICY: + - Think step-by-step internally if needed, but output only the final function. + - Do not include explanations, comments, or markdown. """, - get_todo_instruction_tpl(task_range=(3, 5)), ] ) agent: Agent = Agent( llm=LiteLLM("gpt-4.1-mini"), prompt=prompt_text, - tools=[todo_manager], + tools=[], default_options=AgentOptions(max_turns=30), ) @@ -83,7 +65,7 @@ def sanitize_code(text: str) -> str: timeout_sec=30, per_example_log_file=log_path, # agent specific ext. logs - extended_logs=True, # includes traces, tool usage, etc. + extended_logs=True, # includes traces, tool usage, etc. code_sanitize_fn=sanitize_code, ) diff --git a/packages/ragbits-agents/src/ragbits/agents/__init__.py b/packages/ragbits-agents/src/ragbits/agents/__init__.py index 55d758712..edd8226cf 100644 --- a/packages/ragbits-agents/src/ragbits/agents/__init__.py +++ b/packages/ragbits-agents/src/ragbits/agents/__init__.py @@ -27,4 +27,4 @@ "StreamingPostProcessor", "ToolCall", "ToolCallResult", -] \ No newline at end of file +] diff --git a/packages/ragbits-agents/src/ragbits/agents/tools/__init__.py b/packages/ragbits-agents/src/ragbits/agents/tools/__init__.py index 3f9bc4ec3..182f1d405 100644 --- a/packages/ragbits-agents/src/ragbits/agents/tools/__init__.py +++ b/packages/ragbits-agents/src/ragbits/agents/tools/__init__.py @@ -1,4 +1,4 @@ from ragbits.agents.tools.openai import get_code_interpreter_tool, get_image_generation_tool, get_web_search_tool from ragbits.agents.tools.todo import TodoOrchestrator -__all__ = ["TodoOrchestrator", "get_code_interpreter_tool", "get_image_generation_tool", "get_web_search_tool"] \ No newline at end of file +__all__ = ["TodoOrchestrator", "get_code_interpreter_tool", "get_image_generation_tool", "get_web_search_tool"] diff --git a/packages/ragbits-core/src/ragbits/core/sources/hf.py b/packages/ragbits-core/src/ragbits/core/sources/hf.py index b0dd51f79..b65d613dc 100644 --- a/packages/ragbits-core/src/ragbits/core/sources/hf.py +++ b/packages/ragbits-core/src/ragbits/core/sources/hf.py @@ -23,6 +23,7 @@ class HuggingFaceSource(Source): protocol: ClassVar[str] = "hf" path: str + name: str | None = None split: str = "train" row: int | None = None @@ -51,7 +52,10 @@ async def fetch(self) -> Path: with trace(path=self.path, split=self.split, row=self.row) as outputs: if self.row is not None: try: - dataset = load_dataset(self.path, split=self.split, streaming=True) + if self.name is not None and str(self.name).strip(): + dataset = load_dataset(self.path, self.name, split=self.split, streaming=True) + else: + dataset = load_dataset(self.path, split=self.split, streaming=True) except ConnectionError as exc: raise SourceConnectionError() from exc except DatasetNotFoundError as exc: @@ -79,7 +83,10 @@ async def fetch(self) -> Path: if not path.is_file(): try: - dataset = load_dataset(self.path, split=self.split) + if self.name is not None and str(self.name).strip(): + dataset = load_dataset(self.path, self.name, split=self.split) + else: + dataset = load_dataset(self.path, split=self.split) except ConnectionError as exc: raise SourceConnectionError() from exc except DatasetNotFoundError as exc: diff --git a/packages/ragbits-evaluate/src/ragbits/evaluate/dataloaders/hotpot_qa.py b/packages/ragbits-evaluate/src/ragbits/evaluate/dataloaders/hotpot_qa.py index 6977aade3..a32df261a 100644 --- a/packages/ragbits-evaluate/src/ragbits/evaluate/dataloaders/hotpot_qa.py +++ b/packages/ragbits-evaluate/src/ragbits/evaluate/dataloaders/hotpot_qa.py @@ -35,7 +35,6 @@ def __init__( context_key: str = "context", # filter level_filter: str | None = None, # one of: easy|medium|hard - subset: str | None = None, # one of: distractor|fullwiki (if present in dataset path/metadata) ) -> None: """ Initialize the HotpotQA data loader. @@ -50,7 +49,6 @@ def __init__( level_key: Column with difficulty ("easy" | "medium" | "hard"). context_key: Column with context object containing titles and sentences. level_filter: If provided, return only examples with this level. - subset: Unused in mapping; keep for symmetry with dataset organization. """ required = {id_key, question_key, answer_key, type_key, level_key, context_key} super().__init__(source=source, split=split, required_keys=required) @@ -61,7 +59,6 @@ def __init__( self.level_key = level_key self.context_key = context_key self.level_filter = level_filter - self.subset = subset async def map(self, dataset: Iterable[dict]) -> Iterable[HotpotQAData]: """ diff --git a/packages/ragbits-evaluate/src/ragbits/evaluate/pipelines/__init__.py b/packages/ragbits-evaluate/src/ragbits/evaluate/pipelines/__init__.py index 0fe914943..fd5d62945 100644 --- a/packages/ragbits-evaluate/src/ragbits/evaluate/pipelines/__init__.py +++ b/packages/ragbits-evaluate/src/ragbits/evaluate/pipelines/__init__.py @@ -3,8 +3,8 @@ from ragbits.evaluate.pipelines.base import EvaluationData, EvaluationPipeline, EvaluationResult from ragbits.evaluate.pipelines.document_search import DocumentSearchPipeline from ragbits.evaluate.pipelines.gaia import GaiaPipeline -from ragbits.evaluate.pipelines.human_eval import HumanEvalPipeline from ragbits.evaluate.pipelines.hotpot_qa import HotpotQAPipeline +from ragbits.evaluate.pipelines.human_eval import HumanEvalPipeline __all__ = [ "DocumentSearchPipeline", @@ -12,8 +12,8 @@ "EvaluationPipeline", "EvaluationResult", "GaiaPipeline", - "HumanEvalPipeline", "HotpotQAPipeline", + "HumanEvalPipeline", ] _target_to_evaluation_pipeline: dict[type[WithConstructionConfig], type[EvaluationPipeline]] = { diff --git a/packages/ragbits-evaluate/src/ragbits/evaluate/pipelines/hotpot_qa.py b/packages/ragbits-evaluate/src/ragbits/evaluate/pipelines/hotpot_qa.py index bd1532f7a..4721e8548 100644 --- a/packages/ragbits-evaluate/src/ragbits/evaluate/pipelines/hotpot_qa.py +++ b/packages/ragbits-evaluate/src/ragbits/evaluate/pipelines/hotpot_qa.py @@ -11,25 +11,10 @@ from ragbits.agents import Agent from ragbits.core.llms.base import LLM, LLMClientOptionsT, LLMResponseWithMetadata, Usage from ragbits.document_search import DocumentSearch -from ragbits.document_search.documents.document import Document, DocumentMeta, DocumentType -from ragbits.document_search.documents.element import TextElement -from ragbits.document_search.ingestion.parsers.base import DocumentParser -from ragbits.document_search.ingestion.parsers.router import DocumentParserRouter -from ragbits.document_search.ingestion.strategies.batched import BatchedIngestStrategy +from ragbits.document_search.documents.document import DocumentMeta from ragbits.evaluate.pipelines.base import EvaluationData, EvaluationPipeline, EvaluationResult -class ContextListParser(DocumentParser): - """ - Parser for in-memory context strings (treated as a single TXT document). - """ - - supported_document_types = {DocumentType.TXT} - - async def parse(self, document: Document) -> list[TextElement]: - content = document.local_path.read_text() - return [TextElement(content=content, document_meta=document.metadata)] - class HotpotQAData(EvaluationData): """ @@ -121,9 +106,6 @@ async def __call__(self, data: Iterable[HotpotQAData]) -> Iterable[HotpotQAResul for content in row.reference_context: documents.append(DocumentMeta.from_literal(content)) - parser_router = DocumentParserRouter({DocumentType.TXT: ContextListParser()}) - self.retriever.ingest_strategy = BatchedIngestStrategy(index_batch_size=1000) - self.retriever.parser_router = parser_router await self.retriever.ingest(documents) async def answer_with_retrieval( @@ -209,7 +191,14 @@ async def answer_with_retrieval( ensure_ascii=False, default=str, ) - self._log_example(row=row, predicted_text=predicted_text, predicted_extracted=predicted_extracted, em=result.em_value, f1=result.f1_value, extended_log=ext_log_str) + self._log_example( + row=row, + predicted_text=predicted_text, + predicted_extracted=predicted_extracted, + em=result.em_value, + f1=result.f1_value, + extended_log=ext_log_str, + ) return results From 56c8432651d217f9d38c652114955d90b357bde9 Mon Sep 17 00:00:00 2001 From: ds-radoslaw-izak Date: Tue, 30 Sep 2025 17:04:02 +0200 Subject: [PATCH 28/43] refactor --- examples/README.md | 3 + .../evaluate/agent-benchmarking/run_gaia.py | 288 ++++++++++++++++++ .../evaluate/agent-benchmarking/run_hotpot.py | 185 +++++++++++ .../agent-benchmarking/run_humaneval.py | 161 ++++++++++ .../evaluate/agent-benchmarking/todo_agent.py | 86 ++++++ examples/evaluate/gaia/run.py | 110 ------- examples/evaluate/hotpot_qa/run.py | 90 ------ examples/evaluate/human_eval/run.py | 85 ------ .../src/ragbits/agents/tools/extra.py | 208 ------------- .../src/ragbits/evaluate/metrics/gaia.py | 8 +- .../src/ragbits/evaluate/pipelines/gaia.py | 15 +- .../ragbits/evaluate/pipelines/hotpot_qa.py | 50 ++- .../ragbits/evaluate/pipelines/human_eval.py | 3 +- 13 files changed, 768 insertions(+), 524 deletions(-) create mode 100644 examples/evaluate/agent-benchmarking/run_gaia.py create mode 100644 examples/evaluate/agent-benchmarking/run_hotpot.py create mode 100644 examples/evaluate/agent-benchmarking/run_humaneval.py create mode 100644 examples/evaluate/agent-benchmarking/todo_agent.py delete mode 100644 examples/evaluate/gaia/run.py delete mode 100644 examples/evaluate/hotpot_qa/run.py delete mode 100644 examples/evaluate/human_eval/run.py delete mode 100644 packages/ragbits-agents/src/ragbits/agents/tools/extra.py diff --git a/examples/README.md b/examples/README.md index e8fdbcb7b..d25dab54f 100644 --- a/examples/README.md +++ b/examples/README.md @@ -46,3 +46,6 @@ All necessary details are provided in the comments at the top of each script. | [MCP SSE](/examples/agents/mcp/sse.py) | [ragbits-agents](/packages/ragbits-agents) | Example of how to use the `Agent` class to connect with a remote MCP server via SSE. | | [MCP Streamable HTTP](/examples/agents/mcp/streamable_http.py) | [ragbits-agents](/packages/ragbits-agents) | Example of how to use the `Agent` class to connect with a remote MCP server via HTTP. | | [A2A Orchestration](/examples/agents/a2a/run_orchestrator.py) | [ragbits-agents](/packages/ragbits-agents) | Example of how to setup A2A orchestration. | +| [Agent Benchmark: HotpotQA](/examples/evaluate/agent-benchmarking/run_hotpot.py) | [ragbits-evaluate](/packages/ragbits-evaluate) | Example of how to benchmark on HotpotQA comparing `Agent` and `TodoAgent`. | +| [Agent Benchmark: GAIA](/examples/evaluate/agent-benchmarking/run_gaia.py) | [ragbits-evaluate](/packages/ragbits-evaluate) | Example of how to benchmark on GAIA with tools comparing `Agent` and `TodoAgent`. | +| [Agent Benchmark: HumanEval](/examples/evaluate/agent-benchmarking/run_humaneval.py) | [ragbits-evaluate](/packages/ragbits-evaluate) | Example of how to benchmark on HumanEval comparing `Agent` and `TodoAgent`. | diff --git a/examples/evaluate/agent-benchmarking/run_gaia.py b/examples/evaluate/agent-benchmarking/run_gaia.py new file mode 100644 index 000000000..66769adee --- /dev/null +++ b/examples/evaluate/agent-benchmarking/run_gaia.py @@ -0,0 +1,288 @@ +""" +Ragbits Evaluation Example: GAIA (Agent vs TodoAgent) + +This example demonstrates how to evaluate the GAIA benchmark using either a classic +`Agent` or a task-decomposing `TodoAgent`, controlled by a command-line flag. Both modes +share the same prompt, retrieval setup, and parsing logic. + +To run the script, execute one of the following commands: + + ```bash + # Agent mode + uv run python examples/evaluate/agent-benchmarking/run_gaia.py + + # TodoAgent mode + uv run python examples/evaluate/agent-benchmarking/run_gaia.py --use_todo + ``` +""" + +# /// script +# requires-python = ">=3.10" +# dependencies = [ +# "ragbits-agents", +# "ragbits-core", +# "ragbits-evaluate", +# ] +# /// + +import argparse +import asyncio +import json +import logging +import urllib.parse +import urllib.request +import xml.etree.ElementTree as ET +from pathlib import Path +from typing import Any + +from ragbits.agents import Agent, AgentOptions +from ragbits.agents.tools.openai import get_web_search_tool +from ragbits.core.llms import LiteLLM +from ragbits.core.sources.hf import HuggingFaceSource +from ragbits.evaluate.dataloaders.gaia import GaiaDataLoader +from ragbits.evaluate.evaluator import Evaluator +from ragbits.evaluate.metrics.base import MetricSet +from ragbits.evaluate.metrics.gaia import GaiaEfficiency, GaiaOutcome, GaiaTooling +from ragbits.evaluate.pipelines.gaia import GaiaPipeline + +from todo_agent import TodoAgent + + +# Extra Agent tools + +def add(a: int, b: int) -> int: + """Add two integers and return the result.""" + return a + b + + +def subtract(a: int, b: int) -> int: + """Subtract two integers and return the result (a - b).""" + return a - b + + +def multiply(a: int, b: int) -> int: + """Multiply two integers and return the result.""" + return a * b + + +def divide(a: int, b: int) -> float: + """Divide two integers and return the result as float.""" + if b == 0: + raise ValueError("Cannot divide by zero.") + return a / b + + +def modulus(a: int, b: int) -> int: + """Compute remainder of a divided by b (a % b).""" + if b == 0: + raise ValueError("Cannot divide by zero.") + return a % b + + +def _http_get(url: str, timeout: float = 10.0) -> bytes: + req = urllib.request.Request(url, headers={"User-Agent": "ragbits-agents/extra-tools"}) + with urllib.request.urlopen(req, timeout=timeout) as resp: + return resp.read() + + +def arxiv_search(query: str, max_results: int = 3) -> dict[str, Any]: + """Search arXiv and return up to `max_results` entries (title, summary, link).""" + if max_results <= 0: + return {"results": []} + + base = "https://export.arxiv.org/api/query" + params = urllib.parse.urlencode( + { + "search_query": query, + "start": 0, + "max_results": max_results, + "sortBy": "relevance", + "sortOrder": "descending", + } + ) + raw = _http_get(f"{base}?{params}") + + root = ET.fromstring(raw) + ns = {"atom": "http://www.w3.org/2005/Atom"} + results: list[dict[str, str]] = [] + for entry in root.findall("atom:entry", ns): + title = (entry.findtext("atom:title", default="", namespaces=ns) or "").strip() + summary = (entry.findtext("atom:summary", default="", namespaces=ns) or "").strip() + link_el = entry.find("atom:link[@rel='alternate']", ns) + link = link_el.get("href") if link_el is not None else "" + results.append({"title": title, "summary": summary, "link": link}) + + return {"results": results} + + +def wiki_search(query: str, max_results: int = 2, language: str = "en") -> dict[str, Any]: + """Search Wikipedia and return up to `max_results` entries (title and url).""" + if max_results <= 0: + return {"results": []} + + api = f"https://{language}.wikipedia.org/w/api.php" + params = urllib.parse.urlencode( + { + "action": "opensearch", + "search": query, + "limit": max_results, + "namespace": 0, + "format": "json", + } + ) + raw = _http_get(f"{api}?{params}") + data = json.loads(raw.decode("utf-8")) + + titles: list[str] = data[1] if len(data) > 1 else [] + urls: list[str] = data[3] if len(data) > 3 else [] + + results: list[dict[str, Any]] = [] + for i, title in enumerate(titles[: max_results]): + url = urls[i] if i < len(urls) else "" + results.append({"title": title, "url": url}) + + return {"results": results} + + +def get_extra_instruction_tpl() -> str: + """Generate tool usage instructions template for arithmetic and lookups.""" + return ( + "Tools (use when needed):\n" + "- add(a, b), subtract(a, b), multiply(a, b), divide(a, b), modulus(a, b)\n" + "- arxiv_search(query, max_results=3)\n" + "- wiki_search(query, max_results=2, language='en')\n" + "- web_search -> OpenAI websearch tool\n" + ) + + +def _build_system_prompt() -> str: + """Build a unified GAIA system prompt shared by both modes.""" + gaia_prompt = ( + "You are a general AI assistant. Provide a concise solution and finish with:\n" + "FINAL ANSWER: [your final answer].\n" + "Rules for FINAL ANSWER: use digits for numbers (no units unless requested);\n" + "prefer few words for strings; for lists, return a comma-separated list." + ) + + return "\n".join( + [ + gaia_prompt, + get_extra_instruction_tpl(), + ] + ) + + +def _build_tools() -> list: + """Return the shared toolset for GAIA.""" + return [ + add, + subtract, + multiply, + divide, + modulus, + arxiv_search, + wiki_search, + get_web_search_tool(model_name="gpt-4.1-mini"), + ] + + +def _parse_final_answer(text: str) -> str: + """Extract the FINAL ANSWER segment from model output.""" + marker = "FINAL ANSWER:" + idx = text.rfind(marker) + if idx == -1: + return text.strip() + candidate = text[idx + len(marker) :].strip() + if candidate.startswith("[") and candidate.endswith("]"): + candidate = candidate[1:-1].strip() + return candidate + + +async def main(use_todo: bool) -> None: + """Run GAIA evaluation in classic or Todo mode.""" + logging.getLogger("LiteLLM").setLevel(logging.ERROR) + + base_agent: Agent = Agent( + llm=LiteLLM("gpt-4.1-mini"), + prompt=_build_system_prompt(), + tools=_build_tools(), + default_options=AgentOptions(max_turns=30), + ) + evaluation_target = ( + TodoAgent(agent=base_agent, domain_context="general AI assistant") if use_todo else base_agent + ) + + # Data loader + source = HuggingFaceSource(path="gaia-benchmark/GAIA", name="2023_level1", split="validation") + dataloader = GaiaDataLoader(source=source, split="data[:10]", skip_file_attachments=True) + + # Pipeline + log_file = "gaia_todo_examples.ndjson" if use_todo else "gaia_examples.ndjson" + log_path = Path(__file__).with_name(log_file) + pipeline = GaiaPipeline( + evaluation_target=evaluation_target, + per_example_log_file=log_path, + extended_logs=use_todo, + parse_answer_fn=_parse_final_answer, + ) + + # Metrics + metrics = MetricSet(GaiaOutcome(), GaiaTooling(), GaiaEfficiency()) + + evaluator = Evaluator(batch_size=5, parallelize_batches=True) + results = await evaluator.compute(pipeline=pipeline, dataloader=dataloader, metricset=metrics) + + print("Metrics:") + for key, value in results.metrics.items(): + print(f" {key}: {value:.4f}") + + if use_todo: + await _print_todo_stats(log_path, dataloader) + + +async def _print_todo_stats(log_path: Path, dataloader) -> None: + """Print aggregated TODO-agent statistics from extended logs.""" + print("\nTODO Orchestrator Statistics:") + decomposed_count = 0 + total_tasks = 0 + simple_count = 0 + complex_count = 0 + + if log_path.exists(): + import json + + with open(log_path, encoding="utf-8") as f: + for line in f: + record = json.loads(line) + debug_log = record.get("extended_debug_logging", "[]") + if debug_log and debug_log != "[]": + debug_data = json.loads(debug_log) + if debug_data and len(debug_data) > 0: + metadata = (debug_data[0] or {}).get("metadata", {}) + todo_meta = metadata.get("todo", {}) + + if todo_meta.get("was_decomposed"): + decomposed_count += 1 + total_tasks += int(todo_meta.get("num_tasks", 0)) + + if todo_meta.get("complexity_classification") == "SIMPLE": + simple_count += 1 + elif todo_meta.get("complexity_classification") == "COMPLEX": + complex_count += 1 + + total = len(await dataloader.load()) + rate = (decomposed_count / total * 100) if total else 0.0 + avg_tasks = (total_tasks / decomposed_count) if decomposed_count else 0.0 + print(f" Decomposition rate: {decomposed_count}/{total} ({rate:.1f}%)") + print(f" Average tasks per decomposed query: {avg_tasks:.1f}") + print(f" Complexity classification: {simple_count} simple, {complex_count} complex") + + +if __name__ == "__main__": + parser = argparse.ArgumentParser(description="GAIA evaluation example") + parser.add_argument("--use_todo", action="store_true", help="Run with TodoAgent instead of Agent") + args = parser.parse_args() + + asyncio.run(main(args.use_todo)) + + diff --git a/examples/evaluate/agent-benchmarking/run_hotpot.py b/examples/evaluate/agent-benchmarking/run_hotpot.py new file mode 100644 index 000000000..1726fc311 --- /dev/null +++ b/examples/evaluate/agent-benchmarking/run_hotpot.py @@ -0,0 +1,185 @@ +""" +Ragbits Evaluation Example: HotpotQA (Agent vs TodoAgent) + +This example demonstrates how to evaluate HotpotQA using either a classic `Agent` +or a task-decomposing `TodoAgent`, selected via a command-line flag. Both modes +share the same prompt, retrieval setup, and parsing logic. + +To run the script, execute one of the following commands: + + ```bash + # Agent mode + uv run python examples/evaluate/agent-benchmarking/run_hotpot.py + + # TodoAgent mode + uv run python examples/evaluate/agent-benchmarking/run_hotpot.py --use_todo + ``` +""" + +# /// script +# requires-python = ">=3.10" +# dependencies = [ +# "ragbits-agents", +# "ragbits-core", +# "ragbits-document-search", +# "ragbits-evaluate", +# ] +# /// + +import argparse +import asyncio +import logging +from pathlib import Path + +from ragbits.agents import Agent, AgentOptions +from ragbits.core.embeddings import LiteLLMEmbedder +from ragbits.core.llms import LiteLLM +from ragbits.core.sources.hf import HuggingFaceSource +from ragbits.core.vector_stores import VectorStoreOptions +from ragbits.core.vector_stores.in_memory import InMemoryVectorStore +from ragbits.document_search import DocumentSearch +from ragbits.document_search.ingestion.strategies import BatchedIngestStrategy +from ragbits.evaluate.dataloaders.hotpot_qa import HotpotQADataLoader +from ragbits.evaluate.evaluator import Evaluator +from ragbits.evaluate.metrics.base import MetricSet +from ragbits.evaluate.metrics.hotpot_qa import HotpotQAExactMatch, HotpotQAF1 +from ragbits.evaluate.pipelines.hotpot_qa import HotpotQAPipeline + +from todo_agent import TodoAgent + + +def _build_system_prompt() -> str: + """Build a unified HotpotQA system prompt shared by both modes.""" + return ( + "You are a helpful assistant. Use the provided context to answer.\n" + "Respond on a single line as: 'Answer: '.\n" + "- If yes/no, respond 'Answer: yes' or 'Answer: no'.\n" + "- If a name or title is required, provide only that after 'Answer:'.\n" + "- Do not add any extra text beyond the Answer line.\n" + "Keep the answer concise." + ) + + +def _build_question_generation_prompt(original_question: str, accumulated_context: str) -> str: + """Build a prompt for generating the next search question in multi-hop retrieval.""" + return ( + f"Original question: {original_question}\n\n" + f"Context so far: \n{accumulated_context}\n\n" + "Write ONE new, specific search question that fills the key missing info.\n" + "Do not repeat known facts. Return ONLY the question." + ) + + +def _parse_final_answer(text: str) -> str: + """Extract the Answer segment from model output.""" + marker = "Answer:" + idx = text.rfind(marker) + if idx == -1: + return text.strip() + candidate = text[idx + len(marker) :].strip() + if candidate.startswith("<") and candidate.endswith(">"): + candidate = candidate[1:-1].strip() + return candidate + + +def _build_retriever() -> DocumentSearch: + """Create a lightweight in-memory retriever for HotpotQA.""" + return DocumentSearch( + vector_store=InMemoryVectorStore( + embedder=LiteLLMEmbedder(model_name="text-embedding-3-small"), + default_options=VectorStoreOptions(k=5), + ), + ingest_strategy=BatchedIngestStrategy(index_batch_size=1000), + ) + + +async def main(use_todo: bool) -> None: + """Run HotpotQA evaluation in classic or Todo mode.""" + logging.getLogger("LiteLLM").setLevel(logging.ERROR) + + # Build agent or TodoAgent + base_agent: Agent = Agent( + llm=LiteLLM("gpt-4.1-mini"), + prompt=_build_system_prompt(), + tools=[], + default_options=AgentOptions(max_turns=5), + ) + evaluation_target = ( + TodoAgent(agent=base_agent, domain_context="research QA") if use_todo else base_agent + ) + + # Data loader + source = HuggingFaceSource(path="hotpotqa/hotpot_qa", name="distractor", split="validation") + dataloader = HotpotQADataLoader(source=source, split="data[:10]", level_filter="hard") + + # Pipeline + log_file = "hotpot_todo_examples.ndjson" if use_todo else "hotpot_examples.ndjson" + log_path = Path(__file__).with_name(log_file) + pipeline = HotpotQAPipeline( + evaluation_target=evaluation_target, + retriever=_build_retriever(), + hops=3, + per_example_log_file=log_path, + extended_logs=use_todo, + parse_answer_fn=_parse_final_answer, + question_generation_prompt_fn=_build_question_generation_prompt, + ) + + # Metrics + metrics = MetricSet(HotpotQAExactMatch(), HotpotQAF1()) + + evaluator = Evaluator(batch_size=5, parallelize_batches=True) + results = await evaluator.compute(pipeline=pipeline, dataloader=dataloader, metricset=metrics) + + print("Metrics:") + for key, value in results.metrics.items(): + print(f" {key}: {value:.4f}") + + if use_todo: + await _print_todo_stats(log_path, dataloader) + + +async def _print_todo_stats(log_path: Path, dataloader) -> None: + """Print aggregated TODO-agent statistics from extended logs.""" + print("\nTODO Orchestrator Statistics:") + decomposed_count = 0 + total_tasks = 0 + simple_count = 0 + complex_count = 0 + + if log_path.exists(): + import json + + with open(log_path, encoding="utf-8") as f: + for line in f: + record = json.loads(line) + debug_log = record.get("extended_debug_logging", "[]") + if debug_log and debug_log != "[]": + debug_data = json.loads(debug_log) + if debug_data and len(debug_data) > 0: + metadata = (debug_data[0] or {}).get("metadata", {}) + todo_meta = metadata.get("todo", {}) + + if todo_meta.get("was_decomposed"): + decomposed_count += 1 + total_tasks += int(todo_meta.get("num_tasks", 0)) + + if todo_meta.get("complexity_classification") == "SIMPLE": + simple_count += 1 + elif todo_meta.get("complexity_classification") == "COMPLEX": + complex_count += 1 + + total = len(await dataloader.load()) + rate = (decomposed_count / total * 100) if total else 0.0 + avg_tasks = (total_tasks / decomposed_count) if decomposed_count else 0.0 + print(f" Decomposition rate: {decomposed_count}/{total} ({rate:.1f}%)") + print(f" Average tasks per decomposed query: {avg_tasks:.1f}") + print(f" Complexity classification: {simple_count} simple, {complex_count} complex") + + +if __name__ == "__main__": + parser = argparse.ArgumentParser(description="HotpotQA evaluation example") + parser.add_argument("--use_todo", action="store_true", help="Run with TodoAgent instead of Agent") + args = parser.parse_args() + + asyncio.run(main(args.use_todo)) diff --git a/examples/evaluate/agent-benchmarking/run_humaneval.py b/examples/evaluate/agent-benchmarking/run_humaneval.py new file mode 100644 index 000000000..ee4cc762e --- /dev/null +++ b/examples/evaluate/agent-benchmarking/run_humaneval.py @@ -0,0 +1,161 @@ +""" +Ragbits Evaluation Example: HumanEval (Agent vs TodoAgent) + +This example demonstrates how to evaluate HumanEval using either a classic `Agent` +or a task-decomposing `TodoAgent`. Both modes share the +same prompt, retrieval setup, and parsing logic. + +To run the script, execute one of the following commands: + + ```bash + # Agent mode + uv run python examples/evaluate/agent-benchmarking/run_humaneval.py + + # TodoAgent mode + uv run python examples/evaluate/agent-benchmarking/run_humaneval.py --use_todo + ``` +""" + +# /// script +# requires-python = ">=3.10" +# dependencies = [ +# "ragbits-agents", +# "ragbits-core", +# "ragbits-evaluate", +# ] +# /// + +import argparse +import asyncio +import logging +from pathlib import Path + +from ragbits.agents import Agent, AgentOptions +from ragbits.core.llms import LiteLLM +from ragbits.core.sources.hf import HuggingFaceSource +from ragbits.evaluate.dataloaders.human_eval import HumanEvalDataLoader +from ragbits.evaluate.evaluator import Evaluator +from ragbits.evaluate.metrics.base import MetricSet +from ragbits.evaluate.metrics.human_eval import HumanEvalPassAtK, HumanEvalQualityPerf +from ragbits.evaluate.pipelines.human_eval import HumanEvalPipeline + +from todo_agent import TodoAgent + + +def _build_system_prompt() -> str: + """Build a unified HumanEval system prompt shared by both modes.""" + return "\n".join( + [ + "You are an expert Python engineer.", + "Implement exactly one function that solves the problem.", + "Output ONLY the function as plain Python (no markdown). Include necessary imports.", + "Do not include explanations or comments." + ] + ) + + +def _sanitize_code(text: str) -> str: + """Remove markdown fences and keep only Python function text returned by the model.""" + cleaned = text.replace("\r\n", "\n").replace("\r", "\n").strip() + if "```" in cleaned: + start = cleaned.find("```") + end = cleaned.find("```", start + 3) + if end != -1: + inside = cleaned[start + 3 : end].lstrip() + if "\n" in inside: + first, rest = inside.split("\n", 1) + cleaned = rest if first.strip().lower().startswith("python") else inside + else: + cleaned = inside + return cleaned.strip() + + +async def main(use_todo: bool) -> None: + """Run HumanEval in classic or Todo mode.""" + logging.getLogger("LiteLLM").setLevel(logging.ERROR) + + base_agent: Agent = Agent( + llm=LiteLLM("gpt-4.1-mini"), + prompt=_build_system_prompt(), + tools=[], + default_options=AgentOptions(max_turns=30), + ) + evaluation_target = ( + TodoAgent(agent=base_agent, domain_context="python engineer") if use_todo else base_agent + ) + + # Data + source = HuggingFaceSource(path="openai/openai_humaneval", split="test") + dataloader = HumanEvalDataLoader(source=source, split="data[:2]") + + # Pipeline + log_file = "humaneval_todo_examples.ndjson" if use_todo else "humaneval_examples.ndjson" + log_path = Path(__file__).with_name(log_file) + pipeline = HumanEvalPipeline( + evaluation_target=evaluation_target, + n_samples=1, + timeout_sec=30, + per_example_log_file=log_path, + extended_logs=use_todo, + code_sanitize_fn=_sanitize_code, + ) + + # Metrics + metrics = MetricSet(HumanEvalPassAtK(k=1), HumanEvalPassAtK(k=5), HumanEvalQualityPerf()) + + # Evaluate + evaluator = Evaluator(batch_size=5, parallelize_batches=True) + results = await evaluator.compute(pipeline=pipeline, dataloader=dataloader, metricset=metrics) + + print("Metrics:") + for key, value in results.metrics.items(): + print(f" {key}: {value:.4f}") + + if use_todo: + await _print_todo_stats(log_path, dataloader) + + +async def _print_todo_stats(log_path: Path, dataloader) -> None: + """Print aggregated TODO-agent statistics from extended logs.""" + print("\nTODO Orchestrator Statistics:") + decomposed_count = 0 + total_tasks = 0 + simple_count = 0 + complex_count = 0 + + if log_path.exists(): + import json + + with open(log_path, encoding="utf-8") as f: + for line in f: + record = json.loads(line) + debug_log = record.get("extended_debug_logging", "[]") + if debug_log and debug_log != "[]": + debug_data = json.loads(debug_log) + if debug_data and len(debug_data) > 0: + metadata = (debug_data[0] or {}).get("metadata", {}) + todo_meta = metadata.get("todo", {}) + + if todo_meta.get("was_decomposed"): + decomposed_count += 1 + total_tasks += int(todo_meta.get("num_tasks", 0)) + + if todo_meta.get("complexity_classification") == "SIMPLE": + simple_count += 1 + elif todo_meta.get("complexity_classification") == "COMPLEX": + complex_count += 1 + + total = len(await dataloader.load()) + rate = (decomposed_count / total * 100) if total else 0.0 + avg_tasks = (total_tasks / decomposed_count) if decomposed_count else 0.0 + print(f" Decomposition rate: {decomposed_count}/{total} ({rate:.1f}%)") + print(f" Average tasks per decomposed query: {avg_tasks:.1f}") + print(f" Complexity classification: {simple_count} simple, {complex_count} complex") + + +if __name__ == "__main__": + parser = argparse.ArgumentParser(description="HumanEval evaluation example") + parser.add_argument("--use_todo", action="store_true", help="Run with TodoAgent instead of Agent") + args = parser.parse_args() + + asyncio.run(main(args.use_todo)) diff --git a/examples/evaluate/agent-benchmarking/todo_agent.py b/examples/evaluate/agent-benchmarking/todo_agent.py new file mode 100644 index 000000000..abd16cfc7 --- /dev/null +++ b/examples/evaluate/agent-benchmarking/todo_agent.py @@ -0,0 +1,86 @@ +from __future__ import annotations + +from typing import Any, cast + +from ragbits.agents import Agent, AgentOptions, AgentResult +from ragbits.agents.tool import ToolCallResult +from ragbits.agents.tools.todo import TodoOrchestrator +from ragbits.core.llms.base import LLMClientOptionsT, Usage +from ragbits.core.prompt.base import BasePrompt + + +class TodoAgent(Agent[LLMClientOptionsT, None, str]): + """ + Agent wrapper that uses TodoOrchestrator to optionally decompose a query + into tasks and aggregate a final answer, while remaining compatible with + existing EvaluationPipelines that expect an Agent. + """ + + def __init__(self, agent: Agent[LLMClientOptionsT, None, str], domain_context: str = "") -> None: + super().__init__( + llm=agent.llm, + prompt=agent.prompt, + history=agent.history, + keep_history=False, + mcp_servers=agent.mcp_servers, + default_options=cast(AgentOptions[LLMClientOptionsT] | None, agent.default_options), + ) + self._inner_agent = agent + self._domain_context = domain_context + + async def run( + self, + input: str | None = None, + *_: Any, + **__: Any, + ) -> AgentResult[str]: + """Run the orchestrated flow and return a single final answer.""" + query = input or "" + + orchestrator = TodoOrchestrator(domain_context=self._domain_context) + + # Accumulate outputs from the orchestrated workflow + final_text: str = "" + tool_calls: list[ToolCallResult] | None = None + total_usage: Usage = Usage() + last_prompt: BasePrompt | None = None + + tasks_created = False + num_tasks = 0 + + async for item in orchestrator.run_todo_workflow_streaming(self._inner_agent, query): + match item: + case str(): + final_text += item + case ToolCallResult(): + if tool_calls is None: + tool_calls = [] + tool_calls.append(item) + case Usage(): + total_usage += item + case BasePrompt(): + last_prompt = item + case _: + # Inspect orchestrator internal state to populate metadata + tasks_created = len(orchestrator.todo_list.tasks) > 0 + num_tasks = len(orchestrator.todo_list.tasks) + + # Compose metadata with TODO info + complexity = "COMPLEX" if tasks_created else "SIMPLE" + todo_meta: dict[str, Any] = { + "was_decomposed": bool(tasks_created), + "complexity_classification": complexity, + "num_tasks": int(num_tasks), + "domain_context": self._domain_context, + } + + # Build result compatible with existing pipelines + history = last_prompt.chat if last_prompt is not None else [] + + return AgentResult( + content=final_text.strip(), + metadata={"todo": todo_meta}, + tool_calls=tool_calls, + history=history, + usage=total_usage, + ) diff --git a/examples/evaluate/gaia/run.py b/examples/evaluate/gaia/run.py deleted file mode 100644 index fb2244a9d..000000000 --- a/examples/evaluate/gaia/run.py +++ /dev/null @@ -1,110 +0,0 @@ -import asyncio -import os -import logging -from pathlib import Path - -from ragbits.agents import Agent, AgentOptions -from ragbits.agents.tools.extra import ( - add, - arxiv_search, - divide, - get_extra_instruction_tpl, - modulus, - multiply, - subtract, - wiki_search, -) -from ragbits.agents.tools.openai import get_web_search_tool -from ragbits.core.llms import LiteLLM -from ragbits.core.sources.hf import HuggingFaceSource -from ragbits.evaluate.dataloaders.gaia import GaiaDataLoader -from ragbits.evaluate.evaluator import Evaluator -from ragbits.evaluate.metrics.base import MetricSet -from ragbits.evaluate.metrics.gaia import GaiaEfficiency, GaiaOutcome, GaiaTooling -from ragbits.evaluate.pipelines.gaia import GaiaPipeline - - -async def main() -> None: - """Run GAIA example with an Agent and print aggregate metrics.""" - logging.getLogger("LiteLLM").setLevel(logging.ERROR) - - gaia_prompt = ( - "You are a general AI assistant. I will ask you a question. " - "Report your thoughts, and finish your answer with the following template: " - "FINAL ANSWER: [YOUR FINAL ANSWER]. YOUR FINAL ANSWER should be a number OR as few words as possible " - "OR a comma separated list of numbers and/or strings. If you are asked for a number, don't use comma to write " - "your number neither use units such as $ or percent sign unless specified otherwise. If you are asked for a " - "string, don't use articles, neither abbreviations (e.g. for cities), and write the digits in plain text " - "unless specified otherwise. If you are asked for a comma separated list, apply the above rules depending of " - "whether the element to be put in the list is a number or a string. If you are asked for a number, make sure " - "you respond using digits not text, and ensure the answer is in appropriate unit context wise " - "(e.g. if asked for thousands of meters and your answer is 31000, answer 31)." - ) - - system_prompt = "\n".join( - [ - gaia_prompt, - ( - "Tool usage:\n" - "- Use arithmetic tools for calculations.\n" - "- Use arxiv_search/wiki_search to retrieve relevant facts when needed or explicitly asked.\n" - "- For complex requests, plan your steps internally before answering concisely.\n" - "- For general web-search questions, use search_web tool and gather information." - ), - get_extra_instruction_tpl(), - ] - ) - - tools = [ - add, - subtract, - multiply, - divide, - modulus, - arxiv_search, - wiki_search, - get_web_search_tool(model_name="gpt-4.1-mini") - ] - - agent: Agent = Agent( - llm=LiteLLM("gpt-4.1-mini"), - prompt=system_prompt, - tools=tools, - default_options=AgentOptions(max_turns=30), - ) - - source = HuggingFaceSource(path="gaia-benchmark/GAIA", name="2023_level1", split="validation") - dataloader = GaiaDataLoader(source=source, split="data[:30]", skip_file_attachments=True) - - log_path = Path(__file__).with_name("gaia_examples.ndjson") - - def parse_final_answer(text: str) -> str: - marker = "FINAL ANSWER:" - idx = text.rfind(marker) - if idx == -1: - return text.strip() - candidate = text[idx + len(marker) :].strip() - if candidate.startswith("[") and candidate.endswith("]"): - candidate = candidate[1:-1].strip() - return candidate - - pipeline = GaiaPipeline( - evaluation_target=agent, - per_example_log_file=log_path, - # agent specific ext. logs - extended_logs=False, # includes traces, tool usage, etc. - parse_answer_fn=parse_final_answer, - ) - - metrics = MetricSet(GaiaOutcome(), GaiaTooling(), GaiaEfficiency()) - - evaluator = Evaluator(batch_size=5, parallelize_batches=True) - results = await evaluator.compute(pipeline=pipeline, dataloader=dataloader, metricset=metrics) - - print("Metrics:") - for key, value in results.metrics.items(): - print(f" {key}: {value:.4f}") - - -if __name__ == "__main__": - asyncio.run(main()) diff --git a/examples/evaluate/hotpot_qa/run.py b/examples/evaluate/hotpot_qa/run.py deleted file mode 100644 index 6e65fce3e..000000000 --- a/examples/evaluate/hotpot_qa/run.py +++ /dev/null @@ -1,90 +0,0 @@ -import asyncio -import logging -from pathlib import Path - -from ragbits.agents import Agent, AgentOptions -from ragbits.core.embeddings import LiteLLMEmbedder -from ragbits.core.llms import LiteLLM -from ragbits.core.sources.hf import HuggingFaceSource -from ragbits.core.vector_stores import VectorStoreOptions -from ragbits.core.vector_stores.in_memory import InMemoryVectorStore -from ragbits.document_search import DocumentSearch -from ragbits.document_search.ingestion.strategies import BatchedIngestStrategy -from ragbits.evaluate.dataloaders.hotpot_qa import HotpotQADataLoader -from ragbits.evaluate.evaluator import Evaluator -from ragbits.evaluate.metrics.base import MetricSet -from ragbits.evaluate.metrics.hotpot_qa import HotpotQAExactMatch, HotpotQAF1 -from ragbits.evaluate.pipelines.hotpot_qa import HotpotQAPipeline - - -async def main() -> None: - """Run HotpotQA example with an Agent and print aggregate metrics.""" - logging.getLogger("LiteLLM").setLevel(logging.ERROR) - - hotpot_prompt = ( - "You are a helpful assistant. Use the given context to answer.\n" - "Respond on a single line as: 'Answer: '.\n" - "- If yes/no, respond 'Answer: yes' or 'Answer: no'.\n" - "- If a name/title is required, respond only the name/title after 'Answer:'.\n" - "- Do not add any extra text beyond the Answer line.\n" - "- Your answer should as concise and minimal as possible, while still answering the question.\n" - "- Think step-by-step internally for complex questions before answering concisely." - ) - - system_prompt = "\n".join( - [ - hotpot_prompt, - ] - ) - agent: Agent = Agent( - llm=LiteLLM("gpt-4.1-mini"), - prompt=system_prompt, - tools=[], - default_options=AgentOptions(max_turns=5), - ) - - source = HuggingFaceSource(path="hotpotqa/hotpot_qa", name="distractor", split="validation") - dataloader = HotpotQADataLoader(source=source, split="data[:25]", level_filter="hard") - - log_path = Path(__file__).with_name("hotpot_examples.ndjson") - - def parse_final_answer(text: str) -> str: - marker = "Answer:" - idx = text.rfind(marker) - if idx == -1: - return text.strip() - candidate = text[idx + len(marker) :].strip() - if candidate.startswith("<") and candidate.endswith(">"): - candidate = candidate[1:-1].strip() - return candidate - - retriever = DocumentSearch( - vector_store=InMemoryVectorStore( - embedder=LiteLLMEmbedder(model_name="text-embedding-3-small"), - default_options=VectorStoreOptions(k=5), - ), - ingest_strategy=BatchedIngestStrategy(index_batch_size=1000), - ) - - pipeline = HotpotQAPipeline( - evaluation_target=agent, - retriever=retriever, - hops=3, - per_example_log_file=log_path, - # agent specific ext. logs - extended_logs=False, # includes traces, tool usage, etc. - parse_answer_fn=parse_final_answer, - ) - - metrics = MetricSet(HotpotQAExactMatch(), HotpotQAF1()) - - evaluator = Evaluator(batch_size=5, parallelize_batches=True) - results = await evaluator.compute(pipeline=pipeline, dataloader=dataloader, metricset=metrics) - - print("Metrics:") - for key, value in results.metrics.items(): - print(f" {key}: {value:.4f}") - - -if __name__ == "__main__": - asyncio.run(main()) diff --git a/examples/evaluate/human_eval/run.py b/examples/evaluate/human_eval/run.py deleted file mode 100644 index ec9d8057c..000000000 --- a/examples/evaluate/human_eval/run.py +++ /dev/null @@ -1,85 +0,0 @@ -import asyncio -import logging -from pathlib import Path - -from ragbits.agents import Agent, AgentOptions -from ragbits.core.llms import LiteLLM -from ragbits.core.sources.hf import HuggingFaceSource -from ragbits.evaluate.dataloaders.human_eval import HumanEvalDataLoader -from ragbits.evaluate.evaluator import Evaluator -from ragbits.evaluate.metrics.base import MetricSet -from ragbits.evaluate.metrics.human_eval import HumanEvalPassAtK, HumanEvalQualityPerf -from ragbits.evaluate.pipelines.human_eval import HumanEvalPipeline - - -async def main() -> None: - """Run HumanEval example with an Agent and print aggregate metrics.""" - logging.getLogger("LiteLLM").setLevel(logging.ERROR) - - prompt_text = "\n".join( - [ - """ - You are an expert Python engineer. - Your task is to implement exactly one function that solves the problem. - Return ONLY the function as plain Python (no markdown). Include all necessary imports. - - POLICY: - - Think step-by-step internally if needed, but output only the final function. - - Do not include explanations, comments, or markdown. - """, - ] - ) - - agent: Agent = Agent( - llm=LiteLLM("gpt-4.1-mini"), - prompt=prompt_text, - tools=[], - default_options=AgentOptions(max_turns=30), - ) - - # Data - source = HuggingFaceSource(path="openai/openai_humaneval", split="test") - dataloader = HumanEvalDataLoader(source=source, split="data[:2]") - - # Pipeline - log_path = Path(__file__).with_name("humaneval_examples.ndjson") - - # Code sanitazation function - def sanitize_code(text: str) -> str: - cleaned = text.replace("\r\n", "\n").replace("\r", "\n").strip() - if "```" in cleaned: - start = cleaned.find("```") - end = cleaned.find("```", start + 3) - if end != -1: - inside = cleaned[start + 3 : end].lstrip() - if "\n" in inside: - first, rest = inside.split("\n", 1) - cleaned = rest if first.strip().lower().startswith("python") else inside - else: - cleaned = inside - return cleaned.strip() - - pipeline = HumanEvalPipeline( - evaluation_target=agent, - n_samples=1, - timeout_sec=30, - per_example_log_file=log_path, - # agent specific ext. logs - extended_logs=True, # includes traces, tool usage, etc. - code_sanitize_fn=sanitize_code, - ) - - # Metrics - metrics = MetricSet(HumanEvalPassAtK(k=1), HumanEvalPassAtK(k=5), HumanEvalQualityPerf()) - - # Evaluate - evaluator = Evaluator(batch_size=5, parallelize_batches=True) - results = await evaluator.compute(pipeline=pipeline, dataloader=dataloader, metricset=metrics) - - print("Metrics:") - for key, value in results.metrics.items(): - print(f" {key}: {value:.4f}") - - -if __name__ == "__main__": - asyncio.run(main()) diff --git a/packages/ragbits-agents/src/ragbits/agents/tools/extra.py b/packages/ragbits-agents/src/ragbits/agents/tools/extra.py deleted file mode 100644 index de8d5e069..000000000 --- a/packages/ragbits-agents/src/ragbits/agents/tools/extra.py +++ /dev/null @@ -1,208 +0,0 @@ -from __future__ import annotations - -import json -import urllib.parse -import urllib.request -import xml.etree.ElementTree as ET -from typing import Any - - -def add(a: int, b: int) -> int: - """Add two integers and return the result. - - Args: - a: First integer. - b: Second integer. - - Returns: - Sum of a and b. - """ - return a + b - - -def subtract(a: int, b: int) -> int: - """Subtract two integers and return the result (a - b). - - Args: - a: Minuend integer. - b: Subtrahend integer. - - Returns: - Difference a - b. - """ - return a - b - - -def multiply(a: int, b: int) -> int: - """Multiply two integers and return the result. - - Args: - a: First integer. - b: Second integer. - - Returns: - Product a * b. - """ - return a * b - - -def divide(a: int, b: int) -> float: - """Divide two integers and return the result as float. - - Args: - a: Dividend integer. - b: Divisor integer (must be non-zero). - - Returns: - Quotient a / b as float. - - Raises: - ValueError: If b == 0. - """ - if b == 0: - raise ValueError("Cannot divide by zero.") - return a / b - - -def modulus(a: int, b: int) -> int: - """Compute remainder of a divided by b (a % b). - - Args: - a: Dividend integer. - b: Divisor integer (must be non-zero). - - Returns: - Remainder a % b. - - Raises: - ValueError: If b == 0. - """ - if b == 0: - raise ValueError("Cannot divide by zero.") - return a % b - - -def _http_get(url: str, timeout: float = 10.0) -> bytes: - req = urllib.request.Request(url, headers={"User-Agent": "ragbits-agents/extra-tools"}) - with urllib.request.urlopen(req, timeout=timeout) as resp: - return resp.read() - - -def arxiv_search(query: str, max_results: int = 3) -> dict[str, Any]: - """Search arXiv and return up to `max_results` entries. - - Args: - query: Search query (e.g., "quantum computing") - max_results: Max number of results to return (default 3) - - Returns: - Dict with a list of results: title, summary, link. - """ - if max_results <= 0: - return {"results": []} - - base = "https://export.arxiv.org/api/query" - params = { - "search_query": urllib.parse.quote_plus(query), - "start": "0", - "max_results": str(max_results), - "sortBy": "relevance", - "sortOrder": "descending", - } - url = f"{base}?search_query={params['search_query']}&start={params['start']}&max_results={params['max_results']}&sortBy={params['sortBy']}&sortOrder={params['sortOrder']}" - - raw = _http_get(url) - root = ET.fromstring(raw) - ns = {"atom": "http://www.w3.org/2005/Atom"} - results: list[dict[str, str]] = [] - for entry in root.findall("atom:entry", ns): - title_el = entry.find("atom:title", ns) - summary_el = entry.find("atom:summary", ns) - link_el = entry.find("atom:link[@rel='alternate']", ns) - title = (title_el.text or "").strip() if title_el is not None else "" - summary = (summary_el.text or "").strip() if summary_el is not None else "" - link = link_el.get("href") if link_el is not None else "" - # Trim overly long summaries for brevity - if len(summary) > 1200: - summary = summary[:1200] + "..." - results.append({"title": title, "summary": summary, "link": link}) - - return {"results": results} - - -def wiki_search(query: str, max_results: int = 2, language: str = "en") -> dict[str, Any]: - """Search Wikipedia and return up to `max_results` entries with extracts. - - Args: - query: Search query (e.g., "Alan Turing") - max_results: Max number of results (default 2) - language: Wikipedia language code (default "en") - - Returns: - Dict with list of results: title, pageid, extract, url. - """ - if max_results <= 0: - return {"results": []} - - api = f"https://{language}.wikipedia.org/w/api.php" - search_params = { - "action": "query", - "list": "search", - "srsearch": query, - "srlimit": str(max_results), - "format": "json", - } - search_url = f"{api}?{urllib.parse.urlencode(search_params)}" - raw = _http_get(search_url) - data = json.loads(raw.decode("utf-8")) - hits = data.get("query", {}).get("search", []) - if not hits: - return {"results": []} - - page_ids = [str(h.get("pageid")) for h in hits if "pageid" in h] - extract_params = { - "action": "query", - "prop": "extracts", - "explaintext": "1", - "exintro": "1", - "pageids": "|".join(page_ids), - "format": "json", - } - extract_url = f"{api}?{urllib.parse.urlencode(extract_params)}" - raw2 = _http_get(extract_url) - data2 = json.loads(raw2.decode("utf-8")) - pages = data2.get("query", {}).get("pages", {}) - - results: list[dict[str, Any]] = [] - for pid in page_ids: - page = pages.get(pid) - if not page: - continue - title = page.get("title", "") - extract = (page.get("extract", "") or "").strip() - if len(extract) > 1200: - extract = extract[:1200] + "..." - url = f"https://{language}.wikipedia.org/?curid={pid}" - results.append({"title": title, "pageid": int(pid), "extract": extract, "url": url}) - - return {"results": results} - - -def get_extra_instruction_tpl() -> str: - """Generate tool usage instructions template for arithmetic and lookups. - - Returns: - Instruction template string to include in system prompts. - """ - return ( - "\n\n" - "## Tools Workflow (Arithmetic, arXiv, Wikipedia)\n\n" - "Available actions:\n" - "- `add(a, b)`, `subtract(a, b)`, `multiply(a, b)`, `divide(a, b)`, `modulus(a, b)`\n" - "- `arxiv_search(query, max_results=3)`\n" - "- `wiki_search(query, max_results=2, language='en')`\n\n" - "POLICY:\n" - "1) Use arithmetic tools for calculations instead of inline math when non-trivial.\n" - "2) Use arXiv/Wikipedia tools when scholarly/general knowledge retrieval is needed.\n" - "3) Keep outputs concise; provide FINAL ANSWER after any intermediate reasoning.\n" - ) diff --git a/packages/ragbits-evaluate/src/ragbits/evaluate/metrics/gaia.py b/packages/ragbits-evaluate/src/ragbits/evaluate/metrics/gaia.py index 0f6a85267..05f1c9308 100644 --- a/packages/ragbits-evaluate/src/ragbits/evaluate/metrics/gaia.py +++ b/packages/ragbits-evaluate/src/ragbits/evaluate/metrics/gaia.py @@ -68,22 +68,16 @@ class GaiaEfficiency(Metric[GaiaResult]): """ Efficiency and resource usage metrics: - gaia_avg_latency_ms: average response latency in milliseconds - - gaia_avg_cost_usd: average cost per task in USD - - gaia_avg_total_tokens: average total tokens used per task """ async def compute(self, results: list[GaiaResult]) -> dict: """Compute efficiency and resource usage metrics. Returns: - Dictionary with average latency, cost, and token usage. + Dictionary with average latency. """ avg_latency = float(mean(r.total_latency_ms for r in results)) if results else 0.0 - avg_cost = float(mean(r.cost_usd for r in results)) if results else 0.0 - avg_tokens = float(mean(r.total_tokens for r in results)) if results else 0.0 return { "gaia_avg_latency_ms": avg_latency, - "gaia_avg_cost_usd": avg_cost, - "gaia_avg_total_tokens": avg_tokens, } diff --git a/packages/ragbits-evaluate/src/ragbits/evaluate/pipelines/gaia.py b/packages/ragbits-evaluate/src/ragbits/evaluate/pipelines/gaia.py index 2ac041aa3..c425eed77 100644 --- a/packages/ragbits-evaluate/src/ragbits/evaluate/pipelines/gaia.py +++ b/packages/ragbits-evaluate/src/ragbits/evaluate/pipelines/gaia.py @@ -41,8 +41,6 @@ class GaiaResult(EvaluationResult): num_tool_calls: int tool_error_count: int total_latency_ms: int - total_tokens: int - cost_usd: float tool_names: list[str] | None = None @@ -96,14 +94,12 @@ async def __call__(self, data: Iterable[GaiaData]) -> Iterable[GaiaResult]: content, dbg = await self._generate_with_debug(prompt_input) if debug_traces is not None: debug_traces.append(dbg) - usage = cast(Usage, (dbg or {}).get("usage") or Usage()) tool_calls = cast(list, (dbg or {}).get("tool_calls") or []) else: - content, usage, tool_calls = await self._generate_answer(prompt_input) + content, _, tool_calls = await self._generate_answer(prompt_input) except Exception as generation_exc: content = "" - usage = Usage() tool_calls = [] err_msg = f"GenerationError: {generation_exc.__class__.__name__}: {generation_exc}" if self.extended_logs and debug_traces is not None: @@ -130,8 +126,6 @@ async def __call__(self, data: Iterable[GaiaData]) -> Iterable[GaiaResult]: logging.getLogger(__name__).debug("Error while parsing tool call result: %s", exc) total_latency_ms = int((end_time - start_time) * 1000) - total_tokens = usage.total_tokens if usage else 0 - cost_usd = usage.estimated_cost if usage else 0.0 # Extract tool names (if any) from tool_calls tool_names: list[str] | None = None @@ -158,8 +152,6 @@ async def __call__(self, data: Iterable[GaiaData]) -> Iterable[GaiaResult]: num_tool_calls=num_tool_calls, tool_error_count=tool_error_count, total_latency_ms=total_latency_ms, - total_tokens=total_tokens, - cost_usd=float(cost_usd), tool_names=tool_names, ) results.append(result) @@ -177,7 +169,8 @@ def _init_log_file(self) -> None: if self.per_example_log_file is None: return self.per_example_log_file.parent.mkdir(parents=True, exist_ok=True) - self.per_example_log_file.touch(exist_ok=True) + with open(self.per_example_log_file, "w", encoding="utf-8") as _: + pass def _log_example(self, row: GaiaData, result: GaiaResult, extended_log: str | None = None) -> None: """Append a single NDJSON record for debugging if enabled.""" @@ -200,8 +193,6 @@ def _log_example(self, row: GaiaData, result: GaiaResult, extended_log: str | No "num_tool_calls": result.num_tool_calls, "tool_error_count": result.tool_error_count, "total_latency_ms": result.total_latency_ms, - "total_tokens": result.total_tokens, - "cost_usd": result.cost_usd, "tool_frequency_usage": tool_frequency_usage, } record["extended_debug_logging"] = extended_log or "[]" diff --git a/packages/ragbits-evaluate/src/ragbits/evaluate/pipelines/hotpot_qa.py b/packages/ragbits-evaluate/src/ragbits/evaluate/pipelines/hotpot_qa.py index 4721e8548..8812efabe 100644 --- a/packages/ragbits-evaluate/src/ragbits/evaluate/pipelines/hotpot_qa.py +++ b/packages/ragbits-evaluate/src/ragbits/evaluate/pipelines/hotpot_qa.py @@ -15,7 +15,6 @@ from ragbits.evaluate.pipelines.base import EvaluationData, EvaluationPipeline, EvaluationResult - class HotpotQAData(EvaluationData): """ Represents a single HotpotQA example. @@ -67,6 +66,7 @@ def __init__( per_example_log_file: Path | None = None, extended_logs: bool = False, parse_answer_fn: Callable[[str], str] | None = None, + question_generation_prompt_fn: Callable[[str, str], str] | None = None, retrieval_k: int = 3, element_max_chars: int = 500, hop_context_max_chars: int = 1200, @@ -77,6 +77,7 @@ def __init__( self.per_example_log_file = per_example_log_file self.extended_logs = extended_logs self.parse_answer_fn = parse_answer_fn + self.question_generation_prompt_fn = question_generation_prompt_fn self.retrieval_k = max(1, int(retrieval_k)) self.element_max_chars = max(50, int(element_max_chars)) self.hop_context_max_chars = max(100, int(hop_context_max_chars)) @@ -110,7 +111,7 @@ async def __call__(self, data: Iterable[HotpotQAData]) -> Iterable[HotpotQAResul async def answer_with_retrieval( example: HotpotQAData, - ) -> tuple[str, Usage, list, list[dict]]: + ) -> tuple[str, Usage, list, list[dict], dict]: accumulated_context: list[str] = [] hop_logs: list[dict] = [] last_query = example.question @@ -133,7 +134,12 @@ async def answer_with_retrieval( hop_logs.append({"hop": hop_idx + 1, "question": last_query, "retrieved": hop_text}) if hop_text: accumulated_context.append(hop_text) - last_query = f"{example.question}\n\nContext so far:\n{hop_text}" + # generate a new question for the next hop + if hop_idx < self.hops - 1: + last_query = await self._generate_next_question( + original_question=example.question, + accumulated_context="\n\n".join(accumulated_context), + ) else: break @@ -145,20 +151,23 @@ async def answer_with_retrieval( content, dbg = await self._generate_with_debug(prompt_input) usage = cast(Usage, (dbg or {}).get("usage") or Usage()) tool_calls = cast(list, (dbg or {}).get("tool_calls") or []) + metadata = cast(dict, (dbg or {}).get("metadata") or {}) else: content, usage, tool_calls = await self._generate_answer(prompt_input) + metadata = {} - return str(content), usage, tool_calls, hop_logs + return str(content), usage, tool_calls, hop_logs, metadata results: list[HotpotQAResult] = [] for row in data: try: - predicted_text, usage, tool_calls, hop_logs = await answer_with_retrieval(row) + predicted_text, usage, tool_calls, hop_logs, metadata = await answer_with_retrieval(row) except Exception: predicted_text = "" usage = Usage() tool_calls = [] hop_logs = [] + metadata = {} predicted_extracted = self._parse_answer(predicted_text) ref_norm = self._normalize(row.reference_answer) @@ -183,11 +192,14 @@ async def answer_with_retrieval( ext_log_str = None if self.extended_logs: ext_log_str = json.dumps( - { - "usage": usage, - "tool_calls": tool_calls, - "hops": hop_logs, - }, + [ + { + "usage": usage, + "tool_calls": tool_calls, + "hops": hop_logs, + "metadata": metadata, + } + ], ensure_ascii=False, default=str, ) @@ -207,7 +219,8 @@ def _init_log_file(self) -> None: if self.per_example_log_file is None: return self.per_example_log_file.parent.mkdir(parents=True, exist_ok=True) - self.per_example_log_file.touch(exist_ok=True) + with open(self.per_example_log_file, "w", encoding="utf-8") as _: + pass def _log_example( self, @@ -276,6 +289,21 @@ async def _generate_with_debug(self, prompt: str) -> tuple[str, dict | None]: resp = await target.generate(prompt) return str(resp), None + async def _generate_next_question(self, original_question: str, accumulated_context: str) -> str: + """Generate a new follow-up question based on the original question and accumulated context.""" + if self.question_generation_prompt_fn is None: + # default: simple concatenation + return f"{original_question}\n\nContext so far:\n{accumulated_context}" + + question_generation_prompt = self.question_generation_prompt_fn(original_question, accumulated_context) + + target = self.evaluation_target + if isinstance(target, Agent): + resp = await target.llm.generate(question_generation_prompt) + return str(resp).strip() + resp = await target.generate(question_generation_prompt) + return str(resp).strip() + @staticmethod def _normalize(text: str) -> str: """Basic normalization for answer equality checks: lowercase, strip spaces.""" diff --git a/packages/ragbits-evaluate/src/ragbits/evaluate/pipelines/human_eval.py b/packages/ragbits-evaluate/src/ragbits/evaluate/pipelines/human_eval.py index 20b933ca8..eb737d39d 100644 --- a/packages/ragbits-evaluate/src/ragbits/evaluate/pipelines/human_eval.py +++ b/packages/ragbits-evaluate/src/ragbits/evaluate/pipelines/human_eval.py @@ -262,7 +262,8 @@ def _init_log_file(self) -> None: if self.per_example_log_file is None: return self.per_example_log_file.parent.mkdir(parents=True, exist_ok=True) - self.per_example_log_file.touch(exist_ok=True) + with open(self.per_example_log_file, "w", encoding="utf-8") as _: + pass def _log_example(self, row: HumanEvalData, result: HumanEvalResult, extended_log: str | None = None) -> None: """Append a single NDJSON record for debugging if enabled.""" From 4b2585a4c7a3d626daa191854d682d7454598108 Mon Sep 17 00:00:00 2001 From: ds-radoslaw-izak Date: Wed, 1 Oct 2025 10:41:16 +0200 Subject: [PATCH 29/43] add changelogs --- packages/ragbits-core/CHANGELOG.md | 2 ++ packages/ragbits-evaluate/CHANGELOG.md | 2 ++ 2 files changed, 4 insertions(+) diff --git a/packages/ragbits-core/CHANGELOG.md b/packages/ragbits-core/CHANGELOG.md index ba5e09235..97c10733c 100644 --- a/packages/ragbits-core/CHANGELOG.md +++ b/packages/ragbits-core/CHANGELOG.md @@ -2,6 +2,8 @@ ## Unreleased +- Add name parameter for better filtering of HuggingFace dataloder (#829) + ## 1.3.0 (2025-09-11) - feat: improve app startup speed with lazy LiteLLM loading diff --git a/packages/ragbits-evaluate/CHANGELOG.md b/packages/ragbits-evaluate/CHANGELOG.md index fb7f6bfd8..bade54113 100644 --- a/packages/ragbits-evaluate/CHANGELOG.md +++ b/packages/ragbits-evaluate/CHANGELOG.md @@ -2,6 +2,8 @@ ## Unreleased +- Feat: introduce agent evaluation pipelines and metrics (HotpotQA, HumanEval, GAIA) (#829) + ## 1.3.0 (2025-09-11) ### Changed From 3a9df862751b1f53d7bedce9a7282dd6c7ef6410 Mon Sep 17 00:00:00 2001 From: ds-radoslaw-izak Date: Wed, 1 Oct 2025 10:52:42 +0200 Subject: [PATCH 30/43] trailing spaces removal --- examples/evaluate/agent-benchmarking/run_gaia.py | 14 +++++--------- examples/evaluate/agent-benchmarking/run_hotpot.py | 8 +++----- .../evaluate/agent-benchmarking/run_humaneval.py | 12 +++++------- .../src/ragbits/evaluate/pipelines/hotpot_qa.py | 4 ++-- 4 files changed, 15 insertions(+), 23 deletions(-) diff --git a/examples/evaluate/agent-benchmarking/run_gaia.py b/examples/evaluate/agent-benchmarking/run_gaia.py index 66769adee..43ff7551e 100644 --- a/examples/evaluate/agent-benchmarking/run_gaia.py +++ b/examples/evaluate/agent-benchmarking/run_gaia.py @@ -35,6 +35,8 @@ from pathlib import Path from typing import Any +from todo_agent import TodoAgent + from ragbits.agents import Agent, AgentOptions from ragbits.agents.tools.openai import get_web_search_tool from ragbits.core.llms import LiteLLM @@ -45,10 +47,8 @@ from ragbits.evaluate.metrics.gaia import GaiaEfficiency, GaiaOutcome, GaiaTooling from ragbits.evaluate.pipelines.gaia import GaiaPipeline -from todo_agent import TodoAgent - +# Extra Agent tools -# Extra Agent tools def add(a: int, b: int) -> int: """Add two integers and return the result.""" @@ -137,7 +137,7 @@ def wiki_search(query: str, max_results: int = 2, language: str = "en") -> dict[ urls: list[str] = data[3] if len(data) > 3 else [] results: list[dict[str, Any]] = [] - for i, title in enumerate(titles[: max_results]): + for i, title in enumerate(titles[:max_results]): url = urls[i] if i < len(urls) else "" results.append({"title": title, "url": url}) @@ -208,9 +208,7 @@ async def main(use_todo: bool) -> None: tools=_build_tools(), default_options=AgentOptions(max_turns=30), ) - evaluation_target = ( - TodoAgent(agent=base_agent, domain_context="general AI assistant") if use_todo else base_agent - ) + evaluation_target = TodoAgent(agent=base_agent, domain_context="general AI assistant") if use_todo else base_agent # Data loader source = HuggingFaceSource(path="gaia-benchmark/GAIA", name="2023_level1", split="validation") @@ -284,5 +282,3 @@ async def _print_todo_stats(log_path: Path, dataloader) -> None: args = parser.parse_args() asyncio.run(main(args.use_todo)) - - diff --git a/examples/evaluate/agent-benchmarking/run_hotpot.py b/examples/evaluate/agent-benchmarking/run_hotpot.py index 1726fc311..7697ad151 100644 --- a/examples/evaluate/agent-benchmarking/run_hotpot.py +++ b/examples/evaluate/agent-benchmarking/run_hotpot.py @@ -31,6 +31,8 @@ import logging from pathlib import Path +from todo_agent import TodoAgent + from ragbits.agents import Agent, AgentOptions from ragbits.core.embeddings import LiteLLMEmbedder from ragbits.core.llms import LiteLLM @@ -45,8 +47,6 @@ from ragbits.evaluate.metrics.hotpot_qa import HotpotQAExactMatch, HotpotQAF1 from ragbits.evaluate.pipelines.hotpot_qa import HotpotQAPipeline -from todo_agent import TodoAgent - def _build_system_prompt() -> str: """Build a unified HotpotQA system prompt shared by both modes.""" @@ -104,9 +104,7 @@ async def main(use_todo: bool) -> None: tools=[], default_options=AgentOptions(max_turns=5), ) - evaluation_target = ( - TodoAgent(agent=base_agent, domain_context="research QA") if use_todo else base_agent - ) + evaluation_target = TodoAgent(agent=base_agent, domain_context="research QA") if use_todo else base_agent # Data loader source = HuggingFaceSource(path="hotpotqa/hotpot_qa", name="distractor", split="validation") diff --git a/examples/evaluate/agent-benchmarking/run_humaneval.py b/examples/evaluate/agent-benchmarking/run_humaneval.py index ee4cc762e..bb815b1d8 100644 --- a/examples/evaluate/agent-benchmarking/run_humaneval.py +++ b/examples/evaluate/agent-benchmarking/run_humaneval.py @@ -2,7 +2,7 @@ Ragbits Evaluation Example: HumanEval (Agent vs TodoAgent) This example demonstrates how to evaluate HumanEval using either a classic `Agent` -or a task-decomposing `TodoAgent`. Both modes share the +or a task-decomposing `TodoAgent`. Both modes share the same prompt, retrieval setup, and parsing logic. To run the script, execute one of the following commands: @@ -30,6 +30,8 @@ import logging from pathlib import Path +from todo_agent import TodoAgent + from ragbits.agents import Agent, AgentOptions from ragbits.core.llms import LiteLLM from ragbits.core.sources.hf import HuggingFaceSource @@ -39,8 +41,6 @@ from ragbits.evaluate.metrics.human_eval import HumanEvalPassAtK, HumanEvalQualityPerf from ragbits.evaluate.pipelines.human_eval import HumanEvalPipeline -from todo_agent import TodoAgent - def _build_system_prompt() -> str: """Build a unified HumanEval system prompt shared by both modes.""" @@ -49,7 +49,7 @@ def _build_system_prompt() -> str: "You are an expert Python engineer.", "Implement exactly one function that solves the problem.", "Output ONLY the function as plain Python (no markdown). Include necessary imports.", - "Do not include explanations or comments." + "Do not include explanations or comments.", ] ) @@ -80,9 +80,7 @@ async def main(use_todo: bool) -> None: tools=[], default_options=AgentOptions(max_turns=30), ) - evaluation_target = ( - TodoAgent(agent=base_agent, domain_context="python engineer") if use_todo else base_agent - ) + evaluation_target = TodoAgent(agent=base_agent, domain_context="python engineer") if use_todo else base_agent # Data source = HuggingFaceSource(path="openai/openai_humaneval", split="test") diff --git a/packages/ragbits-evaluate/src/ragbits/evaluate/pipelines/hotpot_qa.py b/packages/ragbits-evaluate/src/ragbits/evaluate/pipelines/hotpot_qa.py index 8812efabe..d1eb70894 100644 --- a/packages/ragbits-evaluate/src/ragbits/evaluate/pipelines/hotpot_qa.py +++ b/packages/ragbits-evaluate/src/ragbits/evaluate/pipelines/hotpot_qa.py @@ -294,9 +294,9 @@ async def _generate_next_question(self, original_question: str, accumulated_cont if self.question_generation_prompt_fn is None: # default: simple concatenation return f"{original_question}\n\nContext so far:\n{accumulated_context}" - + question_generation_prompt = self.question_generation_prompt_fn(original_question, accumulated_context) - + target = self.evaluation_target if isinstance(target, Agent): resp = await target.llm.generate(question_generation_prompt) From 49bf3aa61bb496537021c2e951d577fcf2f08a2f Mon Sep 17 00:00:00 2001 From: ds-radoslaw-izak Date: Wed, 1 Oct 2025 11:06:45 +0200 Subject: [PATCH 31/43] remove some extra tools --- .../evaluate/agent-benchmarking/run_gaia.py | 74 ------------------- 1 file changed, 74 deletions(-) diff --git a/examples/evaluate/agent-benchmarking/run_gaia.py b/examples/evaluate/agent-benchmarking/run_gaia.py index 43ff7551e..ab13c0c0d 100644 --- a/examples/evaluate/agent-benchmarking/run_gaia.py +++ b/examples/evaluate/agent-benchmarking/run_gaia.py @@ -27,13 +27,8 @@ import argparse import asyncio -import json import logging -import urllib.parse -import urllib.request -import xml.etree.ElementTree as ET from pathlib import Path -from typing import Any from todo_agent import TodoAgent @@ -79,78 +74,11 @@ def modulus(a: int, b: int) -> int: return a % b -def _http_get(url: str, timeout: float = 10.0) -> bytes: - req = urllib.request.Request(url, headers={"User-Agent": "ragbits-agents/extra-tools"}) - with urllib.request.urlopen(req, timeout=timeout) as resp: - return resp.read() - - -def arxiv_search(query: str, max_results: int = 3) -> dict[str, Any]: - """Search arXiv and return up to `max_results` entries (title, summary, link).""" - if max_results <= 0: - return {"results": []} - - base = "https://export.arxiv.org/api/query" - params = urllib.parse.urlencode( - { - "search_query": query, - "start": 0, - "max_results": max_results, - "sortBy": "relevance", - "sortOrder": "descending", - } - ) - raw = _http_get(f"{base}?{params}") - - root = ET.fromstring(raw) - ns = {"atom": "http://www.w3.org/2005/Atom"} - results: list[dict[str, str]] = [] - for entry in root.findall("atom:entry", ns): - title = (entry.findtext("atom:title", default="", namespaces=ns) or "").strip() - summary = (entry.findtext("atom:summary", default="", namespaces=ns) or "").strip() - link_el = entry.find("atom:link[@rel='alternate']", ns) - link = link_el.get("href") if link_el is not None else "" - results.append({"title": title, "summary": summary, "link": link}) - - return {"results": results} - - -def wiki_search(query: str, max_results: int = 2, language: str = "en") -> dict[str, Any]: - """Search Wikipedia and return up to `max_results` entries (title and url).""" - if max_results <= 0: - return {"results": []} - - api = f"https://{language}.wikipedia.org/w/api.php" - params = urllib.parse.urlencode( - { - "action": "opensearch", - "search": query, - "limit": max_results, - "namespace": 0, - "format": "json", - } - ) - raw = _http_get(f"{api}?{params}") - data = json.loads(raw.decode("utf-8")) - - titles: list[str] = data[1] if len(data) > 1 else [] - urls: list[str] = data[3] if len(data) > 3 else [] - - results: list[dict[str, Any]] = [] - for i, title in enumerate(titles[:max_results]): - url = urls[i] if i < len(urls) else "" - results.append({"title": title, "url": url}) - - return {"results": results} - - def get_extra_instruction_tpl() -> str: """Generate tool usage instructions template for arithmetic and lookups.""" return ( "Tools (use when needed):\n" "- add(a, b), subtract(a, b), multiply(a, b), divide(a, b), modulus(a, b)\n" - "- arxiv_search(query, max_results=3)\n" - "- wiki_search(query, max_results=2, language='en')\n" "- web_search -> OpenAI websearch tool\n" ) @@ -180,8 +108,6 @@ def _build_tools() -> list: multiply, divide, modulus, - arxiv_search, - wiki_search, get_web_search_tool(model_name="gpt-4.1-mini"), ] From 2b04da9715f56e8fa779b48d2c413665453ca9fa Mon Sep 17 00:00:00 2001 From: ds-radoslaw-izak Date: Wed, 1 Oct 2025 13:04:52 +0200 Subject: [PATCH 32/43] ruff and mypy refactor --- .../evaluate/agent-benchmarking/run_gaia.py | 2 +- .../evaluate/agent-benchmarking/run_hotpot.py | 2 +- .../agent-benchmarking/run_humaneval.py | 2 +- packages/ragbits-core/CHANGELOG.md | 2 +- .../src/ragbits/core/sources/hf.py | 57 +++++---- .../src/ragbits/evaluate/metrics/gaia.py | 9 +- .../src/ragbits/evaluate/metrics/hotpot_qa.py | 6 +- .../ragbits/evaluate/metrics/human_eval.py | 3 +- .../src/ragbits/evaluate/pipelines/gaia.py | 57 +++++---- .../ragbits/evaluate/pipelines/hotpot_qa.py | 109 +++++++++--------- .../ragbits/evaluate/pipelines/human_eval.py | 96 ++++++++------- pyproject.toml | 3 + 12 files changed, 197 insertions(+), 151 deletions(-) diff --git a/examples/evaluate/agent-benchmarking/run_gaia.py b/examples/evaluate/agent-benchmarking/run_gaia.py index ab13c0c0d..797f479d9 100644 --- a/examples/evaluate/agent-benchmarking/run_gaia.py +++ b/examples/evaluate/agent-benchmarking/run_gaia.py @@ -164,7 +164,7 @@ async def main(use_todo: bool) -> None: await _print_todo_stats(log_path, dataloader) -async def _print_todo_stats(log_path: Path, dataloader) -> None: +async def _print_todo_stats(log_path: Path, dataloader: GaiaDataLoader) -> None: """Print aggregated TODO-agent statistics from extended logs.""" print("\nTODO Orchestrator Statistics:") decomposed_count = 0 diff --git a/examples/evaluate/agent-benchmarking/run_hotpot.py b/examples/evaluate/agent-benchmarking/run_hotpot.py index 7697ad151..637e331f8 100644 --- a/examples/evaluate/agent-benchmarking/run_hotpot.py +++ b/examples/evaluate/agent-benchmarking/run_hotpot.py @@ -137,7 +137,7 @@ async def main(use_todo: bool) -> None: await _print_todo_stats(log_path, dataloader) -async def _print_todo_stats(log_path: Path, dataloader) -> None: +async def _print_todo_stats(log_path: Path, dataloader: HotpotQADataLoader) -> None: """Print aggregated TODO-agent statistics from extended logs.""" print("\nTODO Orchestrator Statistics:") decomposed_count = 0 diff --git a/examples/evaluate/agent-benchmarking/run_humaneval.py b/examples/evaluate/agent-benchmarking/run_humaneval.py index bb815b1d8..4c21c3938 100644 --- a/examples/evaluate/agent-benchmarking/run_humaneval.py +++ b/examples/evaluate/agent-benchmarking/run_humaneval.py @@ -113,7 +113,7 @@ async def main(use_todo: bool) -> None: await _print_todo_stats(log_path, dataloader) -async def _print_todo_stats(log_path: Path, dataloader) -> None: +async def _print_todo_stats(log_path: Path, dataloader: HumanEvalDataLoader) -> None: """Print aggregated TODO-agent statistics from extended logs.""" print("\nTODO Orchestrator Statistics:") decomposed_count = 0 diff --git a/packages/ragbits-core/CHANGELOG.md b/packages/ragbits-core/CHANGELOG.md index 97c10733c..c3c7c7f72 100644 --- a/packages/ragbits-core/CHANGELOG.md +++ b/packages/ragbits-core/CHANGELOG.md @@ -2,7 +2,7 @@ ## Unreleased -- Add name parameter for better filtering of HuggingFace dataloder (#829) +- Add name parameter and slightly refactor HuggingFace dataloder (#829) ## 1.3.0 (2025-09-11) diff --git a/packages/ragbits-core/src/ragbits/core/sources/hf.py b/packages/ragbits-core/src/ragbits/core/sources/hf.py index b65d613dc..ad383c8b5 100644 --- a/packages/ragbits-core/src/ragbits/core/sources/hf.py +++ b/packages/ragbits-core/src/ragbits/core/sources/hf.py @@ -1,7 +1,7 @@ import re from collections.abc import Iterable from pathlib import Path -from typing import ClassVar +from typing import TYPE_CHECKING, ClassVar, TypeAlias from typing_extensions import Self @@ -10,6 +10,11 @@ from ragbits.core.sources.exceptions import SourceConnectionError, SourceNotFoundError from ragbits.core.utils.decorators import requires_dependencies +if TYPE_CHECKING: + from datasets import Dataset, DatasetDict, IterableDataset, IterableDatasetDict + + HFDataset: TypeAlias = Dataset | DatasetDict | IterableDataset | IterableDatasetDict + class HuggingFaceSource(Source): """ @@ -34,6 +39,32 @@ def id(self) -> str: """ return f"hf:{self.path}/{self.split}{f'/{self.row}' if self.row is not None else ''}" + def _load_dataset(self, streaming: bool = False) -> "HFDataset": + """ + Load the dataset from Hugging Face. + + Args: + streaming: Whether to stream the dataset. + + Returns: + The loaded dataset. + + Raises: + SourceConnectionError: If the source connection fails. + SourceNotFoundError: If the source dataset is not found. + """ + from datasets import load_dataset + from datasets.exceptions import DatasetNotFoundError + + try: + if self.name is not None and str(self.name).strip(): + return load_dataset(self.path, self.name, split=self.split, streaming=streaming) + return load_dataset(self.path, split=self.split, streaming=streaming) + except ConnectionError as exc: + raise SourceConnectionError() from exc + except DatasetNotFoundError as exc: + raise SourceNotFoundError(source_id=self.id) from exc + @requires_dependencies(["datasets"], "hf") async def fetch(self) -> Path: """ @@ -46,20 +77,9 @@ async def fetch(self) -> Path: SourceConnectionError: If the source connection fails. SourceNotFoundError: If the source document is not found. """ - from datasets import load_dataset - from datasets.exceptions import DatasetNotFoundError - with trace(path=self.path, split=self.split, row=self.row) as outputs: if self.row is not None: - try: - if self.name is not None and str(self.name).strip(): - dataset = load_dataset(self.path, self.name, split=self.split, streaming=True) - else: - dataset = load_dataset(self.path, split=self.split, streaming=True) - except ConnectionError as exc: - raise SourceConnectionError() from exc - except DatasetNotFoundError as exc: - raise SourceNotFoundError(source_id=self.id) from exc + dataset = self._load_dataset(streaming=True) try: data = next(iter(dataset.skip(self.row).take(1))) @@ -82,16 +102,7 @@ async def fetch(self) -> Path: path = source_dir / f"{self.split}.json" if not path.is_file(): - try: - if self.name is not None and str(self.name).strip(): - dataset = load_dataset(self.path, self.name, split=self.split) - else: - dataset = load_dataset(self.path, split=self.split) - except ConnectionError as exc: - raise SourceConnectionError() from exc - except DatasetNotFoundError as exc: - raise SourceNotFoundError(source_id=self.id) from exc - + dataset = self._load_dataset(streaming=False) dataset.to_json(path) outputs.path = path diff --git a/packages/ragbits-evaluate/src/ragbits/evaluate/metrics/gaia.py b/packages/ragbits-evaluate/src/ragbits/evaluate/metrics/gaia.py index 05f1c9308..7e824f05f 100644 --- a/packages/ragbits-evaluate/src/ragbits/evaluate/metrics/gaia.py +++ b/packages/ragbits-evaluate/src/ragbits/evaluate/metrics/gaia.py @@ -12,7 +12,8 @@ class GaiaOutcome(Metric[GaiaResult]): Measures the fraction of tasks that were successfully solved. """ - async def compute(self, results: list[GaiaResult]) -> dict: + @staticmethod + async def compute(results: list[GaiaResult]) -> dict: """Compute task success rate. Returns: @@ -33,7 +34,8 @@ class GaiaTooling(Metric[GaiaResult]): - averaged_freq: average tool usage/calls per task """ - async def compute(self, results: list[GaiaResult]) -> dict: + @staticmethod + async def compute(results: list[GaiaResult]) -> dict: """Compute tool utilization and performance metrics. Returns: @@ -70,7 +72,8 @@ class GaiaEfficiency(Metric[GaiaResult]): - gaia_avg_latency_ms: average response latency in milliseconds """ - async def compute(self, results: list[GaiaResult]) -> dict: + @staticmethod + async def compute(results: list[GaiaResult]) -> dict: """Compute efficiency and resource usage metrics. Returns: diff --git a/packages/ragbits-evaluate/src/ragbits/evaluate/metrics/hotpot_qa.py b/packages/ragbits-evaluate/src/ragbits/evaluate/metrics/hotpot_qa.py index aafc96b0d..615f070e3 100644 --- a/packages/ragbits-evaluate/src/ragbits/evaluate/metrics/hotpot_qa.py +++ b/packages/ragbits-evaluate/src/ragbits/evaluate/metrics/hotpot_qa.py @@ -10,7 +10,8 @@ class HotpotQAExactMatch(Metric[HotpotQAResult]): """Computes EM over HotpotQA by type and overall.""" - async def compute(self, results: list[HotpotQAResult]) -> dict: + @staticmethod + async def compute(results: list[HotpotQAResult]) -> dict: """Compute EM. Returns hotpotqa__em and hotpotqa_overall_em.""" buckets: dict[str, list[float]] = defaultdict(list) for r in results: @@ -32,7 +33,8 @@ def avg(vals: Iterable[float]) -> float: class HotpotQAF1(Metric[HotpotQAResult]): """Computes token-level F1 over HotpotQA by type and overall.""" - async def compute(self, results: list[HotpotQAResult]) -> dict: + @staticmethod + async def compute(results: list[HotpotQAResult]) -> dict: """Compute F1. Returns hotpotqa__f1 and hotpotqa_overall_f1.""" buckets: dict[str, list[float]] = defaultdict(list) for r in results: diff --git a/packages/ragbits-evaluate/src/ragbits/evaluate/metrics/human_eval.py b/packages/ragbits-evaluate/src/ragbits/evaluate/metrics/human_eval.py index dae1a901a..040e616c7 100644 --- a/packages/ragbits-evaluate/src/ragbits/evaluate/metrics/human_eval.py +++ b/packages/ragbits-evaluate/src/ragbits/evaluate/metrics/human_eval.py @@ -56,7 +56,8 @@ class HumanEvalQualityPerf(Metric[HumanEvalResult]): - humaneval_avg_exec_time_sec: average exec time over compilable runs """ - async def compute(self, results: list[HumanEvalResult]) -> dict: + @staticmethod + async def compute(results: list[HumanEvalResult]) -> dict: """Compute code quality and execution performance metrics. Returns: diff --git a/packages/ragbits-evaluate/src/ragbits/evaluate/pipelines/gaia.py b/packages/ragbits-evaluate/src/ragbits/evaluate/pipelines/gaia.py index c425eed77..12dcc13e1 100644 --- a/packages/ragbits-evaluate/src/ragbits/evaluate/pipelines/gaia.py +++ b/packages/ragbits-evaluate/src/ragbits/evaluate/pipelines/gaia.py @@ -74,9 +74,38 @@ def from_config(cls, config: dict) -> Self: try: config["evaluation_target"] = Agent.from_config(config) except Exception: - config["evaluation_target"] = LLM.subclass_from_config(config) + config["evaluation_target"] = LLM.from_config(config) return super().from_config(config) + @staticmethod + def _count_tool_errors(tool_calls: list) -> int: + """Count tool errors from tool_calls.""" + tool_error_count = 0 + for call in tool_calls: + try: + if isinstance(call.result, dict) and "error" in call.result: + tool_error_count += 1 + except Exception as exc: + logging.getLogger(__name__).debug("Error while parsing tool call result: %s", exc) + return tool_error_count + + @staticmethod + def _extract_tool_names(tool_calls: list) -> list[str] | None: + """Extract tool names from tool_calls.""" + if not tool_calls: + return None + tool_names = [] + for call in tool_calls: + try: + name = getattr(call, "name", None) + if name is None and isinstance(call, dict): + name = call.get("name") + if name: + tool_names.append(str(name)) + except Exception as exc: + logging.getLogger(__name__).debug("Tool name extraction error: %s", exc) + return tool_names + async def __call__(self, data: Iterable[GaiaData]) -> Iterable[GaiaResult]: """Generate answer completions per task and evaluate them. Returns list of `GaiaResult`, one per input task. @@ -115,32 +144,10 @@ async def __call__(self, data: Iterable[GaiaData]) -> Iterable[GaiaResult]: tool_triggered = bool(tool_calls) num_tool_calls = len(tool_calls) - - # Count tool errors from AgentResult.tool_calls metadata if present - tool_error_count = 0 - for call in tool_calls: - try: - if isinstance(call.result, dict) and "error" in call.result: - tool_error_count += 1 - except Exception as exc: - logging.getLogger(__name__).debug("Error while parsing tool call result: %s", exc) - + tool_error_count = GaiaPipeline._count_tool_errors(tool_calls) + tool_names = GaiaPipeline._extract_tool_names(tool_calls) total_latency_ms = int((end_time - start_time) * 1000) - # Extract tool names (if any) from tool_calls - tool_names: list[str] | None = None - if tool_calls: - tool_names = [] - for call in tool_calls: - try: - name = getattr(call, "name", None) - if name is None and isinstance(call, dict): - name = call.get("name") - if name: - tool_names.append(str(name)) - except Exception as exc: - logging.getLogger(__name__).debug("Tool name extraction error: %s", exc) - result = GaiaResult( task_id=row.task_id, level=row.level, diff --git a/packages/ragbits-evaluate/src/ragbits/evaluate/pipelines/hotpot_qa.py b/packages/ragbits-evaluate/src/ragbits/evaluate/pipelines/hotpot_qa.py index d1eb70894..b5c019a2f 100644 --- a/packages/ragbits-evaluate/src/ragbits/evaluate/pipelines/hotpot_qa.py +++ b/packages/ragbits-evaluate/src/ragbits/evaluate/pipelines/hotpot_qa.py @@ -92,7 +92,7 @@ def from_config(cls, config: dict) -> Self: try: config["evaluation_target"] = Agent.from_config(config) except Exception: - config["evaluation_target"] = LLM.subclass_from_config(config) + config["evaluation_target"] = LLM.from_config(config) config["retriever"] = DocumentSearch.from_config(config["document_search"]) config["hops"] = int(config.get("hops", 3)) config["retrieval_k"] = int(config.get("retrieval_k", 3)) @@ -100,68 +100,73 @@ def from_config(cls, config: dict) -> Self: config["hop_context_max_chars"] = int(config.get("hop_context_max_chars", 1200)) return super().from_config(config) - async def __call__(self, data: Iterable[HotpotQAData]) -> Iterable[HotpotQAResult]: - """Ingest contexts, perform multi-hop retrieval, and answer HotpotQA questions.""" + async def _ingest_documents(self, data: Iterable[HotpotQAData]) -> None: + """Ingest all documents from the data.""" documents: list[DocumentMeta] = [] for row in data: for content in row.reference_context: documents.append(DocumentMeta.from_literal(content)) - await self.retriever.ingest(documents) - async def answer_with_retrieval( - example: HotpotQAData, - ) -> tuple[str, Usage, list, list[dict], dict]: - accumulated_context: list[str] = [] - hop_logs: list[dict] = [] - last_query = example.question - for hop_idx in range(self.hops): - elements = await self.retriever.search(last_query) - text_parts: list[str] = [] - consumed = 0 - for element in elements[: self.retrieval_k]: - content = getattr(element, "content", "") if hasattr(element, "content") else "" - if isinstance(content, str) and content: - snippet = content.strip().replace("\n\n", "\n")[: self.element_max_chars] - budget = max(0, self.hop_context_max_chars - consumed) - take = snippet[:budget] - if take: - text_parts.append(take) - consumed += len(take) - if consumed >= self.hop_context_max_chars: - break - hop_text = "\n\n".join(text_parts) - hop_logs.append({"hop": hop_idx + 1, "question": last_query, "retrieved": hop_text}) - if hop_text: - accumulated_context.append(hop_text) - # generate a new question for the next hop - if hop_idx < self.hops - 1: - last_query = await self._generate_next_question( - original_question=example.question, - accumulated_context="\n\n".join(accumulated_context), - ) - else: - break - - full_context = "\n\n".join(accumulated_context) - # append retrieved context to user question - prompt_input = example.question if not full_context else f"{example.question}\n\nContext:\n{full_context}" - - if self.extended_logs: - content, dbg = await self._generate_with_debug(prompt_input) - usage = cast(Usage, (dbg or {}).get("usage") or Usage()) - tool_calls = cast(list, (dbg or {}).get("tool_calls") or []) - metadata = cast(dict, (dbg or {}).get("metadata") or {}) + async def _perform_multihop_retrieval(self, example: HotpotQAData) -> tuple[str, list[dict]]: + """Perform multi-hop retrieval and return accumulated context and hop logs.""" + accumulated_context: list[str] = [] + hop_logs: list[dict] = [] + last_query = example.question + for hop_idx in range(self.hops): + elements = await self.retriever.search(last_query) + text_parts: list[str] = [] + consumed = 0 + for element in elements[: self.retrieval_k]: + content = getattr(element, "content", "") if hasattr(element, "content") else "" + if isinstance(content, str) and content: + snippet = content.strip().replace("\n\n", "\n")[: self.element_max_chars] + budget = max(0, self.hop_context_max_chars - consumed) + take = snippet[:budget] + if take: + text_parts.append(take) + consumed += len(take) + if consumed >= self.hop_context_max_chars: + break + hop_text = "\n\n".join(text_parts) + hop_logs.append({"hop": hop_idx + 1, "question": last_query, "retrieved": hop_text}) + if hop_text: + accumulated_context.append(hop_text) + # generate a new question for the next hop + if hop_idx < self.hops - 1: + last_query = await self._generate_next_question( + original_question=example.question, + accumulated_context="\n\n".join(accumulated_context), + ) else: - content, usage, tool_calls = await self._generate_answer(prompt_input) - metadata = {} + break + return "\n\n".join(accumulated_context), hop_logs - return str(content), usage, tool_calls, hop_logs, metadata + async def _answer_with_retrieval(self, example: HotpotQAData) -> tuple[str, Usage, list, list[dict], dict]: + """Answer a question with multi-hop retrieval.""" + full_context, hop_logs = await self._perform_multihop_retrieval(example) + prompt_input = example.question if not full_context else f"{example.question}\n\nContext:\n{full_context}" + + if self.extended_logs: + content, dbg = await self._generate_with_debug(prompt_input) + usage = cast(Usage, (dbg or {}).get("usage") or Usage()) + tool_calls = cast(list, (dbg or {}).get("tool_calls") or []) + metadata = cast(dict, (dbg or {}).get("metadata") or {}) + else: + content, usage, tool_calls = await self._generate_answer(prompt_input) + metadata = {} + + return str(content), usage, tool_calls, hop_logs, metadata + + async def __call__(self, data: Iterable[HotpotQAData]) -> Iterable[HotpotQAResult]: + """Ingest contexts, perform multi-hop retrieval, and answer HotpotQA questions.""" + data_list = list(data) + await self._ingest_documents(data_list) results: list[HotpotQAResult] = [] - for row in data: + for row in data_list: try: - predicted_text, usage, tool_calls, hop_logs, metadata = await answer_with_retrieval(row) + predicted_text, usage, tool_calls, hop_logs, metadata = await self._answer_with_retrieval(row) except Exception: predicted_text = "" usage = Usage() diff --git a/packages/ragbits-evaluate/src/ragbits/evaluate/pipelines/human_eval.py b/packages/ragbits-evaluate/src/ragbits/evaluate/pipelines/human_eval.py index eb737d39d..60bf1b7c4 100644 --- a/packages/ragbits-evaluate/src/ragbits/evaluate/pipelines/human_eval.py +++ b/packages/ragbits-evaluate/src/ragbits/evaluate/pipelines/human_eval.py @@ -6,7 +6,7 @@ import multiprocessing import textwrap import time -from collections.abc import Callable, Iterable +from collections.abc import Callable, Coroutine, Iterable from dataclasses import dataclass from multiprocessing.connection import Connection from pathlib import Path @@ -153,9 +153,50 @@ def from_config(cls, config: dict) -> Self: try: config["evaluation_target"] = Agent.from_config(config) except Exception: - config["evaluation_target"] = LLM.subclass_from_config(config) + config["evaluation_target"] = LLM.from_config(config) return super().from_config(config) + def _process_generation( + self, raw: BaseException | tuple[str, dict | None] | str, debug_traces: list[dict | None] | None + ) -> tuple[str, dict | None]: + """Process a single generation result.""" + if isinstance(raw, BaseException): + err_msg = f"GenerationError: {raw.__class__.__name__}: {raw}" + if self.extended_logs and debug_traces is not None: + debug_traces.append({"error": err_msg}) + raise raw + + if self.extended_logs and isinstance(raw, tuple): + content, dbg = raw + code = self._sanitize(content) + if debug_traces is not None: + debug_traces.append(dbg) + return code, dbg + + if isinstance(raw, str): + code = self._sanitize(raw) + return code, None + + raise TypeError(f"Unexpected type for raw: {type(raw)}") + + def _evaluate_code_sample(self, code: str, row: HumanEvalData) -> tuple[bool, bool, float, str | None]: + """Evaluate a single code sample.""" + # Compile check + try: + compile(code, filename="candidate.py", mode="exec") + compile_ok = True + except Exception as e: + return False, False, 0.0, f"SyntaxError: {e}" + + ok, dur, err = _execute_in_subprocess( + code, + row.entry_point, + row.test, + timeout_sec=self.timeout_sec, + memory_limit_mb=self.memory_limit_mb, + ) + return compile_ok, ok, dur, err + async def __call__(self, data: Iterable[HumanEvalData]) -> Iterable[HumanEvalResult]: """Generate code completions per task and evaluate them. Returns list of `HumanEvalResult`, one per input task. @@ -171,7 +212,7 @@ async def __call__(self, data: Iterable[HumanEvalData]) -> Iterable[HumanEvalRes errors: list[str | None] = [] # Produce n samples - gen_tasks = [] + gen_tasks: list[Coroutine[Any, Any, tuple[str, dict | None] | str]] = [] for _ in range(self.n_samples): if self.extended_logs: gen_tasks.append(self._generate_with_debug(prompt_input)) @@ -181,51 +222,24 @@ async def __call__(self, data: Iterable[HumanEvalData]) -> Iterable[HumanEvalRes debug_traces: list[dict | None] | None = [] if self.extended_logs else None - for _, raw in enumerate(generations): - if isinstance(raw, Exception): + for raw in generations: + try: + code, _ = self._process_generation(raw, debug_traces) + samples.append(code) + except BaseException as e: samples.append("") compile_ok.append(False) pass_mask.append(False) durations.append(0.0) - err_msg = f"GenerationError: {raw.__class__.__name__}: {raw}" + err_msg = f"GenerationError: {e.__class__.__name__}: {e}" errors.append(err_msg) - if self.extended_logs and debug_traces is not None: - debug_traces.append({"error": err_msg}) - continue - - if self.extended_logs: - # Raw is (content, debug) - content, dbg = raw - code = self._sanitize(content) - samples.append(code) - if debug_traces is not None: - debug_traces.append(dbg) - else: - # Raw is a simple string - code = self._sanitize(raw) - samples.append(code) - - # Compile check - try: - compile(code, filename="candidate.py", mode="exec") - compile_ok.append(True) - except Exception as e: - compile_ok.append(False) - pass_mask.append(False) - durations.append(0.0) - errors.append(f"SyntaxError: {e}") continue - ok, dur, err = _execute_in_subprocess( - code, - row.entry_point, - row.test, - timeout_sec=self.timeout_sec, - memory_limit_mb=self.memory_limit_mb, - ) - pass_mask.append(ok) - durations.append(dur) - errors.append(err) + compile_result, passed, duration, error = self._evaluate_code_sample(code, row) + compile_ok.append(compile_result) + pass_mask.append(passed) + durations.append(duration) + errors.append(error) result = HumanEvalResult( task_id=row.task_id, diff --git a/pyproject.toml b/pyproject.toml index bae197717..d3d6f10a0 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -196,6 +196,9 @@ allow-star-arg-any = true "ANN201", # Missing return type annotation "PLR2004", # Magic numbers are ok in tests ] +"**/pipelines/human_eval.py" = [ + "S102", # exec is required for HumanEval code evaluation +] [tool.ruff.format] docstring-code-format = true docstring-code-line-length = 120 From ba77557d5c43d33a1258be7fc591e596580961a8 Mon Sep 17 00:00:00 2001 From: ds-radoslaw-izak Date: Thu, 2 Oct 2025 11:27:20 +0200 Subject: [PATCH 33/43] initialize orchestator with todo agent --- examples/evaluate/agent-benchmarking/todo_agent.py | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/examples/evaluate/agent-benchmarking/todo_agent.py b/examples/evaluate/agent-benchmarking/todo_agent.py index abd16cfc7..00948a0ad 100644 --- a/examples/evaluate/agent-benchmarking/todo_agent.py +++ b/examples/evaluate/agent-benchmarking/todo_agent.py @@ -27,6 +27,7 @@ def __init__(self, agent: Agent[LLMClientOptionsT, None, str], domain_context: s ) self._inner_agent = agent self._domain_context = domain_context + self._orchestrator = TodoOrchestrator(domain_context=domain_context) async def run( self, @@ -37,8 +38,6 @@ async def run( """Run the orchestrated flow and return a single final answer.""" query = input or "" - orchestrator = TodoOrchestrator(domain_context=self._domain_context) - # Accumulate outputs from the orchestrated workflow final_text: str = "" tool_calls: list[ToolCallResult] | None = None @@ -48,7 +47,7 @@ async def run( tasks_created = False num_tasks = 0 - async for item in orchestrator.run_todo_workflow_streaming(self._inner_agent, query): + async for item in self._orchestrator.run_todo_workflow_streaming(self._inner_agent, query): match item: case str(): final_text += item @@ -62,8 +61,8 @@ async def run( last_prompt = item case _: # Inspect orchestrator internal state to populate metadata - tasks_created = len(orchestrator.todo_list.tasks) > 0 - num_tasks = len(orchestrator.todo_list.tasks) + tasks_created = len(self._orchestrator.todo_list.tasks) > 0 + num_tasks = len(self._orchestrator.todo_list.tasks) # Compose metadata with TODO info complexity = "COMPLEX" if tasks_created else "SIMPLE" From bc7534a7fa640a709f87a23858f4653ad060baba Mon Sep 17 00:00:00 2001 From: ds-radoslaw-izak Date: Mon, 6 Oct 2025 11:09:19 +0200 Subject: [PATCH 34/43] add mock of todo orchestrator --- docs/tutorials/todo_orchestrator.md | 154 ++++++++++++++++++++++++++++ 1 file changed, 154 insertions(+) create mode 100644 docs/tutorials/todo_orchestrator.md diff --git a/docs/tutorials/todo_orchestrator.md b/docs/tutorials/todo_orchestrator.md new file mode 100644 index 000000000..2051c16bd --- /dev/null +++ b/docs/tutorials/todo_orchestrator.md @@ -0,0 +1,154 @@ +## TodoOrchestrator — !!!mock-up tutorial!!! + +Short and pragmatic guide to orchestrating task execution with a Todo-oriented agent. + +--- + +### Why TodoOrchestrator? + +- **Motivation**: make complex, multi-step tasks explicit, auditable, and re-runnable. +- **What it is**: a lightweight orchestration layer over your agent tools for planning and progress tracking. +- **Benefits**: clarity of intent, measurable progress, easier debugging, better eval scores via structured decomposition. + +#### Workflow overview + + + +- **Input**: user goal -> agent -> TodoOrchestrator +- **Plan**: generate todos -> order/prioritize -> attach tools +- **Execute**: dispatch steps -> record artifacts -> update status +- **Review**: summarize -> retry failed steps -> export audit + +--- + +### Prerequisites + +- Python env managed by `uv`. +- LLM provider configured (e.g., environment variables) and network access where needed. +- Example files referenced in this tutorial: + - `packages/ragbits-agents/src/ragbits/agents/tools/todo.py` + - `examples/agents/todo_tools_example.py` + - Evaluations: `examples/evaluate/agent-benchmarking/run_gaia.py`, `run_hotpot.py`, `run_humaneval.py` + +--- + +### 1) Set up an agent (baseline) + +Minimal agent wiring using TodoOrchestrator as a tool provider. + +```python +# mock-up code (baseline agent) +from ragbits.agents import Agent +from ragbits.agents.tools.todo import TodoOrchestrator + +agent = Agent( + llm="gpt-xyz", + tools=[tool_1, tool_2], +) + +result = agent.run("Execute Task XYZ.") +``` + +Notes: +- Will keep this as a baseline: no todo manager yet, minimal defaults, some tools. + +--- + +### 2) Baseline evaluation setup (measure accuracy) + +We’ll run three complementary benchmarks to measure multi-step reasoning and tooling: + +- **GAIA**: generalist agent tasks with tool-use and basic reasoning. +- **HotpotQA**: multi-hop question answering assessing and complex reasoning and information retrieval. +- **HumanEval**: code generation with function-level correctness (pass@k). + +Run baseline (mock commands): + +```bash +uv run python examples/evaluate/agent-benchmarking/run_gaia.py --agent baseline # or sth like this +uv run python examples/evaluate/agent-benchmarking/run_hotpot.py --agent baseline # might be full code snippets +uv run python examples/evaluate/agent-benchmarking/run_humaneval.py --agent baseline +``` + +Mock results snapshot (baseline): + + + +--- + +### 3) Apply TodoOrchestrator + +Plug in a concrete todo manager for persistence, progress tracking, and retries. + +```python +# mock-up code!!! +from ragbits.agents.tools.todo import TodoOrchestrator + +todo_orchestrator = TodoOrchestrator(domain_context="") + + +# Similar flow as before +``` + +UI/Console mock-up: + + + +--- + +### 4) Re-run evaluation (expected improvement) + +Re-run the same suites with orchestration. + +```bash +uv run python examples/evaluate/agent-benchmarking/run_gaia.py --agent todo_orchestrated # or sth like this +uv run python examples/evaluate/agent-benchmarking/run_hotpot.py --agent todo_orchestrated # might be full code snippets +uv run python examples/evaluate/agent-benchmarking/run_humaneval.py --agent todo_orchestrated +``` + +Mock results snapshot (after orchestration): + +
+ + + +Key expected gains (mock): +- **GAIA**: +XXX% task success via [argument here]. +- **HotpotQA**: +XXX% F1 through [argument here]. +- **HumanEval**: +XXX% pass@1K with [some argument here]. + +--- + +### 5) MOCK-UP Operational tips + +- **Auditability**: export run logs and todo timelines for regression analysis. +- **Backoff**: configure retries for unreliable tools. +- **Safety**: restrict tool scopes and validate step outputs. + +--- + +### 6) References & examples + +- Tooling: `packages/ragbits-agents/src/ragbits/agents/tools/todo.py` +- Complete example: `examples/agents/todo_tools_example.py` +- Evaluations: + - GAIA: `examples/evaluate/agent-benchmarking/run_gaia.py` + - HotpotQA: `examples/evaluate/agent-benchmarking/run_hotpot.py` + - HumanEval: `examples/evaluate/agent-benchmarking/run_humaneval.py` + +Related tutorials: +- Agents tutorial: `https://ragbits.deepsense.ai/stable/tutorials/agents/` +- RAG tutorial: `https://ragbits.deepsense.ai/stable/tutorials/rag/` +- Chat tutorial: `https://ragbits.deepsense.ai/stable/tutorials/chat/` + +--- + +### Appendix (copy-paste mocks) + +```bash + +# run the agent example (mock) +uv run python examples/agents/todo_tools_example.py +``` + + execution -> audit export or sth goes here> From 0e1607b2765fbf0209fc654e941ec40bdff44523 Mon Sep 17 00:00:00 2001 From: ds-radoslaw-izak Date: Tue, 7 Oct 2025 14:08:25 +0200 Subject: [PATCH 35/43] add info about HF CLI and gated datasets --- docs/tutorials/todo_orchestrator.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/tutorials/todo_orchestrator.md b/docs/tutorials/todo_orchestrator.md index 2051c16bd..43bca20af 100644 --- a/docs/tutorials/todo_orchestrator.md +++ b/docs/tutorials/todo_orchestrator.md @@ -25,6 +25,7 @@ Short and pragmatic guide to orchestrating task execution with a Todo-oriented a - Python env managed by `uv`. - LLM provider configured (e.g., environment variables) and network access where needed. +- `huggingface_cli` account login with access to relevant datasets (i.e. GAIA) - Example files referenced in this tutorial: - `packages/ragbits-agents/src/ragbits/agents/tools/todo.py` - `examples/agents/todo_tools_example.py` From a6db07b912d09c60f80f45176680dd767dc1e907 Mon Sep 17 00:00:00 2001 From: ds-radoslaw-izak Date: Wed, 8 Oct 2025 16:04:12 +0200 Subject: [PATCH 36/43] make the evaluation pipelines pluggable with agents; reformat --- .../agent-benchmarking/example_agents.py | 304 ++++++++++++++++++ .../evaluate/agent-benchmarking/run_gaia.py | 178 ++-------- .../evaluate/agent-benchmarking/run_hotpot.py | 152 ++------- .../agent-benchmarking/run_humaneval.py | 126 ++------ .../evaluate/agent-benchmarking/todo_agent.py | 85 ----- examples/evaluate/agent-benchmarking/utils.py | 68 ++++ 6 files changed, 460 insertions(+), 453 deletions(-) create mode 100644 examples/evaluate/agent-benchmarking/example_agents.py delete mode 100644 examples/evaluate/agent-benchmarking/todo_agent.py create mode 100644 examples/evaluate/agent-benchmarking/utils.py diff --git a/examples/evaluate/agent-benchmarking/example_agents.py b/examples/evaluate/agent-benchmarking/example_agents.py new file mode 100644 index 000000000..ee035686a --- /dev/null +++ b/examples/evaluate/agent-benchmarking/example_agents.py @@ -0,0 +1,304 @@ +""" +Agent definitions for benchmarking examples. + +Each agent is encapsulated in a class and instances are +declared at the bottom so they can be imported via the CLI helper +`import_agent_from_path` using file path forms, e.g.: + + - file path: "examples/evaluate/agent-benchmarking/example_agents.py:gaia_agent" + +Todo-augmented variants are exported as `_todo_agent` and wrap the base +agent with the `TodoAgent` orchestrator. +""" + +from __future__ import annotations + +from collections.abc import Callable +from typing import Any, cast + +from ragbits.agents import Agent, AgentOptions, AgentResult +from ragbits.agents.tool import ToolCallResult +from ragbits.agents.tools.openai import get_web_search_tool +from ragbits.agents.tools.todo import TodoOrchestrator +from ragbits.core.llms import LiteLLM +from ragbits.core.llms.base import LLMClientOptionsT, Usage +from ragbits.core.prompt.base import BasePrompt + + +class TodoAgent(Agent[LLMClientOptionsT, None, str]): + """ + Agent wrapper that uses TodoOrchestrator to optionally decompose a query + into tasks and aggregate a final answer, while remaining compatible with + existing EvaluationPipelines that expect an Agent. + """ + + def __init__(self, agent: Agent[LLMClientOptionsT, None, str], domain_context: str = "") -> None: + super().__init__( + llm=agent.llm, + prompt=agent.prompt, + history=agent.history, + keep_history=False, + mcp_servers=agent.mcp_servers, + default_options=cast(AgentOptions[LLMClientOptionsT] | None, agent.default_options), + ) + self._inner_agent = agent + self._domain_context = domain_context + self._orchestrator = TodoOrchestrator(domain_context=domain_context) + + def __getattr__(self, name: str) -> object: + """Proxy missing attributes to the wrapped inner agent.""" + try: + return super().__getattribute__(name) + except AttributeError: + return getattr(self._inner_agent, name) + + async def run( + self, + input: str | None = None, + *_: Any, + **__: Any, + ) -> AgentResult[str]: + """Run the orchestrated flow and return a single final answer.""" + query = input or "" + + # Accumulate outputs from the orchestrated workflow + final_text: str = "" + tool_calls: list[ToolCallResult] | None = None + total_usage: Usage = Usage() + last_prompt: BasePrompt | None = None + + tasks_created = False + num_tasks = 0 + + async for item in self._orchestrator.run_todo_workflow_streaming(self._inner_agent, query): + match item: + case str(): + final_text += item + case ToolCallResult(): + if tool_calls is None: + tool_calls = [] + tool_calls.append(item) + case Usage(): + total_usage += item + case BasePrompt(): + last_prompt = item + case _: + # Inspect orchestrator internal state to populate metadata + tasks_created = len(self._orchestrator.todo_list.tasks) > 0 + num_tasks = len(self._orchestrator.todo_list.tasks) + + # Compose metadata with TODO info + complexity = "COMPLEX" if tasks_created else "SIMPLE" + todo_meta: dict[str, Any] = { + "was_decomposed": bool(tasks_created), + "complexity_classification": complexity, + "num_tasks": int(num_tasks), + "domain_context": self._domain_context, + } + + # Build result compatible with existing pipelines + history = last_prompt.chat if last_prompt is not None else [] + + return AgentResult( + content=final_text.strip(), + metadata={"todo": todo_meta}, + tool_calls=tool_calls, + history=history, + usage=total_usage, + ) + + +class AgentHumanEval: + """Factory for the HumanEval base agent.""" + + @staticmethod + def build_system_prompt() -> str: + """Return the system prompt for HumanEval.""" + return "\n".join( + [ + "You are an expert Python engineer.", + "Implement exactly one function that solves the problem.", + "Output ONLY the function as plain Python (no markdown). Include necessary imports.", + "Do not include explanations or comments.", + ] + ) + + @classmethod + def build(cls) -> Agent: + """Build the HumanEval agent and attach code sanitization callable.""" + agent: Agent = Agent( + llm=LiteLLM("gpt-4.1-mini"), + prompt=cls.build_system_prompt(), + tools=[], + default_options=AgentOptions(max_turns=30), + ) + agent.code_sanitize_fn = cls.sanitize_code # type: ignore[attr-defined] + return agent + + @staticmethod + def sanitize_code(text: str) -> str: + """Remove markdown fences and keep only Python function text returned by the model.""" + cleaned = text.replace("\r\n", "\n").replace("\r", "\n").strip() + if "```" in cleaned: + start = cleaned.find("```") + end = cleaned.find("```", start + 3) + if end != -1: + inside = cleaned[start + 3 : end].lstrip() + if "\n" in inside: + first, rest = inside.split("\n", 1) + cleaned = rest if first.strip().lower().startswith("python") else inside + else: + cleaned = inside + return cleaned.strip() + + +class AgentHotpot: + """Factory for the HotpotQA base agent.""" + + @staticmethod + def build_system_prompt() -> str: + """Return the system prompt for HotpotQA.""" + return ( + "You are a helpful assistant. Use the provided context to answer.\n" + "Respond on a single line as: 'Answer: '.\n" + "- If yes/no, respond 'Answer: yes' or 'Answer: no'.\n" + "- If a name or title is required, provide only that after 'Answer:'.\n" + "- Do not add any extra text beyond the Answer line.\n" + "Keep the answer concise." + ) + + @classmethod + def build(cls) -> Agent: + """Build the HotpotQA agent and attach parsing helpers.""" + agent: Agent = Agent( + llm=LiteLLM("gpt-4.1-mini"), + prompt=cls.build_system_prompt(), + tools=[], + default_options=AgentOptions(max_turns=5), + ) + agent.parse_final_answer = cls.parse_final_answer # type: ignore[attr-defined] + agent.question_generation_prompt_fn = cls.build_question_generation_prompt # type: ignore[attr-defined] + return agent + + @staticmethod + def parse_final_answer(text: str) -> str: + """Extract and normalize the final answer from model text output.""" + marker = "Answer:" + idx = text.rfind(marker) + if idx == -1: + return text.strip() + candidate = text[idx + len(marker) :].strip() + if candidate.startswith("<") and candidate.endswith(">"): + candidate = candidate[1:-1].strip() + return candidate + + @staticmethod + def build_question_generation_prompt(original_question: str, accumulated_context: str) -> str: + """Construct the next-hop question prompt for multi-hop retrieval.""" + return ( + f"Original question: {original_question}\n\n" + f"Context so far: \n{accumulated_context}\n\n" + "Write ONE new, specific search question that fills the key missing info.\n" + "Do not repeat known facts. Return ONLY the question." + ) + + +class AgentGAIA: + """Factory for the GAIA base agent with extra tools.""" + + @staticmethod + def add(a: int, b: int) -> int: + """Add two integers.""" + return a + b + + @staticmethod + def subtract(a: int, b: int) -> int: + """Subtract two integers.""" + return a - b + + @staticmethod + def multiply(a: int, b: int) -> int: + """Multiply two integers.""" + return a * b + + @staticmethod + def divide(a: int, b: int) -> float: + """Divide two integers as float.""" + if b == 0: + raise ValueError("Cannot divide by zero.") + return a / b + + @staticmethod + def modulus(a: int, b: int) -> int: + """Compute remainder a % b.""" + if b == 0: + raise ValueError("Cannot divide by zero.") + return a % b + + @classmethod + def get_extra_instruction_tpl(cls) -> str: + """Return tool usage instruction template.""" + return ( + "Tools (use when needed):\n" + "- add(a, b), subtract(a, b), multiply(a, b), divide(a, b), modulus(a, b)\n" + "- web_search -> OpenAI websearch tool\n" + ) + + @classmethod + def build_system_prompt(cls) -> str: + """Return the GAIA system prompt with tool instructions.""" + gaia_prompt = ( + "You are a general AI assistant. Provide a concise solution and finish with:\n" + "FINAL ANSWER: [your final answer].\n" + "Rules for FINAL ANSWER: use digits for numbers (no units unless requested);\n" + "prefer few words for strings; for lists, return a comma-separated list." + ) + return "\n".join([gaia_prompt, cls.get_extra_instruction_tpl()]) + + @classmethod + def build_tools(cls) -> list[Callable[..., Any]]: + """Return the callable toolset used by the GAIA agent.""" + tools: list[Callable[..., Any]] = [ + cls.add, + cls.subtract, + cls.multiply, + cls.divide, + cls.modulus, + cast(Callable[..., Any], get_web_search_tool(model_name="gpt-4.1-mini")), + ] + return tools + + @classmethod + def build(cls) -> Agent: + """Build the GAIA agent and attach final-answer parser.""" + agent: Agent = Agent( + llm=LiteLLM("gpt-4.1-mini"), + prompt=cls.build_system_prompt(), + tools=cls.build_tools(), + default_options=AgentOptions(max_turns=30), + ) + agent.parse_final_answer = cls.parse_final_answer # type: ignore[attr-defined] + return agent + + @staticmethod + def parse_final_answer(text: str) -> str: + """Extract the FINAL ANSWER segment from model output.""" + marker = "FINAL ANSWER:" + idx = text.rfind(marker) + if idx == -1: + return text.strip() + candidate = text[idx + len(marker) :].strip() + if candidate.startswith("[") and candidate.endswith("]"): + candidate = candidate[1:-1].strip() + return candidate + + +# Export agent instances for import +humaneval_agent: Agent = AgentHumanEval.build() +humaneval_todo_agent: Agent = TodoAgent(agent=humaneval_agent, domain_context="python engineer") + +hotpot_agent: Agent = AgentHotpot.build() +hotpot_todo_agent: Agent = TodoAgent(agent=hotpot_agent, domain_context="research QA") + +gaia_agent: Agent = AgentGAIA.build() +gaia_todo_agent: Agent = TodoAgent(agent=gaia_agent, domain_context="general AI assistant") diff --git a/examples/evaluate/agent-benchmarking/run_gaia.py b/examples/evaluate/agent-benchmarking/run_gaia.py index 797f479d9..a3720c4f3 100644 --- a/examples/evaluate/agent-benchmarking/run_gaia.py +++ b/examples/evaluate/agent-benchmarking/run_gaia.py @@ -1,19 +1,15 @@ """ -Ragbits Evaluation Example: GAIA (Agent vs TodoAgent) +Ragbits Evaluation Example: GAIA -This example demonstrates how to evaluate the GAIA benchmark using either a classic -`Agent` or a task-decomposing `TodoAgent`, controlled by a command-line flag. Both modes -share the same prompt, retrieval setup, and parsing logic. +This example evaluates GAIA using any agent provided via a path compatible with +the CLI's `import_agent_from_path` utility, e.g.: -To run the script, execute one of the following commands: +uv run python examples/evaluate/agent-benchmarking/run_gaia.py \ + --agent_path examples/evaluate/agent-benchmarking/example_agents.py:gaia_agent - ```bash - # Agent mode - uv run python examples/evaluate/agent-benchmarking/run_gaia.py - - # TodoAgent mode - uv run python examples/evaluate/agent-benchmarking/run_gaia.py --use_todo - ``` +To use the Todo-enabled variant, pass `gaia_todo_agent`. The script will +conditionally print TODO stats when the agent is Todo-based and extended logs +are enabled. """ # /// script @@ -30,11 +26,8 @@ import logging from pathlib import Path -from todo_agent import TodoAgent - -from ragbits.agents import Agent, AgentOptions -from ragbits.agents.tools.openai import get_web_search_tool -from ragbits.core.llms import LiteLLM +from ragbits.agents import Agent +from ragbits.agents.cli import import_agent_from_path from ragbits.core.sources.hf import HuggingFaceSource from ragbits.evaluate.dataloaders.gaia import GaiaDataLoader from ragbits.evaluate.evaluator import Evaluator @@ -42,112 +35,28 @@ from ragbits.evaluate.metrics.gaia import GaiaEfficiency, GaiaOutcome, GaiaTooling from ragbits.evaluate.pipelines.gaia import GaiaPipeline -# Extra Agent tools - - -def add(a: int, b: int) -> int: - """Add two integers and return the result.""" - return a + b - - -def subtract(a: int, b: int) -> int: - """Subtract two integers and return the result (a - b).""" - return a - b - - -def multiply(a: int, b: int) -> int: - """Multiply two integers and return the result.""" - return a * b - - -def divide(a: int, b: int) -> float: - """Divide two integers and return the result as float.""" - if b == 0: - raise ValueError("Cannot divide by zero.") - return a / b - - -def modulus(a: int, b: int) -> int: - """Compute remainder of a divided by b (a % b).""" - if b == 0: - raise ValueError("Cannot divide by zero.") - return a % b - -def get_extra_instruction_tpl() -> str: - """Generate tool usage instructions template for arithmetic and lookups.""" - return ( - "Tools (use when needed):\n" - "- add(a, b), subtract(a, b), multiply(a, b), divide(a, b), modulus(a, b)\n" - "- web_search -> OpenAI websearch tool\n" - ) - - -def _build_system_prompt() -> str: - """Build a unified GAIA system prompt shared by both modes.""" - gaia_prompt = ( - "You are a general AI assistant. Provide a concise solution and finish with:\n" - "FINAL ANSWER: [your final answer].\n" - "Rules for FINAL ANSWER: use digits for numbers (no units unless requested);\n" - "prefer few words for strings; for lists, return a comma-separated list." - ) - - return "\n".join( - [ - gaia_prompt, - get_extra_instruction_tpl(), - ] - ) - - -def _build_tools() -> list: - """Return the shared toolset for GAIA.""" - return [ - add, - subtract, - multiply, - divide, - modulus, - get_web_search_tool(model_name="gpt-4.1-mini"), - ] - - -def _parse_final_answer(text: str) -> str: - """Extract the FINAL ANSWER segment from model output.""" - marker = "FINAL ANSWER:" - idx = text.rfind(marker) - if idx == -1: - return text.strip() - candidate = text[idx + len(marker) :].strip() - if candidate.startswith("[") and candidate.endswith("]"): - candidate = candidate[1:-1].strip() - return candidate - - -async def main(use_todo: bool) -> None: - """Run GAIA evaluation in classic or Todo mode.""" +async def main(agent_path: str | None) -> None: + """Run GAIA evaluation with a pluggable agent.""" logging.getLogger("LiteLLM").setLevel(logging.ERROR) - base_agent: Agent = Agent( - llm=LiteLLM("gpt-4.1-mini"), - prompt=_build_system_prompt(), - tools=_build_tools(), - default_options=AgentOptions(max_turns=30), - ) - evaluation_target = TodoAgent(agent=base_agent, domain_context="general AI assistant") if use_todo else base_agent + default_agent_path = "examples/evaluate/agent-benchmarking/example_agents.py:gaia_agent" + evaluation_target: Agent = import_agent_from_path(agent_path or default_agent_path) # Data loader source = HuggingFaceSource(path="gaia-benchmark/GAIA", name="2023_level1", split="validation") dataloader = GaiaDataLoader(source=source, split="data[:10]", skip_file_attachments=True) # Pipeline + use_todo = evaluation_target.__class__.__name__ == "TodoAgent" log_file = "gaia_todo_examples.ndjson" if use_todo else "gaia_examples.ndjson" log_path = Path(__file__).with_name(log_file) + pipeline = GaiaPipeline( evaluation_target=evaluation_target, per_example_log_file=log_path, extended_logs=use_todo, - parse_answer_fn=_parse_final_answer, + parse_answer_fn=evaluation_target.parse_final_answer, ) # Metrics @@ -161,50 +70,19 @@ async def main(use_todo: bool) -> None: print(f" {key}: {value:.4f}") if use_todo: - await _print_todo_stats(log_path, dataloader) - - -async def _print_todo_stats(log_path: Path, dataloader: GaiaDataLoader) -> None: - """Print aggregated TODO-agent statistics from extended logs.""" - print("\nTODO Orchestrator Statistics:") - decomposed_count = 0 - total_tasks = 0 - simple_count = 0 - complex_count = 0 - - if log_path.exists(): - import json - - with open(log_path, encoding="utf-8") as f: - for line in f: - record = json.loads(line) - debug_log = record.get("extended_debug_logging", "[]") - if debug_log and debug_log != "[]": - debug_data = json.loads(debug_log) - if debug_data and len(debug_data) > 0: - metadata = (debug_data[0] or {}).get("metadata", {}) - todo_meta = metadata.get("todo", {}) - - if todo_meta.get("was_decomposed"): - decomposed_count += 1 - total_tasks += int(todo_meta.get("num_tasks", 0)) - - if todo_meta.get("complexity_classification") == "SIMPLE": - simple_count += 1 - elif todo_meta.get("complexity_classification") == "COMPLEX": - complex_count += 1 - - total = len(await dataloader.load()) - rate = (decomposed_count / total * 100) if total else 0.0 - avg_tasks = (total_tasks / decomposed_count) if decomposed_count else 0.0 - print(f" Decomposition rate: {decomposed_count}/{total} ({rate:.1f}%)") - print(f" Average tasks per decomposed query: {avg_tasks:.1f}") - print(f" Complexity classification: {simple_count} simple, {complex_count} complex") + from utils import print_todo_stats + + await print_todo_stats(log_path, dataloader) if __name__ == "__main__": - parser = argparse.ArgumentParser(description="GAIA evaluation example") - parser.add_argument("--use_todo", action="store_true", help="Run with TodoAgent instead of Agent") + parser = argparse.ArgumentParser(description="GAIA evaluation") + parser.add_argument( + "--agent_path", + type=str, + default=None, + help=("Path to agent 'path/to/file.py:var'. " "Defaults to exported gaia_agent in example_agents."), + ) args = parser.parse_args() - asyncio.run(main(args.use_todo)) + asyncio.run(main(args.agent_path)) diff --git a/examples/evaluate/agent-benchmarking/run_hotpot.py b/examples/evaluate/agent-benchmarking/run_hotpot.py index 637e331f8..e3cbed0c1 100644 --- a/examples/evaluate/agent-benchmarking/run_hotpot.py +++ b/examples/evaluate/agent-benchmarking/run_hotpot.py @@ -1,19 +1,15 @@ """ -Ragbits Evaluation Example: HotpotQA (Agent vs TodoAgent) +Ragbits Evaluation Example: HotpotQA -This example demonstrates how to evaluate HotpotQA using either a classic `Agent` -or a task-decomposing `TodoAgent`, selected via a command-line flag. Both modes -share the same prompt, retrieval setup, and parsing logic. +This example evaluates HotpotQA using any agent provided via a path compatible +with the CLI's `import_agent_from_path` utility, e.g.: -To run the script, execute one of the following commands: +uv run python examples/evaluate/agent-benchmarking/run_hotpot.py \ + --agent_path examples/evaluate/agent-benchmarking/example_agents.py:hotpot_agent - ```bash - # Agent mode - uv run python examples/evaluate/agent-benchmarking/run_hotpot.py - - # TodoAgent mode - uv run python examples/evaluate/agent-benchmarking/run_hotpot.py --use_todo - ``` +If you want to use the Todo-enabled variant, pass `hotpot_todo_agent` instead. +The script will conditionally print TODO stats when the agent is Todo-based and +extended logs are enabled. """ # /// script @@ -31,16 +27,11 @@ import logging from pathlib import Path -from todo_agent import TodoAgent +from utils import build_hotpot_retriever, print_todo_stats -from ragbits.agents import Agent, AgentOptions -from ragbits.core.embeddings import LiteLLMEmbedder -from ragbits.core.llms import LiteLLM +from ragbits.agents import Agent +from ragbits.agents.cli import import_agent_from_path from ragbits.core.sources.hf import HuggingFaceSource -from ragbits.core.vector_stores import VectorStoreOptions -from ragbits.core.vector_stores.in_memory import InMemoryVectorStore -from ragbits.document_search import DocumentSearch -from ragbits.document_search.ingestion.strategies import BatchedIngestStrategy from ragbits.evaluate.dataloaders.hotpot_qa import HotpotQADataLoader from ragbits.evaluate.evaluator import Evaluator from ragbits.evaluate.metrics.base import MetricSet @@ -48,79 +39,31 @@ from ragbits.evaluate.pipelines.hotpot_qa import HotpotQAPipeline -def _build_system_prompt() -> str: - """Build a unified HotpotQA system prompt shared by both modes.""" - return ( - "You are a helpful assistant. Use the provided context to answer.\n" - "Respond on a single line as: 'Answer: '.\n" - "- If yes/no, respond 'Answer: yes' or 'Answer: no'.\n" - "- If a name or title is required, provide only that after 'Answer:'.\n" - "- Do not add any extra text beyond the Answer line.\n" - "Keep the answer concise." - ) - - -def _build_question_generation_prompt(original_question: str, accumulated_context: str) -> str: - """Build a prompt for generating the next search question in multi-hop retrieval.""" - return ( - f"Original question: {original_question}\n\n" - f"Context so far: \n{accumulated_context}\n\n" - "Write ONE new, specific search question that fills the key missing info.\n" - "Do not repeat known facts. Return ONLY the question." - ) - - -def _parse_final_answer(text: str) -> str: - """Extract the Answer segment from model output.""" - marker = "Answer:" - idx = text.rfind(marker) - if idx == -1: - return text.strip() - candidate = text[idx + len(marker) :].strip() - if candidate.startswith("<") and candidate.endswith(">"): - candidate = candidate[1:-1].strip() - return candidate - - -def _build_retriever() -> DocumentSearch: - """Create a lightweight in-memory retriever for HotpotQA.""" - return DocumentSearch( - vector_store=InMemoryVectorStore( - embedder=LiteLLMEmbedder(model_name="text-embedding-3-small"), - default_options=VectorStoreOptions(k=5), - ), - ingest_strategy=BatchedIngestStrategy(index_batch_size=1000), - ) - - -async def main(use_todo: bool) -> None: - """Run HotpotQA evaluation in classic or Todo mode.""" +async def main(agent_path: str | None) -> None: + """Run HotpotQA evaluation with a pluggable agent.""" logging.getLogger("LiteLLM").setLevel(logging.ERROR) - # Build agent or TodoAgent - base_agent: Agent = Agent( - llm=LiteLLM("gpt-4.1-mini"), - prompt=_build_system_prompt(), - tools=[], - default_options=AgentOptions(max_turns=5), - ) - evaluation_target = TodoAgent(agent=base_agent, domain_context="research QA") if use_todo else base_agent + # Load agent from path or fall back to default exported example agent + default_agent_path = "examples/evaluate/agent-benchmarking/example_agents.py:hotpot_agent" + evaluation_target: Agent = import_agent_from_path(agent_path or default_agent_path) # Data loader source = HuggingFaceSource(path="hotpotqa/hotpot_qa", name="distractor", split="validation") - dataloader = HotpotQADataLoader(source=source, split="data[:10]", level_filter="hard") + dataloader = HotpotQADataLoader(source=source, split="data[:5]", level_filter="hard") # Pipeline + use_todo = evaluation_target.__class__.__name__ == "TodoAgent" log_file = "hotpot_todo_examples.ndjson" if use_todo else "hotpot_examples.ndjson" log_path = Path(__file__).with_name(log_file) + pipeline = HotpotQAPipeline( evaluation_target=evaluation_target, - retriever=_build_retriever(), + retriever=build_hotpot_retriever(), hops=3, per_example_log_file=log_path, extended_logs=use_todo, - parse_answer_fn=_parse_final_answer, - question_generation_prompt_fn=_build_question_generation_prompt, + parse_answer_fn=evaluation_target.parse_final_answer, + question_generation_prompt_fn=evaluation_target.question_generation_prompt_fn, ) # Metrics @@ -134,50 +77,17 @@ async def main(use_todo: bool) -> None: print(f" {key}: {value:.4f}") if use_todo: - await _print_todo_stats(log_path, dataloader) - - -async def _print_todo_stats(log_path: Path, dataloader: HotpotQADataLoader) -> None: - """Print aggregated TODO-agent statistics from extended logs.""" - print("\nTODO Orchestrator Statistics:") - decomposed_count = 0 - total_tasks = 0 - simple_count = 0 - complex_count = 0 - - if log_path.exists(): - import json - - with open(log_path, encoding="utf-8") as f: - for line in f: - record = json.loads(line) - debug_log = record.get("extended_debug_logging", "[]") - if debug_log and debug_log != "[]": - debug_data = json.loads(debug_log) - if debug_data and len(debug_data) > 0: - metadata = (debug_data[0] or {}).get("metadata", {}) - todo_meta = metadata.get("todo", {}) - - if todo_meta.get("was_decomposed"): - decomposed_count += 1 - total_tasks += int(todo_meta.get("num_tasks", 0)) - - if todo_meta.get("complexity_classification") == "SIMPLE": - simple_count += 1 - elif todo_meta.get("complexity_classification") == "COMPLEX": - complex_count += 1 - - total = len(await dataloader.load()) - rate = (decomposed_count / total * 100) if total else 0.0 - avg_tasks = (total_tasks / decomposed_count) if decomposed_count else 0.0 - print(f" Decomposition rate: {decomposed_count}/{total} ({rate:.1f}%)") - print(f" Average tasks per decomposed query: {avg_tasks:.1f}") - print(f" Complexity classification: {simple_count} simple, {complex_count} complex") + await print_todo_stats(log_path, dataloader) if __name__ == "__main__": - parser = argparse.ArgumentParser(description="HotpotQA evaluation example") - parser.add_argument("--use_todo", action="store_true", help="Run with TodoAgent instead of Agent") + parser = argparse.ArgumentParser(description="HotpotQA evaluation") + parser.add_argument( + "--agent_path", + type=str, + default=None, + help=("Path to agent 'path/to/file.py:var'. " "Defaults to exported hotpot_agent in example_agents."), + ) args = parser.parse_args() - asyncio.run(main(args.use_todo)) + asyncio.run(main(args.agent_path)) diff --git a/examples/evaluate/agent-benchmarking/run_humaneval.py b/examples/evaluate/agent-benchmarking/run_humaneval.py index 4c21c3938..d5a775f88 100644 --- a/examples/evaluate/agent-benchmarking/run_humaneval.py +++ b/examples/evaluate/agent-benchmarking/run_humaneval.py @@ -1,19 +1,15 @@ """ -Ragbits Evaluation Example: HumanEval (Agent vs TodoAgent) +Ragbits Evaluation Example: HumanEval -This example demonstrates how to evaluate HumanEval using either a classic `Agent` -or a task-decomposing `TodoAgent`. Both modes share the -same prompt, retrieval setup, and parsing logic. +This example evaluates HumanEval using any agent provided via a path compatible +with the CLI's `import_agent_from_path` utility, e.g.: -To run the script, execute one of the following commands: +uv run python examples/evaluate/agent-benchmarking/run_humaneval.py \ + --agent_path=examples/evaluate/agent-benchmarking/example_agents.py:humaneval_agent - ```bash - # Agent mode - uv run python examples/evaluate/agent-benchmarking/run_humaneval.py - - # TodoAgent mode - uv run python examples/evaluate/agent-benchmarking/run_humaneval.py --use_todo - ``` +To run in Todo-enabled mode, pass `humaneval_todo_agent`. The script will +conditionally print TODO stats when the agent is Todo-based and extended logs +are enabled. """ # /// script @@ -30,10 +26,8 @@ import logging from pathlib import Path -from todo_agent import TodoAgent - -from ragbits.agents import Agent, AgentOptions -from ragbits.core.llms import LiteLLM +from ragbits.agents import Agent +from ragbits.agents.cli import import_agent_from_path from ragbits.core.sources.hf import HuggingFaceSource from ragbits.evaluate.dataloaders.human_eval import HumanEvalDataLoader from ragbits.evaluate.evaluator import Evaluator @@ -42,60 +36,29 @@ from ragbits.evaluate.pipelines.human_eval import HumanEvalPipeline -def _build_system_prompt() -> str: - """Build a unified HumanEval system prompt shared by both modes.""" - return "\n".join( - [ - "You are an expert Python engineer.", - "Implement exactly one function that solves the problem.", - "Output ONLY the function as plain Python (no markdown). Include necessary imports.", - "Do not include explanations or comments.", - ] - ) - - -def _sanitize_code(text: str) -> str: - """Remove markdown fences and keep only Python function text returned by the model.""" - cleaned = text.replace("\r\n", "\n").replace("\r", "\n").strip() - if "```" in cleaned: - start = cleaned.find("```") - end = cleaned.find("```", start + 3) - if end != -1: - inside = cleaned[start + 3 : end].lstrip() - if "\n" in inside: - first, rest = inside.split("\n", 1) - cleaned = rest if first.strip().lower().startswith("python") else inside - else: - cleaned = inside - return cleaned.strip() - - -async def main(use_todo: bool) -> None: - """Run HumanEval in classic or Todo mode.""" +async def main(agent_path: str | None) -> None: + """Run HumanEval with a pluggable agent.""" logging.getLogger("LiteLLM").setLevel(logging.ERROR) - base_agent: Agent = Agent( - llm=LiteLLM("gpt-4.1-mini"), - prompt=_build_system_prompt(), - tools=[], - default_options=AgentOptions(max_turns=30), - ) - evaluation_target = TodoAgent(agent=base_agent, domain_context="python engineer") if use_todo else base_agent + default_agent_path = "examples/evaluate/agent-benchmarking/example_agents.py:humaneval_agent" + evaluation_target: Agent = import_agent_from_path(agent_path or default_agent_path) # Data source = HuggingFaceSource(path="openai/openai_humaneval", split="test") dataloader = HumanEvalDataLoader(source=source, split="data[:2]") # Pipeline + use_todo = evaluation_target.__class__.__name__ == "TodoAgent" log_file = "humaneval_todo_examples.ndjson" if use_todo else "humaneval_examples.ndjson" log_path = Path(__file__).with_name(log_file) + pipeline = HumanEvalPipeline( evaluation_target=evaluation_target, - n_samples=1, + n_samples=5, timeout_sec=30, per_example_log_file=log_path, extended_logs=use_todo, - code_sanitize_fn=_sanitize_code, + code_sanitize_fn=evaluation_target.code_sanitize_fn, ) # Metrics @@ -110,50 +73,19 @@ async def main(use_todo: bool) -> None: print(f" {key}: {value:.4f}") if use_todo: - await _print_todo_stats(log_path, dataloader) - - -async def _print_todo_stats(log_path: Path, dataloader: HumanEvalDataLoader) -> None: - """Print aggregated TODO-agent statistics from extended logs.""" - print("\nTODO Orchestrator Statistics:") - decomposed_count = 0 - total_tasks = 0 - simple_count = 0 - complex_count = 0 - - if log_path.exists(): - import json - - with open(log_path, encoding="utf-8") as f: - for line in f: - record = json.loads(line) - debug_log = record.get("extended_debug_logging", "[]") - if debug_log and debug_log != "[]": - debug_data = json.loads(debug_log) - if debug_data and len(debug_data) > 0: - metadata = (debug_data[0] or {}).get("metadata", {}) - todo_meta = metadata.get("todo", {}) - - if todo_meta.get("was_decomposed"): - decomposed_count += 1 - total_tasks += int(todo_meta.get("num_tasks", 0)) - - if todo_meta.get("complexity_classification") == "SIMPLE": - simple_count += 1 - elif todo_meta.get("complexity_classification") == "COMPLEX": - complex_count += 1 - - total = len(await dataloader.load()) - rate = (decomposed_count / total * 100) if total else 0.0 - avg_tasks = (total_tasks / decomposed_count) if decomposed_count else 0.0 - print(f" Decomposition rate: {decomposed_count}/{total} ({rate:.1f}%)") - print(f" Average tasks per decomposed query: {avg_tasks:.1f}") - print(f" Complexity classification: {simple_count} simple, {complex_count} complex") + from utils import print_todo_stats + + await print_todo_stats(log_path, dataloader) if __name__ == "__main__": - parser = argparse.ArgumentParser(description="HumanEval evaluation example") - parser.add_argument("--use_todo", action="store_true", help="Run with TodoAgent instead of Agent") + parser = argparse.ArgumentParser(description="HumanEval evaluation") + parser.add_argument( + "--agent_path", + type=str, + default=None, + help=("Path to agent 'path/to/file.py:var'. " "Defaults to exported humaneval_agent in example_agents."), + ) args = parser.parse_args() - asyncio.run(main(args.use_todo)) + asyncio.run(main(args.agent_path)) diff --git a/examples/evaluate/agent-benchmarking/todo_agent.py b/examples/evaluate/agent-benchmarking/todo_agent.py deleted file mode 100644 index 00948a0ad..000000000 --- a/examples/evaluate/agent-benchmarking/todo_agent.py +++ /dev/null @@ -1,85 +0,0 @@ -from __future__ import annotations - -from typing import Any, cast - -from ragbits.agents import Agent, AgentOptions, AgentResult -from ragbits.agents.tool import ToolCallResult -from ragbits.agents.tools.todo import TodoOrchestrator -from ragbits.core.llms.base import LLMClientOptionsT, Usage -from ragbits.core.prompt.base import BasePrompt - - -class TodoAgent(Agent[LLMClientOptionsT, None, str]): - """ - Agent wrapper that uses TodoOrchestrator to optionally decompose a query - into tasks and aggregate a final answer, while remaining compatible with - existing EvaluationPipelines that expect an Agent. - """ - - def __init__(self, agent: Agent[LLMClientOptionsT, None, str], domain_context: str = "") -> None: - super().__init__( - llm=agent.llm, - prompt=agent.prompt, - history=agent.history, - keep_history=False, - mcp_servers=agent.mcp_servers, - default_options=cast(AgentOptions[LLMClientOptionsT] | None, agent.default_options), - ) - self._inner_agent = agent - self._domain_context = domain_context - self._orchestrator = TodoOrchestrator(domain_context=domain_context) - - async def run( - self, - input: str | None = None, - *_: Any, - **__: Any, - ) -> AgentResult[str]: - """Run the orchestrated flow and return a single final answer.""" - query = input or "" - - # Accumulate outputs from the orchestrated workflow - final_text: str = "" - tool_calls: list[ToolCallResult] | None = None - total_usage: Usage = Usage() - last_prompt: BasePrompt | None = None - - tasks_created = False - num_tasks = 0 - - async for item in self._orchestrator.run_todo_workflow_streaming(self._inner_agent, query): - match item: - case str(): - final_text += item - case ToolCallResult(): - if tool_calls is None: - tool_calls = [] - tool_calls.append(item) - case Usage(): - total_usage += item - case BasePrompt(): - last_prompt = item - case _: - # Inspect orchestrator internal state to populate metadata - tasks_created = len(self._orchestrator.todo_list.tasks) > 0 - num_tasks = len(self._orchestrator.todo_list.tasks) - - # Compose metadata with TODO info - complexity = "COMPLEX" if tasks_created else "SIMPLE" - todo_meta: dict[str, Any] = { - "was_decomposed": bool(tasks_created), - "complexity_classification": complexity, - "num_tasks": int(num_tasks), - "domain_context": self._domain_context, - } - - # Build result compatible with existing pipelines - history = last_prompt.chat if last_prompt is not None else [] - - return AgentResult( - content=final_text.strip(), - metadata={"todo": todo_meta}, - tool_calls=tool_calls, - history=history, - usage=total_usage, - ) diff --git a/examples/evaluate/agent-benchmarking/utils.py b/examples/evaluate/agent-benchmarking/utils.py new file mode 100644 index 000000000..41eafa74e --- /dev/null +++ b/examples/evaluate/agent-benchmarking/utils.py @@ -0,0 +1,68 @@ +from __future__ import annotations + +import json +from collections.abc import Iterable +from pathlib import Path +from typing import Any, Protocol + +from ragbits.core.embeddings import LiteLLMEmbedder +from ragbits.core.vector_stores import VectorStoreOptions +from ragbits.core.vector_stores.in_memory import InMemoryVectorStore +from ragbits.document_search import DocumentSearch +from ragbits.document_search.ingestion.strategies import BatchedIngestStrategy + + +def build_hotpot_retriever() -> DocumentSearch: + """Create a lightweight in-memory retriever for HotpotQA.""" + return DocumentSearch( + vector_store=InMemoryVectorStore( + embedder=LiteLLMEmbedder(model_name="text-embedding-3-small"), + default_options=VectorStoreOptions(k=5), + ), + ingest_strategy=BatchedIngestStrategy(index_batch_size=1000), + ) + + +class _SupportsLoad(Protocol): + async def load(self) -> Iterable[Any]: ... + + +async def print_todo_stats(log_path: Path, dataloader: _SupportsLoad) -> None: + """Print aggregated TODO-agent statistics from extended logs. + + Works across benchmarks if extended logs include the orchestrator metadata. + """ + print("\nTODO Orchestrator Statistics:") + decomposed_count = 0 + total_tasks = 0 + simple_count = 0 + complex_count = 0 + + if log_path.exists(): + with open(log_path, encoding="utf-8") as f: + for line in f: + record = json.loads(line) + debug_log = record.get("extended_debug_logging", "[]") + if debug_log and debug_log != "[]": + debug_data = json.loads(debug_log) + if debug_data and len(debug_data) > 0: + metadata = (debug_data[0] or {}).get("metadata", {}) + todo_meta = metadata.get("todo", {}) + + if todo_meta.get("was_decomposed"): + decomposed_count += 1 + total_tasks += int(todo_meta.get("num_tasks", 0)) + + if todo_meta.get("complexity_classification") == "SIMPLE": + simple_count += 1 + elif todo_meta.get("complexity_classification") == "COMPLEX": + complex_count += 1 + + loaded = await dataloader.load() + items = list(loaded) + total = len(items) + rate = (decomposed_count / total * 100) if total else 0.0 + avg_tasks = (total_tasks / decomposed_count) if decomposed_count else 0.0 + print(f" Decomposition rate: {decomposed_count}/{total} ({rate:.1f}%)") + print(f" Average tasks per decomposed query: {avg_tasks:.1f}") + print(f" Complexity classification: {simple_count} simple, {complex_count} complex") From 77ee2afc2eb7d24c4efc0d5b05a531804f292081 Mon Sep 17 00:00:00 2001 From: dazy-ds <135028324+dazy-ds@users.noreply.github.com> Date: Fri, 10 Oct 2025 09:17:14 +0200 Subject: [PATCH 37/43] feat: todo list component (#827) Co-authored-by: jakubduda-dsai --- examples/agents/todo_tools_example.py | 5 +- examples/chat/chat.py | 2 +- examples/chat/hiking_agent.py | 114 ++++++++++++++ package-lock.json | 6 +- packages/ragbits-agents/CHANGELOG.md | 5 +- .../src/ragbits/agents/tools/todo.py | 54 +++---- packages/ragbits-chat/CHANGELOG.md | 1 + .../src/ragbits/chat/interface/_interface.py | 5 + .../src/ragbits/chat/interface/types.py | 19 ++- .../ragbits/chat/providers/model_provider.py | 5 + .../generate_typescript_from_json_schema.py | 1 + typescript/@ragbits/api-client/package.json | 2 +- .../@ragbits/api-client/src/autogen.types.ts | 33 ++++ typescript/@ragbits/api-client/src/index.ts | 5 + .../ui/__tests__/unit/TodoList.test.tsx | 146 ++++++++++++++++++ .../ChatHistoryPlugin/ChatHistory.test.tsx | 3 +- .../components/ChatMessage/ChatMessage.tsx | 16 ++ .../ui/src/core/components/TodoList.tsx | 72 +++++++++ .../eventHandlers/eventHandlerRegistry.ts | 4 + .../eventHandlers/messageHandlers.ts | 20 +++ typescript/ui/src/core/utils/tasks.ts | 80 ++++++++++ .../components/ChatHistory.tsx | 76 ++++----- typescript/ui/src/types/history.ts | 2 + 23 files changed, 603 insertions(+), 73 deletions(-) create mode 100644 examples/chat/hiking_agent.py create mode 100644 typescript/ui/__tests__/unit/TodoList.test.tsx create mode 100644 typescript/ui/src/core/components/TodoList.tsx create mode 100644 typescript/ui/src/core/utils/tasks.ts diff --git a/examples/agents/todo_tools_example.py b/examples/agents/todo_tools_example.py index 691d5f9af..b86cb9ca7 100644 --- a/examples/agents/todo_tools_example.py +++ b/examples/agents/todo_tools_example.py @@ -34,8 +34,11 @@ def _handle_response(response: ResponseType) -> None: def _handle_streaming_response(response: TodoResult) -> None: """Handle TodoResult from the orchestrator.""" - if response.type in ("status", "task_list"): + if response.type in ("status"): print(response.message or "") + elif response.type in ("task_list"): + for index, task in enumerate(response.tasks, 1): + print(f"{index}. {task.description}") elif response.type in ("task_summary_start", "final_summary_start"): print(response.message or "", end="", flush=True) elif response.type in ("task_completed", "final_summary_end"): diff --git a/examples/chat/chat.py b/examples/chat/chat.py index ccbac8bc6..566de498c 100644 --- a/examples/chat/chat.py +++ b/examples/chat/chat.py @@ -7,7 +7,7 @@ To run the script, execute the following command: ```bash - ragbits api run examples.api.chat:MyChat + ragbits api run examples.chat.chat:MyChat ``` """ diff --git a/examples/chat/hiking_agent.py b/examples/chat/hiking_agent.py new file mode 100644 index 000000000..2e8c8b6a6 --- /dev/null +++ b/examples/chat/hiking_agent.py @@ -0,0 +1,114 @@ +""" +Ragbits Chat Example: Chat Interface + +This example demonstrates how to use the ChatInterface to create a simple chat application with agent capabilities. +It showcases different response types, including text responses, live updates, and reference documents, as well as +the use of todo lists to help agents handle complex tasks. + +To run the script, execute the following command: + + ```bash + ragbits api run examples.chat.hiking_agent:MyChat + ``` +""" + +# /// script +# requires-python = ">=3.10" +# dependencies = [ +# "ragbits-agents", +# "ragbits-chat", +# ] +# /// +# + +from collections.abc import AsyncGenerator + +from ragbits.agents import Agent +from ragbits.agents.tools.todo import TodoOrchestrator, TodoResult +from ragbits.chat.interface import ChatInterface +from ragbits.chat.interface.types import ChatContext, ChatResponse, LiveUpdateType +from ragbits.chat.interface.ui_customization import HeaderCustomization, PageMetaCustomization, UICustomization +from ragbits.core.llms import LiteLLM +from ragbits.core.prompt import ChatFormat + + +class MyChat(ChatInterface): + """A simple example implementation of the ChatInterface that demonstrates different response types.""" + + ui_customization = UICustomization( + header=HeaderCustomization(title="Example Ragbits Agent Chat", subtitle="by deepsense.ai", logo="🐰"), + welcome_message=( + "Hello! I'm your AI hiking trip assistant.\n\n How can I help you today? " + "You can ask me **anything**! " + "I can provide information, answer questions, and assist you with various tasks." + ), + meta=PageMetaCustomization(favicon="🔨", page_title="Change me!"), + ) + + conversation_history = True + show_usage = True + + def __init__(self) -> None: + self.llm = LiteLLM(model_name="gpt-4o-mini") + self.todo_orchestrator = TodoOrchestrator() + self.agent = Agent( + llm=self.llm, + prompt=""" + You are an expert hiking guide. Provide detailed, comprehensive information + about hiking routes, gear, transportation, and safety considerations. + """, + ) + + async def chat( + self, + message: str, + history: ChatFormat, + context: ChatContext, + ) -> AsyncGenerator[ChatResponse, None]: + """ + Example implementation of the ChatInterface. + + Args: + message: The current user message + history: Optional list of previous messages in the conversation + context: Optional context + + Yields: + ChatResponse objects containing different types of content: + - Text chunks for the actual response + - Reference documents used to generate the response + """ + live_update_counter = 0 + + async for response in self.todo_orchestrator.run_todo_workflow_streaming( + self.agent, [*history, {"role": "user", "content": message}] + ): + match response: + case str(): + yield self.create_text_response(response) + case TodoResult(): + if response.type in ("status"): + yield self.create_live_update( + str(live_update_counter), LiveUpdateType.FINISH, response.message or "" + ) + live_update_counter += 1 + elif response.type in ("task_list"): + for task in response.tasks: + yield self.create_todo_item_response(task) + elif response.type in ("start_task"): + yield self.create_todo_item_response(response.current_task) + elif response.type in ("task_summary_start", "final_summary_start"): + yield self.create_live_update( + str(live_update_counter), LiveUpdateType.START, response.message or "" + ) + elif response.type in ("task_completed"): + yield self.create_live_update( + str(live_update_counter), LiveUpdateType.FINISH, response.message or "" + ) + yield self.create_todo_item_response(response.current_task) + live_update_counter += 1 + elif response.type in ("final_summary_end"): + yield self.create_live_update( + str(live_update_counter), LiveUpdateType.FINISH, response.message or "" + ) + live_update_counter += 1 diff --git a/package-lock.json b/package-lock.json index fb44e87a5..50f24ad59 100644 --- a/package-lock.json +++ b/package-lock.json @@ -14988,7 +14988,7 @@ } }, "typescript/@ragbits/api-client": { - "version": "1.2.2", + "version": "1.3.0", "license": "MIT", "devDependencies": { "@eslint/js": "^9.17.0", @@ -15007,7 +15007,7 @@ } }, "typescript/@ragbits/api-client-react": { - "version": "1.2.2", + "version": "1.3.0", "license": "MIT", "dependencies": { "@ragbits/api-client": "*" @@ -15038,7 +15038,7 @@ } }, "typescript/ui": { - "version": "1.2.2", + "version": "1.3.0", "dependencies": { "@heroicons/react": "^2.2.0", "@heroui/react": "^2.8.1", diff --git a/packages/ragbits-agents/CHANGELOG.md b/packages/ragbits-agents/CHANGELOG.md index a1fb79a83..524d282b4 100644 --- a/packages/ragbits-agents/CHANGELOG.md +++ b/packages/ragbits-agents/CHANGELOG.md @@ -1,20 +1,21 @@ # CHANGELOG ## Unreleased -- TodoOrchestrator & Todo list for agent (#823) +- TodoOrchestrator & Todo list for agent (#823) - Support wrapping downstream agents as tools (#818) - Add syntax sugar allowing easier Agents definition (#820) - Add post-processors (#821) - Support streaming from downstream agents (#812) - - Support wrapping downstream agents as tools (#818) - Add syntax sugar allowing easier Agents definition (#820) - Add post-processors (#821) - Support streaming from downstream agents (#812) - Add supervisor post-processor (#830) +- Add support for todo lists generated by agents with examples (#827) ## 1.3.0 (2025-09-11) + ### Changed - ragbits-core updated to version v1.3.0 diff --git a/packages/ragbits-agents/src/ragbits/agents/tools/todo.py b/packages/ragbits-agents/src/ragbits/agents/tools/todo.py index aeb9552fa..699c50dfb 100644 --- a/packages/ragbits-agents/src/ragbits/agents/tools/todo.py +++ b/packages/ragbits-agents/src/ragbits/agents/tools/todo.py @@ -2,10 +2,11 @@ import uuid from collections.abc import AsyncGenerator -from dataclasses import dataclass, field from enum import Enum from types import SimpleNamespace +from pydantic import BaseModel, Field + from ragbits.agents import Agent from ragbits.agents._main import DownstreamAgentResult from ragbits.agents.tool import ToolCallResult @@ -28,8 +29,7 @@ class TaskStatus(str, Enum): RETRYING = "retrying" -@dataclass -class Task: +class Task(BaseModel): """Simple task representation.""" id: str @@ -37,19 +37,19 @@ class Task: status: TaskStatus = TaskStatus.PENDING order: int = 0 summary: str | None = None + parent_id: str | None = None full_response: str | None = None - dependencies: list[str] = field(default_factory=list) + dependencies: list[str] = Field(default_factory=list) -@dataclass -class TodoResult: +class TodoResult(BaseModel): """Result type for todo workflow.""" type: str message: str | None = None current_task: Task | None = None next_task: Task | None = None - tasks: list[Task] | None = None + tasks: list[Task] = Field(default_factory=list) tasks_count: int | None = None progress: str | None = None @@ -60,11 +60,10 @@ class TodoResult: ) -@dataclass -class TodoList: +class TodoList(BaseModel): """Simple todo list for one agent run.""" - tasks: list[Task] = field(default_factory=list) + tasks: list[Task] = Field(default_factory=list) current_index: int = 0 def get_current_task(self) -> Task | None: @@ -110,14 +109,14 @@ def get_current(self) -> TodoResult: progress=f"{self.current_index + 1}/{len(self.tasks)}", ) - def start_current_task(self) -> TodoResult: + def start_current_task(self) -> Task: """Start the current task.""" current = self.get_current_task() if not current: raise ValueError("No current task to start") current.status = TaskStatus.IN_PROGRESS - return TodoResult(type="start_task", message=f"Started task: {current.description}", current_task=current) + return current def complete_current_task(self, summary: str) -> TodoResult: """Complete the current task with summary.""" @@ -159,22 +158,20 @@ def get_completed_context(self) -> str: return "Previous completed tasks:\n" + "\n".join(context_parts) -@dataclass -class TodoOrchestrator: +class TodoOrchestrator(BaseModel): """High-level orchestrator for managing todo workflow with context passing.""" - todo_list: TodoList = field(default_factory=TodoList) + todo_list: TodoList = Field(default_factory=TodoList) domain_context: str = "" - def __init__(self, domain_context: str = ""): + def __init__(self, domain_context: str = "") -> None: """ Initialize TodoOrchestrator with domain-specific prompts. Args: domain_context: Additional context about the domain (e.g., "hiking guide", "software architect", etc.) """ - self.todo_list = TodoList() - self.domain_context = domain_context + super().__init__(domain_context=domain_context) async def run_todo_workflow_streaming( self, agent: Agent, initial_query: str @@ -219,8 +216,7 @@ async def run_todo_workflow_streaming( # Complex query - proceed with task breakdown yield TodoResult(type="status", message=f"📋 Complex query - created {len(tasks)} tasks:") - for i, task in enumerate(tasks, 1): - yield TodoResult(type="task_list", message=f" {i}. {task}") + yield TodoResult(type="task_list", tasks=tasks, tasks_count=len(tasks)) # Step 2: Execute each task with context from previous tasks task_summaries = [] @@ -242,19 +238,22 @@ async def run_todo_workflow_streaming( # Execute single task with focused context and stream summary async for task_response in self._execute_single_task_focused(agent, current_task, context, initial_query): yield task_response + yield "\n\n" # Get the completed task summary completed_tasks = [t for t in self.todo_list.tasks if t.status == TaskStatus.COMPLETED] if completed_tasks: latest_summary = completed_tasks[-1].summary task_summaries.append(latest_summary) - yield TodoResult(type="task_completed", message="\n✅ Task completed\n") + yield TodoResult( + type="task_completed", message="\n✅ Task completed\n", current_task=completed_tasks[-1] + ) # Step 3: Generate comprehensive final summary with streaming yield TodoResult(type="status", message="📝 Generating comprehensive final summary...") yield TodoResult( type="final_summary_start", - message=f"\n📊 COMPREHENSIVE {self.domain_context.upper()} SUMMARY:\n" + "=" * 60 + "\n", + message=f"\n📊 Comprehensive {self.domain_context} summary:\n", ) async for summary_response in self._generate_comprehensive_summary_streaming( @@ -262,7 +261,7 @@ async def run_todo_workflow_streaming( ): yield summary_response - yield TodoResult(type="final_summary_end", message="\n" + "=" * 60) + yield TodoResult(type="final_summary_end", message="\n") yield TodoResult(type="status", message="🎉 All tasks completed!") @staticmethod @@ -293,7 +292,7 @@ async def _analyze_query_complexity(agent: Agent, query: str) -> bool: # Default to COMPLEX if we can't determine (safer approach) return response != "SIMPLE" - async def _create_tasks_simple(self, agent: Agent, initial_query: str) -> list[str]: + async def _create_tasks_simple(self, agent: Agent, initial_query: str) -> list[Task]: """Create tasks based on initial query - simple, non-streaming.""" # First, analyze if the query actually needs task breakdown is_complex = await TodoOrchestrator._analyze_query_complexity(agent, initial_query) @@ -321,7 +320,7 @@ async def _create_tasks_simple(self, agent: Agent, initial_query: str) -> list[s tasks = self._parse_tasks_from_response(response) if tasks: self.todo_list.create_tasks(tasks) - return tasks + return self.todo_list.tasks # Return the actual Task objects return [] @@ -349,7 +348,10 @@ async def _execute_single_task_focused( """ # Mark task as started - self.todo_list.start_current_task() + current_task = self.todo_list.start_current_task() + yield TodoResult( + type="start_task", message=f"Started task: {current_task.description}", current_task=current_task + ) full_response = "" last_summary_length = 0 diff --git a/packages/ragbits-chat/CHANGELOG.md b/packages/ragbits-chat/CHANGELOG.md index aebabd8c1..1c43ff86b 100644 --- a/packages/ragbits-chat/CHANGELOG.md +++ b/packages/ragbits-chat/CHANGELOG.md @@ -1,6 +1,7 @@ # CHANGELOG ## Unreleased +- Add todo list component to the UI, add support for todo events in API (#827) ## 1.3.0 (2025-09-11) diff --git a/packages/ragbits-chat/src/ragbits/chat/interface/_interface.py b/packages/ragbits-chat/src/ragbits/chat/interface/_interface.py index 8e4b73df2..7a68af9e9 100644 --- a/packages/ragbits-chat/src/ragbits/chat/interface/_interface.py +++ b/packages/ragbits-chat/src/ragbits/chat/interface/_interface.py @@ -9,6 +9,7 @@ from collections.abc import AsyncGenerator, Callable from typing import Any +from ragbits.agents.tools.todo import Task from ragbits.chat.interface.ui_customization import UICustomization from ragbits.core.audit.metrics import record_metric from ragbits.core.audit.metrics.base import MetricType @@ -251,6 +252,10 @@ def create_usage_response(usage: Usage) -> ChatResponse: content={model: MessageUsage.from_usage(usage) for model, usage in usage.model_breakdown.items()}, ) + @staticmethod + def create_todo_item_response(task: Task) -> ChatResponse: + return ChatResponse(type=ChatResponseType.TODO_ITEM, content=task) + @staticmethod def _sign_state(state: dict[str, Any]) -> str: """ diff --git a/packages/ragbits-chat/src/ragbits/chat/interface/types.py b/packages/ragbits-chat/src/ragbits/chat/interface/types.py index 920003651..75bfd4d01 100644 --- a/packages/ragbits-chat/src/ragbits/chat/interface/types.py +++ b/packages/ragbits-chat/src/ragbits/chat/interface/types.py @@ -3,6 +3,7 @@ from pydantic import BaseModel, ConfigDict, Field +from ragbits.agents.tools.todo import Task from ragbits.chat.auth.types import User from ragbits.chat.interface.forms import UserSettings from ragbits.chat.interface.ui_customization import UICustomization @@ -122,6 +123,7 @@ class ChatResponseType(str, Enum): CHUNKED_CONTENT = "chunked_content" CLEAR_MESSAGE = "clear_message" USAGE = "usage" + TODO_ITEM = "todo_item" class ChatContext(BaseModel): @@ -140,7 +142,16 @@ class ChatResponse(BaseModel): type: ChatResponseType content: ( - str | Reference | StateUpdate | LiveUpdate | list[str] | Image | dict[str, MessageUsage] | ChunkedContent | None + str + | Reference + | StateUpdate + | LiveUpdate + | list[str] + | Image + | dict[str, MessageUsage] + | ChunkedContent + | None + | Task ) def as_text(self) -> str | None: @@ -217,6 +228,12 @@ def as_usage(self) -> dict[str, MessageUsage] | None: """ return cast(dict[str, MessageUsage], self.content) if self.type == ChatResponseType.USAGE else None + def as_task(self) -> Task | None: + """ + Return the content as Task if this is an todo_item response, else None. + """ + return cast(Task, self.content) if self.type == ChatResponseType.TODO_ITEM else None + class ChatMessageRequest(BaseModel): """Client-side chat request interface.""" diff --git a/packages/ragbits-chat/src/ragbits/chat/providers/model_provider.py b/packages/ragbits-chat/src/ragbits/chat/providers/model_provider.py index 6b1191c74..b94bfe4bc 100644 --- a/packages/ragbits-chat/src/ragbits/chat/providers/model_provider.py +++ b/packages/ragbits-chat/src/ragbits/chat/providers/model_provider.py @@ -10,6 +10,7 @@ from pydantic import BaseModel +from ragbits.agents.tools.todo import Task, TaskStatus from ragbits.chat.interface.types import AuthType @@ -82,6 +83,7 @@ def get_models(self) -> dict[str, type[BaseModel | Enum]]: "FeedbackType": FeedbackType, "LiveUpdateType": LiveUpdateType, "MessageRole": MessageRole, + "TaskStatus": TaskStatus, # Core data models "ChatContext": ChatContext, "ChunkedContent": ChunkedContent, @@ -93,6 +95,7 @@ def get_models(self) -> dict[str, type[BaseModel | Enum]]: "FeedbackItem": FeedbackItem, "Image": Image, "MessageUsage": MessageUsage, + "Task": Task, # Configuration models "HeaderCustomization": HeaderCustomization, "UICustomization": UICustomization, @@ -151,6 +154,8 @@ def get_categories(self) -> dict[str, list[str]]: "JWTToken", "User", "MessageUsage", + "Task", + "TaskStatus", ], "configuration": [ "HeaderCustomization", diff --git a/scripts/generate_typescript_from_json_schema.py b/scripts/generate_typescript_from_json_schema.py index 903e85e12..317b7fce8 100644 --- a/scripts/generate_typescript_from_json_schema.py +++ b/scripts/generate_typescript_from_json_schema.py @@ -201,6 +201,7 @@ def _generate_chat_response_union_type() -> str: ("ImageChatResponse", "image", "Image"), ("ClearMessageResponse", "clear_message", "never"), ("MessageUsageChatResponse", "usage", "Record"), + ("TodoItemChatResonse", "todo_item", "Task"), ] internal_response_interfaces = [ diff --git a/typescript/@ragbits/api-client/package.json b/typescript/@ragbits/api-client/package.json index 5d5a27567..f10063cf4 100644 --- a/typescript/@ragbits/api-client/package.json +++ b/typescript/@ragbits/api-client/package.json @@ -5,7 +5,7 @@ "repository": { "type": "git", "url": "https://github.com/deepsense-ai/ragbits" - }, + }, "main": "dist/index.cjs", "module": "dist/index.js", "types": "dist/index.d.ts", diff --git a/typescript/@ragbits/api-client/src/autogen.types.ts b/typescript/@ragbits/api-client/src/autogen.types.ts index 5ac4f55af..0240f250c 100644 --- a/typescript/@ragbits/api-client/src/autogen.types.ts +++ b/typescript/@ragbits/api-client/src/autogen.types.ts @@ -23,6 +23,7 @@ export const ChatResponseType = { ChunkedContent: 'chunked_content', ClearMessage: 'clear_message', Usage: 'usage', + TodoItem: 'todo_item', } as const export type ChatResponseType = TypeFrom @@ -58,6 +59,17 @@ export const MessageRole = { export type MessageRole = TypeFrom +/** + * Represents the TaskStatus enum + */ +export const TaskStatus = { + Pending: 'pending', + InProgress: 'in_progress', + Completed: 'completed', +} as const + +export type TaskStatus = TypeFrom + /** * Represents the AuthType enum */ @@ -170,6 +182,21 @@ export interface MessageUsage { total_tokens: number } +/** + * Simple task representation. + */ +export interface Task { + id: string + description: string + /** + * Task status options. + */ + status: 'pending' | 'in_progress' | 'completed' + order: number + summary: string | null + parent_id: string | null +} + /** * Customization for the header section of the UI. */ @@ -465,6 +492,11 @@ export interface MessageUsageChatResponse { content: Record } +export interface TodoItemChatResonse { + type: 'todo_item' + content: Task +} + export interface ChunkedChatResponse { type: 'chunked_content' content: ChunkedContent @@ -484,3 +516,4 @@ export type ChatResponse = | ImageChatResponse | ClearMessageResponse | MessageUsageChatResponse + | TodoItemChatResonse diff --git a/typescript/@ragbits/api-client/src/index.ts b/typescript/@ragbits/api-client/src/index.ts index 57851fa8e..3c45f36f7 100644 --- a/typescript/@ragbits/api-client/src/index.ts +++ b/typescript/@ragbits/api-client/src/index.ts @@ -200,6 +200,11 @@ export class RagbitsClient { } await callbacks.onMessage(parsedData) + // Yield control back to event loop to prevent freezing + // TODO: Refactor the event processing to use an asynchronous queue to avoid UI freezes + await new Promise((resolve) => + setTimeout(resolve, 0) + ) } catch (parseError) { console.error('Error parsing JSON:', parseError) await callbacks.onError( diff --git a/typescript/ui/__tests__/unit/TodoList.test.tsx b/typescript/ui/__tests__/unit/TodoList.test.tsx new file mode 100644 index 000000000..efc5b6b1b --- /dev/null +++ b/typescript/ui/__tests__/unit/TodoList.test.tsx @@ -0,0 +1,146 @@ +import { cleanup, render, screen, within } from "@testing-library/react"; +import { Task, TaskStatus } from "@ragbits/api-client-react"; +import TodoList from "../../src/core/components/TodoList"; +import { afterEach, describe, expect, it, vi } from "vitest"; + +function makeTask(partial: Partial): Task { + return { + id: partial.id ?? "1", + description: partial.description ?? "Test task", + status: partial.status ?? TaskStatus.Pending, + order: partial.order ?? 1, + summary: partial.summary ?? null, + parent_id: partial.parent_id ?? null, + } as Task; +} + +describe("TodoList", () => { + afterEach(() => { + cleanup(); + vi.clearAllMocks(); + }); + + it("renders root tasks", () => { + const tasks = [ + makeTask({ id: "1", description: "Task A" }), + makeTask({ id: "2", description: "Task B" }), + ]; + + render(); + + expect(screen.getByTestId("todo-task-1")).toBeInTheDocument(); + expect(screen.getByTestId("todo-task-2")).toBeInTheDocument(); + + expect(screen.getByText("Task A")).toBeInTheDocument(); + expect(screen.getByText("Task B")).toBeInTheDocument(); + }); + + it("applies completed styles and checks checkbox", () => { + const tasks = [ + makeTask({ + id: "done", + description: "Done", + status: TaskStatus.Completed, + }), + ]; + + render(); + + const task = screen.getByTestId("todo-task-done"); + const checkbox = within(task).getByRole("checkbox"); + expect(checkbox).toBeChecked(); + expect(screen.getByText("Done")).toHaveClass("line-through"); + }); + + it("shows spinner for in-progress tasks and applies italic class", () => { + const tasks = [ + makeTask({ + id: "working", + description: "Working", + status: TaskStatus.InProgress, + }), + ]; + + render(); + + const task = screen.getByTestId("todo-task-working"); + + const spinner = within(task).getByLabelText("Task is in progress"); + expect(spinner).toBeInTheDocument(); + expect(screen.getByText("Working")).toHaveClass("italic"); + }); + + it("renders nested tasks and applies margin-left on children wrapper", () => { + const tasks = [ + makeTask({ id: "1", description: "Parent" }), + makeTask({ id: "2", description: "Child", parent_id: "1" }), + ]; + + render(); + + expect(screen.getByTestId("todo-task-1")).toBeInTheDocument(); + expect(screen.getByTestId("todo-task-2")).toBeInTheDocument(); + const childrenWrapper = screen.getByTestId("todo-children-wrapper-1"); + expect(childrenWrapper).toHaveStyle("margin-left: 0.5rem"); + }); + + it("orders root tasks according to `order` field", () => { + const tasks = [ + makeTask({ id: "a", description: "A", order: 2 }), + makeTask({ id: "b", description: "B", order: 1 }), + ]; + + render(); + + const root = screen.getByTestId("todo-list-root-0"); + const renderedTasks = Array.from( + root.querySelectorAll('[data-testid^="todo-task-"]'), + ); + const ids = renderedTasks.map((el) => el.getAttribute("data-testid")); + expect(ids).toEqual(["todo-task-b", "todo-task-a"]); + }); + + it("orders children according to `order` field", () => { + const tasks = [ + makeTask({ id: "parent", description: "Parent", order: 1 }), + makeTask({ + id: "c1", + description: "Child 1", + order: 2, + parent_id: "parent", + }), + makeTask({ + id: "c2", + description: "Child 2", + order: 1, + parent_id: "parent", + }), + ]; + + render(); + + const wrapper = screen.getByTestId("todo-children-wrapper-parent"); + const childTasks = Array.from( + wrapper.querySelectorAll('[data-testid^="todo-task-"]'), + ); + const ids = childTasks.map((el) => el.getAttribute("data-testid")); + expect(ids).toEqual(["todo-task-c2", "todo-task-c1"]); + }); + + it("renders task summary when provided", () => { + const tasks = [ + makeTask({ + id: "with-summary", + description: "Task with summary", + summary: "This is a summary", + }), + ]; + + render(); + + const task = screen.getByTestId("todo-task-with-summary"); + expect(task).toBeInTheDocument(); + expect(screen.getByText("Task with summary")).toBeInTheDocument(); + expect(screen.getByText("This is a summary")).toBeInTheDocument(); + }); +}); diff --git a/typescript/ui/__tests__/unit/plugin/ChatHistoryPlugin/ChatHistory.test.tsx b/typescript/ui/__tests__/unit/plugin/ChatHistoryPlugin/ChatHistory.test.tsx index f8323d0c7..413b91264 100644 --- a/typescript/ui/__tests__/unit/plugin/ChatHistoryPlugin/ChatHistory.test.tsx +++ b/typescript/ui/__tests__/unit/plugin/ChatHistoryPlugin/ChatHistory.test.tsx @@ -54,7 +54,7 @@ const MOCK_CONVERSATIONS: HistoryStore["conversations"] = { history: {}, followupMessages: null, serverState: null, - conversationId: "null", + conversationId: "temp-mock-id-1", eventsLog: [], lastMessageId: null, chatOptions: undefined, @@ -108,6 +108,7 @@ describe("ChatHistory", () => { return; } + console.log(`delete-conversation-${key}`); expect( screen.getByTestId(`delete-conversation-${key}`), ).toBeInTheDocument(); diff --git a/typescript/ui/src/core/components/ChatMessage/ChatMessage.tsx b/typescript/ui/src/core/components/ChatMessage/ChatMessage.tsx index 989a1d87c..2a802cb6e 100644 --- a/typescript/ui/src/core/components/ChatMessage/ChatMessage.tsx +++ b/typescript/ui/src/core/components/ChatMessage/ChatMessage.tsx @@ -12,6 +12,8 @@ import { useMessage, } from "../../stores/HistoryStore/selectors.ts"; import { MessageRole } from "@ragbits/api-client"; +import TodoList from "../TodoList.tsx"; +import { AnimatePresence, motion } from "framer-motion"; type ChatMessageProps = { classNames?: { @@ -92,6 +94,20 @@ const ChatMessage = forwardRef( classNames={{ liveUpdates: classNames?.liveUpdates }} /> )} + {message.tasks && message.tasks.length > 0 && ( + + +

Execution plan

+ +
+
+ )} + {tasksTree + .getRoots() + .map(({ id, description, status, summary, children }) => { + const inProgressIcon = ( + + ); + return ( +
+
+ inProgressIcon + : undefined + } + classNames={{ + hiddenInput: "cursor-default", + wrapper: cn( + status === TaskStatus.InProgress && "before:border-none", + ), + base: "pointer-events-none hover:bg-transparent", + label: cn( + "transition-colors", + status === TaskStatus.Completed && + "line-through text-default-400", + status === TaskStatus.InProgress && "text-primary italic", + status === TaskStatus.Pending && "text-default-900", + ), + }} + > + {description} + {summary &&

{summary}

} +
+
+ {children.length > 0 && ( +
+ +
+ )} +
+ ); + })} + + ); +} diff --git a/typescript/ui/src/core/stores/HistoryStore/eventHandlers/eventHandlerRegistry.ts b/typescript/ui/src/core/stores/HistoryStore/eventHandlers/eventHandlerRegistry.ts index 8b4799cc3..7e0d456e9 100644 --- a/typescript/ui/src/core/stores/HistoryStore/eventHandlers/eventHandlerRegistry.ts +++ b/typescript/ui/src/core/stores/HistoryStore/eventHandlers/eventHandlerRegistry.ts @@ -13,6 +13,7 @@ import { handleMessageId, handleReference, handleText, + handleTodoItem, handleUsage, } from "./messageHandlers"; @@ -101,3 +102,6 @@ ChatHandlerRegistry.register(ChatResponseType.ClearMessage, { ChatHandlerRegistry.register(ChatResponseType.Usage, { handle: handleUsage, }); +ChatHandlerRegistry.register(ChatResponseType.TodoItem, { + handle: handleTodoItem, +}); diff --git a/typescript/ui/src/core/stores/HistoryStore/eventHandlers/messageHandlers.ts b/typescript/ui/src/core/stores/HistoryStore/eventHandlers/messageHandlers.ts index 2811625a3..d03437a1b 100644 --- a/typescript/ui/src/core/stores/HistoryStore/eventHandlers/messageHandlers.ts +++ b/typescript/ui/src/core/stores/HistoryStore/eventHandlers/messageHandlers.ts @@ -7,6 +7,7 @@ import { MessageUsageChatResponse, ReferenceChatResponse, TextChatResponse, + TodoItemChatResonse, } from "@ragbits/api-client-react"; import { PrimaryHandler } from "./eventHandlerRegistry"; import { produce } from "immer"; @@ -97,3 +98,22 @@ export const handleUsage: PrimaryHandler = ( const message = draft.history[ctx.messageId]; message.usage = response.content; }; + +export const handleTodoItem: PrimaryHandler = ( + { content }, + draft, + ctx, +) => { + const message = draft.history[ctx.messageId]; + const tasks = message.tasks ?? []; + const newTasks = produce(tasks, (tasksDraft) => { + const taskIndex = tasksDraft.findIndex((t) => t.id === content.id); + if (taskIndex === -1) { + tasksDraft.push(content); + } else { + tasksDraft[taskIndex] = content; + } + }); + + message.tasks = newTasks; +}; diff --git a/typescript/ui/src/core/utils/tasks.ts b/typescript/ui/src/core/utils/tasks.ts new file mode 100644 index 000000000..192fa37b7 --- /dev/null +++ b/typescript/ui/src/core/utils/tasks.ts @@ -0,0 +1,80 @@ +import { Task } from "@ragbits/api-client-react"; + +export interface TaskNode extends Task { + children: TaskNode[]; +} + +export class TaskTree { + private nodes: Map = new Map(); + private roots: TaskNode[] = []; + + constructor(tasks: Task[]) { + this.buildTree(tasks); + } + + private buildTree(tasks: Task[]) { + for (const task of tasks) { + this.nodes.set(task.id, { ...task, children: [] }); + } + + for (const node of this.nodes.values()) { + if (node.parent_id) { + const parent = this.nodes.get(node.parent_id); + if (parent) { + parent.children.push(node); + parent.children.sort((a, b) => a.order - b.order); + } else { + this.roots.push(node); + this.roots.sort((a, b) => a.order - b.order); + } + } else { + this.roots.push(node); + this.roots.sort((a, b) => a.order - b.order); + } + } + } + + *iterate(): IterableIterator { + function* dfs(nodes: TaskNode[]): IterableIterator { + for (const node of nodes) { + yield node; + yield* dfs(node.children); + } + } + yield* dfs(this.roots); + } + + get(id: string): TaskNode | undefined { + return this.nodes.get(id); + } + + update(id: string, updates: Partial): void { + const node = this.nodes.get(id); + if (!node) return; + + Object.assign(node, updates); + if (updates.order !== undefined) { + if (node.parent_id) { + const parent = this.nodes.get(node.parent_id); + parent?.children.sort((a, b) => a.order - b.order); + } else { + this.roots.sort((a, b) => a.order - b.order); + } + } + + if (updates.status === "completed") { + this.completeChildren(node); + } + } + + private completeChildren(node: TaskNode) { + for (const child of node.children) { + child.status = "completed"; + this.completeChildren(child); + } + } + + getRoots(): TaskNode[] { + return this.roots; + } +} diff --git a/typescript/ui/src/plugins/ChatHistoryPlugin/components/ChatHistory.tsx b/typescript/ui/src/plugins/ChatHistoryPlugin/components/ChatHistory.tsx index 6bd7b0ffc..aa4a0fbd5 100644 --- a/typescript/ui/src/plugins/ChatHistoryPlugin/components/ChatHistory.tsx +++ b/typescript/ui/src/plugins/ChatHistoryPlugin/components/ChatHistory.tsx @@ -8,12 +8,15 @@ import { useHistoryStore } from "../../../core/stores/HistoryStore/useHistorySto import { isTemporaryConversation } from "../../../core/stores/HistoryStore/historyStore"; import { useNavigate } from "react-router"; import { getConversationRoute } from "../utils"; +import { useShallow } from "zustand/shallow"; export default function ChatHistory() { const { selectConversation, deleteConversation, newConversation } = useHistoryActions(); const navigate = useNavigate(); - const conversations = useHistoryStore((s) => s.conversations); + const conversations = useHistoryStore( + useShallow((s) => Object.keys(s.conversations).reverse()), + ); const currentConversation = useHistoryStore((s) => s.currentConversation); const [isCollapsed, setCollapsed] = useState(false); const collapseButtonTitle = isCollapsed ? "Open sidebar" : "Close sidebar"; @@ -112,46 +115,45 @@ export default function ChatHistory() { width: 0, }} > - {Object.entries(conversations) - .reverse() - .map(([conversationKey, conversation]) => { - if (isTemporaryConversation(conversation.conversationId)) { - return null; - } + {conversations.map((conversation) => { + if (isTemporaryConversation(conversation)) { + return null; + } - const isSelected = conversationKey === currentConversation; - return ( -
+ const isSelected = conversation === currentConversation; + const variant = isSelected ? "solid" : "light"; + return ( +
+ + - - - -
- ); - })} + +
+ ); + })} )} diff --git a/typescript/ui/src/types/history.ts b/typescript/ui/src/types/history.ts index 4e3bfc7f8..74205eb36 100644 --- a/typescript/ui/src/types/history.ts +++ b/typescript/ui/src/types/history.ts @@ -7,6 +7,7 @@ import { Image, MessageUsage, RagbitsClient, + Task, } from "@ragbits/api-client-react"; export type UnsubscribeFn = (() => void) | null; @@ -24,6 +25,7 @@ export interface ChatMessage { extensions?: Record; images?: Record; usage?: Record; + tasks?: Task[]; } export interface Conversation { From 61ec71f29df74ac1f86d1b5c056bad2ba87e7d37 Mon Sep 17 00:00:00 2001 From: ds-ragbits-robot Date: Fri, 10 Oct 2025 07:17:57 +0000 Subject: [PATCH 38/43] Automated UI build --- ...uard-B3JOY-uC.js => AuthGuard-Cg314rC1.js} | 2 +- .../ui-build/assets/ChatHistory-D2Pd5V75.js | 1 - .../ui-build/assets/ChatHistory-Dzy0EI1-.js | 1 + ...YA6GEAP.js => ChatOptionsForm-CUT15Ecj.js} | 2 +- ...m-Bovwe8ia.js => FeedbackForm-Cuu7ROp3.js} | 2 +- .../{Login-B2kPNK-w.js => Login-xlop2v42.js} | 2 +- ...n-Bspy5P1_.js => LogoutButton-Cp3E_g1o.js} | 2 +- ...on-BvHR4xdz.js => ShareButton-DpNGX0tU.js} | 2 +- .../ui-build/assets/UsageButton-BMDI2IGg.js | 1 - .../ui-build/assets/UsageButton-I3vvJAZH.js | 1 + ...tore-DLhLSjcY.js => authStore-Ur4ZGows.js} | 2 +- .../assets/chunk-IGSAU2ZA-DUS7ku-0.js | 1 - .../assets/chunk-IGSAU2ZA-RYoue1Xd.js | 1 + ...DnKzYyYP.js => chunk-SSA7SXE4-CpT2ku66.js} | 2 +- .../chat/ui-build/assets/index-3BSSmhVm.js | 1 - .../chat/ui-build/assets/index-BTHsSiyo.css | 1 - .../chat/ui-build/assets/index-BTypXP0X.js | 127 ++++++++++++++++++ .../chat/ui-build/assets/index-C75huGqt.js | 127 ------------------ .../{index-VYICyW2P.js => index-CTrBaHsz.js} | 6 +- .../chat/ui-build/assets/index-CYQIHhg3.js | 1 + .../chat/ui-build/assets/index-DHfXqRui.css | 1 + .../chat/ui-build/assets/index-I-Ja0wkh.js | 4 - .../chat/ui-build/assets/index-nfbmdcVN.js | 4 + .../src/ragbits/chat/ui-build/index.html | 4 +- 24 files changed, 149 insertions(+), 149 deletions(-) rename packages/ragbits-chat/src/ragbits/chat/ui-build/assets/{AuthGuard-B3JOY-uC.js => AuthGuard-Cg314rC1.js} (56%) delete mode 100644 packages/ragbits-chat/src/ragbits/chat/ui-build/assets/ChatHistory-D2Pd5V75.js create mode 100644 packages/ragbits-chat/src/ragbits/chat/ui-build/assets/ChatHistory-Dzy0EI1-.js rename packages/ragbits-chat/src/ragbits/chat/ui-build/assets/{ChatOptionsForm-DYA6GEAP.js => ChatOptionsForm-CUT15Ecj.js} (95%) rename packages/ragbits-chat/src/ragbits/chat/ui-build/assets/{FeedbackForm-Bovwe8ia.js => FeedbackForm-Cuu7ROp3.js} (88%) rename packages/ragbits-chat/src/ragbits/chat/ui-build/assets/{Login-B2kPNK-w.js => Login-xlop2v42.js} (79%) rename packages/ragbits-chat/src/ragbits/chat/ui-build/assets/{LogoutButton-Bspy5P1_.js => LogoutButton-Cp3E_g1o.js} (81%) rename packages/ragbits-chat/src/ragbits/chat/ui-build/assets/{ShareButton-BvHR4xdz.js => ShareButton-DpNGX0tU.js} (98%) delete mode 100644 packages/ragbits-chat/src/ragbits/chat/ui-build/assets/UsageButton-BMDI2IGg.js create mode 100644 packages/ragbits-chat/src/ragbits/chat/ui-build/assets/UsageButton-I3vvJAZH.js rename packages/ragbits-chat/src/ragbits/chat/ui-build/assets/{authStore-DLhLSjcY.js => authStore-Ur4ZGows.js} (74%) delete mode 100644 packages/ragbits-chat/src/ragbits/chat/ui-build/assets/chunk-IGSAU2ZA-DUS7ku-0.js create mode 100644 packages/ragbits-chat/src/ragbits/chat/ui-build/assets/chunk-IGSAU2ZA-RYoue1Xd.js rename packages/ragbits-chat/src/ragbits/chat/ui-build/assets/{chunk-SSA7SXE4-DnKzYyYP.js => chunk-SSA7SXE4-CpT2ku66.js} (62%) delete mode 100644 packages/ragbits-chat/src/ragbits/chat/ui-build/assets/index-3BSSmhVm.js delete mode 100644 packages/ragbits-chat/src/ragbits/chat/ui-build/assets/index-BTHsSiyo.css create mode 100644 packages/ragbits-chat/src/ragbits/chat/ui-build/assets/index-BTypXP0X.js delete mode 100644 packages/ragbits-chat/src/ragbits/chat/ui-build/assets/index-C75huGqt.js rename packages/ragbits-chat/src/ragbits/chat/ui-build/assets/{index-VYICyW2P.js => index-CTrBaHsz.js} (61%) create mode 100644 packages/ragbits-chat/src/ragbits/chat/ui-build/assets/index-CYQIHhg3.js create mode 100644 packages/ragbits-chat/src/ragbits/chat/ui-build/assets/index-DHfXqRui.css delete mode 100644 packages/ragbits-chat/src/ragbits/chat/ui-build/assets/index-I-Ja0wkh.js create mode 100644 packages/ragbits-chat/src/ragbits/chat/ui-build/assets/index-nfbmdcVN.js diff --git a/packages/ragbits-chat/src/ragbits/chat/ui-build/assets/AuthGuard-B3JOY-uC.js b/packages/ragbits-chat/src/ragbits/chat/ui-build/assets/AuthGuard-Cg314rC1.js similarity index 56% rename from packages/ragbits-chat/src/ragbits/chat/ui-build/assets/AuthGuard-B3JOY-uC.js rename to packages/ragbits-chat/src/ragbits/chat/ui-build/assets/AuthGuard-Cg314rC1.js index e7e8303be..42af54d7e 100644 --- a/packages/ragbits-chat/src/ragbits/chat/ui-build/assets/AuthGuard-B3JOY-uC.js +++ b/packages/ragbits-chat/src/ragbits/chat/ui-build/assets/AuthGuard-Cg314rC1.js @@ -1 +1 @@ -import{r as a,j as s,aN as c,h as x,aJ as g,bs as m,bt as p,bu as v,bv as b,bw as j}from"./index-C75huGqt.js";import{a as r}from"./authStore-DLhLSjcY.js";const k=a.createContext(null);function A({children:o}){const[n]=a.useState(()=>r);return s.jsx(k.Provider,{value:n,children:o})}function C(){const{token:o,tokenExpiration:n,logout:l}=c(r,e=>e),i=x(e=>e.isLoading),u=g(),d=a.useRef(i);a.useEffect(()=>{d.current=i},[i]);const t=a.useCallback(()=>{const e=()=>{d.current?setTimeout(e,500):(l(),u("/login"))};e()},[l,u]);return a.useEffect(()=>{if(!o||!n)return;const e=Date.now(),h=n-e;if(h<=0){t();return}const f=setTimeout(()=>{t()},h);return()=>clearTimeout(f)},[o,n,t]),null}function S({children:o}){const n=m(),l=c(r,t=>t.isAuthenticated),i=c(r,t=>t.hasHydrated),u=c(r,t=>t.token?.access_token),d=c(r,t=>t.logout);return i?n.pathname==="/login"?o:l&&u?s.jsx(A,{children:s.jsxs(v,{baseUrl:b,auth:{getToken:()=>u,onUnauthorized:d},children:[o,s.jsx(C,{})]})}):s.jsx(j,{to:"/login",replace:!0}):s.jsx(p,{})}export{S as default}; +import{r as a,j as s,aP as c,h as x,aK as g,bj as m,bk as p,bl as j,bm as k,bn as v}from"./index-BTypXP0X.js";import{a as r}from"./authStore-Ur4ZGows.js";const b=a.createContext(null);function A({children:o}){const[n]=a.useState(()=>r);return s.jsx(b.Provider,{value:n,children:o})}function C(){const{token:o,tokenExpiration:n,logout:l}=c(r,e=>e),i=x(e=>e.isLoading),u=g(),d=a.useRef(i);a.useEffect(()=>{d.current=i},[i]);const t=a.useCallback(()=>{const e=()=>{d.current?setTimeout(e,500):(l(),u("/login"))};e()},[l,u]);return a.useEffect(()=>{if(!o||!n)return;const e=Date.now(),h=n-e;if(h<=0){t();return}const f=setTimeout(()=>{t()},h);return()=>clearTimeout(f)},[o,n,t]),null}function R({children:o}){const n=m(),l=c(r,t=>t.isAuthenticated),i=c(r,t=>t.hasHydrated),u=c(r,t=>t.token?.access_token),d=c(r,t=>t.logout);return i?n.pathname==="/login"?o:l&&u?s.jsx(A,{children:s.jsxs(j,{baseUrl:k,auth:{getToken:()=>u,onUnauthorized:d},children:[o,s.jsx(C,{})]})}):s.jsx(v,{to:"/login",replace:!0}):s.jsx(p,{})}export{R as default}; diff --git a/packages/ragbits-chat/src/ragbits/chat/ui-build/assets/ChatHistory-D2Pd5V75.js b/packages/ragbits-chat/src/ragbits/chat/ui-build/assets/ChatHistory-D2Pd5V75.js deleted file mode 100644 index 75bfe6406..000000000 --- a/packages/ragbits-chat/src/ragbits/chat/ui-build/assets/ChatHistory-D2Pd5V75.js +++ /dev/null @@ -1 +0,0 @@ -import{a as C,aJ as N,i as h,r as y,j as t,aK as n,aD as I,D as o,d as s,I as i,aL as D,aM as m}from"./index-C75huGqt.js";function P(){const{selectConversation:u,deleteConversation:v,newConversation:x}=C(),r=N(),p=h(e=>e.conversations),f=h(e=>e.currentConversation),[a,b]=y.useState(!1),l=a?"Open sidebar":"Close sidebar",g=t.jsx(i,{icon:"heroicons:pencil-square"}),j=()=>{const e=x();r(m(e))},w=e=>{u(e),r(m(e))};return t.jsx(n.div,{initial:!1,animate:{maxWidth:a?"4.5rem":"16rem"},className:"rounded-l-medium border-small border-divider ml-4 flex h-full w-full min-w-[4.5rem] flex-grow flex-col space-y-2 overflow-hidden border-r-0 p-4 py-3",children:t.jsxs(I,{children:[t.jsx(o,{content:l,placement:"bottom",children:t.jsx(s,{isIconOnly:!0,"aria-label":l,variant:"ghost",onPress:()=>b(e=>!e),"data-testid":"chat-history-collapse-button",className:"ml-auto",children:t.jsx(i,{icon:a?"heroicons:chevron-double-right":"heroicons:chevron-double-left"})})},"collapse-button"),!a&&t.jsx(n.p,{initial:!1,animate:{opacity:1,width:"100%",height:"auto"},exit:{opacity:0,width:0,height:0,marginBottom:0},className:"text-small text-foreground truncate leading-5 font-semibold",children:"Conversations"},"conversations"),t.jsx(o,{content:"New conversation",placement:"right",children:t.jsx(s,{"aria-label":"New conversation",variant:"ghost",onPress:j,"data-testid":"chat-history-clear-chat-button",startContent:g,isIconOnly:a,children:!a&&"New conversation"})},"new-conversation-button"),!a&&t.jsx(n.div,{className:"mt-2 flex flex-1 flex-col gap-2 overflow-auto overflow-x-hidden",initial:!1,animate:{opacity:1,width:"100%"},exit:{opacity:0,width:0},children:Object.entries(p).reverse().map(([e,c])=>{if(D(c.conversationId))return null;const d=e===f;return t.jsxs("div",{className:"flex gap-2",children:[t.jsx(s,{variant:d?"solid":"light","aria-label":`Select conversation ${e}`,"data-active":d,onPress:()=>w(e),title:e,"data-testid":`select-conversation-${e}`,children:t.jsx("div",{className:"text-small truncate",children:c.conversationId})}),t.jsx(o,{content:"Delete conversation",placement:"right",children:t.jsx(s,{isIconOnly:!0,"aria-label":`Delete conversation ${e}`,onPress:()=>v(e),variant:"ghost","data-testid":`delete-conversation-${e}`,children:t.jsx(i,{icon:"heroicons:trash"})})})]},e)})},"conversation-list")]})})}export{P as default}; diff --git a/packages/ragbits-chat/src/ragbits/chat/ui-build/assets/ChatHistory-Dzy0EI1-.js b/packages/ragbits-chat/src/ragbits/chat/ui-build/assets/ChatHistory-Dzy0EI1-.js new file mode 100644 index 000000000..4ff764322 --- /dev/null +++ b/packages/ragbits-chat/src/ragbits/chat/ui-build/assets/ChatHistory-Dzy0EI1-.js @@ -0,0 +1 @@ +import{a as y,aK as C,i as h,aL as N,r as I,j as t,aM as n,aD as O,D as o,d as s,I as i,aN as $,aO as u}from"./index-BTypXP0X.js";function P(){const{selectConversation:m,deleteConversation:x,newConversation:v}=y(),l=C(),p=h(N(e=>Object.keys(e.conversations).reverse())),f=h(e=>e.currentConversation),[a,b]=I.useState(!1),r=a?"Open sidebar":"Close sidebar",g=t.jsx(i,{icon:"heroicons:pencil-square"}),j=()=>{const e=v();l(u(e))},w=e=>{m(e),l(u(e))};return t.jsx(n.div,{initial:!1,animate:{maxWidth:a?"4.5rem":"16rem"},className:"rounded-l-medium border-small border-divider ml-4 flex h-full w-full min-w-[4.5rem] flex-grow flex-col space-y-2 overflow-hidden border-r-0 p-4 py-3",children:t.jsxs(O,{children:[t.jsx(o,{content:r,placement:"bottom",children:t.jsx(s,{isIconOnly:!0,"aria-label":r,variant:"ghost",onPress:()=>b(e=>!e),"data-testid":"chat-history-collapse-button",className:"ml-auto",children:t.jsx(i,{icon:a?"heroicons:chevron-double-right":"heroicons:chevron-double-left"})})},"collapse-button"),!a&&t.jsx(n.p,{initial:!1,animate:{opacity:1,width:"100%",height:"auto"},exit:{opacity:0,width:0,height:0,marginBottom:0},className:"text-small text-foreground truncate leading-5 font-semibold",children:"Conversations"},"conversations"),t.jsx(o,{content:"New conversation",placement:"right",children:t.jsx(s,{"aria-label":"New conversation",variant:"ghost",onPress:j,"data-testid":"chat-history-clear-chat-button",startContent:g,isIconOnly:a,children:!a&&"New conversation"})},"new-conversation-button"),!a&&t.jsx(n.div,{className:"mt-2 flex flex-1 flex-col gap-2 overflow-auto overflow-x-hidden",initial:!1,animate:{opacity:1,width:"100%"},exit:{opacity:0,width:0},children:p.map(e=>{if($(e))return null;const c=e===f,d=c?"solid":"light";return t.jsxs("div",{className:"flex gap-2",children:[t.jsx(s,{variant:d,"aria-label":`Select conversation ${e}`,"data-active":c,onPress:()=>w(e),title:e,"data-testid":`select-conversation-${e}`,children:t.jsx("div",{className:"text-small truncate",children:e})}),t.jsx(o,{content:"Delete conversation",placement:"right",children:t.jsx(s,{isIconOnly:!0,"aria-label":`Delete conversation ${e}`,onPress:()=>x(e),variant:"ghost","data-testid":`delete-conversation-${e}`,children:t.jsx(i,{icon:"heroicons:trash"})})})]},`${e}-${d}`)})},"conversation-list")]})})}export{P as default}; diff --git a/packages/ragbits-chat/src/ragbits/chat/ui-build/assets/ChatOptionsForm-DYA6GEAP.js b/packages/ragbits-chat/src/ragbits/chat/ui-build/assets/ChatOptionsForm-CUT15Ecj.js similarity index 95% rename from packages/ragbits-chat/src/ragbits/chat/ui-build/assets/ChatOptionsForm-DYA6GEAP.js rename to packages/ragbits-chat/src/ragbits/chat/ui-build/assets/ChatOptionsForm-CUT15Ecj.js index 30415d2a3..d74a4f5e2 100644 --- a/packages/ragbits-chat/src/ragbits/chat/ui-build/assets/ChatOptionsForm-DYA6GEAP.js +++ b/packages/ragbits-chat/src/ragbits/chat/ui-build/assets/ChatOptionsForm-CUT15Ecj.js @@ -1 +1 @@ -import{g as z,r as f,u as ie,h as ce,a as ue,i as le,b as fe,p as Y,C as Q,j as l,D as de,d as A,I as me,m as ge,e as he,f as pe}from"./index-C75huGqt.js";import{g as Z,v as W,F as be,t as ve}from"./index-VYICyW2P.js";import{m as Se}from"./chunk-IGSAU2ZA-DUS7ku-0.js";import"./chunk-SSA7SXE4-DnKzYyYP.js";import"./index-I-Ja0wkh.js";var B,V;function xe(){if(V)return B;V=1;var n="Expected a function",t=NaN,s="[object Symbol]",m=/^\s+|\s+$/g,g=/^[-+]0x[0-9a-f]+$/i,h=/^0b[01]+$/i,i=/^0o[0-7]+$/i,x=parseInt,v=typeof z=="object"&&z&&z.Object===Object&&z,y=typeof self=="object"&&self&&self.Object===Object&&self,C=v||y||Function("return this")(),d=Object.prototype,r=d.toString,c=Math.max,O=Math.min,E=function(){return C.Date.now()};function $(e,u,b){var T,L,N,I,p,j,R=0,G=!1,D=!1,k=!0;if(typeof e!="function")throw new TypeError(n);u=q(u)||0,_(b)&&(G=!!b.leading,D="maxWait"in b,N=D?c(q(b.maxWait)||0,u):N,k="trailing"in b?!!b.trailing:k);function H(o){var S=T,F=L;return T=L=void 0,R=o,I=e.apply(F,S),I}function re(o){return R=o,p=setTimeout(P,u),G?H(o):I}function oe(o){var S=o-j,F=o-R,X=u-S;return D?O(X,N-F):X}function U(o){var S=o-j,F=o-R;return j===void 0||S>=u||S<0||D&&F>=N}function P(){var o=E();if(U(o))return K(o);p=setTimeout(P,oe(o))}function K(o){return p=void 0,k&&T?H(o):(T=L=void 0,I)}function se(){p!==void 0&&clearTimeout(p),R=0,T=j=L=p=void 0}function ae(){return p===void 0?I:K(E())}function M(){var o=E(),S=U(o);if(T=arguments,L=this,j=o,S){if(p===void 0)return re(j);if(D)return p=setTimeout(P,u),H(j)}return p===void 0&&(p=setTimeout(P,u)),I}return M.cancel=se,M.flush=ae,M}function _(e){var u=typeof e;return!!e&&(u=="object"||u=="function")}function a(e){return!!e&&typeof e=="object"}function w(e){return typeof e=="symbol"||a(e)&&r.call(e)==s}function q(e){if(typeof e=="number")return e;if(w(e))return t;if(_(e)){var u=typeof e.valueOf=="function"?e.valueOf():e;e=_(u)?u+"":u}if(typeof e!="string")return e===0?e:+e;e=e.replace(m,"");var b=h.test(e);return b||i.test(e)?x(e.slice(2),b?2:8):g.test(e)?t:+e}return B=$,B}xe();var ne=typeof window<"u"?f.useLayoutEffect:f.useEffect;function ee(n,t,s,m){const g=f.useRef(t);ne(()=>{g.current=t},[t]),f.useEffect(()=>{const h=window;if(!(h&&h.addEventListener))return;const i=x=>{g.current(x)};return h.addEventListener(n,i,m),()=>{h.removeEventListener(n,i,m)}},[n,s,m])}function te(n){const t=f.useRef(()=>{throw new Error("Cannot call an event handler while rendering.")});return ne(()=>{t.current=n},[n]),f.useCallback((...s)=>{var m;return(m=t.current)==null?void 0:m.call(t,...s)},[t])}var J=typeof window>"u";function ye(n,t,s={}){const{initializeWithValue:m=!0}=s,g=f.useCallback(r=>s.serializer?s.serializer(r):JSON.stringify(r),[s]),h=f.useCallback(r=>{if(s.deserializer)return s.deserializer(r);if(r==="undefined")return;const c=t instanceof Function?t():t;let O;try{O=JSON.parse(r)}catch(E){return console.error("Error parsing JSON:",E),c}return O},[s,t]),i=f.useCallback(()=>{const r=t instanceof Function?t():t;if(J)return r;try{const c=window.localStorage.getItem(n);return c?h(c):r}catch(c){return console.warn(`Error reading localStorage key “${n}”:`,c),r}},[t,n,h]),[x,v]=f.useState(()=>m?i():t instanceof Function?t():t),y=te(r=>{J&&console.warn(`Tried setting localStorage key “${n}” even though environment is not a client`);try{const c=r instanceof Function?r(i()):r;window.localStorage.setItem(n,g(c)),v(c),window.dispatchEvent(new StorageEvent("local-storage",{key:n}))}catch(c){console.warn(`Error setting localStorage key “${n}”:`,c)}}),C=te(()=>{J&&console.warn(`Tried removing localStorage key “${n}” even though environment is not a client`);const r=t instanceof Function?t():t;window.localStorage.removeItem(n),v(r),window.dispatchEvent(new StorageEvent("local-storage",{key:n}))});f.useEffect(()=>{v(i())},[n]);const d=f.useCallback(r=>{r.key&&r.key!==n||v(i())},[n,i]);return ee("storage",d),ee("local-storage",d),[x,y,C]}const Ce="ragbits-no-history-chat-options";function Ie(){const{isOpen:n,onOpen:t,onClose:s}=ie(),m=ce(a=>a.chatOptions),g=f.useRef(null),{setChatOptions:h,initializeChatOptions:i}=ue(),x=le(a=>a.currentConversation),{config:{user_settings:v}}=fe(),[y,C]=ye(Ce,null),d=v?.form,r=a=>{Y.isPluginActivated(Q.name)||C(a)},c=()=>{t()},O=(a,w)=>{w.preventDefault(),g.current=a.formData,s()},E=()=>{if(!d)return;const a=Z(W,d);g.current=a,s()},$=()=>{s()},_=a=>{if(a!=="exit"||!g.current)return;const w=g.current;h(w),r(w),g.current=null};return f.useEffect(()=>{if(!d)return;const a=Z(W,d);Y.isPluginActivated(Q.name)?i(a):y!==null?i(y):(i(a),C(a))},[i,d,x,y,C]),d?l.jsxs(l.Fragment,{children:[l.jsx(de,{content:"Chat Options",placement:"bottom",children:l.jsx(A,{isIconOnly:!0,variant:"ghost",className:"p-0","aria-label":"Open chat options",onPress:c,"data-testid":"open-chat-options",children:l.jsx(me,{icon:"heroicons:cog-6-tooth"})})}),l.jsx(ge,{isOpen:n,onOpenChange:$,motionProps:{onAnimationComplete:_},children:l.jsxs(he,{children:[l.jsx(Se,{className:"text-default-900 flex flex-col gap-1",children:d.title||"Chat Options"}),l.jsx(pe,{children:l.jsx("div",{className:"flex flex-col gap-4",children:l.jsx(be,{schema:d,validator:W,formData:m,onSubmit:O,transformErrors:ve,liveValidate:!0,children:l.jsxs("div",{className:"flex justify-end gap-4 py-4",children:[l.jsx(A,{className:"mr-auto",color:"primary",variant:"light",onPress:E,"aria-label":"Restore default user settings",children:"Restore defaults"}),l.jsx(A,{color:"danger",variant:"light",onPress:s,"aria-label":"Close chat options form",children:"Cancel"}),l.jsx(A,{color:"primary",type:"submit","aria-label":"Save chat options","data-testid":"chat-options-submit",children:"Save"})]})})})})]})})]}):null}export{Ie as default}; +import{g as z,r as f,u as ie,h as ce,a as ue,i as le,b as fe,p as Y,C as Q,j as l,D as de,d as A,I as me,m as ge,e as he,f as pe}from"./index-BTypXP0X.js";import{g as Z,v as W,F as be,t as ve}from"./index-CTrBaHsz.js";import{m as Se}from"./chunk-IGSAU2ZA-RYoue1Xd.js";import"./chunk-SSA7SXE4-CpT2ku66.js";import"./index-nfbmdcVN.js";var B,V;function xe(){if(V)return B;V=1;var n="Expected a function",t=NaN,s="[object Symbol]",m=/^\s+|\s+$/g,g=/^[-+]0x[0-9a-f]+$/i,h=/^0b[01]+$/i,i=/^0o[0-7]+$/i,x=parseInt,v=typeof z=="object"&&z&&z.Object===Object&&z,y=typeof self=="object"&&self&&self.Object===Object&&self,C=v||y||Function("return this")(),d=Object.prototype,r=d.toString,c=Math.max,O=Math.min,E=function(){return C.Date.now()};function $(e,u,b){var T,L,N,I,p,j,R=0,G=!1,D=!1,k=!0;if(typeof e!="function")throw new TypeError(n);u=q(u)||0,_(b)&&(G=!!b.leading,D="maxWait"in b,N=D?c(q(b.maxWait)||0,u):N,k="trailing"in b?!!b.trailing:k);function H(o){var S=T,F=L;return T=L=void 0,R=o,I=e.apply(F,S),I}function re(o){return R=o,p=setTimeout(P,u),G?H(o):I}function oe(o){var S=o-j,F=o-R,X=u-S;return D?O(X,N-F):X}function U(o){var S=o-j,F=o-R;return j===void 0||S>=u||S<0||D&&F>=N}function P(){var o=E();if(U(o))return K(o);p=setTimeout(P,oe(o))}function K(o){return p=void 0,k&&T?H(o):(T=L=void 0,I)}function se(){p!==void 0&&clearTimeout(p),R=0,T=j=L=p=void 0}function ae(){return p===void 0?I:K(E())}function M(){var o=E(),S=U(o);if(T=arguments,L=this,j=o,S){if(p===void 0)return re(j);if(D)return p=setTimeout(P,u),H(j)}return p===void 0&&(p=setTimeout(P,u)),I}return M.cancel=se,M.flush=ae,M}function _(e){var u=typeof e;return!!e&&(u=="object"||u=="function")}function a(e){return!!e&&typeof e=="object"}function w(e){return typeof e=="symbol"||a(e)&&r.call(e)==s}function q(e){if(typeof e=="number")return e;if(w(e))return t;if(_(e)){var u=typeof e.valueOf=="function"?e.valueOf():e;e=_(u)?u+"":u}if(typeof e!="string")return e===0?e:+e;e=e.replace(m,"");var b=h.test(e);return b||i.test(e)?x(e.slice(2),b?2:8):g.test(e)?t:+e}return B=$,B}xe();var ne=typeof window<"u"?f.useLayoutEffect:f.useEffect;function ee(n,t,s,m){const g=f.useRef(t);ne(()=>{g.current=t},[t]),f.useEffect(()=>{const h=window;if(!(h&&h.addEventListener))return;const i=x=>{g.current(x)};return h.addEventListener(n,i,m),()=>{h.removeEventListener(n,i,m)}},[n,s,m])}function te(n){const t=f.useRef(()=>{throw new Error("Cannot call an event handler while rendering.")});return ne(()=>{t.current=n},[n]),f.useCallback((...s)=>{var m;return(m=t.current)==null?void 0:m.call(t,...s)},[t])}var J=typeof window>"u";function ye(n,t,s={}){const{initializeWithValue:m=!0}=s,g=f.useCallback(r=>s.serializer?s.serializer(r):JSON.stringify(r),[s]),h=f.useCallback(r=>{if(s.deserializer)return s.deserializer(r);if(r==="undefined")return;const c=t instanceof Function?t():t;let O;try{O=JSON.parse(r)}catch(E){return console.error("Error parsing JSON:",E),c}return O},[s,t]),i=f.useCallback(()=>{const r=t instanceof Function?t():t;if(J)return r;try{const c=window.localStorage.getItem(n);return c?h(c):r}catch(c){return console.warn(`Error reading localStorage key “${n}”:`,c),r}},[t,n,h]),[x,v]=f.useState(()=>m?i():t instanceof Function?t():t),y=te(r=>{J&&console.warn(`Tried setting localStorage key “${n}” even though environment is not a client`);try{const c=r instanceof Function?r(i()):r;window.localStorage.setItem(n,g(c)),v(c),window.dispatchEvent(new StorageEvent("local-storage",{key:n}))}catch(c){console.warn(`Error setting localStorage key “${n}”:`,c)}}),C=te(()=>{J&&console.warn(`Tried removing localStorage key “${n}” even though environment is not a client`);const r=t instanceof Function?t():t;window.localStorage.removeItem(n),v(r),window.dispatchEvent(new StorageEvent("local-storage",{key:n}))});f.useEffect(()=>{v(i())},[n]);const d=f.useCallback(r=>{r.key&&r.key!==n||v(i())},[n,i]);return ee("storage",d),ee("local-storage",d),[x,y,C]}const Ce="ragbits-no-history-chat-options";function Ie(){const{isOpen:n,onOpen:t,onClose:s}=ie(),m=ce(a=>a.chatOptions),g=f.useRef(null),{setChatOptions:h,initializeChatOptions:i}=ue(),x=le(a=>a.currentConversation),{config:{user_settings:v}}=fe(),[y,C]=ye(Ce,null),d=v?.form,r=a=>{Y.isPluginActivated(Q.name)||C(a)},c=()=>{t()},O=(a,w)=>{w.preventDefault(),g.current=a.formData,s()},E=()=>{if(!d)return;const a=Z(W,d);g.current=a,s()},$=()=>{s()},_=a=>{if(a!=="exit"||!g.current)return;const w=g.current;h(w),r(w),g.current=null};return f.useEffect(()=>{if(!d)return;const a=Z(W,d);Y.isPluginActivated(Q.name)?i(a):y!==null?i(y):(i(a),C(a))},[i,d,x,y,C]),d?l.jsxs(l.Fragment,{children:[l.jsx(de,{content:"Chat Options",placement:"bottom",children:l.jsx(A,{isIconOnly:!0,variant:"ghost",className:"p-0","aria-label":"Open chat options",onPress:c,"data-testid":"open-chat-options",children:l.jsx(me,{icon:"heroicons:cog-6-tooth"})})}),l.jsx(ge,{isOpen:n,onOpenChange:$,motionProps:{onAnimationComplete:_},children:l.jsxs(he,{children:[l.jsx(Se,{className:"text-default-900 flex flex-col gap-1",children:d.title||"Chat Options"}),l.jsx(pe,{children:l.jsx("div",{className:"flex flex-col gap-4",children:l.jsx(be,{schema:d,validator:W,formData:m,onSubmit:O,transformErrors:ve,liveValidate:!0,children:l.jsxs("div",{className:"flex justify-end gap-4 py-4",children:[l.jsx(A,{className:"mr-auto",color:"primary",variant:"light",onPress:E,"aria-label":"Restore default user settings",children:"Restore defaults"}),l.jsx(A,{color:"danger",variant:"light",onPress:s,"aria-label":"Close chat options form",children:"Cancel"}),l.jsx(A,{color:"primary",type:"submit","aria-label":"Save chat options","data-testid":"chat-options-submit",children:"Save"})]})})})})]})})]}):null}export{Ie as default}; diff --git a/packages/ragbits-chat/src/ragbits/chat/ui-build/assets/FeedbackForm-Bovwe8ia.js b/packages/ragbits-chat/src/ragbits/chat/ui-build/assets/FeedbackForm-Cuu7ROp3.js similarity index 88% rename from packages/ragbits-chat/src/ragbits/chat/ui-build/assets/FeedbackForm-Bovwe8ia.js rename to packages/ragbits-chat/src/ragbits/chat/ui-build/assets/FeedbackForm-Cuu7ROp3.js index 8b9f54d5f..f6d416891 100644 --- a/packages/ragbits-chat/src/ragbits/chat/ui-build/assets/FeedbackForm-Bovwe8ia.js +++ b/packages/ragbits-chat/src/ragbits/chat/ui-build/assets/FeedbackForm-Cuu7ROp3.js @@ -1 +1 @@ -import{u as g,a as v,b as C,r as _,F as s,c as T,j as e,D as b,d as n,I as u,m as w,e as D,f as I}from"./index-C75huGqt.js";import{F as O,t as S,v as E}from"./index-VYICyW2P.js";import{m as N}from"./chunk-IGSAU2ZA-DUS7ku-0.js";import"./chunk-SSA7SXE4-DnKzYyYP.js";import"./index-I-Ja0wkh.js";function V({message:t}){const{isOpen:f,onOpen:h,onClose:r}=g(),{mergeExtensions:p}=v(),{config:{feedback:o}}=C(),[l,x]=_.useState(s.Like),k=T("/api/feedback",{headers:{"Content-Type":"application/json"},method:"POST"}),i=o[l].form,j=()=>{r()},c=async a=>{if(!t.serverId)throw new Error('Feedback is only available for messages with "serverId" set');try{await k.call({body:{message_id:t.serverId,feedback:l,payload:a??{}}})}catch(F){console.error(F)}},y=a=>{p(t.id,{feedbackType:l}),c(a.formData),r()},d=async a=>{if(x(a),o[a].form===null){await c(null);return}h()};if(!i)return null;const m=t.extensions?.feedbackType;return e.jsxs(e.Fragment,{children:[o.like.enabled&&e.jsx(b,{content:"Like",placement:"bottom",children:e.jsx(n,{isIconOnly:!0,variant:"ghost",className:"p-0","aria-label":"Rate message as helpful",onPress:()=>d(s.Like),"data-testid":"feedback-like",children:e.jsx(u,{icon:m===s.Like?"heroicons:hand-thumb-up-solid":"heroicons:hand-thumb-up"})})}),o.dislike.enabled&&e.jsx(b,{content:"Dislike",placement:"bottom",children:e.jsx(n,{isIconOnly:!0,variant:"ghost",className:"p-0","aria-label":"Rate message as unhelpful",onPress:()=>d(s.Dislike),"data-testid":"feedback-dislike",children:e.jsx(u,{icon:m===s.Dislike?"heroicons:hand-thumb-down-solid":"heroicons:hand-thumb-down"})})}),e.jsx(w,{isOpen:f,onOpenChange:j,children:e.jsx(D,{children:a=>e.jsxs(e.Fragment,{children:[e.jsx(N,{className:"text-default-900 flex flex-col gap-1",children:i.title}),e.jsx(I,{children:e.jsx("div",{className:"flex flex-col gap-4",children:e.jsx(O,{schema:i,validator:E,onSubmit:y,transformErrors:S,liveValidate:!0,children:e.jsxs("div",{className:"flex justify-end gap-4 py-4",children:[e.jsx(n,{color:"danger",variant:"light",onPress:a,"aria-label":"Close feedback form",children:"Cancel"}),e.jsx(n,{color:"primary",type:"submit","aria-label":"Submit feedback","data-testid":"feedback-submit",children:"Submit"})]})})})})]})})})]})}export{V as default}; +import{u as g,a as v,b as C,r as _,F as s,c as T,j as e,D as b,d as n,I as u,m as w,e as D,f as I}from"./index-BTypXP0X.js";import{F as O,t as S,v as E}from"./index-CTrBaHsz.js";import{m as N}from"./chunk-IGSAU2ZA-RYoue1Xd.js";import"./chunk-SSA7SXE4-CpT2ku66.js";import"./index-nfbmdcVN.js";function V({message:t}){const{isOpen:f,onOpen:h,onClose:r}=g(),{mergeExtensions:p}=v(),{config:{feedback:o}}=C(),[l,x]=_.useState(s.Like),k=T("/api/feedback",{headers:{"Content-Type":"application/json"},method:"POST"}),i=o[l].form,j=()=>{r()},c=async a=>{if(!t.serverId)throw new Error('Feedback is only available for messages with "serverId" set');try{await k.call({body:{message_id:t.serverId,feedback:l,payload:a??{}}})}catch(F){console.error(F)}},y=a=>{p(t.id,{feedbackType:l}),c(a.formData),r()},d=async a=>{if(x(a),o[a].form===null){await c(null);return}h()};if(!i)return null;const m=t.extensions?.feedbackType;return e.jsxs(e.Fragment,{children:[o.like.enabled&&e.jsx(b,{content:"Like",placement:"bottom",children:e.jsx(n,{isIconOnly:!0,variant:"ghost",className:"p-0","aria-label":"Rate message as helpful",onPress:()=>d(s.Like),"data-testid":"feedback-like",children:e.jsx(u,{icon:m===s.Like?"heroicons:hand-thumb-up-solid":"heroicons:hand-thumb-up"})})}),o.dislike.enabled&&e.jsx(b,{content:"Dislike",placement:"bottom",children:e.jsx(n,{isIconOnly:!0,variant:"ghost",className:"p-0","aria-label":"Rate message as unhelpful",onPress:()=>d(s.Dislike),"data-testid":"feedback-dislike",children:e.jsx(u,{icon:m===s.Dislike?"heroicons:hand-thumb-down-solid":"heroicons:hand-thumb-down"})})}),e.jsx(w,{isOpen:f,onOpenChange:j,children:e.jsx(D,{children:a=>e.jsxs(e.Fragment,{children:[e.jsx(N,{className:"text-default-900 flex flex-col gap-1",children:i.title}),e.jsx(I,{children:e.jsx("div",{className:"flex flex-col gap-4",children:e.jsx(O,{schema:i,validator:E,onSubmit:y,transformErrors:S,liveValidate:!0,children:e.jsxs("div",{className:"flex justify-end gap-4 py-4",children:[e.jsx(n,{color:"danger",variant:"light",onPress:a,"aria-label":"Close feedback form",children:"Cancel"}),e.jsx(n,{color:"primary",type:"submit","aria-label":"Submit feedback","data-testid":"feedback-submit",children:"Submit"})]})})})})]})})})]})}export{V as default}; diff --git a/packages/ragbits-chat/src/ragbits/chat/ui-build/assets/Login-B2kPNK-w.js b/packages/ragbits-chat/src/ragbits/chat/ui-build/assets/Login-xlop2v42.js similarity index 79% rename from packages/ragbits-chat/src/ragbits/chat/ui-build/assets/Login-B2kPNK-w.js rename to packages/ragbits-chat/src/ragbits/chat/ui-build/assets/Login-xlop2v42.js index 8095219ac..04d6d32fa 100644 --- a/packages/ragbits-chat/src/ragbits/chat/ui-build/assets/Login-B2kPNK-w.js +++ b/packages/ragbits-chat/src/ragbits/chat/ui-build/assets/Login-xlop2v42.js @@ -1 +1 @@ -import{r as n,bp as w,c as y,aN as b,aJ as S,j as e,aD as j,aK as v,d as C,bq as N}from"./index-C75huGqt.js";import{a as P}from"./authStore-DLhLSjcY.js";import{i as c}from"./chunk-SSA7SXE4-DnKzYyYP.js";const q=()=>{const a=n.useContext(w);if(!a)throw new Error("useInitializeUserStore must be used within a HistoryStoreContextProvider");return a.initializeUserStore};function U(){const[a,m]=n.useState({username:"",password:""}),u=y("/api/auth/login",{headers:{"Content-Type":"application/json"},method:"POST"}),p=b(P,s=>s.login),g=S(),x=q(),[f,o]=n.useState(!1),h=async s=>{o(!1),s.preventDefault(),s.stopPropagation();const r=new FormData(s.currentTarget),i=r.get("username"),l=r.get("password");try{const t=await u.call({body:{username:i,password:l}});if(!t.success||!t.jwt_token||!t.user){o(!0);return}p(t.user,t.jwt_token),x(t.user.user_id),g("/")}catch(t){o(!0),console.error("Failed to login",t)}},d=s=>r=>m(i=>N(i,l=>{l[s]=r.target.value}));return n.useEffect(()=>{document.title="Login"},[]),e.jsx("div",{className:"flex h-screen w-screen",children:e.jsxs("form",{className:"rounded-medium border-small border-divider m-auto flex w-full max-w-xs flex-col gap-4 p-4",onSubmit:h,children:[e.jsxs("div",{className:"text-small",children:[e.jsx("div",{className:"text-foreground truncate leading-5 font-semibold",children:"Sign in"}),e.jsx("div",{className:"text-default-500 truncate leading-5 font-normal",children:"Sign in to start chatting."})]}),e.jsx(c,{label:"Username",name:"username",labelPlacement:"outside",placeholder:"Your username",required:!0,isRequired:!0,value:a.username,onChange:d("username")}),e.jsx(c,{label:"Password",labelPlacement:"outside",id:"password",name:"password",type:"password",placeholder:"••••••••",required:!0,isRequired:!0,value:a.password,onChange:d("password")}),e.jsx(j,{children:f&&!u.isLoading&&e.jsx(v.div,{className:"text-small text-danger",initial:{opacity:0,y:-10},animate:{opacity:1,y:0},exit:{opacity:0,y:-10},transition:{duration:.3,ease:"easeOut"},children:"We couldn't sign you in. Please verify your credentials and try again."})}),e.jsx(C,{type:"submit",color:a.password&&a.username?"primary":"default",children:"Sign in"})]})})}export{U as default}; +import{r as n,bg as w,c as y,aP as b,aK as S,j as e,aD as j,aM as v,d as P,bh as C}from"./index-BTypXP0X.js";import{a as N}from"./authStore-Ur4ZGows.js";import{i as c}from"./chunk-SSA7SXE4-CpT2ku66.js";const D=()=>{const a=n.useContext(w);if(!a)throw new Error("useInitializeUserStore must be used within a HistoryStoreContextProvider");return a.initializeUserStore};function U(){const[a,m]=n.useState({username:"",password:""}),u=y("/api/auth/login",{headers:{"Content-Type":"application/json"},method:"POST"}),p=b(N,s=>s.login),g=S(),x=D(),[f,o]=n.useState(!1),h=async s=>{o(!1),s.preventDefault(),s.stopPropagation();const r=new FormData(s.currentTarget),i=r.get("username"),l=r.get("password");try{const t=await u.call({body:{username:i,password:l}});if(!t.success||!t.jwt_token||!t.user){o(!0);return}p(t.user,t.jwt_token),x(t.user.user_id),g("/")}catch(t){o(!0),console.error("Failed to login",t)}},d=s=>r=>m(i=>C(i,l=>{l[s]=r.target.value}));return n.useEffect(()=>{document.title="Login"},[]),e.jsx("div",{className:"flex h-screen w-screen",children:e.jsxs("form",{className:"rounded-medium border-small border-divider m-auto flex w-full max-w-xs flex-col gap-4 p-4",onSubmit:h,children:[e.jsxs("div",{className:"text-small",children:[e.jsx("div",{className:"text-foreground truncate leading-5 font-semibold",children:"Sign in"}),e.jsx("div",{className:"text-default-500 truncate leading-5 font-normal",children:"Sign in to start chatting."})]}),e.jsx(c,{label:"Username",name:"username",labelPlacement:"outside",placeholder:"Your username",required:!0,isRequired:!0,value:a.username,onChange:d("username")}),e.jsx(c,{label:"Password",labelPlacement:"outside",id:"password",name:"password",type:"password",placeholder:"••••••••",required:!0,isRequired:!0,value:a.password,onChange:d("password")}),e.jsx(j,{children:f&&!u.isLoading&&e.jsx(v.div,{className:"text-small text-danger",initial:{opacity:0,y:-10},animate:{opacity:1,y:0},exit:{opacity:0,y:-10},transition:{duration:.3,ease:"easeOut"},children:"We couldn't sign you in. Please verify your credentials and try again."})}),e.jsx(P,{type:"submit",color:a.password&&a.username?"primary":"default",children:"Sign in"})]})})}export{U as default}; diff --git a/packages/ragbits-chat/src/ragbits/chat/ui-build/assets/LogoutButton-Bspy5P1_.js b/packages/ragbits-chat/src/ragbits/chat/ui-build/assets/LogoutButton-Cp3E_g1o.js similarity index 81% rename from packages/ragbits-chat/src/ragbits/chat/ui-build/assets/LogoutButton-Bspy5P1_.js rename to packages/ragbits-chat/src/ragbits/chat/ui-build/assets/LogoutButton-Cp3E_g1o.js index 1cd873c59..4a53057ca 100644 --- a/packages/ragbits-chat/src/ragbits/chat/ui-build/assets/LogoutButton-Bspy5P1_.js +++ b/packages/ragbits-chat/src/ragbits/chat/ui-build/assets/LogoutButton-Cp3E_g1o.js @@ -1 +1 @@ -import{c as u,aN as s,aJ as i,j as o,D as g,d,I as p}from"./index-C75huGqt.js";import{a as n}from"./authStore-DLhLSjcY.js";function m(){const r=u("/api/auth/logout",{headers:{"Content-Type":"application/json"},method:"POST"}),c=s(n,t=>t.logout),e=s(n,t=>t.token?.access_token),a=i(),l=async()=>{if(!e){a("/login");return}try{if(!(await r.call({body:{token:e}})).success)return;c(),a("/login")}catch(t){console.error("Failed to logout",t)}};return o.jsx(g,{content:"Logout",placement:"bottom",children:o.jsx(d,{isIconOnly:!0,"aria-label":"Logout",variant:"ghost",onPress:l,"data-testid":"logout-button",children:o.jsx(p,{icon:"heroicons:arrow-left-start-on-rectangle"})})})}export{m as default}; +import{c as u,aP as s,aK as i,j as o,D as g,d,I as p}from"./index-BTypXP0X.js";import{a as n}from"./authStore-Ur4ZGows.js";function m(){const r=u("/api/auth/logout",{headers:{"Content-Type":"application/json"},method:"POST"}),c=s(n,t=>t.logout),e=s(n,t=>t.token?.access_token),a=i(),l=async()=>{if(!e){a("/login");return}try{if(!(await r.call({body:{token:e}})).success)return;c(),a("/login")}catch(t){console.error("Failed to logout",t)}};return o.jsx(g,{content:"Logout",placement:"bottom",children:o.jsx(d,{isIconOnly:!0,"aria-label":"Logout",variant:"ghost",onPress:l,"data-testid":"logout-button",children:o.jsx(p,{icon:"heroicons:arrow-left-start-on-rectangle"})})})}export{m as default}; diff --git a/packages/ragbits-chat/src/ragbits/chat/ui-build/assets/ShareButton-BvHR4xdz.js b/packages/ragbits-chat/src/ragbits/chat/ui-build/assets/ShareButton-DpNGX0tU.js similarity index 98% rename from packages/ragbits-chat/src/ragbits/chat/ui-build/assets/ShareButton-BvHR4xdz.js rename to packages/ragbits-chat/src/ragbits/chat/ui-build/assets/ShareButton-DpNGX0tU.js index b17161ec2..c07f73fb3 100644 --- a/packages/ragbits-chat/src/ragbits/chat/ui-build/assets/ShareButton-BvHR4xdz.js +++ b/packages/ragbits-chat/src/ragbits/chat/ui-build/assets/ShareButton-DpNGX0tU.js @@ -1 +1 @@ -import{aH as Gr,u as Jr,r as hr,i as Wr,j as k,D as qr,d as gr,I as Yr,m as Kr,e as Lr,f as Qr,aI as Vr}from"./index-C75huGqt.js";import{m as Xr}from"./chunk-IGSAU2ZA-DUS7ku-0.js";var T=Uint8Array,$=Uint16Array,jr=Int32Array,lr=new T([0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0,0,0,0]),sr=new T([0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13,0,0]),pr=new T([16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15]),Nr=function(r,e){for(var a=new $(31),n=0;n<31;++n)a[n]=e+=1<>1|(y&21845)<<1;Q=(Q&52428)>>2|(Q&13107)<<2,Q=(Q&61680)>>4|(Q&3855)<<4,Cr[y]=((Q&65280)>>8|(Q&255)<<8)>>1}var q=function(r,e,a){for(var n=r.length,t=0,o=new $(e);t>h]=c}else for(l=new $(n),t=0;t>15-r[t]);return l},V=new T(288);for(var y=0;y<144;++y)V[y]=8;for(var y=144;y<256;++y)V[y]=9;for(var y=256;y<280;++y)V[y]=7;for(var y=280;y<288;++y)V[y]=8;var fr=new T(32);for(var y=0;y<32;++y)fr[y]=5;var re=q(V,9,0),ee=q(V,9,1),ae=q(fr,5,0),ne=q(fr,5,1),wr=function(r){for(var e=r[0],a=1;ae&&(e=r[a]);return e},J=function(r,e,a){var n=e/8|0;return(r[n]|r[n+1]<<8)>>(e&7)&a},xr=function(r,e){var a=e/8|0;return(r[a]|r[a+1]<<8|r[a+2]<<16)>>(e&7)},Ar=function(r){return(r+7)/8|0},cr=function(r,e,a){return(e==null||e<0)&&(e=0),(a==null||a>r.length)&&(a=r.length),new T(r.subarray(e,a))},te=["unexpected EOF","invalid block type","invalid length/literal","invalid distance","stream finished","no stream handler",,"no callback","invalid UTF-8 data","extra field too long","date not in range 1980-2099","filename too long","stream finishing","invalid zip data"],G=function(r,e,a){var n=new Error(e||te[r]);if(n.code=r,Error.captureStackTrace&&Error.captureStackTrace(n,G),!a)throw n;return n},oe=function(r,e,a,n){var t=r.length,o=0;if(!t||e.f&&!e.l)return a||new T(0);var v=!a,l=v||e.i!=2,h=e.i;v&&(a=new T(t*3));var c=function(ar){var nr=a.length;if(ar>nr){var rr=new T(Math.max(nr*2,ar));rr.set(a),a=rr}},f=e.f||0,i=e.p||0,u=e.b||0,x=e.l,S=e.d,w=e.m,d=e.n,m=t*8;do{if(!x){f=J(r,i,1);var R=J(r,i+1,3);if(i+=3,R)if(R==1)x=ee,S=ne,w=9,d=5;else if(R==2){var N=J(r,i,31)+257,A=J(r,i+10,15)+4,g=N+J(r,i+5,31)+1;i+=14;for(var s=new T(g),M=new T(19),C=0;C>4;if(j<16)s[C++]=j;else{var E=0,b=0;for(j==16?(b=3+J(r,i,3),i+=2,E=s[C-1]):j==17?(b=3+J(r,i,7),i+=3):j==18&&(b=11+J(r,i,127),i+=7);b--;)s[C++]=E}}var z=s.subarray(0,N),F=s.subarray(N);w=wr(z),d=wr(F),x=q(z,w,1),S=q(F,d,1)}else G(1);else{var j=Ar(i)+4,D=r[j-4]|r[j-3]<<8,I=j+D;if(I>t){h&&G(0);break}l&&c(u+D),a.set(r.subarray(j,I),u),e.b=u+=D,e.p=i=I*8,e.f=f;continue}if(i>m){h&&G(0);break}}l&&c(u+131072);for(var er=(1<>4;if(i+=E&15,i>m){h&&G(0);break}if(E||G(2),H<256)a[u++]=H;else if(H==256){Y=i,x=null;break}else{var P=H-254;if(H>264){var C=H-257,p=lr[C];P=J(r,i,(1<>4;W||G(3),i+=W&15;var F=Zr[X];if(X>3){var p=sr[X];F+=xr(r,i)&(1<m){h&&G(0);break}l&&c(u+131072);var Z=u+P;if(u>8},tr=function(r,e,a){a<<=e&7;var n=e/8|0;r[n]|=a,r[n+1]|=a>>8,r[n+2]|=a>>16},yr=function(r,e){for(var a=[],n=0;nu&&(u=o[n].s);var x=new $(u+1),S=Tr(a[f-1],x,0);if(S>e){var n=0,w=0,d=S-e,m=1<e)w+=m-(1<>=d;w>0;){var j=o[n].s;x[j]=0&&w;--n){var D=o[n].s;x[D]==e&&(--x[D],++w)}S=e}return{t:new T(x),l:S}},Tr=function(r,e,a){return r.s==-1?Math.max(Tr(r.l,e,a+1),Tr(r.r,e,a+1)):e[r.s]=a},Er=function(r){for(var e=r.length;e&&!r[--e];);for(var a=new $(++e),n=0,t=r[0],o=1,v=function(h){a[n++]=h},l=1;l<=e;++l)if(r[l]==t&&l!=e)++o;else{if(!t&&o>2){for(;o>138;o-=138)v(32754);o>2&&(v(o>10?o-11<<5|28690:o-3<<5|12305),o=0)}else if(o>3){for(v(t),--o;o>6;o-=6)v(8304);o>2&&(v(o-3<<5|8208),o=0)}for(;o--;)v(t);o=1,t=r[l]}return{c:a.subarray(0,n),n:e}},or=function(r,e){for(var a=0,n=0;n>8,r[t+2]=r[t]^255,r[t+3]=r[t+1]^255;for(var o=0;o4&&!M[pr[O-1]];--O);var L=c+5<<3,U=or(t,V)+or(o,fr)+v,_=or(t,u)+or(o,w)+v+14+3*O+or(A,M)+2*A[16]+3*A[17]+7*A[18];if(h>=0&&L<=U&&L<=_)return Ur(e,f,r.subarray(h,h+c));var E,b,z,F;if(K(e,f,1+(_15&&(K(e,f,H[g]>>5&127),f+=H[g]>>12)}}else E=re,b=V,z=ae,F=fr;for(var g=0;g255){var P=p>>18&31;tr(e,f,E[P+257]),f+=b[P+257],P>7&&(K(e,f,p>>23&31),f+=lr[P]);var W=p&31;tr(e,f,z[W]),f+=F[W],W>3&&(tr(e,f,p>>5&8191),f+=sr[W])}else tr(e,f,E[p]),f+=b[p]}return tr(e,f,E[256]),f+b[256]},fe=new jr([65540,131080,131088,131104,262176,1048704,1048832,2114560,2117632]),Hr=new T(0),ie=function(r,e,a,n,t,o){var v=o.z||r.length,l=new T(n+v+5*(1+Math.ceil(v/7e3))+t),h=l.subarray(n,l.length-t),c=o.l,f=(o.r||0)&7;if(e){f&&(h[0]=o.r>>3);for(var i=fe[e-1],u=i>>13,x=i&8191,S=(1<7e3||M>24576)&&(E>423||!c)){f=Fr(r,h,0,D,I,N,g,M,O,s-O,f),M=A=g=0,O=s;for(var b=0;b<286;++b)I[b]=0;for(var b=0;b<30;++b)N[b]=0}var z=2,F=0,er=x,B=U-_&32767;if(E>2&&L==j(s-B))for(var Y=Math.min(u,E)-1,H=Math.min(32767,s),P=Math.min(258,E);B<=H&&--er&&U!=_;){if(r[s+z]==r[s+z-B]){for(var p=0;pz){if(z=p,F=B,p>Y)break;for(var W=Math.min(B,p-2),X=0,b=0;bX&&(X=vr,_=Z)}}}U=_,_=w[U],B+=U-_&32767}if(F){D[M++]=268435456|mr[z]<<18|Mr[F];var ar=mr[z]&31,nr=Mr[F]&31;g+=lr[ar]+sr[nr],++I[257+ar],++N[nr],C=s+z,++A}else D[M++]=r[s],++I[r[s]]}}for(s=Math.max(s,C);s=v&&(h[f/8|0]=c,rr=v),f=Ur(h,f+1,r.subarray(s,rr))}o.i=v}return cr(l,0,n+Ar(f)+t)},Pr=function(){var r=1,e=0;return{p:function(a){for(var n=r,t=e,o=a.length|0,v=0;v!=o;){for(var l=Math.min(v+2655,o);v>16),t=(t&65535)+15*(t>>16)}r=n,e=t},d:function(){return r%=65521,e%=65521,(r&255)<<24|(r&65280)<<8|(e&255)<<8|e>>8}}},ve=function(r,e,a,n,t){if(!t&&(t={l:1},e.dictionary)){var o=e.dictionary.subarray(-32768),v=new T(o.length+r.length);v.set(o),v.set(r,o.length),r=v,t.w=o.length}return ie(r,e.level==null?6:e.level,e.mem==null?t.l?Math.ceil(Math.max(8,Math.min(13,Math.log(r.length)))*1.5):20:12+e.mem,a,n,t)},$r=function(r,e,a){for(;a;++e)r[e]=a,a>>>=8},le=function(r,e){var a=e.level,n=a==0?0:a<6?1:a==9?3:2;if(r[0]=120,r[1]=n<<6|(e.dictionary&&32),r[1]|=31-(r[0]<<8|r[1])%31,e.dictionary){var t=Pr();t.p(e.dictionary),$r(r,2,t.d())}},se=function(r,e){return((r[0]&15)!=8||r[0]>>4>7||(r[0]<<8|r[1])%31)&&G(6,"invalid zlib data"),(r[1]>>5&1)==1&&G(6,"invalid zlib data: "+(r[1]&32?"need":"unexpected")+" dictionary"),(r[1]>>3&4)+2};function ce(r,e){e||(e={});var a=Pr();a.p(r);var n=ve(r,e,e.dictionary?6:2,4);return le(n,e),$r(n,n.length-4,a.d()),n}function ue(r,e){return oe(r.subarray(se(r),-4),{i:2},e,e)}var Ir=typeof TextEncoder<"u"&&new TextEncoder,dr=typeof TextDecoder<"u"&&new TextDecoder,he=0;try{dr.decode(Hr,{stream:!0}),he=1}catch{}var ge=function(r){for(var e="",a=0;;){var n=r[a++],t=(n>127)+(n>223)+(n>239);if(a+t>r.length)return{s:e,r:cr(r,a-1)};t?t==3?(n=((n&15)<<18|(r[a++]&63)<<12|(r[a++]&63)<<6|r[a++]&63)-65536,e+=String.fromCharCode(55296|n>>10,56320|n&1023)):t&1?e+=String.fromCharCode((n&31)<<6|r[a++]&63):e+=String.fromCharCode((n&15)<<12|(r[a++]&63)<<6|r[a++]&63):e+=String.fromCharCode(n)}};function Or(r,e){if(e){for(var a=new T(r.length),n=0;n>1)),v=0,l=function(f){o[v++]=f},n=0;no.length){var h=new T(v+8+(t-n<<1));h.set(o),o=h}var c=r.charCodeAt(n);c<128||e?l(c):c<2048?(l(192|c>>6),l(128|c&63)):c>55295&&c<57344?(c=65536+(c&1047552)|r.charCodeAt(++n)&1023,l(240|c>>18),l(128|c>>12&63),l(128|c>>6&63),l(128|c&63)):(l(224|c>>12),l(128|c>>6&63),l(128|c&63))}return cr(o,0,v)}function kr(r,e){if(e){for(var a="",n=0;n`,br=``;function xe(r){if(typeof r!="object"||r===null)return!1;const e=r;return!(typeof e.history!="object"||"followupMessages"in e&&typeof e.followupMessages!="object"||"chatOptions"in e&&typeof e.chatOptions!="object"||"serverState"in e&&typeof e.serverState!="object"||"conversationId"in e&&typeof e.conversationId!="string"&&typeof e.conversationId!="object")}function be(){const{restore:r}=Gr(),{isOpen:e,onOpen:a,onClose:n}=Jr(),[t,o]=hr.useState(Dr),v=hr.useRef(null),{getCurrentConversation:l}=Wr(f=>f.primitives),h=()=>{const{chatOptions:f,history:i,serverState:u,conversationId:x,followupMessages:S}=l(),w=Vr({chatOptions:f,history:i,serverState:u,conversationId:x,followupMessages:S}),d=Or(`${Sr}${JSON.stringify(w)}${br}`),m=btoa(kr(ce(d,{level:9}),!0));navigator.clipboard.writeText(m),o(we),n(),v.current&&clearTimeout(v.current),v.current=setTimeout(()=>{o(Dr)},2e3)},c=()=>{n()};return hr.useEffect(()=>{const f=i=>{if(!i.clipboardData)return;const u=i.clipboardData.types;if(!u.includes("text/plain")&&!u.includes("text"))return;const x=i.clipboardData.getData("text/plain")??i.clipboardData.getData("text");try{const S=atob(x);if(!S.startsWith("xÚ"))return;const w=kr(ue(Or(S,!0)));if(!w.startsWith(Sr)||!w.endsWith(br))return;i.preventDefault(),i.stopPropagation();const d=w.slice(Sr.length,-br.length),m=JSON.parse(d);if(!xe(m))return;r(m.history,m.followupMessages,m.chatOptions,m.serverState,m.conversationId)}catch(S){console.error("Couldn't parse pasted string as valid Ragbits state",S)}};return window.addEventListener("paste",f),()=>{window.removeEventListener("paste",f)}}),k.jsxs(k.Fragment,{children:[k.jsx(qr,{content:"Share conversation",placement:"bottom",children:k.jsx(gr,{isIconOnly:!0,variant:"ghost",className:"p-0","aria-label":"Share conversation",onPress:a,children:k.jsx(Yr,{icon:t})})}),k.jsx(Kr,{isOpen:e,onOpenChange:c,children:k.jsx(Lr,{children:f=>k.jsxs(k.Fragment,{children:[k.jsx(Xr,{className:"text-default-900 flex flex-col gap-1",children:"Share conversation"}),k.jsx(Qr,{children:k.jsxs("div",{className:"flex flex-col gap-4",children:[k.jsx("p",{className:"text-medium text-default-500",children:"You are about to copy a code that allows sharing and storing your current app state. Once copied, you can paste this code anywhere on the site to instantly return to this exact setup. It’s a quick way to save your progress or share it with others."}),k.jsxs("div",{className:"flex justify-end gap-4 py-4",children:[k.jsx(gr,{color:"danger",variant:"light",onPress:f,"aria-label":"Close share modal",children:"Cancel"}),k.jsx(gr,{color:"primary",onPress:h,"aria-label":"Copy to clipboard to share the conversation",children:"Copy to clipboard"})]})]})})]})})})]})}export{be as default}; +import{aI as Gr,u as Jr,r as hr,i as Wr,j as k,D as qr,d as gr,I as Yr,m as Kr,e as Lr,f as Qr,aJ as Vr}from"./index-BTypXP0X.js";import{m as Xr}from"./chunk-IGSAU2ZA-RYoue1Xd.js";var T=Uint8Array,$=Uint16Array,jr=Int32Array,lr=new T([0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0,0,0,0]),sr=new T([0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13,0,0]),pr=new T([16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15]),Nr=function(r,e){for(var a=new $(31),n=0;n<31;++n)a[n]=e+=1<>1|(y&21845)<<1;Q=(Q&52428)>>2|(Q&13107)<<2,Q=(Q&61680)>>4|(Q&3855)<<4,Cr[y]=((Q&65280)>>8|(Q&255)<<8)>>1}var q=function(r,e,a){for(var n=r.length,t=0,o=new $(e);t>h]=c}else for(l=new $(n),t=0;t>15-r[t]);return l},V=new T(288);for(var y=0;y<144;++y)V[y]=8;for(var y=144;y<256;++y)V[y]=9;for(var y=256;y<280;++y)V[y]=7;for(var y=280;y<288;++y)V[y]=8;var fr=new T(32);for(var y=0;y<32;++y)fr[y]=5;var re=q(V,9,0),ee=q(V,9,1),ae=q(fr,5,0),ne=q(fr,5,1),wr=function(r){for(var e=r[0],a=1;ae&&(e=r[a]);return e},J=function(r,e,a){var n=e/8|0;return(r[n]|r[n+1]<<8)>>(e&7)&a},xr=function(r,e){var a=e/8|0;return(r[a]|r[a+1]<<8|r[a+2]<<16)>>(e&7)},Ar=function(r){return(r+7)/8|0},cr=function(r,e,a){return(e==null||e<0)&&(e=0),(a==null||a>r.length)&&(a=r.length),new T(r.subarray(e,a))},te=["unexpected EOF","invalid block type","invalid length/literal","invalid distance","stream finished","no stream handler",,"no callback","invalid UTF-8 data","extra field too long","date not in range 1980-2099","filename too long","stream finishing","invalid zip data"],G=function(r,e,a){var n=new Error(e||te[r]);if(n.code=r,Error.captureStackTrace&&Error.captureStackTrace(n,G),!a)throw n;return n},oe=function(r,e,a,n){var t=r.length,o=0;if(!t||e.f&&!e.l)return a||new T(0);var v=!a,l=v||e.i!=2,h=e.i;v&&(a=new T(t*3));var c=function(ar){var nr=a.length;if(ar>nr){var rr=new T(Math.max(nr*2,ar));rr.set(a),a=rr}},f=e.f||0,i=e.p||0,u=e.b||0,x=e.l,S=e.d,w=e.m,d=e.n,m=t*8;do{if(!x){f=J(r,i,1);var R=J(r,i+1,3);if(i+=3,R)if(R==1)x=ee,S=ne,w=9,d=5;else if(R==2){var N=J(r,i,31)+257,A=J(r,i+10,15)+4,g=N+J(r,i+5,31)+1;i+=14;for(var s=new T(g),M=new T(19),C=0;C>4;if(j<16)s[C++]=j;else{var E=0,b=0;for(j==16?(b=3+J(r,i,3),i+=2,E=s[C-1]):j==17?(b=3+J(r,i,7),i+=3):j==18&&(b=11+J(r,i,127),i+=7);b--;)s[C++]=E}}var z=s.subarray(0,N),F=s.subarray(N);w=wr(z),d=wr(F),x=q(z,w,1),S=q(F,d,1)}else G(1);else{var j=Ar(i)+4,D=r[j-4]|r[j-3]<<8,I=j+D;if(I>t){h&&G(0);break}l&&c(u+D),a.set(r.subarray(j,I),u),e.b=u+=D,e.p=i=I*8,e.f=f;continue}if(i>m){h&&G(0);break}}l&&c(u+131072);for(var er=(1<>4;if(i+=E&15,i>m){h&&G(0);break}if(E||G(2),H<256)a[u++]=H;else if(H==256){Y=i,x=null;break}else{var P=H-254;if(H>264){var C=H-257,p=lr[C];P=J(r,i,(1<>4;W||G(3),i+=W&15;var F=Zr[X];if(X>3){var p=sr[X];F+=xr(r,i)&(1<m){h&&G(0);break}l&&c(u+131072);var Z=u+P;if(u>8},tr=function(r,e,a){a<<=e&7;var n=e/8|0;r[n]|=a,r[n+1]|=a>>8,r[n+2]|=a>>16},yr=function(r,e){for(var a=[],n=0;nu&&(u=o[n].s);var x=new $(u+1),S=Tr(a[f-1],x,0);if(S>e){var n=0,w=0,d=S-e,m=1<e)w+=m-(1<>=d;w>0;){var j=o[n].s;x[j]=0&&w;--n){var D=o[n].s;x[D]==e&&(--x[D],++w)}S=e}return{t:new T(x),l:S}},Tr=function(r,e,a){return r.s==-1?Math.max(Tr(r.l,e,a+1),Tr(r.r,e,a+1)):e[r.s]=a},Er=function(r){for(var e=r.length;e&&!r[--e];);for(var a=new $(++e),n=0,t=r[0],o=1,v=function(h){a[n++]=h},l=1;l<=e;++l)if(r[l]==t&&l!=e)++o;else{if(!t&&o>2){for(;o>138;o-=138)v(32754);o>2&&(v(o>10?o-11<<5|28690:o-3<<5|12305),o=0)}else if(o>3){for(v(t),--o;o>6;o-=6)v(8304);o>2&&(v(o-3<<5|8208),o=0)}for(;o--;)v(t);o=1,t=r[l]}return{c:a.subarray(0,n),n:e}},or=function(r,e){for(var a=0,n=0;n>8,r[t+2]=r[t]^255,r[t+3]=r[t+1]^255;for(var o=0;o4&&!M[pr[O-1]];--O);var L=c+5<<3,U=or(t,V)+or(o,fr)+v,_=or(t,u)+or(o,w)+v+14+3*O+or(A,M)+2*A[16]+3*A[17]+7*A[18];if(h>=0&&L<=U&&L<=_)return Ur(e,f,r.subarray(h,h+c));var E,b,z,F;if(K(e,f,1+(_15&&(K(e,f,H[g]>>5&127),f+=H[g]>>12)}}else E=re,b=V,z=ae,F=fr;for(var g=0;g255){var P=p>>18&31;tr(e,f,E[P+257]),f+=b[P+257],P>7&&(K(e,f,p>>23&31),f+=lr[P]);var W=p&31;tr(e,f,z[W]),f+=F[W],W>3&&(tr(e,f,p>>5&8191),f+=sr[W])}else tr(e,f,E[p]),f+=b[p]}return tr(e,f,E[256]),f+b[256]},fe=new jr([65540,131080,131088,131104,262176,1048704,1048832,2114560,2117632]),Hr=new T(0),ie=function(r,e,a,n,t,o){var v=o.z||r.length,l=new T(n+v+5*(1+Math.ceil(v/7e3))+t),h=l.subarray(n,l.length-t),c=o.l,f=(o.r||0)&7;if(e){f&&(h[0]=o.r>>3);for(var i=fe[e-1],u=i>>13,x=i&8191,S=(1<7e3||M>24576)&&(E>423||!c)){f=Fr(r,h,0,D,I,N,g,M,O,s-O,f),M=A=g=0,O=s;for(var b=0;b<286;++b)I[b]=0;for(var b=0;b<30;++b)N[b]=0}var z=2,F=0,er=x,B=U-_&32767;if(E>2&&L==j(s-B))for(var Y=Math.min(u,E)-1,H=Math.min(32767,s),P=Math.min(258,E);B<=H&&--er&&U!=_;){if(r[s+z]==r[s+z-B]){for(var p=0;pz){if(z=p,F=B,p>Y)break;for(var W=Math.min(B,p-2),X=0,b=0;bX&&(X=vr,_=Z)}}}U=_,_=w[U],B+=U-_&32767}if(F){D[M++]=268435456|mr[z]<<18|Mr[F];var ar=mr[z]&31,nr=Mr[F]&31;g+=lr[ar]+sr[nr],++I[257+ar],++N[nr],C=s+z,++A}else D[M++]=r[s],++I[r[s]]}}for(s=Math.max(s,C);s=v&&(h[f/8|0]=c,rr=v),f=Ur(h,f+1,r.subarray(s,rr))}o.i=v}return cr(l,0,n+Ar(f)+t)},Pr=function(){var r=1,e=0;return{p:function(a){for(var n=r,t=e,o=a.length|0,v=0;v!=o;){for(var l=Math.min(v+2655,o);v>16),t=(t&65535)+15*(t>>16)}r=n,e=t},d:function(){return r%=65521,e%=65521,(r&255)<<24|(r&65280)<<8|(e&255)<<8|e>>8}}},ve=function(r,e,a,n,t){if(!t&&(t={l:1},e.dictionary)){var o=e.dictionary.subarray(-32768),v=new T(o.length+r.length);v.set(o),v.set(r,o.length),r=v,t.w=o.length}return ie(r,e.level==null?6:e.level,e.mem==null?t.l?Math.ceil(Math.max(8,Math.min(13,Math.log(r.length)))*1.5):20:12+e.mem,a,n,t)},$r=function(r,e,a){for(;a;++e)r[e]=a,a>>>=8},le=function(r,e){var a=e.level,n=a==0?0:a<6?1:a==9?3:2;if(r[0]=120,r[1]=n<<6|(e.dictionary&&32),r[1]|=31-(r[0]<<8|r[1])%31,e.dictionary){var t=Pr();t.p(e.dictionary),$r(r,2,t.d())}},se=function(r,e){return((r[0]&15)!=8||r[0]>>4>7||(r[0]<<8|r[1])%31)&&G(6,"invalid zlib data"),(r[1]>>5&1)==1&&G(6,"invalid zlib data: "+(r[1]&32?"need":"unexpected")+" dictionary"),(r[1]>>3&4)+2};function ce(r,e){e||(e={});var a=Pr();a.p(r);var n=ve(r,e,e.dictionary?6:2,4);return le(n,e),$r(n,n.length-4,a.d()),n}function ue(r,e){return oe(r.subarray(se(r),-4),{i:2},e,e)}var Ir=typeof TextEncoder<"u"&&new TextEncoder,dr=typeof TextDecoder<"u"&&new TextDecoder,he=0;try{dr.decode(Hr,{stream:!0}),he=1}catch{}var ge=function(r){for(var e="",a=0;;){var n=r[a++],t=(n>127)+(n>223)+(n>239);if(a+t>r.length)return{s:e,r:cr(r,a-1)};t?t==3?(n=((n&15)<<18|(r[a++]&63)<<12|(r[a++]&63)<<6|r[a++]&63)-65536,e+=String.fromCharCode(55296|n>>10,56320|n&1023)):t&1?e+=String.fromCharCode((n&31)<<6|r[a++]&63):e+=String.fromCharCode((n&15)<<12|(r[a++]&63)<<6|r[a++]&63):e+=String.fromCharCode(n)}};function Or(r,e){if(e){for(var a=new T(r.length),n=0;n>1)),v=0,l=function(f){o[v++]=f},n=0;no.length){var h=new T(v+8+(t-n<<1));h.set(o),o=h}var c=r.charCodeAt(n);c<128||e?l(c):c<2048?(l(192|c>>6),l(128|c&63)):c>55295&&c<57344?(c=65536+(c&1047552)|r.charCodeAt(++n)&1023,l(240|c>>18),l(128|c>>12&63),l(128|c>>6&63),l(128|c&63)):(l(224|c>>12),l(128|c>>6&63),l(128|c&63))}return cr(o,0,v)}function kr(r,e){if(e){for(var a="",n=0;n`,br=``;function xe(r){if(typeof r!="object"||r===null)return!1;const e=r;return!(typeof e.history!="object"||"followupMessages"in e&&typeof e.followupMessages!="object"||"chatOptions"in e&&typeof e.chatOptions!="object"||"serverState"in e&&typeof e.serverState!="object"||"conversationId"in e&&typeof e.conversationId!="string"&&typeof e.conversationId!="object")}function be(){const{restore:r}=Gr(),{isOpen:e,onOpen:a,onClose:n}=Jr(),[t,o]=hr.useState(Dr),v=hr.useRef(null),{getCurrentConversation:l}=Wr(f=>f.primitives),h=()=>{const{chatOptions:f,history:i,serverState:u,conversationId:x,followupMessages:S}=l(),w=Vr({chatOptions:f,history:i,serverState:u,conversationId:x,followupMessages:S}),d=Or(`${Sr}${JSON.stringify(w)}${br}`),m=btoa(kr(ce(d,{level:9}),!0));navigator.clipboard.writeText(m),o(we),n(),v.current&&clearTimeout(v.current),v.current=setTimeout(()=>{o(Dr)},2e3)},c=()=>{n()};return hr.useEffect(()=>{const f=i=>{if(!i.clipboardData)return;const u=i.clipboardData.types;if(!u.includes("text/plain")&&!u.includes("text"))return;const x=i.clipboardData.getData("text/plain")??i.clipboardData.getData("text");try{const S=atob(x);if(!S.startsWith("xÚ"))return;const w=kr(ue(Or(S,!0)));if(!w.startsWith(Sr)||!w.endsWith(br))return;i.preventDefault(),i.stopPropagation();const d=w.slice(Sr.length,-br.length),m=JSON.parse(d);if(!xe(m))return;r(m.history,m.followupMessages,m.chatOptions,m.serverState,m.conversationId)}catch(S){console.error("Couldn't parse pasted string as valid Ragbits state",S)}};return window.addEventListener("paste",f),()=>{window.removeEventListener("paste",f)}}),k.jsxs(k.Fragment,{children:[k.jsx(qr,{content:"Share conversation",placement:"bottom",children:k.jsx(gr,{isIconOnly:!0,variant:"ghost",className:"p-0","aria-label":"Share conversation",onPress:a,children:k.jsx(Yr,{icon:t})})}),k.jsx(Kr,{isOpen:e,onOpenChange:c,children:k.jsx(Lr,{children:f=>k.jsxs(k.Fragment,{children:[k.jsx(Xr,{className:"text-default-900 flex flex-col gap-1",children:"Share conversation"}),k.jsx(Qr,{children:k.jsxs("div",{className:"flex flex-col gap-4",children:[k.jsx("p",{className:"text-medium text-default-500",children:"You are about to copy a code that allows sharing and storing your current app state. Once copied, you can paste this code anywhere on the site to instantly return to this exact setup. It’s a quick way to save your progress or share it with others."}),k.jsxs("div",{className:"flex justify-end gap-4 py-4",children:[k.jsx(gr,{color:"danger",variant:"light",onPress:f,"aria-label":"Close share modal",children:"Cancel"}),k.jsx(gr,{color:"primary",onPress:h,"aria-label":"Copy to clipboard to share the conversation",children:"Copy to clipboard"})]})]})})]})})})]})}export{be as default}; diff --git a/packages/ragbits-chat/src/ragbits/chat/ui-build/assets/UsageButton-BMDI2IGg.js b/packages/ragbits-chat/src/ragbits/chat/ui-build/assets/UsageButton-BMDI2IGg.js deleted file mode 100644 index bd62ffe45..000000000 --- a/packages/ragbits-chat/src/ragbits/chat/ui-build/assets/UsageButton-BMDI2IGg.js +++ /dev/null @@ -1 +0,0 @@ -import{r as B,aO as Ml,aP as ae,t as Ne,l as ie,n as z,aQ as W,aR as U,aS as te,aT as Tl,W as _,aU as Rl,aV as Vl,a3 as ze,aW as ue,aX as Ol,k as pe,a7 as Hl,a8 as J,a9 as Ll,aY as L,as as Ul,aZ as Y,a_ as Z,a$ as le,ac as Wl,b0 as Gl,b1 as Ce,b2 as Yl,O as T,A as M,G as X,J as K,j as h,w as I,M as w,aC as be,ag as O,Z as Zl,a1 as _l,a0 as ql,ai as q,x as Jl,y as Fe,H as Pe,ae as Ke,u as Xl,aF as De,D as Ql,d as eu,I as tu,m as lu,e as uu,f as nu,b3 as ou}from"./index-C75huGqt.js";import{b as fe,a as Ie,c as je,C as su,u as iu}from"./index-I-Ja0wkh.js";import{m as ru}from"./chunk-IGSAU2ZA-DUS7ku-0.js";function Me(e,t){const l=B.useRef(!0),u=B.useRef(null);B.useEffect(()=>(l.current=!0,()=>{l.current=!1}),[]),B.useEffect(()=>{let o=u.current;l.current?l.current=!1:(!o||t.some((n,i)=>!Object.is(n,o[i])))&&e(),u.current=t},t)}function au(e,t){let l=t?.isDisabled,[u,o]=B.useState(!1);return Ml(()=>{if(e?.current&&!l){let n=()=>{if(e.current){let a=ae(e.current,{tabbable:!0});o(!!a.nextNode())}};n();let i=new MutationObserver(n);return i.observe(e.current,{subtree:!0,childList:!0,attributes:!0,attributeFilter:["tabIndex","disabled"]}),()=>{i.disconnect()}}}),l?!1:u}var Be=Ne({base:"w-px h-px inline-block",variants:{isInline:{true:"inline-block",false:"block"}},defaultVariants:{isInline:!1}}),ke=Ne({slots:{base:"flex flex-col relative gap-4",wrapper:["p-4","z-0","flex","flex-col","relative","justify-between","gap-4","shadow-small","bg-content1","overflow-auto"],table:"min-w-full h-auto",thead:"[&>tr]:first:rounded-lg",tbody:"after:block",tr:["group/tr","outline-hidden",...ie],th:["group/th","px-3","h-10","text-start","align-middle","bg-default-100","whitespace-nowrap","text-foreground-500","text-tiny","font-semibold","first:rounded-s-lg","last:rounded-e-lg","outline-hidden","data-[sortable=true]:cursor-pointer","data-[hover=true]:text-foreground-400",...ie],td:["py-2","px-3","relative","align-middle","whitespace-normal","text-small","font-normal","outline-hidden","[&>*]:z-1","[&>*]:relative",...ie,"before:pointer-events-none","before:content-['']","before:absolute","before:z-0","before:inset-0","before:opacity-0","data-[selected=true]:before:opacity-100","group-data-[disabled=true]/tr:text-foreground-300","group-data-[disabled=true]/tr:cursor-not-allowed"],tfoot:"",sortIcon:["ms-2","mb-px","opacity-0","text-inherit","inline-block","transition-transform-opacity","data-[visible=true]:opacity-100","group-data-[hover=true]/th:opacity-100","data-[direction=ascending]:rotate-180"],emptyWrapper:"text-foreground-400 align-middle text-center h-40",loadingWrapper:"absolute inset-0 flex items-center justify-center"},variants:{color:{default:{td:"before:bg-default/60 data-[selected=true]:text-default-foreground"},primary:{td:"before:bg-primary/20 data-[selected=true]:text-primary"},secondary:{td:"before:bg-secondary/20 data-[selected=true]:text-secondary"},success:{td:"before:bg-success/20 data-[selected=true]:text-success-600 dark:data-[selected=true]:text-success"},warning:{td:"before:bg-warning/20 data-[selected=true]:text-warning-600 dark:data-[selected=true]:text-warning"},danger:{td:"before:bg-danger/20 data-[selected=true]:text-danger dark:data-[selected=true]:text-danger-500"}},layout:{auto:{table:"table-auto"},fixed:{table:"table-fixed"}},shadow:{none:{wrapper:"shadow-none"},sm:{wrapper:"shadow-small"},md:{wrapper:"shadow-medium"},lg:{wrapper:"shadow-large"}},hideHeader:{true:{thead:"hidden"}},isStriped:{true:{td:["group-data-[odd=true]/tr:before:bg-default-100","group-data-[odd=true]/tr:before:opacity-100","group-data-[odd=true]/tr:before:-z-10"]}},isCompact:{true:{td:"py-1"},false:{}},isHeaderSticky:{true:{thead:"sticky top-0 z-20 [&>tr]:first:shadow-small"}},isSelectable:{true:{tr:"cursor-default",td:["group-aria-[selected=false]/tr:group-data-[hover=true]/tr:before:bg-default-100","group-aria-[selected=false]/tr:group-data-[hover=true]/tr:before:opacity-70"]}},isMultiSelectable:{true:{td:["group-data-[first=true]/tr:first:before:rounded-ss-lg","group-data-[first=true]/tr:last:before:rounded-se-lg","group-data-[middle=true]/tr:before:rounded-none","group-data-[last=true]/tr:first:before:rounded-es-lg","group-data-[last=true]/tr:last:before:rounded-ee-lg"]},false:{td:["first:before:rounded-s-lg","last:before:rounded-e-lg"]}},radius:{none:{wrapper:"rounded-none",th:["first:rounded-s-none","first:before:rounded-s-none","last:rounded-e-none","last:before:rounded-e-none"],td:["first:before:rounded-s-none","last:before:rounded-e-none","group-data-[first=true]/tr:first:before:rounded-ss-none","group-data-[first=true]/tr:last:before:rounded-se-none","group-data-[last=true]/tr:first:before:rounded-es-none","group-data-[last=true]/tr:last:before:rounded-ee-none"]},sm:{wrapper:"rounded-small"},md:{wrapper:"rounded-medium"},lg:{wrapper:"rounded-large"}},fullWidth:{true:{base:"w-full",wrapper:"w-full",table:"w-full"}},align:{start:{th:"text-start",td:"text-start"},center:{th:"text-center",td:"text-center"},end:{th:"text-end",td:"text-end"}}},defaultVariants:{layout:"auto",shadow:"sm",radius:"lg",color:"default",isCompact:!1,hideHeader:!1,isStriped:!1,fullWidth:!0,align:"start"},compoundVariants:[{isStriped:!0,color:"default",class:{td:"group-data-[odd=true]/tr:data-[selected=true]/tr:before:bg-default/60"}},{isStriped:!0,color:"primary",class:{td:"group-data-[odd=true]/tr:data-[selected=true]/tr:before:bg-primary/20"}},{isStriped:!0,color:"secondary",class:{td:"group-data-[odd=true]/tr:data-[selected=true]/tr:before:bg-secondary/20"}},{isStriped:!0,color:"success",class:{td:"group-data-[odd=true]/tr:data-[selected=true]/tr:before:bg-success/20"}},{isStriped:!0,color:"warning",class:{td:"group-data-[odd=true]/tr:data-[selected=true]/tr:before:bg-warning/20"}},{isStriped:!0,color:"danger",class:{td:"group-data-[odd=true]/tr:data-[selected=true]/tr:before:bg-danger/20"}}]});const he=new WeakMap;function ce(e){return typeof e=="string"?e.replace(/\s*/g,""):""+e}function cu(e,t){let l=he.get(e);if(!l)throw new Error("Unknown grid");return`${l}-${ce(t)}`}function Te(e,t,l){let u=he.get(e);if(!u)throw new Error("Unknown grid");return`${u}-${ce(t)}-${ce(l)}`}function Re(e,t){return[...e.collection.rowHeaderColumnKeys].map(l=>Te(e,t,l)).join(" ")}var Ve={};Ve={ascending:"تصاعدي",ascendingSort:e=>`ترتيب حسب العمود ${e.columnName} بترتيب تصاعدي`,columnSize:e=>`${e.value} بالبكسل`,descending:"تنازلي",descendingSort:e=>`ترتيب حسب العمود ${e.columnName} بترتيب تنازلي`,resizerDescription:"اضغط على مفتاح Enter لبدء تغيير الحجم",select:"تحديد",selectAll:"تحديد الكل",sortable:"عمود قابل للترتيب"};var Oe={};Oe={ascending:"възходящ",ascendingSort:e=>`сортирано по колона ${e.columnName} във възходящ ред`,columnSize:e=>`${e.value} пиксела`,descending:"низходящ",descendingSort:e=>`сортирано по колона ${e.columnName} в низходящ ред`,resizerDescription:"Натиснете „Enter“, за да започнете да преоразмерявате",select:"Изберете",selectAll:"Изберете всичко",sortable:"сортираща колона"};var He={};He={ascending:"vzestupně",ascendingSort:e=>`řazeno vzestupně podle sloupce ${e.columnName}`,columnSize:e=>`${e.value} pixelů`,descending:"sestupně",descendingSort:e=>`řazeno sestupně podle sloupce ${e.columnName}`,resizerDescription:"Stisknutím klávesy Enter začnete měnit velikost",select:"Vybrat",selectAll:"Vybrat vše",sortable:"sloupec s možností řazení"};var Le={};Le={ascending:"stigende",ascendingSort:e=>`sorteret efter kolonne ${e.columnName} i stigende rækkefølge`,columnSize:e=>`${e.value} pixels`,descending:"faldende",descendingSort:e=>`sorteret efter kolonne ${e.columnName} i faldende rækkefølge`,resizerDescription:"Tryk på Enter for at ændre størrelse",select:"Vælg",selectAll:"Vælg alle",sortable:"sorterbar kolonne"};var Ue={};Ue={ascending:"aufsteigend",ascendingSort:e=>`sortiert nach Spalte ${e.columnName} in aufsteigender Reihenfolge`,columnSize:e=>`${e.value} Pixel`,descending:"absteigend",descendingSort:e=>`sortiert nach Spalte ${e.columnName} in absteigender Reihenfolge`,resizerDescription:"Eingabetaste zum Starten der Größenänderung drücken",select:"Auswählen",selectAll:"Alles auswählen",sortable:"sortierbare Spalte"};var We={};We={ascending:"αύξουσα",ascendingSort:e=>`διαλογή ανά στήλη ${e.columnName} σε αύξουσα σειρά`,columnSize:e=>`${e.value} pixel`,descending:"φθίνουσα",descendingSort:e=>`διαλογή ανά στήλη ${e.columnName} σε φθίνουσα σειρά`,resizerDescription:"Πατήστε Enter για έναρξη της αλλαγής μεγέθους",select:"Επιλογή",selectAll:"Επιλογή όλων",sortable:"Στήλη διαλογής"};var Ge={};Ge={select:"Select",selectAll:"Select All",sortable:"sortable column",ascending:"ascending",descending:"descending",ascendingSort:e=>`sorted by column ${e.columnName} in ascending order`,descendingSort:e=>`sorted by column ${e.columnName} in descending order`,columnSize:e=>`${e.value} pixels`,resizerDescription:"Press Enter to start resizing"};var Ye={};Ye={ascending:"ascendente",ascendingSort:e=>`ordenado por columna ${e.columnName} en sentido ascendente`,columnSize:e=>`${e.value} píxeles`,descending:"descendente",descendingSort:e=>`ordenado por columna ${e.columnName} en orden descendente`,resizerDescription:"Pulse Intro para empezar a redimensionar",select:"Seleccionar",selectAll:"Seleccionar todos",sortable:"columna ordenable"};var Ze={};Ze={ascending:"tõusev järjestus",ascendingSort:e=>`sorditud veeru järgi ${e.columnName} tõusvas järjestuses`,columnSize:e=>`${e.value} pikslit`,descending:"laskuv järjestus",descendingSort:e=>`sorditud veeru järgi ${e.columnName} laskuvas järjestuses`,resizerDescription:"Suuruse muutmise alustamiseks vajutage klahvi Enter",select:"Vali",selectAll:"Vali kõik",sortable:"sorditav veerg"};var _e={};_e={ascending:"nouseva",ascendingSort:e=>`lajiteltu sarakkeen ${e.columnName} mukaan nousevassa järjestyksessä`,columnSize:e=>`${e.value} pikseliä`,descending:"laskeva",descendingSort:e=>`lajiteltu sarakkeen ${e.columnName} mukaan laskevassa järjestyksessä`,resizerDescription:"Aloita koon muutos painamalla Enter-näppäintä",select:"Valitse",selectAll:"Valitse kaikki",sortable:"lajiteltava sarake"};var qe={};qe={ascending:"croissant",ascendingSort:e=>`trié en fonction de la colonne ${e.columnName} par ordre croissant`,columnSize:e=>`${e.value} pixels`,descending:"décroissant",descendingSort:e=>`trié en fonction de la colonne ${e.columnName} par ordre décroissant`,resizerDescription:"Appuyez sur Entrée pour commencer le redimensionnement.",select:"Sélectionner",selectAll:"Sélectionner tout",sortable:"colonne triable"};var Je={};Je={ascending:"עולה",ascendingSort:e=>`מוין לפי עמודה ${e.columnName} בסדר עולה`,columnSize:e=>`${e.value} פיקסלים`,descending:"יורד",descendingSort:e=>`מוין לפי עמודה ${e.columnName} בסדר יורד`,resizerDescription:"הקש Enter כדי לשנות את הגודל",select:"בחר",selectAll:"בחר הכול",sortable:"עמודה שניתן למיין"};var Xe={};Xe={ascending:"rastući",ascendingSort:e=>`razvrstano po stupcima ${e.columnName} rastućem redoslijedom`,columnSize:e=>`${e.value} piksela`,descending:"padajući",descendingSort:e=>`razvrstano po stupcima ${e.columnName} padajućim redoslijedom`,resizerDescription:"Pritisnite Enter da biste započeli promenu veličine",select:"Odaberite",selectAll:"Odaberite sve",sortable:"stupac koji se može razvrstati"};var Qe={};Qe={ascending:"növekvő",ascendingSort:e=>`rendezve a(z) ${e.columnName} oszlop szerint, növekvő sorrendben`,columnSize:e=>`${e.value} képpont`,descending:"csökkenő",descendingSort:e=>`rendezve a(z) ${e.columnName} oszlop szerint, csökkenő sorrendben`,resizerDescription:"Nyomja le az Enter billentyűt az átméretezés megkezdéséhez",select:"Kijelölés",selectAll:"Összes kijelölése",sortable:"rendezendő oszlop"};var et={};et={ascending:"crescente",ascendingSort:e=>`in ordine crescente in base alla colonna ${e.columnName}`,columnSize:e=>`${e.value} pixel`,descending:"decrescente",descendingSort:e=>`in ordine decrescente in base alla colonna ${e.columnName}`,resizerDescription:"Premi Invio per iniziare a ridimensionare",select:"Seleziona",selectAll:"Seleziona tutto",sortable:"colonna ordinabile"};var tt={};tt={ascending:"昇順",ascendingSort:e=>`列 ${e.columnName} を昇順で並べ替え`,columnSize:e=>`${e.value} ピクセル`,descending:"降順",descendingSort:e=>`列 ${e.columnName} を降順で並べ替え`,resizerDescription:"Enter キーを押してサイズ変更を開始",select:"選択",selectAll:"すべて選択",sortable:"並べ替え可能な列"};var lt={};lt={ascending:"오름차순",ascendingSort:e=>`${e.columnName} 열을 기준으로 오름차순으로 정렬됨`,columnSize:e=>`${e.value} 픽셀`,descending:"내림차순",descendingSort:e=>`${e.columnName} 열을 기준으로 내림차순으로 정렬됨`,resizerDescription:"크기 조정을 시작하려면 Enter를 누르세요.",select:"선택",selectAll:"모두 선택",sortable:"정렬 가능한 열"};var ut={};ut={ascending:"didėjančia tvarka",ascendingSort:e=>`surikiuota pagal stulpelį ${e.columnName} didėjančia tvarka`,columnSize:e=>`${e.value} piks.`,descending:"mažėjančia tvarka",descendingSort:e=>`surikiuota pagal stulpelį ${e.columnName} mažėjančia tvarka`,resizerDescription:"Paspauskite „Enter“, kad pradėtumėte keisti dydį",select:"Pasirinkti",selectAll:"Pasirinkti viską",sortable:"rikiuojamas stulpelis"};var nt={};nt={ascending:"augošā secībā",ascendingSort:e=>`kārtots pēc kolonnas ${e.columnName} augošā secībā`,columnSize:e=>`${e.value} pikseļi`,descending:"dilstošā secībā",descendingSort:e=>`kārtots pēc kolonnas ${e.columnName} dilstošā secībā`,resizerDescription:"Nospiediet Enter, lai sāktu izmēru mainīšanu",select:"Atlasīt",selectAll:"Atlasīt visu",sortable:"kārtojamā kolonna"};var ot={};ot={ascending:"stigende",ascendingSort:e=>`sortert etter kolonne ${e.columnName} i stigende rekkefølge`,columnSize:e=>`${e.value} piksler`,descending:"synkende",descendingSort:e=>`sortert etter kolonne ${e.columnName} i synkende rekkefølge`,resizerDescription:"Trykk på Enter for å starte størrelsesendring",select:"Velg",selectAll:"Velg alle",sortable:"kolonne som kan sorteres"};var st={};st={ascending:"oplopend",ascendingSort:e=>`gesorteerd in oplopende volgorde in kolom ${e.columnName}`,columnSize:e=>`${e.value} pixels`,descending:"aflopend",descendingSort:e=>`gesorteerd in aflopende volgorde in kolom ${e.columnName}`,resizerDescription:"Druk op Enter om het formaat te wijzigen",select:"Selecteren",selectAll:"Alles selecteren",sortable:"sorteerbare kolom"};var it={};it={ascending:"rosnąco",ascendingSort:e=>`posortowano według kolumny ${e.columnName} w porządku rosnącym`,columnSize:e=>`Liczba pikseli: ${e.value}`,descending:"malejąco",descendingSort:e=>`posortowano według kolumny ${e.columnName} w porządku malejącym`,resizerDescription:"Naciśnij Enter, aby rozpocząć zmienianie rozmiaru",select:"Zaznacz",selectAll:"Zaznacz wszystko",sortable:"kolumna z możliwością sortowania"};var rt={};rt={ascending:"crescente",ascendingSort:e=>`classificado pela coluna ${e.columnName} em ordem crescente`,columnSize:e=>`${e.value} pixels`,descending:"decrescente",descendingSort:e=>`classificado pela coluna ${e.columnName} em ordem decrescente`,resizerDescription:"Pressione Enter para começar a redimensionar",select:"Selecionar",selectAll:"Selecionar tudo",sortable:"coluna classificável"};var at={};at={ascending:"ascendente",ascendingSort:e=>`Ordenar por coluna ${e.columnName} em ordem ascendente`,columnSize:e=>`${e.value} pixels`,descending:"descendente",descendingSort:e=>`Ordenar por coluna ${e.columnName} em ordem descendente`,resizerDescription:"Prima Enter para iniciar o redimensionamento",select:"Selecionar",selectAll:"Selecionar tudo",sortable:"Coluna ordenável"};var ct={};ct={ascending:"crescătoare",ascendingSort:e=>`sortate după coloana ${e.columnName} în ordine crescătoare`,columnSize:e=>`${e.value} pixeli`,descending:"descrescătoare",descendingSort:e=>`sortate după coloana ${e.columnName} în ordine descrescătoare`,resizerDescription:"Apăsați pe Enter pentru a începe redimensionarea",select:"Selectare",selectAll:"Selectare totală",sortable:"coloană sortabilă"};var dt={};dt={ascending:"возрастание",ascendingSort:e=>`сортировать столбец ${e.columnName} в порядке возрастания`,columnSize:e=>`${e.value} пикс.`,descending:"убывание",descendingSort:e=>`сортировать столбец ${e.columnName} в порядке убывания`,resizerDescription:"Нажмите клавишу Enter для начала изменения размеров",select:"Выбрать",selectAll:"Выбрать все",sortable:"сортируемый столбец"};var mt={};mt={ascending:"vzostupne",ascendingSort:e=>`zoradené zostupne podľa stĺpca ${e.columnName}`,columnSize:e=>`Počet pixelov: ${e.value}`,descending:"zostupne",descendingSort:e=>`zoradené zostupne podľa stĺpca ${e.columnName}`,resizerDescription:"Stlačením klávesu Enter začnete zmenu veľkosti",select:"Vybrať",selectAll:"Vybrať všetko",sortable:"zoraditeľný stĺpec"};var pt={};pt={ascending:"naraščajoče",ascendingSort:e=>`razvrščeno po stolpcu ${e.columnName} v naraščajočem vrstnem redu`,columnSize:e=>`${e.value} slikovnih pik`,descending:"padajoče",descendingSort:e=>`razvrščeno po stolpcu ${e.columnName} v padajočem vrstnem redu`,resizerDescription:"Pritisnite tipko Enter da začnete spreminjati velikost",select:"Izberite",selectAll:"Izberite vse",sortable:"razvrstljivi stolpec"};var bt={};bt={ascending:"rastući",ascendingSort:e=>`sortirano po kolonama ${e.columnName} rastućim redosledom`,columnSize:e=>`${e.value} piksela`,descending:"padajući",descendingSort:e=>`sortirano po kolonama ${e.columnName} padajućim redosledom`,resizerDescription:"Pritisnite Enter da biste započeli promenu veličine",select:"Izaberite",selectAll:"Izaberite sve",sortable:"kolona koja se može sortirati"};var ft={};ft={ascending:"stigande",ascendingSort:e=>`sorterat på kolumn ${e.columnName} i stigande ordning`,columnSize:e=>`${e.value} pixlar`,descending:"fallande",descendingSort:e=>`sorterat på kolumn ${e.columnName} i fallande ordning`,resizerDescription:"Tryck på Retur för att börja ändra storlek",select:"Markera",selectAll:"Markera allt",sortable:"sorterbar kolumn"};var ht={};ht={ascending:"artan sırada",ascendingSort:e=>`${e.columnName} sütuna göre artan düzende sırala`,columnSize:e=>`${e.value} piksel`,descending:"azalan sırada",descendingSort:e=>`${e.columnName} sütuna göre azalan düzende sırala`,resizerDescription:"Yeniden boyutlandırmak için Enter'a basın",select:"Seç",selectAll:"Tümünü Seç",sortable:"Sıralanabilir sütun"};var vt={};vt={ascending:"висхідний",ascendingSort:e=>`відсортовано за стовпцем ${e.columnName} у висхідному порядку`,columnSize:e=>`${e.value} пікс.`,descending:"низхідний",descendingSort:e=>`відсортовано за стовпцем ${e.columnName} у низхідному порядку`,resizerDescription:"Натисніть Enter, щоб почати зміну розміру",select:"Вибрати",selectAll:"Вибрати все",sortable:"сортувальний стовпець"};var gt={};gt={ascending:"升序",ascendingSort:e=>`按列 ${e.columnName} 升序排序`,columnSize:e=>`${e.value} 像素`,descending:"降序",descendingSort:e=>`按列 ${e.columnName} 降序排序`,resizerDescription:"按“输入”键开始调整大小。",select:"选择",selectAll:"全选",sortable:"可排序的列"};var $t={};$t={ascending:"遞增",ascendingSort:e=>`已依據「${e.columnName}」欄遞增排序`,columnSize:e=>`${e.value} 像素`,descending:"遞減",descendingSort:e=>`已依據「${e.columnName}」欄遞減排序`,resizerDescription:"按 Enter 鍵以開始調整大小",select:"選取",selectAll:"全選",sortable:"可排序的欄"};var ne={};ne={"ar-AE":Ve,"bg-BG":Oe,"cs-CZ":He,"da-DK":Le,"de-DE":Ue,"el-GR":We,"en-US":Ge,"es-ES":Ye,"et-EE":Ze,"fi-FI":_e,"fr-FR":qe,"he-IL":Je,"hr-HR":Xe,"hu-HU":Qe,"it-IT":et,"ja-JP":tt,"ko-KR":lt,"lt-LT":ut,"lv-LV":nt,"nb-NO":ot,"nl-NL":st,"pl-PL":it,"pt-BR":rt,"pt-PT":at,"ro-RO":ct,"ru-RU":dt,"sk-SK":mt,"sl-SI":pt,"sr-SP":bt,"sv-SE":ft,"tr-TR":ht,"uk-UA":vt,"zh-CN":gt,"zh-TW":$t};class yt{isCell(t){return t.type==="cell"}isRow(t){return t.type==="row"||t.type==="item"}isDisabled(t){var l;return this.disabledBehavior==="all"&&(((l=t.props)===null||l===void 0?void 0:l.isDisabled)||this.disabledKeys.has(t.key))}findPreviousKey(t,l){let u=t!=null?this.collection.getKeyBefore(t):this.collection.getLastKey();for(;u!=null;){let o=this.collection.getItem(u);if(!o)return null;if(!this.isDisabled(o)&&(!l||l(o)))return u;u=this.collection.getKeyBefore(u)}return null}findNextKey(t,l){let u=t!=null?this.collection.getKeyAfter(t):this.collection.getFirstKey();for(;u!=null;){let o=this.collection.getItem(u);if(!o)return null;if(!this.isDisabled(o)&&(!l||l(o)))return u;if(u=this.collection.getKeyAfter(u),u==null)return null}return null}getKeyForItemInRowByIndex(t,l=0){if(l<0)return null;let u=this.collection.getItem(t);if(!u)return null;let o=0;for(let a of z(u,this.collection)){var n;if(a.colSpan&&a.colSpan+o>l)return(n=a.key)!==null&&n!==void 0?n:null;a.colSpan&&(o=o+a.colSpan-1);var i;if(o===l)return(i=a.key)!==null&&i!==void 0?i:null;o++}return null}getKeyBelow(t){let l=t,u=this.collection.getItem(l);if(!u)return null;var o;if(this.isCell(u)&&(l=(o=u.parentKey)!==null&&o!==void 0?o:null),l==null)return null;if(l=this.findNextKey(l,n=>n.type==="item"),l!=null){if(this.isCell(u)){let n=u.colIndex?u.colIndex:u.index;return this.getKeyForItemInRowByIndex(l,n)}if(this.focusMode==="row")return l}return null}getKeyAbove(t){let l=t,u=this.collection.getItem(l);if(!u)return null;var o;if(this.isCell(u)&&(l=(o=u.parentKey)!==null&&o!==void 0?o:null),l==null)return null;if(l=this.findPreviousKey(l,n=>n.type==="item"),l!=null){if(this.isCell(u)){let n=u.colIndex?u.colIndex:u.index;return this.getKeyForItemInRowByIndex(l,n)}if(this.focusMode==="row")return l}return null}getKeyRightOf(t){let l=this.collection.getItem(t);if(!l)return null;if(this.isRow(l)){var u,o;let d=z(l,this.collection);var n;return(n=this.direction==="rtl"?(u=W(d))===null||u===void 0?void 0:u.key:(o=U(d))===null||o===void 0?void 0:o.key)!==null&&n!==void 0?n:null}if(this.isCell(l)&&l.parentKey!=null){let d=this.collection.getItem(l.parentKey);if(!d)return null;let r=z(d,this.collection);var i;let p=(i=this.direction==="rtl"?te(r,l.index-1):te(r,l.index+1))!==null&&i!==void 0?i:null;var a;if(p)return(a=p.key)!==null&&a!==void 0?a:null;var m;if(this.focusMode==="row")return(m=l.parentKey)!==null&&m!==void 0?m:null;var c;return(c=this.direction==="rtl"?this.getFirstKey(t):this.getLastKey(t))!==null&&c!==void 0?c:null}return null}getKeyLeftOf(t){let l=this.collection.getItem(t);if(!l)return null;if(this.isRow(l)){var u,o;let d=z(l,this.collection);var n;return(n=this.direction==="rtl"?(u=U(d))===null||u===void 0?void 0:u.key:(o=W(d))===null||o===void 0?void 0:o.key)!==null&&n!==void 0?n:null}if(this.isCell(l)&&l.parentKey!=null){let d=this.collection.getItem(l.parentKey);if(!d)return null;let r=z(d,this.collection);var i;let p=(i=this.direction==="rtl"?te(r,l.index+1):te(r,l.index-1))!==null&&i!==void 0?i:null;var a;if(p)return(a=p.key)!==null&&a!==void 0?a:null;var m;if(this.focusMode==="row")return(m=l.parentKey)!==null&&m!==void 0?m:null;var c;return(c=this.direction==="rtl"?this.getLastKey(t):this.getFirstKey(t))!==null&&c!==void 0?c:null}return null}getFirstKey(t,l){let u=t??null,o;if(u!=null){if(o=this.collection.getItem(u),!o)return null;if(this.isCell(o)&&!l&&o.parentKey!=null){var n;let c=this.collection.getItem(o.parentKey);if(!c)return null;var i;return(i=(n=U(z(c,this.collection)))===null||n===void 0?void 0:n.key)!==null&&i!==void 0?i:null}}if(u=this.findNextKey(void 0,c=>c.type==="item"),u!=null&&(o&&this.isCell(o)&&l||this.focusMode==="cell")){var a;let c=this.collection.getItem(u);if(!c)return null;var m;u=(m=(a=U(z(c,this.collection)))===null||a===void 0?void 0:a.key)!==null&&m!==void 0?m:null}return u}getLastKey(t,l){let u=t??null,o;if(u!=null){if(o=this.collection.getItem(u),!o)return null;if(this.isCell(o)&&!l&&o.parentKey!=null){var n;let c=this.collection.getItem(o.parentKey);if(!c)return null;let d=z(c,this.collection);var i;return(i=(n=W(d))===null||n===void 0?void 0:n.key)!==null&&i!==void 0?i:null}}if(u=this.findPreviousKey(void 0,c=>c.type==="item"),u!=null&&(o&&this.isCell(o)&&l||this.focusMode==="cell")){var a;let c=this.collection.getItem(u);if(!c)return null;let d=z(c,this.collection);var m;u=(m=(a=W(d))===null||a===void 0?void 0:a.key)!==null&&m!==void 0?m:null}return u}getKeyPageAbove(t){let l=t,u=this.layoutDelegate.getItemRect(l);if(!u)return null;let o=Math.max(0,u.y+u.height-this.layoutDelegate.getVisibleRect().height);for(;u&&u.y>o&&l!=null;){var n;if(l=(n=this.getKeyAbove(l))!==null&&n!==void 0?n:null,l==null)break;u=this.layoutDelegate.getItemRect(l)}return l}getKeyPageBelow(t){let l=t,u=this.layoutDelegate.getItemRect(l);if(!u)return null;let o=this.layoutDelegate.getVisibleRect().height,n=Math.min(this.layoutDelegate.getContentSize().height,u.y+o);for(;u&&u.y+u.heightr.type==="item"),u==null&&!a&&(u=this.getFirstKey(),a=!0)}return null}constructor(t){if(this.collection=t.collection,this.disabledKeys=t.disabledKeys,this.disabledBehavior=t.disabledBehavior||"all",this.direction=t.direction,this.collator=t.collator,!t.layout&&!t.ref)throw new Error("Either a layout or a ref must be specified.");this.layoutDelegate=t.layoutDelegate||(t.layout?new du(t.layout):new Tl(t.ref)),this.focusMode=t.focusMode||"row"}}class du{getContentSize(){return this.layout.getContentSize()}getItemRect(t){var l;return((l=this.layout.getLayoutInfo(t))===null||l===void 0?void 0:l.rect)||null}getVisibleRect(){return this.layout.virtualizer.visibleRect}constructor(t){this.layout=t}}const ve=new WeakMap;var xt={};xt={deselectedItem:e=>`${e.item} غير المحدد`,longPressToSelect:"اضغط مطولًا للدخول إلى وضع التحديد.",select:"تحديد",selectedAll:"جميع العناصر المحددة.",selectedCount:(e,t)=>`${t.plural(e.count,{"=0":"لم يتم تحديد عناصر",one:()=>`${t.number(e.count)} عنصر محدد`,other:()=>`${t.number(e.count)} عنصر محدد`})}.`,selectedItem:e=>`${e.item} المحدد`};var Ct={};Ct={deselectedItem:e=>`${e.item} не е избран.`,longPressToSelect:"Натиснете и задръжте за да влезете в избирателен режим.",select:"Изберете",selectedAll:"Всички елементи са избрани.",selectedCount:(e,t)=>`${t.plural(e.count,{"=0":"Няма избрани елементи",one:()=>`${t.number(e.count)} избран елемент`,other:()=>`${t.number(e.count)} избрани елементи`})}.`,selectedItem:e=>`${e.item} избран.`};var Dt={};Dt={deselectedItem:e=>`Položka ${e.item} není vybrána.`,longPressToSelect:"Dlouhým stisknutím přejdete do režimu výběru.",select:"Vybrat",selectedAll:"Vybrány všechny položky.",selectedCount:(e,t)=>`${t.plural(e.count,{"=0":"Nevybrány žádné položky",one:()=>`Vybrána ${t.number(e.count)} položka`,other:()=>`Vybráno ${t.number(e.count)} položek`})}.`,selectedItem:e=>`Vybrána položka ${e.item}.`};var Bt={};Bt={deselectedItem:e=>`${e.item} ikke valgt.`,longPressToSelect:"Lav et langt tryk for at aktivere valgtilstand.",select:"Vælg",selectedAll:"Alle elementer valgt.",selectedCount:(e,t)=>`${t.plural(e.count,{"=0":"Ingen elementer valgt",one:()=>`${t.number(e.count)} element valgt`,other:()=>`${t.number(e.count)} elementer valgt`})}.`,selectedItem:e=>`${e.item} valgt.`};var kt={};kt={deselectedItem:e=>`${e.item} nicht ausgewählt.`,longPressToSelect:"Gedrückt halten, um Auswahlmodus zu öffnen.",select:"Auswählen",selectedAll:"Alle Elemente ausgewählt.",selectedCount:(e,t)=>`${t.plural(e.count,{"=0":"Keine Elemente ausgewählt",one:()=>`${t.number(e.count)} Element ausgewählt`,other:()=>`${t.number(e.count)} Elemente ausgewählt`})}.`,selectedItem:e=>`${e.item} ausgewählt.`};var Et={};Et={deselectedItem:e=>`Δεν επιλέχθηκε το στοιχείο ${e.item}.`,longPressToSelect:"Πατήστε παρατεταμένα για να μπείτε σε λειτουργία επιλογής.",select:"Επιλογή",selectedAll:"Επιλέχθηκαν όλα τα στοιχεία.",selectedCount:(e,t)=>`${t.plural(e.count,{"=0":"Δεν επιλέχθηκαν στοιχεία",one:()=>`Επιλέχθηκε ${t.number(e.count)} στοιχείο`,other:()=>`Επιλέχθηκαν ${t.number(e.count)} στοιχεία`})}.`,selectedItem:e=>`Επιλέχθηκε το στοιχείο ${e.item}.`};var St={};St={deselectedItem:e=>`${e.item} not selected.`,select:"Select",selectedCount:(e,t)=>`${t.plural(e.count,{"=0":"No items selected",one:()=>`${t.number(e.count)} item selected`,other:()=>`${t.number(e.count)} items selected`})}.`,selectedAll:"All items selected.",selectedItem:e=>`${e.item} selected.`,longPressToSelect:"Long press to enter selection mode."};var At={};At={deselectedItem:e=>`${e.item} no seleccionado.`,longPressToSelect:"Mantenga pulsado para abrir el modo de selección.",select:"Seleccionar",selectedAll:"Todos los elementos seleccionados.",selectedCount:(e,t)=>`${t.plural(e.count,{"=0":"Ningún elemento seleccionado",one:()=>`${t.number(e.count)} elemento seleccionado`,other:()=>`${t.number(e.count)} elementos seleccionados`})}.`,selectedItem:e=>`${e.item} seleccionado.`};var wt={};wt={deselectedItem:e=>`${e.item} pole valitud.`,longPressToSelect:"Valikurežiimi sisenemiseks vajutage pikalt.",select:"Vali",selectedAll:"Kõik üksused valitud.",selectedCount:(e,t)=>`${t.plural(e.count,{"=0":"Üksusi pole valitud",one:()=>`${t.number(e.count)} üksus valitud`,other:()=>`${t.number(e.count)} üksust valitud`})}.`,selectedItem:e=>`${e.item} valitud.`};var Nt={};Nt={deselectedItem:e=>`Kohdetta ${e.item} ei valittu.`,longPressToSelect:"Siirry valintatilaan painamalla pitkään.",select:"Valitse",selectedAll:"Kaikki kohteet valittu.",selectedCount:(e,t)=>`${t.plural(e.count,{"=0":"Ei yhtään kohdetta valittu",one:()=>`${t.number(e.count)} kohde valittu`,other:()=>`${t.number(e.count)} kohdetta valittu`})}.`,selectedItem:e=>`${e.item} valittu.`};var zt={};zt={deselectedItem:e=>`${e.item} non sélectionné.`,longPressToSelect:"Appuyez de manière prolongée pour passer en mode de sélection.",select:"Sélectionner",selectedAll:"Tous les éléments sélectionnés.",selectedCount:(e,t)=>`${t.plural(e.count,{"=0":"Aucun élément sélectionné",one:()=>`${t.number(e.count)} élément sélectionné`,other:()=>`${t.number(e.count)} éléments sélectionnés`})}.`,selectedItem:e=>`${e.item} sélectionné.`};var Ft={};Ft={deselectedItem:e=>`${e.item} לא נבחר.`,longPressToSelect:"הקשה ארוכה לכניסה למצב בחירה.",select:"בחר",selectedAll:"כל הפריטים נבחרו.",selectedCount:(e,t)=>`${t.plural(e.count,{"=0":"לא נבחרו פריטים",one:()=>`פריט ${t.number(e.count)} נבחר`,other:()=>`${t.number(e.count)} פריטים נבחרו`})}.`,selectedItem:e=>`${e.item} נבחר.`};var Pt={};Pt={deselectedItem:e=>`Stavka ${e.item} nije odabrana.`,longPressToSelect:"Dugo pritisnite za ulazak u način odabira.",select:"Odaberite",selectedAll:"Odabrane su sve stavke.",selectedCount:(e,t)=>`${t.plural(e.count,{"=0":"Nije odabrana nijedna stavka",one:()=>`Odabrana je ${t.number(e.count)} stavka`,other:()=>`Odabrano je ${t.number(e.count)} stavki`})}.`,selectedItem:e=>`Stavka ${e.item} je odabrana.`};var Kt={};Kt={deselectedItem:e=>`${e.item} nincs kijelölve.`,longPressToSelect:"Nyomja hosszan a kijelöléshez.",select:"Kijelölés",selectedAll:"Az összes elem kijelölve.",selectedCount:(e,t)=>`${t.plural(e.count,{"=0":"Egy elem sincs kijelölve",one:()=>`${t.number(e.count)} elem kijelölve`,other:()=>`${t.number(e.count)} elem kijelölve`})}.`,selectedItem:e=>`${e.item} kijelölve.`};var It={};It={deselectedItem:e=>`${e.item} non selezionato.`,longPressToSelect:"Premi a lungo per passare alla modalità di selezione.",select:"Seleziona",selectedAll:"Tutti gli elementi selezionati.",selectedCount:(e,t)=>`${t.plural(e.count,{"=0":"Nessun elemento selezionato",one:()=>`${t.number(e.count)} elemento selezionato`,other:()=>`${t.number(e.count)} elementi selezionati`})}.`,selectedItem:e=>`${e.item} selezionato.`};var jt={};jt={deselectedItem:e=>`${e.item} が選択されていません。`,longPressToSelect:"長押しして選択モードを開きます。",select:"選択",selectedAll:"すべての項目を選択しました。",selectedCount:(e,t)=>`${t.plural(e.count,{"=0":"項目が選択されていません",one:()=>`${t.number(e.count)} 項目を選択しました`,other:()=>`${t.number(e.count)} 項目を選択しました`})}。`,selectedItem:e=>`${e.item} を選択しました。`};var Mt={};Mt={deselectedItem:e=>`${e.item}이(가) 선택되지 않았습니다.`,longPressToSelect:"선택 모드로 들어가려면 길게 누르십시오.",select:"선택",selectedAll:"모든 항목이 선택되었습니다.",selectedCount:(e,t)=>`${t.plural(e.count,{"=0":"선택된 항목이 없습니다",one:()=>`${t.number(e.count)}개 항목이 선택되었습니다`,other:()=>`${t.number(e.count)}개 항목이 선택되었습니다`})}.`,selectedItem:e=>`${e.item}이(가) 선택되었습니다.`};var Tt={};Tt={deselectedItem:e=>`${e.item} nepasirinkta.`,longPressToSelect:"Norėdami įjungti pasirinkimo režimą, paspauskite ir palaikykite.",select:"Pasirinkti",selectedAll:"Pasirinkti visi elementai.",selectedCount:(e,t)=>`${t.plural(e.count,{"=0":"Nepasirinktas nė vienas elementas",one:()=>`Pasirinktas ${t.number(e.count)} elementas`,other:()=>`Pasirinkta elementų: ${t.number(e.count)}`})}.`,selectedItem:e=>`Pasirinkta: ${e.item}.`};var Rt={};Rt={deselectedItem:e=>`Vienums ${e.item} nav atlasīts.`,longPressToSelect:"Ilgi turiet nospiestu. lai ieslēgtu atlases režīmu.",select:"Atlasīt",selectedAll:"Atlasīti visi vienumi.",selectedCount:(e,t)=>`${t.plural(e.count,{"=0":"Nav atlasīts neviens vienums",one:()=>`Atlasīto vienumu skaits: ${t.number(e.count)}`,other:()=>`Atlasīto vienumu skaits: ${t.number(e.count)}`})}.`,selectedItem:e=>`Atlasīts vienums ${e.item}.`};var Vt={};Vt={deselectedItem:e=>`${e.item} er ikke valgt.`,longPressToSelect:"Bruk et langt trykk for å gå inn i valgmodus.",select:"Velg",selectedAll:"Alle elementer er valgt.",selectedCount:(e,t)=>`${t.plural(e.count,{"=0":"Ingen elementer er valgt",one:()=>`${t.number(e.count)} element er valgt`,other:()=>`${t.number(e.count)} elementer er valgt`})}.`,selectedItem:e=>`${e.item} er valgt.`};var Ot={};Ot={deselectedItem:e=>`${e.item} niet geselecteerd.`,longPressToSelect:"Druk lang om de selectiemodus te openen.",select:"Selecteren",selectedAll:"Alle items geselecteerd.",selectedCount:(e,t)=>`${t.plural(e.count,{"=0":"Geen items geselecteerd",one:()=>`${t.number(e.count)} item geselecteerd`,other:()=>`${t.number(e.count)} items geselecteerd`})}.`,selectedItem:e=>`${e.item} geselecteerd.`};var Ht={};Ht={deselectedItem:e=>`Nie zaznaczono ${e.item}.`,longPressToSelect:"Naciśnij i przytrzymaj, aby wejść do trybu wyboru.",select:"Zaznacz",selectedAll:"Wszystkie zaznaczone elementy.",selectedCount:(e,t)=>`${t.plural(e.count,{"=0":"Nie zaznaczono żadnych elementów",one:()=>`${t.number(e.count)} zaznaczony element`,other:()=>`${t.number(e.count)} zaznaczonych elementów`})}.`,selectedItem:e=>`Zaznaczono ${e.item}.`};var Lt={};Lt={deselectedItem:e=>`${e.item} não selecionado.`,longPressToSelect:"Mantenha pressionado para entrar no modo de seleção.",select:"Selecionar",selectedAll:"Todos os itens selecionados.",selectedCount:(e,t)=>`${t.plural(e.count,{"=0":"Nenhum item selecionado",one:()=>`${t.number(e.count)} item selecionado`,other:()=>`${t.number(e.count)} itens selecionados`})}.`,selectedItem:e=>`${e.item} selecionado.`};var Ut={};Ut={deselectedItem:e=>`${e.item} não selecionado.`,longPressToSelect:"Prima continuamente para entrar no modo de seleção.",select:"Selecionar",selectedAll:"Todos os itens selecionados.",selectedCount:(e,t)=>`${t.plural(e.count,{"=0":"Nenhum item selecionado",one:()=>`${t.number(e.count)} item selecionado`,other:()=>`${t.number(e.count)} itens selecionados`})}.`,selectedItem:e=>`${e.item} selecionado.`};var Wt={};Wt={deselectedItem:e=>`${e.item} neselectat.`,longPressToSelect:"Apăsați lung pentru a intra în modul de selectare.",select:"Selectare",selectedAll:"Toate elementele selectate.",selectedCount:(e,t)=>`${t.plural(e.count,{"=0":"Niciun element selectat",one:()=>`${t.number(e.count)} element selectat`,other:()=>`${t.number(e.count)} elemente selectate`})}.`,selectedItem:e=>`${e.item} selectat.`};var Gt={};Gt={deselectedItem:e=>`${e.item} не выбрано.`,longPressToSelect:"Нажмите и удерживайте для входа в режим выбора.",select:"Выбрать",selectedAll:"Выбраны все элементы.",selectedCount:(e,t)=>`${t.plural(e.count,{"=0":"Нет выбранных элементов",one:()=>`${t.number(e.count)} элемент выбран`,other:()=>`${t.number(e.count)} элементов выбрано`})}.`,selectedItem:e=>`${e.item} выбрано.`};var Yt={};Yt={deselectedItem:e=>`Nevybraté položky: ${e.item}.`,longPressToSelect:"Dlhším stlačením prejdite do režimu výberu.",select:"Vybrať",selectedAll:"Všetky vybraté položky.",selectedCount:(e,t)=>`${t.plural(e.count,{"=0":"Žiadne vybraté položky",one:()=>`${t.number(e.count)} vybratá položka`,other:()=>`Počet vybratých položiek:${t.number(e.count)}`})}.`,selectedItem:e=>`Vybraté položky: ${e.item}.`};var Zt={};Zt={deselectedItem:e=>`Element ${e.item} ni izbran.`,longPressToSelect:"Za izbirni način pritisnite in dlje časa držite.",select:"Izberite",selectedAll:"Vsi elementi so izbrani.",selectedCount:(e,t)=>`${t.plural(e.count,{"=0":"Noben element ni izbran",one:()=>`${t.number(e.count)} element je izbran`,other:()=>`${t.number(e.count)} elementov je izbranih`})}.`,selectedItem:e=>`Element ${e.item} je izbran.`};var _t={};_t={deselectedItem:e=>`${e.item} nije izabrano.`,longPressToSelect:"Dugo pritisnite za ulazak u režim biranja.",select:"Izaberite",selectedAll:"Izabrane su sve stavke.",selectedCount:(e,t)=>`${t.plural(e.count,{"=0":"Nije izabrana nijedna stavka",one:()=>`Izabrana je ${t.number(e.count)} stavka`,other:()=>`Izabrano je ${t.number(e.count)} stavki`})}.`,selectedItem:e=>`${e.item} je izabrano.`};var qt={};qt={deselectedItem:e=>`${e.item} ej markerat.`,longPressToSelect:"Tryck länge när du vill öppna väljarläge.",select:"Markera",selectedAll:"Alla markerade objekt.",selectedCount:(e,t)=>`${t.plural(e.count,{"=0":"Inga markerade objekt",one:()=>`${t.number(e.count)} markerat objekt`,other:()=>`${t.number(e.count)} markerade objekt`})}.`,selectedItem:e=>`${e.item} markerat.`};var Jt={};Jt={deselectedItem:e=>`${e.item} seçilmedi.`,longPressToSelect:"Seçim moduna girmek için uzun basın.",select:"Seç",selectedAll:"Tüm ögeler seçildi.",selectedCount:(e,t)=>`${t.plural(e.count,{"=0":"Hiçbir öge seçilmedi",one:()=>`${t.number(e.count)} öge seçildi`,other:()=>`${t.number(e.count)} öge seçildi`})}.`,selectedItem:e=>`${e.item} seçildi.`};var Xt={};Xt={deselectedItem:e=>`${e.item} не вибрано.`,longPressToSelect:"Виконайте довге натиснення, щоб перейти в режим вибору.",select:"Вибрати",selectedAll:"Усі елементи вибрано.",selectedCount:(e,t)=>`${t.plural(e.count,{"=0":"Жодних елементів не вибрано",one:()=>`${t.number(e.count)} елемент вибрано`,other:()=>`Вибрано елементів: ${t.number(e.count)}`})}.`,selectedItem:e=>`${e.item} вибрано.`};var Qt={};Qt={deselectedItem:e=>`未选择 ${e.item}。`,longPressToSelect:"长按以进入选择模式。",select:"选择",selectedAll:"已选择所有项目。",selectedCount:(e,t)=>`${t.plural(e.count,{"=0":"未选择项目",one:()=>`已选择 ${t.number(e.count)} 个项目`,other:()=>`已选择 ${t.number(e.count)} 个项目`})}。`,selectedItem:e=>`已选择 ${e.item}。`};var el={};el={deselectedItem:e=>`未選取「${e.item}」。`,longPressToSelect:"長按以進入選擇模式。",select:"選取",selectedAll:"已選取所有項目。",selectedCount:(e,t)=>`${t.plural(e.count,{"=0":"未選取任何項目",one:()=>`已選取 ${t.number(e.count)} 個項目`,other:()=>`已選取 ${t.number(e.count)} 個項目`})}。`,selectedItem:e=>`已選取「${e.item}」。`};var oe={};oe={"ar-AE":xt,"bg-BG":Ct,"cs-CZ":Dt,"da-DK":Bt,"de-DE":kt,"el-GR":Et,"en-US":St,"es-ES":At,"et-EE":wt,"fi-FI":Nt,"fr-FR":zt,"he-IL":Ft,"hr-HR":Pt,"hu-HU":Kt,"it-IT":It,"ja-JP":jt,"ko-KR":Mt,"lt-LT":Tt,"lv-LV":Rt,"nb-NO":Vt,"nl-NL":Ot,"pl-PL":Ht,"pt-BR":Lt,"pt-PT":Ut,"ro-RO":Wt,"ru-RU":Gt,"sk-SK":Yt,"sl-SI":Zt,"sr-SP":_t,"sv-SE":qt,"tr-TR":Jt,"uk-UA":Xt,"zh-CN":Qt,"zh-TW":el};const tl=7e3;let V=null;function ll(e,t="assertive",l=tl){V?V.announce(e,t,l):(V=new mu,(typeof IS_REACT_ACT_ENVIRONMENT=="boolean"?IS_REACT_ACT_ENVIRONMENT:typeof jest<"u")?V.announce(e,t,l):setTimeout(()=>{V?.isAttached()&&V?.announce(e,t,l)},100))}class mu{isAttached(){var t;return(t=this.node)===null||t===void 0?void 0:t.isConnected}createLog(t){let l=document.createElement("div");return l.setAttribute("role","log"),l.setAttribute("aria-live",t),l.setAttribute("aria-relevant","additions"),l}destroy(){this.node&&(document.body.removeChild(this.node),this.node=null)}announce(t,l="assertive",u=tl){var o,n;if(!this.node)return;let i=document.createElement("div");typeof t=="object"?(i.setAttribute("role","img"),i.setAttribute("aria-labelledby",t["aria-labelledby"])):i.textContent=t,l==="assertive"?(o=this.assertiveLog)===null||o===void 0||o.appendChild(i):(n=this.politeLog)===null||n===void 0||n.appendChild(i),t!==""&&setTimeout(()=>{i.remove()},u)}clear(t){this.node&&((!t||t==="assertive")&&this.assertiveLog&&(this.assertiveLog.innerHTML=""),(!t||t==="polite")&&this.politeLog&&(this.politeLog.innerHTML=""))}constructor(){this.node=null,this.assertiveLog=null,this.politeLog=null,typeof document<"u"&&(this.node=document.createElement("div"),this.node.dataset.liveAnnouncer="true",Object.assign(this.node.style,{border:0,clip:"rect(0 0 0 0)",clipPath:"inset(50%)",height:"1px",margin:"-1px",overflow:"hidden",padding:0,position:"absolute",width:"1px",whiteSpace:"nowrap"}),this.assertiveLog=this.createLog("assertive"),this.node.appendChild(this.assertiveLog),this.politeLog=this.createLog("polite"),this.node.appendChild(this.politeLog),document.body.prepend(this.node))}}function pu(e){return e&&e.__esModule?e.default:e}function bu(e,t){let{getRowText:l=a=>{var m,c,d,r;return(r=(m=(c=t.collection).getTextValue)===null||m===void 0?void 0:m.call(c,a))!==null&&r!==void 0?r:(d=t.collection.getItem(a))===null||d===void 0?void 0:d.textValue}}=e,u=_(pu(oe),"@react-aria/grid"),o=t.selectionManager.rawSelection,n=B.useRef(o),i=Rl(()=>{var a;if(!t.selectionManager.isFocused||o===n.current){n.current=o;return}let m=Ee(o,n.current),c=Ee(n.current,o),d=t.selectionManager.selectionBehavior==="replace",r=[];if(t.selectionManager.selectedKeys.size===1&&d){let p=t.selectionManager.selectedKeys.keys().next().value;if(p!=null&&t.collection.getItem(p)){let s=l(p);s&&r.push(u.format("selectedItem",{item:s}))}}else if(m.size===1&&c.size===0){let p=m.keys().next().value;if(p!=null){let s=l(p);s&&r.push(u.format("selectedItem",{item:s}))}}else if(c.size===1&&m.size===0){let p=c.keys().next().value;if(p!=null&&t.collection.getItem(p)){let s=l(p);s&&r.push(u.format("deselectedItem",{item:s}))}}t.selectionManager.selectionMode==="multiple"&&(r.length===0||o==="all"||o.size>1||n.current==="all"||((a=n.current)===null||a===void 0?void 0:a.size)>1)&&r.push(o==="all"?u.format("selectedAll"):u.format("selectedCount",{count:o.size})),r.length>0&&ll(r.join(" ")),n.current=o});Me(()=>{if(t.selectionManager.isFocused)i();else{let a=requestAnimationFrame(i);return()=>cancelAnimationFrame(a)}},[o,t.selectionManager.isFocused])}function Ee(e,t){let l=new Set;if(e==="all"||t==="all")return l;for(let u of e.keys())t.has(u)||l.add(u);return l}function fu(e){return e&&e.__esModule?e.default:e}function hu(e){let t=_(fu(oe),"@react-aria/grid"),l=Vl(),u=(l==="pointer"||l==="virtual"||l==null)&&typeof window<"u"&&"ontouchstart"in window,o=B.useMemo(()=>{let i=e.selectionManager.selectionMode,a=e.selectionManager.selectionBehavior,m;return u&&(m=t.format("longPressToSelect")),a==="replace"&&i!=="none"&&e.hasItemActions?m:void 0},[e.selectionManager.selectionMode,e.selectionManager.selectionBehavior,e.hasItemActions,t,u]);return fe(o)}function vu(e,t,l){let{isVirtualized:u,disallowTypeAhead:o,keyboardDelegate:n,focusMode:i,scrollRef:a,getRowText:m,onRowAction:c,onCellAction:d,escapeKeyBehavior:r="clearSelection",shouldSelectOnPressUp:p}=e,{selectionManager:s}=t;!e["aria-label"]&&!e["aria-labelledby"]&&console.warn("An aria-label or aria-labelledby prop is required for accessibility.");let b=ze({usage:"search",sensitivity:"base"}),{direction:v}=ue(),g=t.selectionManager.disabledBehavior,x=B.useMemo(()=>n||new yt({collection:t.collection,disabledKeys:t.disabledKeys,disabledBehavior:g,ref:l,direction:v,collator:b,focusMode:i}),[n,t.collection,t.disabledKeys,g,l,v,b,i]),{collectionProps:D}=Ol({ref:l,selectionManager:s,keyboardDelegate:x,isVirtualized:u,scrollRef:a,disallowTypeAhead:o,escapeKeyBehavior:r}),y=pe(e.id);ve.set(t,{keyboardDelegate:x,actions:{onRowAction:c,onCellAction:d},shouldSelectOnPressUp:p});let $=hu({selectionManager:s,hasItemActions:!!(c||d)}),f=Hl(e,{labelable:!0}),E=B.useCallback(C=>{if(s.isFocused){C.currentTarget.contains(C.target)||s.setFocused(!1);return}C.currentTarget.contains(C.target)&&s.setFocused(!0)},[s]),S=B.useMemo(()=>({onBlur:D.onBlur,onFocus:E}),[E,D.onBlur]),A=au(l,{isDisabled:t.collection.size!==0}),k=J(f,{role:"grid",id:y,"aria-multiselectable":s.selectionMode==="multiple"?"true":void 0},t.isKeyboardNavigationDisabled?S:D,t.collection.size===0&&{tabIndex:A?-1:0}||void 0,$);return u&&(k["aria-rowcount"]=t.collection.size,k["aria-colcount"]=t.collection.columnCount),bu({getRowText:m},t),{gridProps:k}}function gu(){return{rowGroupProps:{role:"rowgroup"}}}function $u(e,t,l){var u,o;let{node:n,isVirtualized:i,shouldSelectOnPressUp:a,onAction:m}=e,{actions:c,shouldSelectOnPressUp:d}=ve.get(t),r=c.onRowAction?()=>{var g;return(g=c.onRowAction)===null||g===void 0?void 0:g.call(c,n.key)}:m,{itemProps:p,...s}=Ie({selectionManager:t.selectionManager,key:n.key,ref:l,isVirtualized:i,shouldSelectOnPressUp:d||a,onAction:r||!(n==null||(u=n.props)===null||u===void 0)&&u.onAction?Ll(n==null||(o=n.props)===null||o===void 0?void 0:o.onAction,r):void 0,isDisabled:t.collection.size===0}),b=t.selectionManager.isSelected(n.key),v={role:"row","aria-selected":t.selectionManager.selectionMode!=="none"?b:void 0,"aria-disabled":s.isDisabled||void 0,...p};return i&&(v["aria-rowindex"]=n.index+1),{rowProps:v,...s}}function ul(e,t,l){let{node:u,isVirtualized:o,focusMode:n="child",shouldSelectOnPressUp:i,onAction:a}=e,{direction:m}=ue(),{keyboardDelegate:c,actions:{onCellAction:d}}=ve.get(t),r=B.useRef(null),p=()=>{if(l.current){let y=ae(l.current);if(n==="child"){if(l.current.contains(document.activeElement)&&l.current!==document.activeElement)return;let $=t.selectionManager.childFocusStrategy==="last"?re(y):y.firstChild();if($){L($);return}}(r.current!=null&&u.key!==r.current||!l.current.contains(document.activeElement))&&L(l.current)}},{itemProps:s,isPressed:b}=Ie({selectionManager:t.selectionManager,key:u.key,ref:l,isVirtualized:o,focus:p,shouldSelectOnPressUp:i,onAction:d?()=>d(u.key):a,isDisabled:t.collection.size===0}),v=y=>{if(!y.currentTarget.contains(y.target)||t.isKeyboardNavigationDisabled||!l.current||!document.activeElement)return;let $=ae(l.current);switch($.currentNode=document.activeElement,y.key){case"ArrowLeft":{let C=m==="rtl"?$.nextNode():$.previousNode();if(n==="child"&&C===l.current&&(C=null),y.preventDefault(),y.stopPropagation(),C)L(C),Y(C,{containingElement:Z(l.current)});else{var f;if(((f=c.getKeyLeftOf)===null||f===void 0?void 0:f.call(c,u.key))!==u.key){var E;(E=l.current.parentElement)===null||E===void 0||E.dispatchEvent(new KeyboardEvent(y.nativeEvent.type,y.nativeEvent));break}n==="cell"&&m==="rtl"?(L(l.current),Y(l.current,{containingElement:Z(l.current)})):($.currentNode=l.current,C=m==="rtl"?$.firstChild():re($),C&&(L(C),Y(C,{containingElement:Z(l.current)})))}break}case"ArrowRight":{let C=m==="rtl"?$.previousNode():$.nextNode();if(n==="child"&&C===l.current&&(C=null),y.preventDefault(),y.stopPropagation(),C)L(C),Y(C,{containingElement:Z(l.current)});else{var S;if(((S=c.getKeyRightOf)===null||S===void 0?void 0:S.call(c,u.key))!==u.key){var A;(A=l.current.parentElement)===null||A===void 0||A.dispatchEvent(new KeyboardEvent(y.nativeEvent.type,y.nativeEvent));break}n==="cell"&&m==="ltr"?(L(l.current),Y(l.current,{containingElement:Z(l.current)})):($.currentNode=l.current,C=m==="rtl"?re($):$.firstChild(),C&&(L(C),Y(C,{containingElement:Z(l.current)})))}break}case"ArrowUp":case"ArrowDown":if(!y.altKey&&l.current.contains(y.target)){var k;y.stopPropagation(),y.preventDefault(),(k=l.current.parentElement)===null||k===void 0||k.dispatchEvent(new KeyboardEvent(y.nativeEvent.type,y.nativeEvent))}break}},g=y=>{if(r.current=u.key,y.target!==l.current){Ul()||t.selectionManager.setFocusedKey(u.key);return}requestAnimationFrame(()=>{n==="child"&&document.activeElement===l.current&&p()})},x=J(s,{role:"gridcell",onKeyDownCapture:v,"aria-colspan":u.colSpan,"aria-colindex":u.colIndex!=null?u.colIndex+1:void 0,colSpan:o?void 0:u.colSpan,onFocus:g});var D;return o&&(x["aria-colindex"]=((D=u.colIndex)!==null&&D!==void 0?D:u.index)+1),i&&x.tabIndex!=null&&x.onPointerDown==null&&(x.onPointerDown=y=>{let $=y.currentTarget,f=$.getAttribute("tabindex");$.removeAttribute("tabindex"),requestAnimationFrame(()=>{f!=null&&$.setAttribute("tabindex",f)})}),{gridCellProps:x,isPressed:b}}function re(e){let t=null,l=null;do l=e.lastChild(),l&&(t=l);while(l);return t}function yu(e){return e&&e.__esModule?e.default:e}function xu(e,t){let{key:l}=e,u=t.selectionManager,o=pe(),n=!t.selectionManager.canSelectItem(l),i=t.selectionManager.isSelected(l),a=()=>u.toggleSelection(l);const m=_(yu(oe),"@react-aria/grid");return{checkboxProps:{id:o,"aria-label":m.format("select"),isSelected:i,isDisabled:n,onChange:a}}}class Cu extends yt{isCell(t){return t.type==="cell"||t.type==="rowheader"||t.type==="column"}getKeyBelow(t){let l=this.collection.getItem(t);if(!l)return null;if(l.type==="column"){let u=U(z(l,this.collection));if(u)return u.key;let o=this.getFirstKey();return o==null||!this.collection.getItem(o)?null:super.getKeyForItemInRowByIndex(o,l.index)}return super.getKeyBelow(t)}getKeyAbove(t){let l=this.collection.getItem(t);if(!l)return null;if(l.type==="column"){let n=l.parentKey!=null?this.collection.getItem(l.parentKey):null;return n&&n.type==="column"?n.key:null}let u=super.getKeyAbove(t),o=u!=null?this.collection.getItem(u):null;return o&&o.type!=="headerrow"?u:this.isCell(l)?this.collection.columns[l.index].key:this.collection.columns[0].key}findNextColumnKey(t){let l=this.findNextKey(t.key,o=>o.type==="column");if(l!=null)return l;let u=this.collection.headerRows[t.level];for(let o of z(u,this.collection))if(o.type==="column")return o.key;return null}findPreviousColumnKey(t){let l=this.findPreviousKey(t.key,n=>n.type==="column");if(l!=null)return l;let u=this.collection.headerRows[t.level],o=[...z(u,this.collection)];for(let n=o.length-1;n>=0;n--){let i=o[n];if(i.type==="column")return i.key}return null}getKeyRightOf(t){let l=this.collection.getItem(t);return l?l.type==="column"?this.direction==="rtl"?this.findPreviousColumnKey(l):this.findNextColumnKey(l):super.getKeyRightOf(t):null}getKeyLeftOf(t){let l=this.collection.getItem(t);return l?l.type==="column"?this.direction==="rtl"?this.findNextColumnKey(l):this.findPreviousColumnKey(l):super.getKeyLeftOf(t):null}getKeyForSearch(t,l){if(!this.collator)return null;let u=this.collection,o=l??this.getFirstKey();if(o==null)return null;let n=u.getItem(o);var i;n?.type==="cell"&&(o=(i=n.parentKey)!==null&&i!==void 0?i:null);let a=!1;for(;o!=null;){let m=u.getItem(o);if(!m)return null;if(m.textValue){let c=m.textValue.slice(0,t.length);if(this.collator.compare(c,t)===0)return m.key}for(let c of z(m,this.collection)){let d=u.columns[c.index];if(u.rowHeaderColumnKeys.has(d.key)&&c.textValue){let r=c.textValue.slice(0,t.length);if(this.collator.compare(r,t)===0){let p=l!=null?u.getItem(l):n;return p?.type==="cell"?c.key:m.key}}}o=this.getKeyBelow(o),o==null&&!a&&(o=this.getFirstKey(),a=!0)}return null}}function Du(e){return e&&e.__esModule?e.default:e}function Bu(e,t,l){let{keyboardDelegate:u,isVirtualized:o,layoutDelegate:n,layout:i}=e,a=ze({usage:"search",sensitivity:"base"}),{direction:m}=ue(),c=t.selectionManager.disabledBehavior,d=B.useMemo(()=>u||new Cu({collection:t.collection,disabledKeys:t.disabledKeys,disabledBehavior:c,ref:l,direction:m,collator:a,layoutDelegate:n,layout:i}),[u,t.collection,t.disabledKeys,c,l,m,a,n,i]),r=pe(e.id);he.set(t,r);let{gridProps:p}=vu({...e,id:r,keyboardDelegate:d},t,l);o&&(p["aria-rowcount"]=t.collection.size+t.collection.headerRows.length),le()&&"expandedKeys"in t&&(p.role="treegrid");let{column:s,direction:b}=t.sortDescriptor||{},v=_(Du(ne),"@react-aria/table"),g=B.useMemo(()=>{var D,y;let $=(y=(D=t.collection.columns.find(f=>f.key===s))===null||D===void 0?void 0:D.textValue)!==null&&y!==void 0?y:"";return b&&s?v.format(`${b}Sort`,{columnName:$}):void 0},[b,s,t.collection.columns]),x=fe(g);return Me(()=>{g&&ll(g,"assertive",500)},[g]),{gridProps:J(p,x,{"aria-describedby":[x["aria-describedby"],p["aria-describedby"]].filter(Boolean).join(" ")})}}function ku(e){return e&&e.__esModule?e.default:e}function nl(e,t,l){var u,o;let{node:n}=e,i=n.props.allowsSorting,{gridCellProps:a}=ul({...e,focusMode:"child"},t,l),m=n.props.isSelectionCell&&t.selectionManager.selectionMode==="single",{pressProps:c}=Wl({isDisabled:!i||m,onPress(){t.sort(n.key)},ref:l}),{focusableProps:d}=Gl({},l),r,p=((u=t.sortDescriptor)===null||u===void 0?void 0:u.column)===n.key,s=(o=t.sortDescriptor)===null||o===void 0?void 0:o.direction;n.props.allowsSorting&&!Ce()&&(r=p?s:"none");let b=_(ku(ne),"@react-aria/table"),v;i&&(v=`${b.format("sortable")}`,p&&s&&Ce()&&(v=`${v}, ${b.format(s)}`));let g=fe(v),x=t.collection.size===0;return B.useEffect(()=>{x&&t.selectionManager.focusedKey===n.key&&t.selectionManager.setFocusedKey(null)},[x,t.selectionManager,n.key]),{columnHeaderProps:{...J(d,a,c,g,x?{tabIndex:-1}:null),role:"columnheader",id:cu(t,n.key),"aria-colspan":n.colSpan&&n.colSpan>1?n.colSpan:void 0,"aria-sort":r}}}const Se={expand:{ltr:"ArrowRight",rtl:"ArrowLeft"},collapse:{ltr:"ArrowLeft",rtl:"ArrowRight"}};function Eu(e,t,l){let{node:u,isVirtualized:o}=e,{rowProps:n,...i}=$u(e,t,l),{direction:a}=ue();o&&!(le()&&"expandedKeys"in t)?n["aria-rowindex"]=u.index+1+t.collection.headerRows.length:delete n["aria-rowindex"];let m={};if(le()&&"expandedKeys"in t){let f=t.keyMap.get(u.key);if(f!=null){var c,d,r,p,s,b;let E=((c=f.props)===null||c===void 0?void 0:c.UNSTABLE_childItems)||((r=f.props)===null||r===void 0||(d=r.children)===null||d===void 0?void 0:d.length)>t.userColumnCount;var v,g,x,D;m={onKeyDown:S=>{(S.key===Se.expand[a]&&t.selectionManager.focusedKey===f.key&&E&&t.expandedKeys!=="all"&&!t.expandedKeys.has(f.key)||S.key===Se.collapse[a]&&t.selectionManager.focusedKey===f.key&&E&&(t.expandedKeys==="all"||t.expandedKeys.has(f.key)))&&(t.toggleKey(f.key),S.stopPropagation())},"aria-expanded":E?t.expandedKeys==="all"||t.expandedKeys.has(u.key):void 0,"aria-level":f.level,"aria-posinset":((v=f.indexOfType)!==null&&v!==void 0?v:0)+1,"aria-setsize":f.level>1?((x=(p=W((g=(s=t.keyMap.get(f.parentKey))===null||s===void 0?void 0:s.childNodes)!==null&&g!==void 0?g:[]))===null||p===void 0?void 0:p.indexOfType)!==null&&x!==void 0?x:0)+1:((D=(b=W(t.collection.body.childNodes))===null||b===void 0?void 0:b.indexOfType)!==null&&D!==void 0?D:0)+1}}}let y=Yl(u.props),$=i.hasAction?y:{};return{rowProps:{...J(n,m,$),"aria-labelledby":Re(t,u.key)},...i}}function Su(e,t,l){let{node:u,isVirtualized:o}=e,n={role:"row"};return o&&!(le()&&"expandedKeys"in t)&&(n["aria-rowindex"]=u.index+1),{rowProps:n}}function ol(e,t,l){var u;let{gridCellProps:o,isPressed:n}=ul(e,t,l),i=(u=e.node.column)===null||u===void 0?void 0:u.key;return i!=null&&t.collection.rowHeaderColumnKeys.has(i)&&(o.role="rowheader",o.id=Te(t,e.node.parentKey,i)),{gridCellProps:o,isPressed:n}}function Au(e){return e&&e.__esModule?e.default:e}function wu(e,t){let{key:l}=e;const{checkboxProps:u}=xu(e,t);return{checkboxProps:{...u,"aria-labelledby":`${u.id} ${Re(t,l)}`}}}function Nu(e){let{isEmpty:t,isSelectAll:l,selectionMode:u}=e.selectionManager;return{checkboxProps:{"aria-label":_(Au(ne),"@react-aria/table").format(u==="single"?"select":"selectAll"),isSelected:l,isDisabled:u!=="multiple"||e.collection.size===0||e.collection.rows.length===1&&e.collection.rows[0].type==="loader",isIndeterminate:!t&&!l,onChange:()=>e.selectionManager.toggleSelectAll()}}}function ge(){return gu()}var sl=T((e,t)=>{var l,u;const{as:o,className:n,node:i,slots:a,state:m,selectionMode:c,color:d,checkboxesProps:r,disableAnimation:p,classNames:s,...b}=e,v=o||"th",g=typeof v=="string",x=M(t),{columnHeaderProps:D}=nl({node:i},m,x),{isFocusVisible:y,focusProps:$}=X(),{checkboxProps:f}=Nu(m),E=K(s?.th,n,(l=i.props)==null?void 0:l.className),S=c==="single",{onChange:A,...k}=f;return h.jsx(v,{ref:x,"data-focus-visible":w(y),...I(D,$,O(i.props,{enabled:g}),O(b,{enabled:g})),className:(u=a.th)==null?void 0:u.call(a,{class:E}),children:S?h.jsx(be,{children:f["aria-label"]}):h.jsx(je,{color:d,disableAnimation:p,onValueChange:A,...I(r,k)})})});sl.displayName="HeroUI.TableSelectAllCheckbox";var il=sl;function zu(e){let{collection:t,focusMode:l}=e,u=e.UNSAFE_selectionState||Zl(e),o=B.useMemo(()=>e.disabledKeys?new Set(e.disabledKeys):new Set,[e.disabledKeys]),n=u.setFocusedKey;u.setFocusedKey=(m,c)=>{if(l==="cell"&&m!=null){let b=t.getItem(m);if(b?.type==="item"){var d,r;let v=z(b,t);var p,s;c==="last"?m=(p=(d=W(v))===null||d===void 0?void 0:d.key)!==null&&p!==void 0?p:null:m=(s=(r=U(v))===null||r===void 0?void 0:r.key)!==null&&s!==void 0?s:null}}n(m,c)};let i=B.useMemo(()=>new _l(t,u),[t,u]);const a=B.useRef(null);return B.useEffect(()=>{if(u.focusedKey!=null&&a.current&&!t.getItem(u.focusedKey)){const m=a.current.getItem(u.focusedKey),c=m?.parentKey!=null&&(m.type==="cell"||m.type==="rowheader"||m.type==="column")?a.current.getItem(m.parentKey):m;if(!c){u.setFocusedKey(null);return}const d=a.current.rows,r=t.rows,p=d.length-r.length;let s=Math.min(p>1?Math.max(c.index-p+1,0):c.index,r.length-1),b=null;for(;s>=0;){if(!i.isDisabled(r[s].key)&&r[s].type!=="headerrow"){b=r[s];break}sc.index&&(s=c.index),s--)}if(b){const v=b.hasChildNodes?[...z(b,t)]:[],g=b.hasChildNodes&&c!==m&&m&&m.index{let p=this.keyMap.get(r.key);t.visitNode&&(r=t.visitNode(r)),this.keyMap.set(r.key,r);let s=new Set,b=null,v=!1;if(r.type==="item"){var g;for(let f of r.childNodes)if(((g=f.props)===null||g===void 0?void 0:g.colSpan)!==void 0){v=!0;break}}for(let f of r.childNodes){if(f.type==="cell"&&v){var x,D;f.colspan=(x=f.props)===null||x===void 0?void 0:x.colSpan,f.colSpan=(D=f.props)===null||D===void 0?void 0:D.colSpan;var y,$;f.colIndex=b?((y=b.colIndex)!==null&&y!==void 0?y:b.index)+(($=b.colSpan)!==null&&$!==void 0?$:1):f.index}f.type==="cell"&&f.parentKey==null&&(f.parentKey=r.key),s.add(f.key),b?(b.nextKey=f.key,f.prevKey=b.key):f.prevKey=null,l(f),b=f}if(b&&(b.nextKey=null),p)for(let f of p.childNodes)s.has(f.key)||u(f)},u=r=>{this.keyMap.delete(r.key);for(let p of r.childNodes)this.keyMap.get(p.key)===p&&u(p)},o=null;for(let[r,p]of t.items.entries()){var n,i,a,m,c,d;let s={...p,level:(n=p.level)!==null&&n!==void 0?n:0,key:(i=p.key)!==null&&i!==void 0?i:"row-"+r,type:(a=p.type)!==null&&a!==void 0?a:"row",value:(m=p.value)!==null&&m!==void 0?m:null,hasChildNodes:!0,childNodes:[...p.childNodes],rendered:p.rendered,textValue:(c=p.textValue)!==null&&c!==void 0?c:"",index:(d=p.index)!==null&&d!==void 0?d:r};o?(o.nextKey=s.key,s.prevKey=o.key):s.prevKey=null,this.rows.push(s),l(s),o=s}o&&(o.nextKey=null)}}const rl="row-header-column-"+Math.random().toString(36).slice(2);let de="row-header-column-"+Math.random().toString(36).slice(2);for(;rl===de;)de="row-header-column-"+Math.random().toString(36).slice(2);function Pu(e,t){if(t.length===0)return[];let l=[],u=new Map;for(let d of t){let r=d.parentKey,p=[d];for(;r;){let s=e.get(r);if(!s)break;if(u.has(s)){var o,n;(n=(o=s).colSpan)!==null&&n!==void 0||(o.colSpan=0),s.colSpan++,s.colspan=s.colSpan;let{column:b,index:v}=u.get(s);if(v>p.length)break;for(let g=v;gd.length)),a=Array(i).fill(0).map(()=>[]),m=0;for(let d of l){let r=i-1;for(let p of d){if(p){let s=a[r],b=s.reduce((v,g)=>{var x;return v+((x=g.colSpan)!==null&&x!==void 0?x:1)},0);if(b0&&(s[s.length-1].nextKey=v.key,v.prevKey=s[s.length-1].key),s.push(v)}s.length>0&&(s[s.length-1].nextKey=p.key,p.prevKey=s[s.length-1].key),p.level=r,p.colIndex=m,s.push(p)}r--}m++}let c=0;for(let d of a){let r=d.reduce((p,s)=>{var b;return p+((b=s.colSpan)!==null&&b!==void 0?b:1)},0);if(r({type:"headerrow",key:"headerrow-"+r,index:r,value:null,rendered:null,level:0,hasChildNodes:!0,childNodes:d,textValue:""}))}class Ku extends Fu{*[Symbol.iterator](){yield*this.body.childNodes}get size(){return this._size}getKeys(){return this.keyMap.keys()}getKeyBefore(t){let l=this.keyMap.get(t);var u;return(u=l?.prevKey)!==null&&u!==void 0?u:null}getKeyAfter(t){let l=this.keyMap.get(t);var u;return(u=l?.nextKey)!==null&&u!==void 0?u:null}getFirstKey(){var t,l;return(l=(t=U(this.body.childNodes))===null||t===void 0?void 0:t.key)!==null&&l!==void 0?l:null}getLastKey(){var t,l;return(l=(t=W(this.body.childNodes))===null||t===void 0?void 0:t.key)!==null&&l!==void 0?l:null}getItem(t){var l;return(l=this.keyMap.get(t))!==null&&l!==void 0?l:null}at(t){const l=[...this.getKeys()];return this.getItem(l[t])}getChildren(t){return t===this.body.key?this.body.childNodes:super.getChildren(t)}getTextValue(t){let l=this.getItem(t);if(!l)return"";if(l.textValue)return l.textValue;let u=this.rowHeaderColumnKeys;if(u){let o=[];for(let n of l.childNodes){let i=this.columns[n.index];if(u.has(i.key)&&n.textValue&&o.push(n.textValue),o.length===u.size)break}return o.join(" ")}return""}constructor(t,l,u){let o=new Set,n=null,i=[];if(u?.showSelectionCheckboxes){let r={type:"column",key:rl,value:null,textValue:"",level:0,index:u?.showDragButtons?1:0,hasChildNodes:!1,rendered:null,childNodes:[],props:{isSelectionCell:!0}};i.unshift(r)}if(u?.showDragButtons){let r={type:"column",key:de,value:null,textValue:"",level:0,index:0,hasChildNodes:!1,rendered:null,childNodes:[],props:{isDragButtonCell:!0}};i.unshift(r)}let a=[],m=new Map,c=r=>{switch(r.type){case"body":n=r;break;case"column":m.set(r.key,r),r.hasChildNodes||(i.push(r),r.props.isRowHeader&&o.add(r.key));break;case"item":a.push(r);return}for(let p of r.childNodes)c(p)};for(let r of t)c(r);let d=Pu(m,i);if(d.forEach((r,p)=>a.splice(p,0,r)),super({columnCount:i.length,items:a,visitNode:r=>(r.column=i[r.index],r)}),this._size=0,this.columns=i,this.rowHeaderColumnKeys=o,this.body=n,this.headerRows=d,this._size=[...n.childNodes].length,this.rowHeaderColumnKeys.size===0){let r=this.columns.find(p=>{var s,b;return!(!((s=p.props)===null||s===void 0)&&s.isDragButtonCell)&&!(!((b=p.props)===null||b===void 0)&&b.isSelectionCell)});r&&this.rowHeaderColumnKeys.add(r.key)}}}const Iu={ascending:"descending",descending:"ascending"};function ju(e){let[t,l]=B.useState(!1),{selectionMode:u="none",showSelectionCheckboxes:o,showDragButtons:n}=e,i=B.useMemo(()=>({showSelectionCheckboxes:o&&u!=="none",showDragButtons:n,selectionMode:u,columns:[]}),[e.children,o,u,n]),a=ql(e,B.useCallback(r=>new Ku(r,null,i),[i]),i),{disabledKeys:m,selectionManager:c}=zu({...e,collection:a,disabledBehavior:e.disabledBehavior||"selection"});var d;return{collection:a,disabledKeys:m,selectionManager:c,showSelectionCheckboxes:e.showSelectionCheckboxes||!1,sortDescriptor:(d=e.sortDescriptor)!==null&&d!==void 0?d:null,isKeyboardNavigationDisabled:a.size===0||t,setKeyboardNavigationDisabled:l,sort(r,p){var s,b;(b=e.onSortChange)===null||b===void 0||b.call(e,{column:r,direction:p??(((s=e.sortDescriptor)===null||s===void 0?void 0:s.column)===r?Iu[e.sortDescriptor.direction]:"ascending")})}}}function al(e){return null}al.getCollectionNode=function*(t,l){let{children:u,columns:o}=t;if(l.columns=[],typeof u=="function"){if(!o)throw new Error("props.children was a function but props.columns is missing");for(let n of o)yield{type:"column",value:n,renderer:u}}else{let n=[];q.Children.forEach(u,i=>{n.push({type:"column",element:i})}),yield*n}};let Mu=al;function cl(e){return null}cl.getCollectionNode=function*(t){let{children:l,items:u}=t;yield{type:"body",hasChildNodes:!0,props:t,*childNodes(){if(typeof l=="function"){if(!u)throw new Error("props.children was a function but props.items is missing");for(let o of u)yield{type:"item",value:o,renderer:l}}else{let o=[];q.Children.forEach(l,n=>{o.push({type:"item",element:n})}),yield*o}}}};let Tu=cl;function dl(e){return null}dl.getCollectionNode=function*(t,l){let{title:u,children:o,childColumns:n}=t,i=u||o,a=t.textValue||(typeof i=="string"?i:"")||t["aria-label"],m=yield{type:"column",hasChildNodes:!!n||!!u&&q.Children.count(o)>0,rendered:i,textValue:a,props:t,*childNodes(){if(n)for(let d of n)yield{type:"column",value:d};else if(u){let d=[];q.Children.forEach(o,r=>{d.push({type:"column",element:r})}),yield*d}},shouldInvalidate(d){return c(d),!1}},c=d=>{for(let r of m)r.hasChildNodes||d.columns.push(r)};c(l)};let Ru=dl;function me(e){return null}me.getCollectionNode=function*(t,l){let{children:u,textValue:o,UNSTABLE_childItems:n}=t;yield{type:"item",props:t,textValue:o,"aria-label":t["aria-label"],hasChildNodes:!0,*childNodes(){if(l.showDragButtons&&(yield{type:"cell",key:"header-drag",props:{isDragButtonCell:!0}}),l.showSelectionCheckboxes&&l.selectionMode!=="none"&&(yield{type:"cell",key:"header",props:{isSelectionCell:!0}}),typeof u=="function"){for(let i of l.columns)yield{type:"cell",element:u(i.key),key:i.key};if(n)for(let i of n)yield{type:"item",value:i}}else{let i=[],a=[],m=0;if(q.Children.forEach(u,c=>{if(c.type===me){if(i.lengtha.key!==l.columns[m].key)||i.showSelectionCheckboxes!==l.showSelectionCheckboxes||i.showDragButtons!==l.showDragButtons||i.selectionMode!==l.selectionMode}}};let Vu=me;function ml(e){return null}ml.getCollectionNode=function*(t){let{children:l}=t,u=t.textValue||(typeof l=="string"?l:"")||t["aria-label"]||"";yield{type:"cell",props:t,rendered:l,textValue:u,"aria-label":t["aria-label"],hasChildNodes:!1}};let Ou=ml;function pl(e){var t;const l=Jl(),[u,o]=Fe(e,ke.variantKeys),{ref:n,as:i,baseRef:a,children:m,className:c,classNames:d,removeWrapper:r=!1,disableAnimation:p=(t=l?.disableAnimation)!=null?t:!1,isKeyboardNavigationDisabled:s=!1,selectionMode:b="none",topContentPlacement:v="inside",bottomContentPlacement:g="inside",selectionBehavior:x=b==="none"?null:"toggle",disabledBehavior:D="selection",showSelectionCheckboxes:y=b==="multiple"&&x!=="replace",BaseComponent:$="div",checkboxesProps:f,topContent:E,bottomContent:S,sortIcon:A,onRowAction:k,onCellAction:C,...N}=u,j=i||"table",F=typeof j=="string",R=M(n),Q=M(a),G=ju({...e,children:m,showSelectionCheckboxes:y});s&&!G.isKeyboardNavigationDisabled&&G.setKeyboardNavigationDisabled(!0);const{collection:se}=G,{layout:sn,...Fl}=e,{gridProps:$e}=Bu({...Fl},G,R),ee=b!=="none",ye=b==="multiple",H=B.useMemo(()=>ke({...o,isSelectable:ee,isMultiSelectable:ye}),[Pe(o),ee,ye]),xe=K(d?.base,c),Pl=B.useMemo(()=>{var P;return{state:G,slots:H,isSelectable:ee,collection:se,classNames:d,color:e?.color,disableAnimation:p,checkboxesProps:f,isHeaderSticky:(P=e?.isHeaderSticky)!=null?P:!1,selectionMode:b,selectionBehavior:x,disabledBehavior:D,showSelectionCheckboxes:y,onRowAction:k,onCellAction:C}},[H,G,se,ee,d,b,x,f,D,p,y,e?.color,e?.isHeaderSticky,k,C]),Kl=B.useCallback(P=>({...P,ref:Q,className:H.base({class:K(xe,P?.className)})}),[xe,H]),Il=B.useCallback(P=>({...P,ref:Q,className:H.wrapper({class:K(d?.wrapper,P?.className)})}),[d?.wrapper,H]),jl=B.useCallback(P=>({...I($e,O(N,{enabled:F}),P),onKeyDownCapture:void 0,ref:R,className:H.table({class:K(d?.table,P?.className)})}),[d?.table,F,H,$e,N]);return{BaseComponent:$,Component:j,children:m,state:G,collection:se,values:Pl,topContent:E,bottomContent:S,removeWrapper:r,topContentPlacement:v,bottomContentPlacement:g,sortIcon:A,getBaseProps:Kl,getWrapperProps:Il,getTableProps:jl}}var bl=T((e,t)=>{var l,u,o;const{as:n,className:i,node:a,rowKey:m,slots:c,state:d,classNames:r,...p}=e,s=n||"td",b=typeof s=="string",v=M(t),{gridCellProps:g}=ol({node:a},d,v),x=K(r?.td,i,(l=a.props)==null?void 0:l.className),{isFocusVisible:D,focusProps:y}=X(),$=d.selectionManager.isSelected(m),f=B.useMemo(()=>{const S=typeof a.rendered;return S!=="object"&&S!=="function"?h.jsx("span",{children:a.rendered}):a.rendered},[a.rendered]),E=((u=a.column)==null?void 0:u.props)||{};return h.jsx(s,{ref:v,"data-focus-visible":w(D),"data-selected":w($),...I(g,y,O(a.props,{enabled:b}),p),className:(o=c.td)==null?void 0:o.call(c,{align:E.align,class:x}),children:f})});bl.displayName="HeroUI.TableCell";var fl=bl,hl=T((e,t)=>{var l,u;const{as:o,className:n,node:i,rowKey:a,slots:m,state:c,color:d,disableAnimation:r,checkboxesProps:p,selectionMode:s,classNames:b,...v}=e,g=o||"td",x=typeof g=="string",D=M(t),{gridCellProps:y}=ol({node:i},c,D),{isFocusVisible:$,focusProps:f}=X(),{checkboxProps:E}=wu({key:i?.parentKey||i.key},c),S=K(b?.td,n,(l=i.props)==null?void 0:l.className),A=s==="single",{onChange:k,...C}=E,N=c.selectionManager.isSelected(a);return h.jsx(g,{ref:D,"data-focus-visible":w($),"data-selected":w(N),...I(y,f,O(i.props,{enabled:x}),v),className:(u=m.td)==null?void 0:u.call(m,{class:S}),children:A?h.jsx(be,{children:E["aria-label"]}):h.jsx(je,{color:d,disableAnimation:r,onValueChange:k,...I(p,C)})})});hl.displayName="HeroUI.TableCheckboxCell";var vl=hl,gl=T((e,t)=>{var l,u;const{as:o,className:n,children:i,node:a,slots:m,state:c,isSelectable:d,classNames:r,...p}=e,s=o||(e?.href?"a":"tr"),b=typeof s=="string",v=M(t),{rowProps:g}=Eu({node:a},c,v),x=K(r?.tr,n,(l=a.props)==null?void 0:l.className),{isFocusVisible:D,focusProps:y}=X(),$=c.disabledKeys.has(a.key),f=c.selectionManager.isSelected(a.key),{isHovered:E,hoverProps:S}=Ke({isDisabled:$}),{isFirst:A,isLast:k,isMiddle:C,isOdd:N}=B.useMemo(()=>{const j=a.key===c.collection.getFirstKey(),F=a.key===c.collection.getLastKey(),R=!j&&!F,Q=a?.index?(a.index+1)%2===0:!1;return{isFirst:j,isLast:F,isMiddle:R,isOdd:Q}},[a,c.collection]);return h.jsx(s,{ref:v,"data-disabled":w($),"data-first":w(A),"data-focus-visible":w(D),"data-hover":w(E),"data-last":w(k),"data-middle":w(C),"data-odd":w(N),"data-selected":w(f),...I(g,y,d?S:{},O(a.props,{enabled:b}),p),className:(u=m.tr)==null?void 0:u.call(m,{class:x}),children:i})});gl.displayName="HeroUI.TableRow";var $l=gl,yl=T((e,t)=>{var l;const{as:u,className:o,slots:n,state:i,collection:a,isSelectable:m,color:c,disableAnimation:d,checkboxesProps:r,selectionMode:p,classNames:s,rowVirtualizer:b,...v}=e,g=u||"tbody",x=typeof g=="string",D=M(t),{rowGroupProps:y}=ge(),$=K(s?.tbody,o),f=a?.body.props,E=f?.isLoading||f?.loadingState==="loading"||f?.loadingState==="loadingMore",S=[...a.body.childNodes],A=b.getVirtualItems();let k,C;return a.size===0&&f.emptyContent&&(k=h.jsx("tr",{role:"row",children:h.jsx("td",{className:n?.emptyWrapper({class:s?.emptyWrapper}),colSpan:a.columnCount,role:"gridcell",children:!E&&f.emptyContent})})),E&&f.loadingContent&&(C=h.jsxs("tr",{role:"row",children:[h.jsx("td",{className:n?.loadingWrapper({class:s?.loadingWrapper}),colSpan:a.columnCount,role:"gridcell",children:f.loadingContent}),!k&&a.size===0?h.jsx("td",{className:n?.emptyWrapper({class:s?.emptyWrapper})}):null]})),h.jsxs(g,{ref:D,...I(y,O(f,{enabled:x}),v),className:(l=n.tbody)==null?void 0:l.call(n,{class:$}),"data-empty":w(a.size===0),"data-loading":w(E),children:[A.map((N,j)=>{const F=S[N.index];return F?h.jsx($l,{classNames:s,isSelectable:m,node:F,slots:n,state:i,style:{transform:`translateY(${N.start-j*N.size}px)`,height:`${N.size}px`},children:[...F.childNodes].map(R=>R.props.isSelectionCell?h.jsx(vl,{checkboxesProps:r,classNames:s,color:c,disableAnimation:d,node:R,rowKey:F.key,selectionMode:p,slots:n,state:i},String(R.key)):h.jsx(fl,{classNames:s,node:R,rowKey:F.key,slots:n,state:i},String(R.key)))},String(F.key)):null}),C,k]})});yl.displayName="HeroUI.VirtualizedTableBody";var Hu=yl,xl=T((e,t)=>{var l,u,o,n,i;const{as:a,className:m,state:c,node:d,slots:r,classNames:p,sortIcon:s,...b}=e,v=a||"th",g=typeof v=="string",x=M(t),{columnHeaderProps:D}=nl({node:d},c,x),y=K(p?.th,m,(l=d.props)==null?void 0:l.className),{isFocusVisible:$,focusProps:f}=X(),{isHovered:E,hoverProps:S}=Ke({}),{hideHeader:A,align:k,...C}=d.props,N=C.allowsSorting,j={"aria-hidden":!0,"data-direction":(u=c.sortDescriptor)==null?void 0:u.direction,"data-visible":w(((o=c.sortDescriptor)==null?void 0:o.column)===d.key),className:(n=r.sortIcon)==null?void 0:n.call(r,{class:p?.sortIcon})},F=typeof s=="function"?s(j):B.isValidElement(s)&&B.cloneElement(s,j);return h.jsxs(v,{ref:x,colSpan:d.colspan,"data-focus-visible":w($),"data-hover":w(E),"data-sortable":w(N),...I(D,f,O(C,{enabled:g}),N?S:{},b),className:(i=r.th)==null?void 0:i.call(r,{align:k,class:y}),children:[A?h.jsx(be,{children:d.rendered}):d.rendered,N&&(F||h.jsx(su,{strokeWidth:3,...j}))]})});xl.displayName="HeroUI.TableColumnHeader";var Cl=xl,Dl=T((e,t)=>{var l,u;const{as:o,className:n,children:i,node:a,slots:m,classNames:c,state:d,...r}=e,p=o||"tr",s=typeof p=="string",b=M(t),{rowProps:v}=Su({node:a},d),g=K(c?.tr,n,(l=a.props)==null?void 0:l.className);return h.jsx(p,{ref:b,...I(v,O(a.props,{enabled:s}),r),className:(u=m.tr)==null?void 0:u.call(m,{class:g}),children:i})});Dl.displayName="HeroUI.TableHeaderRow";var Bl=Dl,kl=B.forwardRef((e,t)=>{var l;const{as:u,className:o,children:n,slots:i,classNames:a,...m}=e,c=u||"thead",d=M(t),{rowGroupProps:r}=ge(),p=K(a?.thead,o);return h.jsx(c,{ref:d,className:(l=i.thead)==null?void 0:l.call(i,{class:p}),...I(r,m),children:n})});kl.displayName="HeroUI.TableRowGroup";var El=kl,Lu={px:"1px",0:"0px",.5:"0.125rem",1:"0.25rem",1.5:"0.375rem",2:"0.5rem",2.5:"0.625rem",3:"0.75rem",3.5:"0.875rem",4:"1rem",5:"1.25rem",6:"1.5rem",7:"1.75rem",8:"2rem",9:"2.25rem",10:"2.5rem",11:"2.75rem",12:"3rem",14:"3.5rem",16:"4rem",20:"5rem",24:"6rem",28:"7rem",32:"8rem",36:"9rem",40:"10rem",44:"11rem",48:"12rem",52:"13rem",56:"14rem",60:"15rem",64:"16rem",72:"18rem",80:"20rem",96:"24rem"},Ae=e=>{var t;return(t=Lu[e])!=null?t:e};function Uu(e){const[t,l]=Fe(e,Be.variantKeys),{as:u,className:o,x:n=1,y:i=1,...a}=t,m=u||"span",c=B.useMemo(()=>Be({...l,className:o}),[Pe(l),o]),d=Ae(n),r=Ae(i);return{Component:m,getSpacerProps:(s={})=>({...s,...a,"aria-hidden":w(!0),className:K(c,s.className),style:{...s.style,...a.style,marginLeft:d,marginTop:r}})}}var Sl=T((e,t)=>{const{Component:l,getSpacerProps:u}=Uu({...e});return h.jsx(l,{ref:t,...u()})});Sl.displayName="HeroUI.Spacer";var Al=Sl,wl=T((e,t)=>{const{BaseComponent:l,Component:u,collection:o,values:n,topContent:i,topContentPlacement:a,bottomContentPlacement:m,bottomContent:c,getBaseProps:d,getWrapperProps:r,getTableProps:p}=pl({...e,ref:t}),{rowHeight:s=40,maxTableHeight:b=600}=e,v=B.useCallback(({children:A})=>h.jsx(l,{...r(),ref:D,style:{height:b,display:"block"},children:A}),[r,b]),x=[...o.body.childNodes].length,D=B.useRef(null),[y,$]=B.useState(0),f=B.useRef(null);B.useLayoutEffect(()=>{f.current&&$(f.current.getBoundingClientRect().height)},[f]);const E=iu({count:x,getScrollElement:()=>D.current,estimateSize:()=>s,overscan:5}),S=p();return h.jsxs("div",{...d(),children:[a==="outside"&&i,h.jsx(v,{children:h.jsxs(h.Fragment,{children:[a==="inside"&&i,h.jsxs(u,{...S,style:{height:`calc(${E.getTotalSize()+y}px)`,...S.style},children:[h.jsxs(El,{ref:f,classNames:n.classNames,slots:n.slots,children:[o.headerRows.map(A=>h.jsx(Bl,{classNames:n.classNames,node:A,slots:n.slots,state:n.state,children:[...A.childNodes].map(k=>{var C;return(C=k?.props)!=null&&C.isSelectionCell?h.jsx(il,{checkboxesProps:n.checkboxesProps,classNames:n.classNames,color:n.color,disableAnimation:n.disableAnimation,node:k,selectionMode:n.selectionMode,slots:n.slots,state:n.state},k?.key):h.jsx(Cl,{classNames:n.classNames,node:k,slots:n.slots,state:n.state},k?.key)})},A?.key)),h.jsx(Al,{as:"tr",tabIndex:-1,y:1})]}),h.jsx(Hu,{checkboxesProps:n.checkboxesProps,classNames:n.classNames,collection:n.collection,color:n.color,disableAnimation:n.disableAnimation,isSelectable:n.isSelectable,rowVirtualizer:E,selectionMode:n.selectionMode,slots:n.slots,state:n.state})]}),m==="inside"&&c]})}),m==="outside"&&c]})});wl.displayName="HeroUI.VirtualizedTable";var Wu=wl,Nl=T((e,t)=>{var l;const{as:u,className:o,slots:n,state:i,collection:a,isSelectable:m,color:c,disableAnimation:d,checkboxesProps:r,selectionMode:p,classNames:s,...b}=e,v=u||"tbody",g=typeof v=="string",x=M(t),{rowGroupProps:D}=ge(),y=K(s?.tbody,o),$=a?.body.props,f=$?.isLoading||$?.loadingState==="loading"||$?.loadingState==="loadingMore",E=B.useMemo(()=>[...a.body.childNodes].map(k=>h.jsx($l,{classNames:s,isSelectable:m,node:k,slots:n,state:i,children:[...k.childNodes].map(C=>C.props.isSelectionCell?h.jsx(vl,{checkboxesProps:r,classNames:s,color:c,disableAnimation:d,node:C,rowKey:k.key,selectionMode:p,slots:n,state:i},C.key):h.jsx(fl,{classNames:s,node:C,rowKey:k.key,slots:n,state:i},C.key))},k.key)),[a.body.childNodes,s,m,n,i]);let S,A;return a.size===0&&$.emptyContent&&(S=h.jsx("tr",{role:"row",children:h.jsx("td",{className:n?.emptyWrapper({class:s?.emptyWrapper}),colSpan:a.columnCount,role:"gridcell",children:!f&&$.emptyContent})})),f&&$.loadingContent&&(A=h.jsxs("tr",{role:"row",children:[h.jsx("td",{className:n?.loadingWrapper({class:s?.loadingWrapper}),colSpan:a.columnCount,role:"gridcell",children:$.loadingContent}),!S&&a.size===0?h.jsx("td",{className:n?.emptyWrapper({class:s?.emptyWrapper})}):null]})),h.jsxs(v,{ref:x,...I(D,O($,{enabled:g}),b),className:(l=n.tbody)==null?void 0:l.call(n,{class:y}),"data-empty":w(a.size===0),"data-loading":w(f),children:[E,A,S]})});Nl.displayName="HeroUI.TableBody";var Gu=Nl,zl=T((e,t)=>{const{BaseComponent:l,Component:u,collection:o,values:n,topContent:i,topContentPlacement:a,bottomContentPlacement:m,bottomContent:c,removeWrapper:d,sortIcon:r,getBaseProps:p,getWrapperProps:s,getTableProps:b}=pl({...e,ref:t}),{isVirtualized:v,rowHeight:g=40,maxTableHeight:x=600}=e,D=v,y=B.useCallback(({children:$})=>d?$:h.jsx(l,{...s(),children:$}),[d,s]);return D?h.jsx(Wu,{...e,ref:t,maxTableHeight:x,rowHeight:g}):h.jsxs("div",{...p(),children:[a==="outside"&&i,h.jsx(y,{children:h.jsxs(h.Fragment,{children:[a==="inside"&&i,h.jsxs(u,{...b(),children:[h.jsxs(El,{classNames:n.classNames,slots:n.slots,children:[o.headerRows.map($=>h.jsx(Bl,{classNames:n.classNames,node:$,slots:n.slots,state:n.state,children:[...$.childNodes].map(f=>{var E;return(E=f?.props)!=null&&E.isSelectionCell?h.jsx(il,{checkboxesProps:n.checkboxesProps,classNames:n.classNames,color:n.color,disableAnimation:n.disableAnimation,node:f,selectionMode:n.selectionMode,slots:n.slots,state:n.state},f?.key):h.jsx(Cl,{classNames:n.classNames,node:f,slots:n.slots,sortIcon:r,state:n.state},f?.key)})},$?.key)),h.jsx(Al,{as:"tr",tabIndex:-1,y:1})]}),h.jsx(Gu,{checkboxesProps:n.checkboxesProps,classNames:n.classNames,collection:n.collection,color:n.color,disableAnimation:n.disableAnimation,isSelectable:n.isSelectable,selectionMode:n.selectionMode,slots:n.slots,state:n.state})]}),m==="inside"&&c]})}),m==="outside"&&c]})});zl.displayName="HeroUI.Table";var Yu=zl,Zu=Ru,_u=Zu,qu=Mu,Ju=qu,Xu=Vu,Qu=Xu,en=Tu,tn=en,ln=Ou,un=ln;const nn={n_requests:"Number Of Requests",estimated_cost:"Estimated Cost ($)"},we=["model","n_requests","prompt_tokens","completion_tokens","total_tokens","estimated_cost"];function on(e){return e.replace(/(-?)(\d*)\.?(\d*)e([+-]\d+)/,function(t,l,u,o,n){return n<0?l+"0."+Array(1-n-u.length).join("0")+o+u:l+u+o+Array(n-o.length+1).join("0")})}function dn({usage:e}){const t=Object.keys(e),{isOpen:l,onOpen:u,onClose:o}=Xl(),n=()=>{o()},i=Object.keys(e[t[0]]),a=[...we.filter(s=>s==="model"||i.includes(s)),...i.filter(s=>!we.includes(s))],m=i.reduce((s,b)=>({...s,[b]:0}),{}),c=t.reduce((s,b)=>(a.reduce((v,g)=>(g==="model"||(v[g]+=e[b][g]),v),s),s),m),d=[...a.map(s=>({key:s,label:nn[s]??De.words(s).map(De.upperFirst).join(" ")}))],r=[...t.map(s=>({model:s,...e[s]})),{model:"Total",...c}],p=h.jsxs("div",{className:"p-2",children:[h.jsxs("div",{className:"flex flex-col gap-2",children:[c.prompt_tokens!==void 0&&h.jsxs("div",{className:"flex justify-between gap-2",children:[h.jsx("span",{className:"font-semibold",children:"Prompt tokens"}),h.jsx("span",{children:c.prompt_tokens})]}),c.completion_tokens!==void 0&&h.jsxs("div",{className:"flex justify-between gap-2",children:[h.jsx("span",{className:"font-semibold",children:"Completion tokens"}),h.jsx("span",{children:c.completion_tokens})]}),c.total_tokens!==void 0&&h.jsxs("div",{className:"flex justify-between gap-2",children:[h.jsx("span",{className:"font-semibold",children:"Total tokens"}),h.jsx("span",{children:c.total_tokens})]}),c.estimated_cost!==void 0&&h.jsxs("div",{className:"flex justify-between gap-2",children:[h.jsx("span",{className:"font-semibold",children:"Estimated cost"}),h.jsxs("span",{children:[on(c.estimated_cost.toString()),"$"]})]})]}),h.jsx("p",{className:"m-auto mt-2 text-center",children:"Show detailed usage breakdown by model."})]});return h.jsxs(h.Fragment,{children:[h.jsx(Ql,{content:p,placement:"bottom",children:h.jsx(eu,{isIconOnly:!0,variant:"ghost",className:"p-0","aria-label":"Open usage details",onPress:u,children:h.jsx(tu,{icon:"heroicons:information-circle"})})}),h.jsx(lu,{isOpen:l,onOpenChange:n,size:"4xl",children:h.jsx(uu,{children:h.jsxs(h.Fragment,{children:[h.jsx(ru,{className:"text-default-900 flex flex-col gap-1",children:"Usage details"}),h.jsx(nu,{children:h.jsxs(Yu,{"aria-label":"Table with detailed usage statistics for each model used to generate the message.",fullWidth:!0,children:[h.jsx(Ju,{columns:d,children:s=>h.jsx(_u,{children:s.label},s.key)}),h.jsx(tn,{items:r,children:s=>h.jsx(Qu,{className:s.model==="Total"?"border-default-200 border-t-1":"",children:b=>h.jsx(un,{children:ou(s,b)})},s.model)})]})})]})})})]})}export{dn as default}; diff --git a/packages/ragbits-chat/src/ragbits/chat/ui-build/assets/UsageButton-I3vvJAZH.js b/packages/ragbits-chat/src/ragbits/chat/ui-build/assets/UsageButton-I3vvJAZH.js new file mode 100644 index 000000000..42024c530 --- /dev/null +++ b/packages/ragbits-chat/src/ragbits/chat/ui-build/assets/UsageButton-I3vvJAZH.js @@ -0,0 +1 @@ +import{r as B,aQ as Ml,aR as ae,t as Ne,l as ie,n as z,aS as W,aT as U,aU as te,aV as Tl,W as _,aW as Rl,aX as Vl,a3 as ze,aY as ue,aZ as Ol,k as pe,a7 as Hl,a8 as J,a9 as Ll,a_ as L,as as Ul,a$ as Y,b0 as Z,b1 as le,ac as Wl,b2 as Gl,b3 as Ce,b4 as Yl,O as T,A as M,G as X,J as K,j as h,w as I,M as w,aC as be,aH as Fe,ag as O,Z as Zl,a1 as _l,a0 as ql,ai as q,x as Jl,y as Pe,H as Ke,ae as Ie,u as Xl,aF as De,D as Ql,d as eu,I as tu,m as lu,e as uu,f as nu,b5 as ou}from"./index-BTypXP0X.js";import{b as fe,a as je,C as su,u as iu}from"./index-nfbmdcVN.js";import{m as ru}from"./chunk-IGSAU2ZA-RYoue1Xd.js";function Me(e,t){const l=B.useRef(!0),u=B.useRef(null);B.useEffect(()=>(l.current=!0,()=>{l.current=!1}),[]),B.useEffect(()=>{let o=u.current;l.current?l.current=!1:(!o||t.some((n,i)=>!Object.is(n,o[i])))&&e(),u.current=t},t)}function au(e,t){let l=t?.isDisabled,[u,o]=B.useState(!1);return Ml(()=>{if(e?.current&&!l){let n=()=>{if(e.current){let a=ae(e.current,{tabbable:!0});o(!!a.nextNode())}};n();let i=new MutationObserver(n);return i.observe(e.current,{subtree:!0,childList:!0,attributes:!0,attributeFilter:["tabIndex","disabled"]}),()=>{i.disconnect()}}}),l?!1:u}var Be=Ne({base:"w-px h-px inline-block",variants:{isInline:{true:"inline-block",false:"block"}},defaultVariants:{isInline:!1}}),ke=Ne({slots:{base:"flex flex-col relative gap-4",wrapper:["p-4","z-0","flex","flex-col","relative","justify-between","gap-4","shadow-small","bg-content1","overflow-auto"],table:"min-w-full h-auto",thead:"[&>tr]:first:rounded-lg",tbody:"after:block",tr:["group/tr","outline-hidden",...ie],th:["group/th","px-3","h-10","text-start","align-middle","bg-default-100","whitespace-nowrap","text-foreground-500","text-tiny","font-semibold","first:rounded-s-lg","last:rounded-e-lg","outline-hidden","data-[sortable=true]:cursor-pointer","data-[hover=true]:text-foreground-400",...ie],td:["py-2","px-3","relative","align-middle","whitespace-normal","text-small","font-normal","outline-hidden","[&>*]:z-1","[&>*]:relative",...ie,"before:pointer-events-none","before:content-['']","before:absolute","before:z-0","before:inset-0","before:opacity-0","data-[selected=true]:before:opacity-100","group-data-[disabled=true]/tr:text-foreground-300","group-data-[disabled=true]/tr:cursor-not-allowed"],tfoot:"",sortIcon:["ms-2","mb-px","opacity-0","text-inherit","inline-block","transition-transform-opacity","data-[visible=true]:opacity-100","group-data-[hover=true]/th:opacity-100","data-[direction=ascending]:rotate-180"],emptyWrapper:"text-foreground-400 align-middle text-center h-40",loadingWrapper:"absolute inset-0 flex items-center justify-center"},variants:{color:{default:{td:"before:bg-default/60 data-[selected=true]:text-default-foreground"},primary:{td:"before:bg-primary/20 data-[selected=true]:text-primary"},secondary:{td:"before:bg-secondary/20 data-[selected=true]:text-secondary"},success:{td:"before:bg-success/20 data-[selected=true]:text-success-600 dark:data-[selected=true]:text-success"},warning:{td:"before:bg-warning/20 data-[selected=true]:text-warning-600 dark:data-[selected=true]:text-warning"},danger:{td:"before:bg-danger/20 data-[selected=true]:text-danger dark:data-[selected=true]:text-danger-500"}},layout:{auto:{table:"table-auto"},fixed:{table:"table-fixed"}},shadow:{none:{wrapper:"shadow-none"},sm:{wrapper:"shadow-small"},md:{wrapper:"shadow-medium"},lg:{wrapper:"shadow-large"}},hideHeader:{true:{thead:"hidden"}},isStriped:{true:{td:["group-data-[odd=true]/tr:before:bg-default-100","group-data-[odd=true]/tr:before:opacity-100","group-data-[odd=true]/tr:before:-z-10"]}},isCompact:{true:{td:"py-1"},false:{}},isHeaderSticky:{true:{thead:"sticky top-0 z-20 [&>tr]:first:shadow-small"}},isSelectable:{true:{tr:"cursor-default",td:["group-aria-[selected=false]/tr:group-data-[hover=true]/tr:before:bg-default-100","group-aria-[selected=false]/tr:group-data-[hover=true]/tr:before:opacity-70"]}},isMultiSelectable:{true:{td:["group-data-[first=true]/tr:first:before:rounded-ss-lg","group-data-[first=true]/tr:last:before:rounded-se-lg","group-data-[middle=true]/tr:before:rounded-none","group-data-[last=true]/tr:first:before:rounded-es-lg","group-data-[last=true]/tr:last:before:rounded-ee-lg"]},false:{td:["first:before:rounded-s-lg","last:before:rounded-e-lg"]}},radius:{none:{wrapper:"rounded-none",th:["first:rounded-s-none","first:before:rounded-s-none","last:rounded-e-none","last:before:rounded-e-none"],td:["first:before:rounded-s-none","last:before:rounded-e-none","group-data-[first=true]/tr:first:before:rounded-ss-none","group-data-[first=true]/tr:last:before:rounded-se-none","group-data-[last=true]/tr:first:before:rounded-es-none","group-data-[last=true]/tr:last:before:rounded-ee-none"]},sm:{wrapper:"rounded-small"},md:{wrapper:"rounded-medium"},lg:{wrapper:"rounded-large"}},fullWidth:{true:{base:"w-full",wrapper:"w-full",table:"w-full"}},align:{start:{th:"text-start",td:"text-start"},center:{th:"text-center",td:"text-center"},end:{th:"text-end",td:"text-end"}}},defaultVariants:{layout:"auto",shadow:"sm",radius:"lg",color:"default",isCompact:!1,hideHeader:!1,isStriped:!1,fullWidth:!0,align:"start"},compoundVariants:[{isStriped:!0,color:"default",class:{td:"group-data-[odd=true]/tr:data-[selected=true]/tr:before:bg-default/60"}},{isStriped:!0,color:"primary",class:{td:"group-data-[odd=true]/tr:data-[selected=true]/tr:before:bg-primary/20"}},{isStriped:!0,color:"secondary",class:{td:"group-data-[odd=true]/tr:data-[selected=true]/tr:before:bg-secondary/20"}},{isStriped:!0,color:"success",class:{td:"group-data-[odd=true]/tr:data-[selected=true]/tr:before:bg-success/20"}},{isStriped:!0,color:"warning",class:{td:"group-data-[odd=true]/tr:data-[selected=true]/tr:before:bg-warning/20"}},{isStriped:!0,color:"danger",class:{td:"group-data-[odd=true]/tr:data-[selected=true]/tr:before:bg-danger/20"}}]});const he=new WeakMap;function ce(e){return typeof e=="string"?e.replace(/\s*/g,""):""+e}function cu(e,t){let l=he.get(e);if(!l)throw new Error("Unknown grid");return`${l}-${ce(t)}`}function Te(e,t,l){let u=he.get(e);if(!u)throw new Error("Unknown grid");return`${u}-${ce(t)}-${ce(l)}`}function Re(e,t){return[...e.collection.rowHeaderColumnKeys].map(l=>Te(e,t,l)).join(" ")}var Ve={};Ve={ascending:"تصاعدي",ascendingSort:e=>`ترتيب حسب العمود ${e.columnName} بترتيب تصاعدي`,columnSize:e=>`${e.value} بالبكسل`,descending:"تنازلي",descendingSort:e=>`ترتيب حسب العمود ${e.columnName} بترتيب تنازلي`,resizerDescription:"اضغط على مفتاح Enter لبدء تغيير الحجم",select:"تحديد",selectAll:"تحديد الكل",sortable:"عمود قابل للترتيب"};var Oe={};Oe={ascending:"възходящ",ascendingSort:e=>`сортирано по колона ${e.columnName} във възходящ ред`,columnSize:e=>`${e.value} пиксела`,descending:"низходящ",descendingSort:e=>`сортирано по колона ${e.columnName} в низходящ ред`,resizerDescription:"Натиснете „Enter“, за да започнете да преоразмерявате",select:"Изберете",selectAll:"Изберете всичко",sortable:"сортираща колона"};var He={};He={ascending:"vzestupně",ascendingSort:e=>`řazeno vzestupně podle sloupce ${e.columnName}`,columnSize:e=>`${e.value} pixelů`,descending:"sestupně",descendingSort:e=>`řazeno sestupně podle sloupce ${e.columnName}`,resizerDescription:"Stisknutím klávesy Enter začnete měnit velikost",select:"Vybrat",selectAll:"Vybrat vše",sortable:"sloupec s možností řazení"};var Le={};Le={ascending:"stigende",ascendingSort:e=>`sorteret efter kolonne ${e.columnName} i stigende rækkefølge`,columnSize:e=>`${e.value} pixels`,descending:"faldende",descendingSort:e=>`sorteret efter kolonne ${e.columnName} i faldende rækkefølge`,resizerDescription:"Tryk på Enter for at ændre størrelse",select:"Vælg",selectAll:"Vælg alle",sortable:"sorterbar kolonne"};var Ue={};Ue={ascending:"aufsteigend",ascendingSort:e=>`sortiert nach Spalte ${e.columnName} in aufsteigender Reihenfolge`,columnSize:e=>`${e.value} Pixel`,descending:"absteigend",descendingSort:e=>`sortiert nach Spalte ${e.columnName} in absteigender Reihenfolge`,resizerDescription:"Eingabetaste zum Starten der Größenänderung drücken",select:"Auswählen",selectAll:"Alles auswählen",sortable:"sortierbare Spalte"};var We={};We={ascending:"αύξουσα",ascendingSort:e=>`διαλογή ανά στήλη ${e.columnName} σε αύξουσα σειρά`,columnSize:e=>`${e.value} pixel`,descending:"φθίνουσα",descendingSort:e=>`διαλογή ανά στήλη ${e.columnName} σε φθίνουσα σειρά`,resizerDescription:"Πατήστε Enter για έναρξη της αλλαγής μεγέθους",select:"Επιλογή",selectAll:"Επιλογή όλων",sortable:"Στήλη διαλογής"};var Ge={};Ge={select:"Select",selectAll:"Select All",sortable:"sortable column",ascending:"ascending",descending:"descending",ascendingSort:e=>`sorted by column ${e.columnName} in ascending order`,descendingSort:e=>`sorted by column ${e.columnName} in descending order`,columnSize:e=>`${e.value} pixels`,resizerDescription:"Press Enter to start resizing"};var Ye={};Ye={ascending:"ascendente",ascendingSort:e=>`ordenado por columna ${e.columnName} en sentido ascendente`,columnSize:e=>`${e.value} píxeles`,descending:"descendente",descendingSort:e=>`ordenado por columna ${e.columnName} en orden descendente`,resizerDescription:"Pulse Intro para empezar a redimensionar",select:"Seleccionar",selectAll:"Seleccionar todos",sortable:"columna ordenable"};var Ze={};Ze={ascending:"tõusev järjestus",ascendingSort:e=>`sorditud veeru järgi ${e.columnName} tõusvas järjestuses`,columnSize:e=>`${e.value} pikslit`,descending:"laskuv järjestus",descendingSort:e=>`sorditud veeru järgi ${e.columnName} laskuvas järjestuses`,resizerDescription:"Suuruse muutmise alustamiseks vajutage klahvi Enter",select:"Vali",selectAll:"Vali kõik",sortable:"sorditav veerg"};var _e={};_e={ascending:"nouseva",ascendingSort:e=>`lajiteltu sarakkeen ${e.columnName} mukaan nousevassa järjestyksessä`,columnSize:e=>`${e.value} pikseliä`,descending:"laskeva",descendingSort:e=>`lajiteltu sarakkeen ${e.columnName} mukaan laskevassa järjestyksessä`,resizerDescription:"Aloita koon muutos painamalla Enter-näppäintä",select:"Valitse",selectAll:"Valitse kaikki",sortable:"lajiteltava sarake"};var qe={};qe={ascending:"croissant",ascendingSort:e=>`trié en fonction de la colonne ${e.columnName} par ordre croissant`,columnSize:e=>`${e.value} pixels`,descending:"décroissant",descendingSort:e=>`trié en fonction de la colonne ${e.columnName} par ordre décroissant`,resizerDescription:"Appuyez sur Entrée pour commencer le redimensionnement.",select:"Sélectionner",selectAll:"Sélectionner tout",sortable:"colonne triable"};var Je={};Je={ascending:"עולה",ascendingSort:e=>`מוין לפי עמודה ${e.columnName} בסדר עולה`,columnSize:e=>`${e.value} פיקסלים`,descending:"יורד",descendingSort:e=>`מוין לפי עמודה ${e.columnName} בסדר יורד`,resizerDescription:"הקש Enter כדי לשנות את הגודל",select:"בחר",selectAll:"בחר הכול",sortable:"עמודה שניתן למיין"};var Xe={};Xe={ascending:"rastući",ascendingSort:e=>`razvrstano po stupcima ${e.columnName} rastućem redoslijedom`,columnSize:e=>`${e.value} piksela`,descending:"padajući",descendingSort:e=>`razvrstano po stupcima ${e.columnName} padajućim redoslijedom`,resizerDescription:"Pritisnite Enter da biste započeli promenu veličine",select:"Odaberite",selectAll:"Odaberite sve",sortable:"stupac koji se može razvrstati"};var Qe={};Qe={ascending:"növekvő",ascendingSort:e=>`rendezve a(z) ${e.columnName} oszlop szerint, növekvő sorrendben`,columnSize:e=>`${e.value} képpont`,descending:"csökkenő",descendingSort:e=>`rendezve a(z) ${e.columnName} oszlop szerint, csökkenő sorrendben`,resizerDescription:"Nyomja le az Enter billentyűt az átméretezés megkezdéséhez",select:"Kijelölés",selectAll:"Összes kijelölése",sortable:"rendezendő oszlop"};var et={};et={ascending:"crescente",ascendingSort:e=>`in ordine crescente in base alla colonna ${e.columnName}`,columnSize:e=>`${e.value} pixel`,descending:"decrescente",descendingSort:e=>`in ordine decrescente in base alla colonna ${e.columnName}`,resizerDescription:"Premi Invio per iniziare a ridimensionare",select:"Seleziona",selectAll:"Seleziona tutto",sortable:"colonna ordinabile"};var tt={};tt={ascending:"昇順",ascendingSort:e=>`列 ${e.columnName} を昇順で並べ替え`,columnSize:e=>`${e.value} ピクセル`,descending:"降順",descendingSort:e=>`列 ${e.columnName} を降順で並べ替え`,resizerDescription:"Enter キーを押してサイズ変更を開始",select:"選択",selectAll:"すべて選択",sortable:"並べ替え可能な列"};var lt={};lt={ascending:"오름차순",ascendingSort:e=>`${e.columnName} 열을 기준으로 오름차순으로 정렬됨`,columnSize:e=>`${e.value} 픽셀`,descending:"내림차순",descendingSort:e=>`${e.columnName} 열을 기준으로 내림차순으로 정렬됨`,resizerDescription:"크기 조정을 시작하려면 Enter를 누르세요.",select:"선택",selectAll:"모두 선택",sortable:"정렬 가능한 열"};var ut={};ut={ascending:"didėjančia tvarka",ascendingSort:e=>`surikiuota pagal stulpelį ${e.columnName} didėjančia tvarka`,columnSize:e=>`${e.value} piks.`,descending:"mažėjančia tvarka",descendingSort:e=>`surikiuota pagal stulpelį ${e.columnName} mažėjančia tvarka`,resizerDescription:"Paspauskite „Enter“, kad pradėtumėte keisti dydį",select:"Pasirinkti",selectAll:"Pasirinkti viską",sortable:"rikiuojamas stulpelis"};var nt={};nt={ascending:"augošā secībā",ascendingSort:e=>`kārtots pēc kolonnas ${e.columnName} augošā secībā`,columnSize:e=>`${e.value} pikseļi`,descending:"dilstošā secībā",descendingSort:e=>`kārtots pēc kolonnas ${e.columnName} dilstošā secībā`,resizerDescription:"Nospiediet Enter, lai sāktu izmēru mainīšanu",select:"Atlasīt",selectAll:"Atlasīt visu",sortable:"kārtojamā kolonna"};var ot={};ot={ascending:"stigende",ascendingSort:e=>`sortert etter kolonne ${e.columnName} i stigende rekkefølge`,columnSize:e=>`${e.value} piksler`,descending:"synkende",descendingSort:e=>`sortert etter kolonne ${e.columnName} i synkende rekkefølge`,resizerDescription:"Trykk på Enter for å starte størrelsesendring",select:"Velg",selectAll:"Velg alle",sortable:"kolonne som kan sorteres"};var st={};st={ascending:"oplopend",ascendingSort:e=>`gesorteerd in oplopende volgorde in kolom ${e.columnName}`,columnSize:e=>`${e.value} pixels`,descending:"aflopend",descendingSort:e=>`gesorteerd in aflopende volgorde in kolom ${e.columnName}`,resizerDescription:"Druk op Enter om het formaat te wijzigen",select:"Selecteren",selectAll:"Alles selecteren",sortable:"sorteerbare kolom"};var it={};it={ascending:"rosnąco",ascendingSort:e=>`posortowano według kolumny ${e.columnName} w porządku rosnącym`,columnSize:e=>`Liczba pikseli: ${e.value}`,descending:"malejąco",descendingSort:e=>`posortowano według kolumny ${e.columnName} w porządku malejącym`,resizerDescription:"Naciśnij Enter, aby rozpocząć zmienianie rozmiaru",select:"Zaznacz",selectAll:"Zaznacz wszystko",sortable:"kolumna z możliwością sortowania"};var rt={};rt={ascending:"crescente",ascendingSort:e=>`classificado pela coluna ${e.columnName} em ordem crescente`,columnSize:e=>`${e.value} pixels`,descending:"decrescente",descendingSort:e=>`classificado pela coluna ${e.columnName} em ordem decrescente`,resizerDescription:"Pressione Enter para começar a redimensionar",select:"Selecionar",selectAll:"Selecionar tudo",sortable:"coluna classificável"};var at={};at={ascending:"ascendente",ascendingSort:e=>`Ordenar por coluna ${e.columnName} em ordem ascendente`,columnSize:e=>`${e.value} pixels`,descending:"descendente",descendingSort:e=>`Ordenar por coluna ${e.columnName} em ordem descendente`,resizerDescription:"Prima Enter para iniciar o redimensionamento",select:"Selecionar",selectAll:"Selecionar tudo",sortable:"Coluna ordenável"};var ct={};ct={ascending:"crescătoare",ascendingSort:e=>`sortate după coloana ${e.columnName} în ordine crescătoare`,columnSize:e=>`${e.value} pixeli`,descending:"descrescătoare",descendingSort:e=>`sortate după coloana ${e.columnName} în ordine descrescătoare`,resizerDescription:"Apăsați pe Enter pentru a începe redimensionarea",select:"Selectare",selectAll:"Selectare totală",sortable:"coloană sortabilă"};var dt={};dt={ascending:"возрастание",ascendingSort:e=>`сортировать столбец ${e.columnName} в порядке возрастания`,columnSize:e=>`${e.value} пикс.`,descending:"убывание",descendingSort:e=>`сортировать столбец ${e.columnName} в порядке убывания`,resizerDescription:"Нажмите клавишу Enter для начала изменения размеров",select:"Выбрать",selectAll:"Выбрать все",sortable:"сортируемый столбец"};var mt={};mt={ascending:"vzostupne",ascendingSort:e=>`zoradené zostupne podľa stĺpca ${e.columnName}`,columnSize:e=>`Počet pixelov: ${e.value}`,descending:"zostupne",descendingSort:e=>`zoradené zostupne podľa stĺpca ${e.columnName}`,resizerDescription:"Stlačením klávesu Enter začnete zmenu veľkosti",select:"Vybrať",selectAll:"Vybrať všetko",sortable:"zoraditeľný stĺpec"};var pt={};pt={ascending:"naraščajoče",ascendingSort:e=>`razvrščeno po stolpcu ${e.columnName} v naraščajočem vrstnem redu`,columnSize:e=>`${e.value} slikovnih pik`,descending:"padajoče",descendingSort:e=>`razvrščeno po stolpcu ${e.columnName} v padajočem vrstnem redu`,resizerDescription:"Pritisnite tipko Enter da začnete spreminjati velikost",select:"Izberite",selectAll:"Izberite vse",sortable:"razvrstljivi stolpec"};var bt={};bt={ascending:"rastući",ascendingSort:e=>`sortirano po kolonama ${e.columnName} rastućim redosledom`,columnSize:e=>`${e.value} piksela`,descending:"padajući",descendingSort:e=>`sortirano po kolonama ${e.columnName} padajućim redosledom`,resizerDescription:"Pritisnite Enter da biste započeli promenu veličine",select:"Izaberite",selectAll:"Izaberite sve",sortable:"kolona koja se može sortirati"};var ft={};ft={ascending:"stigande",ascendingSort:e=>`sorterat på kolumn ${e.columnName} i stigande ordning`,columnSize:e=>`${e.value} pixlar`,descending:"fallande",descendingSort:e=>`sorterat på kolumn ${e.columnName} i fallande ordning`,resizerDescription:"Tryck på Retur för att börja ändra storlek",select:"Markera",selectAll:"Markera allt",sortable:"sorterbar kolumn"};var ht={};ht={ascending:"artan sırada",ascendingSort:e=>`${e.columnName} sütuna göre artan düzende sırala`,columnSize:e=>`${e.value} piksel`,descending:"azalan sırada",descendingSort:e=>`${e.columnName} sütuna göre azalan düzende sırala`,resizerDescription:"Yeniden boyutlandırmak için Enter'a basın",select:"Seç",selectAll:"Tümünü Seç",sortable:"Sıralanabilir sütun"};var vt={};vt={ascending:"висхідний",ascendingSort:e=>`відсортовано за стовпцем ${e.columnName} у висхідному порядку`,columnSize:e=>`${e.value} пікс.`,descending:"низхідний",descendingSort:e=>`відсортовано за стовпцем ${e.columnName} у низхідному порядку`,resizerDescription:"Натисніть Enter, щоб почати зміну розміру",select:"Вибрати",selectAll:"Вибрати все",sortable:"сортувальний стовпець"};var gt={};gt={ascending:"升序",ascendingSort:e=>`按列 ${e.columnName} 升序排序`,columnSize:e=>`${e.value} 像素`,descending:"降序",descendingSort:e=>`按列 ${e.columnName} 降序排序`,resizerDescription:"按“输入”键开始调整大小。",select:"选择",selectAll:"全选",sortable:"可排序的列"};var $t={};$t={ascending:"遞增",ascendingSort:e=>`已依據「${e.columnName}」欄遞增排序`,columnSize:e=>`${e.value} 像素`,descending:"遞減",descendingSort:e=>`已依據「${e.columnName}」欄遞減排序`,resizerDescription:"按 Enter 鍵以開始調整大小",select:"選取",selectAll:"全選",sortable:"可排序的欄"};var ne={};ne={"ar-AE":Ve,"bg-BG":Oe,"cs-CZ":He,"da-DK":Le,"de-DE":Ue,"el-GR":We,"en-US":Ge,"es-ES":Ye,"et-EE":Ze,"fi-FI":_e,"fr-FR":qe,"he-IL":Je,"hr-HR":Xe,"hu-HU":Qe,"it-IT":et,"ja-JP":tt,"ko-KR":lt,"lt-LT":ut,"lv-LV":nt,"nb-NO":ot,"nl-NL":st,"pl-PL":it,"pt-BR":rt,"pt-PT":at,"ro-RO":ct,"ru-RU":dt,"sk-SK":mt,"sl-SI":pt,"sr-SP":bt,"sv-SE":ft,"tr-TR":ht,"uk-UA":vt,"zh-CN":gt,"zh-TW":$t};class yt{isCell(t){return t.type==="cell"}isRow(t){return t.type==="row"||t.type==="item"}isDisabled(t){var l;return this.disabledBehavior==="all"&&(((l=t.props)===null||l===void 0?void 0:l.isDisabled)||this.disabledKeys.has(t.key))}findPreviousKey(t,l){let u=t!=null?this.collection.getKeyBefore(t):this.collection.getLastKey();for(;u!=null;){let o=this.collection.getItem(u);if(!o)return null;if(!this.isDisabled(o)&&(!l||l(o)))return u;u=this.collection.getKeyBefore(u)}return null}findNextKey(t,l){let u=t!=null?this.collection.getKeyAfter(t):this.collection.getFirstKey();for(;u!=null;){let o=this.collection.getItem(u);if(!o)return null;if(!this.isDisabled(o)&&(!l||l(o)))return u;if(u=this.collection.getKeyAfter(u),u==null)return null}return null}getKeyForItemInRowByIndex(t,l=0){if(l<0)return null;let u=this.collection.getItem(t);if(!u)return null;let o=0;for(let a of z(u,this.collection)){var n;if(a.colSpan&&a.colSpan+o>l)return(n=a.key)!==null&&n!==void 0?n:null;a.colSpan&&(o=o+a.colSpan-1);var i;if(o===l)return(i=a.key)!==null&&i!==void 0?i:null;o++}return null}getKeyBelow(t){let l=t,u=this.collection.getItem(l);if(!u)return null;var o;if(this.isCell(u)&&(l=(o=u.parentKey)!==null&&o!==void 0?o:null),l==null)return null;if(l=this.findNextKey(l,n=>n.type==="item"),l!=null){if(this.isCell(u)){let n=u.colIndex?u.colIndex:u.index;return this.getKeyForItemInRowByIndex(l,n)}if(this.focusMode==="row")return l}return null}getKeyAbove(t){let l=t,u=this.collection.getItem(l);if(!u)return null;var o;if(this.isCell(u)&&(l=(o=u.parentKey)!==null&&o!==void 0?o:null),l==null)return null;if(l=this.findPreviousKey(l,n=>n.type==="item"),l!=null){if(this.isCell(u)){let n=u.colIndex?u.colIndex:u.index;return this.getKeyForItemInRowByIndex(l,n)}if(this.focusMode==="row")return l}return null}getKeyRightOf(t){let l=this.collection.getItem(t);if(!l)return null;if(this.isRow(l)){var u,o;let d=z(l,this.collection);var n;return(n=this.direction==="rtl"?(u=W(d))===null||u===void 0?void 0:u.key:(o=U(d))===null||o===void 0?void 0:o.key)!==null&&n!==void 0?n:null}if(this.isCell(l)&&l.parentKey!=null){let d=this.collection.getItem(l.parentKey);if(!d)return null;let r=z(d,this.collection);var i;let p=(i=this.direction==="rtl"?te(r,l.index-1):te(r,l.index+1))!==null&&i!==void 0?i:null;var a;if(p)return(a=p.key)!==null&&a!==void 0?a:null;var m;if(this.focusMode==="row")return(m=l.parentKey)!==null&&m!==void 0?m:null;var c;return(c=this.direction==="rtl"?this.getFirstKey(t):this.getLastKey(t))!==null&&c!==void 0?c:null}return null}getKeyLeftOf(t){let l=this.collection.getItem(t);if(!l)return null;if(this.isRow(l)){var u,o;let d=z(l,this.collection);var n;return(n=this.direction==="rtl"?(u=U(d))===null||u===void 0?void 0:u.key:(o=W(d))===null||o===void 0?void 0:o.key)!==null&&n!==void 0?n:null}if(this.isCell(l)&&l.parentKey!=null){let d=this.collection.getItem(l.parentKey);if(!d)return null;let r=z(d,this.collection);var i;let p=(i=this.direction==="rtl"?te(r,l.index+1):te(r,l.index-1))!==null&&i!==void 0?i:null;var a;if(p)return(a=p.key)!==null&&a!==void 0?a:null;var m;if(this.focusMode==="row")return(m=l.parentKey)!==null&&m!==void 0?m:null;var c;return(c=this.direction==="rtl"?this.getLastKey(t):this.getFirstKey(t))!==null&&c!==void 0?c:null}return null}getFirstKey(t,l){let u=t??null,o;if(u!=null){if(o=this.collection.getItem(u),!o)return null;if(this.isCell(o)&&!l&&o.parentKey!=null){var n;let c=this.collection.getItem(o.parentKey);if(!c)return null;var i;return(i=(n=U(z(c,this.collection)))===null||n===void 0?void 0:n.key)!==null&&i!==void 0?i:null}}if(u=this.findNextKey(void 0,c=>c.type==="item"),u!=null&&(o&&this.isCell(o)&&l||this.focusMode==="cell")){var a;let c=this.collection.getItem(u);if(!c)return null;var m;u=(m=(a=U(z(c,this.collection)))===null||a===void 0?void 0:a.key)!==null&&m!==void 0?m:null}return u}getLastKey(t,l){let u=t??null,o;if(u!=null){if(o=this.collection.getItem(u),!o)return null;if(this.isCell(o)&&!l&&o.parentKey!=null){var n;let c=this.collection.getItem(o.parentKey);if(!c)return null;let d=z(c,this.collection);var i;return(i=(n=W(d))===null||n===void 0?void 0:n.key)!==null&&i!==void 0?i:null}}if(u=this.findPreviousKey(void 0,c=>c.type==="item"),u!=null&&(o&&this.isCell(o)&&l||this.focusMode==="cell")){var a;let c=this.collection.getItem(u);if(!c)return null;let d=z(c,this.collection);var m;u=(m=(a=W(d))===null||a===void 0?void 0:a.key)!==null&&m!==void 0?m:null}return u}getKeyPageAbove(t){let l=t,u=this.layoutDelegate.getItemRect(l);if(!u)return null;let o=Math.max(0,u.y+u.height-this.layoutDelegate.getVisibleRect().height);for(;u&&u.y>o&&l!=null;){var n;if(l=(n=this.getKeyAbove(l))!==null&&n!==void 0?n:null,l==null)break;u=this.layoutDelegate.getItemRect(l)}return l}getKeyPageBelow(t){let l=t,u=this.layoutDelegate.getItemRect(l);if(!u)return null;let o=this.layoutDelegate.getVisibleRect().height,n=Math.min(this.layoutDelegate.getContentSize().height,u.y+o);for(;u&&u.y+u.heightr.type==="item"),u==null&&!a&&(u=this.getFirstKey(),a=!0)}return null}constructor(t){if(this.collection=t.collection,this.disabledKeys=t.disabledKeys,this.disabledBehavior=t.disabledBehavior||"all",this.direction=t.direction,this.collator=t.collator,!t.layout&&!t.ref)throw new Error("Either a layout or a ref must be specified.");this.layoutDelegate=t.layoutDelegate||(t.layout?new du(t.layout):new Tl(t.ref)),this.focusMode=t.focusMode||"row"}}class du{getContentSize(){return this.layout.getContentSize()}getItemRect(t){var l;return((l=this.layout.getLayoutInfo(t))===null||l===void 0?void 0:l.rect)||null}getVisibleRect(){return this.layout.virtualizer.visibleRect}constructor(t){this.layout=t}}const ve=new WeakMap;var xt={};xt={deselectedItem:e=>`${e.item} غير المحدد`,longPressToSelect:"اضغط مطولًا للدخول إلى وضع التحديد.",select:"تحديد",selectedAll:"جميع العناصر المحددة.",selectedCount:(e,t)=>`${t.plural(e.count,{"=0":"لم يتم تحديد عناصر",one:()=>`${t.number(e.count)} عنصر محدد`,other:()=>`${t.number(e.count)} عنصر محدد`})}.`,selectedItem:e=>`${e.item} المحدد`};var Ct={};Ct={deselectedItem:e=>`${e.item} не е избран.`,longPressToSelect:"Натиснете и задръжте за да влезете в избирателен режим.",select:"Изберете",selectedAll:"Всички елементи са избрани.",selectedCount:(e,t)=>`${t.plural(e.count,{"=0":"Няма избрани елементи",one:()=>`${t.number(e.count)} избран елемент`,other:()=>`${t.number(e.count)} избрани елементи`})}.`,selectedItem:e=>`${e.item} избран.`};var Dt={};Dt={deselectedItem:e=>`Položka ${e.item} není vybrána.`,longPressToSelect:"Dlouhým stisknutím přejdete do režimu výběru.",select:"Vybrat",selectedAll:"Vybrány všechny položky.",selectedCount:(e,t)=>`${t.plural(e.count,{"=0":"Nevybrány žádné položky",one:()=>`Vybrána ${t.number(e.count)} položka`,other:()=>`Vybráno ${t.number(e.count)} položek`})}.`,selectedItem:e=>`Vybrána položka ${e.item}.`};var Bt={};Bt={deselectedItem:e=>`${e.item} ikke valgt.`,longPressToSelect:"Lav et langt tryk for at aktivere valgtilstand.",select:"Vælg",selectedAll:"Alle elementer valgt.",selectedCount:(e,t)=>`${t.plural(e.count,{"=0":"Ingen elementer valgt",one:()=>`${t.number(e.count)} element valgt`,other:()=>`${t.number(e.count)} elementer valgt`})}.`,selectedItem:e=>`${e.item} valgt.`};var kt={};kt={deselectedItem:e=>`${e.item} nicht ausgewählt.`,longPressToSelect:"Gedrückt halten, um Auswahlmodus zu öffnen.",select:"Auswählen",selectedAll:"Alle Elemente ausgewählt.",selectedCount:(e,t)=>`${t.plural(e.count,{"=0":"Keine Elemente ausgewählt",one:()=>`${t.number(e.count)} Element ausgewählt`,other:()=>`${t.number(e.count)} Elemente ausgewählt`})}.`,selectedItem:e=>`${e.item} ausgewählt.`};var Et={};Et={deselectedItem:e=>`Δεν επιλέχθηκε το στοιχείο ${e.item}.`,longPressToSelect:"Πατήστε παρατεταμένα για να μπείτε σε λειτουργία επιλογής.",select:"Επιλογή",selectedAll:"Επιλέχθηκαν όλα τα στοιχεία.",selectedCount:(e,t)=>`${t.plural(e.count,{"=0":"Δεν επιλέχθηκαν στοιχεία",one:()=>`Επιλέχθηκε ${t.number(e.count)} στοιχείο`,other:()=>`Επιλέχθηκαν ${t.number(e.count)} στοιχεία`})}.`,selectedItem:e=>`Επιλέχθηκε το στοιχείο ${e.item}.`};var St={};St={deselectedItem:e=>`${e.item} not selected.`,select:"Select",selectedCount:(e,t)=>`${t.plural(e.count,{"=0":"No items selected",one:()=>`${t.number(e.count)} item selected`,other:()=>`${t.number(e.count)} items selected`})}.`,selectedAll:"All items selected.",selectedItem:e=>`${e.item} selected.`,longPressToSelect:"Long press to enter selection mode."};var At={};At={deselectedItem:e=>`${e.item} no seleccionado.`,longPressToSelect:"Mantenga pulsado para abrir el modo de selección.",select:"Seleccionar",selectedAll:"Todos los elementos seleccionados.",selectedCount:(e,t)=>`${t.plural(e.count,{"=0":"Ningún elemento seleccionado",one:()=>`${t.number(e.count)} elemento seleccionado`,other:()=>`${t.number(e.count)} elementos seleccionados`})}.`,selectedItem:e=>`${e.item} seleccionado.`};var wt={};wt={deselectedItem:e=>`${e.item} pole valitud.`,longPressToSelect:"Valikurežiimi sisenemiseks vajutage pikalt.",select:"Vali",selectedAll:"Kõik üksused valitud.",selectedCount:(e,t)=>`${t.plural(e.count,{"=0":"Üksusi pole valitud",one:()=>`${t.number(e.count)} üksus valitud`,other:()=>`${t.number(e.count)} üksust valitud`})}.`,selectedItem:e=>`${e.item} valitud.`};var Nt={};Nt={deselectedItem:e=>`Kohdetta ${e.item} ei valittu.`,longPressToSelect:"Siirry valintatilaan painamalla pitkään.",select:"Valitse",selectedAll:"Kaikki kohteet valittu.",selectedCount:(e,t)=>`${t.plural(e.count,{"=0":"Ei yhtään kohdetta valittu",one:()=>`${t.number(e.count)} kohde valittu`,other:()=>`${t.number(e.count)} kohdetta valittu`})}.`,selectedItem:e=>`${e.item} valittu.`};var zt={};zt={deselectedItem:e=>`${e.item} non sélectionné.`,longPressToSelect:"Appuyez de manière prolongée pour passer en mode de sélection.",select:"Sélectionner",selectedAll:"Tous les éléments sélectionnés.",selectedCount:(e,t)=>`${t.plural(e.count,{"=0":"Aucun élément sélectionné",one:()=>`${t.number(e.count)} élément sélectionné`,other:()=>`${t.number(e.count)} éléments sélectionnés`})}.`,selectedItem:e=>`${e.item} sélectionné.`};var Ft={};Ft={deselectedItem:e=>`${e.item} לא נבחר.`,longPressToSelect:"הקשה ארוכה לכניסה למצב בחירה.",select:"בחר",selectedAll:"כל הפריטים נבחרו.",selectedCount:(e,t)=>`${t.plural(e.count,{"=0":"לא נבחרו פריטים",one:()=>`פריט ${t.number(e.count)} נבחר`,other:()=>`${t.number(e.count)} פריטים נבחרו`})}.`,selectedItem:e=>`${e.item} נבחר.`};var Pt={};Pt={deselectedItem:e=>`Stavka ${e.item} nije odabrana.`,longPressToSelect:"Dugo pritisnite za ulazak u način odabira.",select:"Odaberite",selectedAll:"Odabrane su sve stavke.",selectedCount:(e,t)=>`${t.plural(e.count,{"=0":"Nije odabrana nijedna stavka",one:()=>`Odabrana je ${t.number(e.count)} stavka`,other:()=>`Odabrano je ${t.number(e.count)} stavki`})}.`,selectedItem:e=>`Stavka ${e.item} je odabrana.`};var Kt={};Kt={deselectedItem:e=>`${e.item} nincs kijelölve.`,longPressToSelect:"Nyomja hosszan a kijelöléshez.",select:"Kijelölés",selectedAll:"Az összes elem kijelölve.",selectedCount:(e,t)=>`${t.plural(e.count,{"=0":"Egy elem sincs kijelölve",one:()=>`${t.number(e.count)} elem kijelölve`,other:()=>`${t.number(e.count)} elem kijelölve`})}.`,selectedItem:e=>`${e.item} kijelölve.`};var It={};It={deselectedItem:e=>`${e.item} non selezionato.`,longPressToSelect:"Premi a lungo per passare alla modalità di selezione.",select:"Seleziona",selectedAll:"Tutti gli elementi selezionati.",selectedCount:(e,t)=>`${t.plural(e.count,{"=0":"Nessun elemento selezionato",one:()=>`${t.number(e.count)} elemento selezionato`,other:()=>`${t.number(e.count)} elementi selezionati`})}.`,selectedItem:e=>`${e.item} selezionato.`};var jt={};jt={deselectedItem:e=>`${e.item} が選択されていません。`,longPressToSelect:"長押しして選択モードを開きます。",select:"選択",selectedAll:"すべての項目を選択しました。",selectedCount:(e,t)=>`${t.plural(e.count,{"=0":"項目が選択されていません",one:()=>`${t.number(e.count)} 項目を選択しました`,other:()=>`${t.number(e.count)} 項目を選択しました`})}。`,selectedItem:e=>`${e.item} を選択しました。`};var Mt={};Mt={deselectedItem:e=>`${e.item}이(가) 선택되지 않았습니다.`,longPressToSelect:"선택 모드로 들어가려면 길게 누르십시오.",select:"선택",selectedAll:"모든 항목이 선택되었습니다.",selectedCount:(e,t)=>`${t.plural(e.count,{"=0":"선택된 항목이 없습니다",one:()=>`${t.number(e.count)}개 항목이 선택되었습니다`,other:()=>`${t.number(e.count)}개 항목이 선택되었습니다`})}.`,selectedItem:e=>`${e.item}이(가) 선택되었습니다.`};var Tt={};Tt={deselectedItem:e=>`${e.item} nepasirinkta.`,longPressToSelect:"Norėdami įjungti pasirinkimo režimą, paspauskite ir palaikykite.",select:"Pasirinkti",selectedAll:"Pasirinkti visi elementai.",selectedCount:(e,t)=>`${t.plural(e.count,{"=0":"Nepasirinktas nė vienas elementas",one:()=>`Pasirinktas ${t.number(e.count)} elementas`,other:()=>`Pasirinkta elementų: ${t.number(e.count)}`})}.`,selectedItem:e=>`Pasirinkta: ${e.item}.`};var Rt={};Rt={deselectedItem:e=>`Vienums ${e.item} nav atlasīts.`,longPressToSelect:"Ilgi turiet nospiestu. lai ieslēgtu atlases režīmu.",select:"Atlasīt",selectedAll:"Atlasīti visi vienumi.",selectedCount:(e,t)=>`${t.plural(e.count,{"=0":"Nav atlasīts neviens vienums",one:()=>`Atlasīto vienumu skaits: ${t.number(e.count)}`,other:()=>`Atlasīto vienumu skaits: ${t.number(e.count)}`})}.`,selectedItem:e=>`Atlasīts vienums ${e.item}.`};var Vt={};Vt={deselectedItem:e=>`${e.item} er ikke valgt.`,longPressToSelect:"Bruk et langt trykk for å gå inn i valgmodus.",select:"Velg",selectedAll:"Alle elementer er valgt.",selectedCount:(e,t)=>`${t.plural(e.count,{"=0":"Ingen elementer er valgt",one:()=>`${t.number(e.count)} element er valgt`,other:()=>`${t.number(e.count)} elementer er valgt`})}.`,selectedItem:e=>`${e.item} er valgt.`};var Ot={};Ot={deselectedItem:e=>`${e.item} niet geselecteerd.`,longPressToSelect:"Druk lang om de selectiemodus te openen.",select:"Selecteren",selectedAll:"Alle items geselecteerd.",selectedCount:(e,t)=>`${t.plural(e.count,{"=0":"Geen items geselecteerd",one:()=>`${t.number(e.count)} item geselecteerd`,other:()=>`${t.number(e.count)} items geselecteerd`})}.`,selectedItem:e=>`${e.item} geselecteerd.`};var Ht={};Ht={deselectedItem:e=>`Nie zaznaczono ${e.item}.`,longPressToSelect:"Naciśnij i przytrzymaj, aby wejść do trybu wyboru.",select:"Zaznacz",selectedAll:"Wszystkie zaznaczone elementy.",selectedCount:(e,t)=>`${t.plural(e.count,{"=0":"Nie zaznaczono żadnych elementów",one:()=>`${t.number(e.count)} zaznaczony element`,other:()=>`${t.number(e.count)} zaznaczonych elementów`})}.`,selectedItem:e=>`Zaznaczono ${e.item}.`};var Lt={};Lt={deselectedItem:e=>`${e.item} não selecionado.`,longPressToSelect:"Mantenha pressionado para entrar no modo de seleção.",select:"Selecionar",selectedAll:"Todos os itens selecionados.",selectedCount:(e,t)=>`${t.plural(e.count,{"=0":"Nenhum item selecionado",one:()=>`${t.number(e.count)} item selecionado`,other:()=>`${t.number(e.count)} itens selecionados`})}.`,selectedItem:e=>`${e.item} selecionado.`};var Ut={};Ut={deselectedItem:e=>`${e.item} não selecionado.`,longPressToSelect:"Prima continuamente para entrar no modo de seleção.",select:"Selecionar",selectedAll:"Todos os itens selecionados.",selectedCount:(e,t)=>`${t.plural(e.count,{"=0":"Nenhum item selecionado",one:()=>`${t.number(e.count)} item selecionado`,other:()=>`${t.number(e.count)} itens selecionados`})}.`,selectedItem:e=>`${e.item} selecionado.`};var Wt={};Wt={deselectedItem:e=>`${e.item} neselectat.`,longPressToSelect:"Apăsați lung pentru a intra în modul de selectare.",select:"Selectare",selectedAll:"Toate elementele selectate.",selectedCount:(e,t)=>`${t.plural(e.count,{"=0":"Niciun element selectat",one:()=>`${t.number(e.count)} element selectat`,other:()=>`${t.number(e.count)} elemente selectate`})}.`,selectedItem:e=>`${e.item} selectat.`};var Gt={};Gt={deselectedItem:e=>`${e.item} не выбрано.`,longPressToSelect:"Нажмите и удерживайте для входа в режим выбора.",select:"Выбрать",selectedAll:"Выбраны все элементы.",selectedCount:(e,t)=>`${t.plural(e.count,{"=0":"Нет выбранных элементов",one:()=>`${t.number(e.count)} элемент выбран`,other:()=>`${t.number(e.count)} элементов выбрано`})}.`,selectedItem:e=>`${e.item} выбрано.`};var Yt={};Yt={deselectedItem:e=>`Nevybraté položky: ${e.item}.`,longPressToSelect:"Dlhším stlačením prejdite do režimu výberu.",select:"Vybrať",selectedAll:"Všetky vybraté položky.",selectedCount:(e,t)=>`${t.plural(e.count,{"=0":"Žiadne vybraté položky",one:()=>`${t.number(e.count)} vybratá položka`,other:()=>`Počet vybratých položiek:${t.number(e.count)}`})}.`,selectedItem:e=>`Vybraté položky: ${e.item}.`};var Zt={};Zt={deselectedItem:e=>`Element ${e.item} ni izbran.`,longPressToSelect:"Za izbirni način pritisnite in dlje časa držite.",select:"Izberite",selectedAll:"Vsi elementi so izbrani.",selectedCount:(e,t)=>`${t.plural(e.count,{"=0":"Noben element ni izbran",one:()=>`${t.number(e.count)} element je izbran`,other:()=>`${t.number(e.count)} elementov je izbranih`})}.`,selectedItem:e=>`Element ${e.item} je izbran.`};var _t={};_t={deselectedItem:e=>`${e.item} nije izabrano.`,longPressToSelect:"Dugo pritisnite za ulazak u režim biranja.",select:"Izaberite",selectedAll:"Izabrane su sve stavke.",selectedCount:(e,t)=>`${t.plural(e.count,{"=0":"Nije izabrana nijedna stavka",one:()=>`Izabrana je ${t.number(e.count)} stavka`,other:()=>`Izabrano je ${t.number(e.count)} stavki`})}.`,selectedItem:e=>`${e.item} je izabrano.`};var qt={};qt={deselectedItem:e=>`${e.item} ej markerat.`,longPressToSelect:"Tryck länge när du vill öppna väljarläge.",select:"Markera",selectedAll:"Alla markerade objekt.",selectedCount:(e,t)=>`${t.plural(e.count,{"=0":"Inga markerade objekt",one:()=>`${t.number(e.count)} markerat objekt`,other:()=>`${t.number(e.count)} markerade objekt`})}.`,selectedItem:e=>`${e.item} markerat.`};var Jt={};Jt={deselectedItem:e=>`${e.item} seçilmedi.`,longPressToSelect:"Seçim moduna girmek için uzun basın.",select:"Seç",selectedAll:"Tüm ögeler seçildi.",selectedCount:(e,t)=>`${t.plural(e.count,{"=0":"Hiçbir öge seçilmedi",one:()=>`${t.number(e.count)} öge seçildi`,other:()=>`${t.number(e.count)} öge seçildi`})}.`,selectedItem:e=>`${e.item} seçildi.`};var Xt={};Xt={deselectedItem:e=>`${e.item} не вибрано.`,longPressToSelect:"Виконайте довге натиснення, щоб перейти в режим вибору.",select:"Вибрати",selectedAll:"Усі елементи вибрано.",selectedCount:(e,t)=>`${t.plural(e.count,{"=0":"Жодних елементів не вибрано",one:()=>`${t.number(e.count)} елемент вибрано`,other:()=>`Вибрано елементів: ${t.number(e.count)}`})}.`,selectedItem:e=>`${e.item} вибрано.`};var Qt={};Qt={deselectedItem:e=>`未选择 ${e.item}。`,longPressToSelect:"长按以进入选择模式。",select:"选择",selectedAll:"已选择所有项目。",selectedCount:(e,t)=>`${t.plural(e.count,{"=0":"未选择项目",one:()=>`已选择 ${t.number(e.count)} 个项目`,other:()=>`已选择 ${t.number(e.count)} 个项目`})}。`,selectedItem:e=>`已选择 ${e.item}。`};var el={};el={deselectedItem:e=>`未選取「${e.item}」。`,longPressToSelect:"長按以進入選擇模式。",select:"選取",selectedAll:"已選取所有項目。",selectedCount:(e,t)=>`${t.plural(e.count,{"=0":"未選取任何項目",one:()=>`已選取 ${t.number(e.count)} 個項目`,other:()=>`已選取 ${t.number(e.count)} 個項目`})}。`,selectedItem:e=>`已選取「${e.item}」。`};var oe={};oe={"ar-AE":xt,"bg-BG":Ct,"cs-CZ":Dt,"da-DK":Bt,"de-DE":kt,"el-GR":Et,"en-US":St,"es-ES":At,"et-EE":wt,"fi-FI":Nt,"fr-FR":zt,"he-IL":Ft,"hr-HR":Pt,"hu-HU":Kt,"it-IT":It,"ja-JP":jt,"ko-KR":Mt,"lt-LT":Tt,"lv-LV":Rt,"nb-NO":Vt,"nl-NL":Ot,"pl-PL":Ht,"pt-BR":Lt,"pt-PT":Ut,"ro-RO":Wt,"ru-RU":Gt,"sk-SK":Yt,"sl-SI":Zt,"sr-SP":_t,"sv-SE":qt,"tr-TR":Jt,"uk-UA":Xt,"zh-CN":Qt,"zh-TW":el};const tl=7e3;let V=null;function ll(e,t="assertive",l=tl){V?V.announce(e,t,l):(V=new mu,(typeof IS_REACT_ACT_ENVIRONMENT=="boolean"?IS_REACT_ACT_ENVIRONMENT:typeof jest<"u")?V.announce(e,t,l):setTimeout(()=>{V?.isAttached()&&V?.announce(e,t,l)},100))}class mu{isAttached(){var t;return(t=this.node)===null||t===void 0?void 0:t.isConnected}createLog(t){let l=document.createElement("div");return l.setAttribute("role","log"),l.setAttribute("aria-live",t),l.setAttribute("aria-relevant","additions"),l}destroy(){this.node&&(document.body.removeChild(this.node),this.node=null)}announce(t,l="assertive",u=tl){var o,n;if(!this.node)return;let i=document.createElement("div");typeof t=="object"?(i.setAttribute("role","img"),i.setAttribute("aria-labelledby",t["aria-labelledby"])):i.textContent=t,l==="assertive"?(o=this.assertiveLog)===null||o===void 0||o.appendChild(i):(n=this.politeLog)===null||n===void 0||n.appendChild(i),t!==""&&setTimeout(()=>{i.remove()},u)}clear(t){this.node&&((!t||t==="assertive")&&this.assertiveLog&&(this.assertiveLog.innerHTML=""),(!t||t==="polite")&&this.politeLog&&(this.politeLog.innerHTML=""))}constructor(){this.node=null,this.assertiveLog=null,this.politeLog=null,typeof document<"u"&&(this.node=document.createElement("div"),this.node.dataset.liveAnnouncer="true",Object.assign(this.node.style,{border:0,clip:"rect(0 0 0 0)",clipPath:"inset(50%)",height:"1px",margin:"-1px",overflow:"hidden",padding:0,position:"absolute",width:"1px",whiteSpace:"nowrap"}),this.assertiveLog=this.createLog("assertive"),this.node.appendChild(this.assertiveLog),this.politeLog=this.createLog("polite"),this.node.appendChild(this.politeLog),document.body.prepend(this.node))}}function pu(e){return e&&e.__esModule?e.default:e}function bu(e,t){let{getRowText:l=a=>{var m,c,d,r;return(r=(m=(c=t.collection).getTextValue)===null||m===void 0?void 0:m.call(c,a))!==null&&r!==void 0?r:(d=t.collection.getItem(a))===null||d===void 0?void 0:d.textValue}}=e,u=_(pu(oe),"@react-aria/grid"),o=t.selectionManager.rawSelection,n=B.useRef(o),i=Rl(()=>{var a;if(!t.selectionManager.isFocused||o===n.current){n.current=o;return}let m=Ee(o,n.current),c=Ee(n.current,o),d=t.selectionManager.selectionBehavior==="replace",r=[];if(t.selectionManager.selectedKeys.size===1&&d){let p=t.selectionManager.selectedKeys.keys().next().value;if(p!=null&&t.collection.getItem(p)){let s=l(p);s&&r.push(u.format("selectedItem",{item:s}))}}else if(m.size===1&&c.size===0){let p=m.keys().next().value;if(p!=null){let s=l(p);s&&r.push(u.format("selectedItem",{item:s}))}}else if(c.size===1&&m.size===0){let p=c.keys().next().value;if(p!=null&&t.collection.getItem(p)){let s=l(p);s&&r.push(u.format("deselectedItem",{item:s}))}}t.selectionManager.selectionMode==="multiple"&&(r.length===0||o==="all"||o.size>1||n.current==="all"||((a=n.current)===null||a===void 0?void 0:a.size)>1)&&r.push(o==="all"?u.format("selectedAll"):u.format("selectedCount",{count:o.size})),r.length>0&&ll(r.join(" ")),n.current=o});Me(()=>{if(t.selectionManager.isFocused)i();else{let a=requestAnimationFrame(i);return()=>cancelAnimationFrame(a)}},[o,t.selectionManager.isFocused])}function Ee(e,t){let l=new Set;if(e==="all"||t==="all")return l;for(let u of e.keys())t.has(u)||l.add(u);return l}function fu(e){return e&&e.__esModule?e.default:e}function hu(e){let t=_(fu(oe),"@react-aria/grid"),l=Vl(),u=(l==="pointer"||l==="virtual"||l==null)&&typeof window<"u"&&"ontouchstart"in window,o=B.useMemo(()=>{let i=e.selectionManager.selectionMode,a=e.selectionManager.selectionBehavior,m;return u&&(m=t.format("longPressToSelect")),a==="replace"&&i!=="none"&&e.hasItemActions?m:void 0},[e.selectionManager.selectionMode,e.selectionManager.selectionBehavior,e.hasItemActions,t,u]);return fe(o)}function vu(e,t,l){let{isVirtualized:u,disallowTypeAhead:o,keyboardDelegate:n,focusMode:i,scrollRef:a,getRowText:m,onRowAction:c,onCellAction:d,escapeKeyBehavior:r="clearSelection",shouldSelectOnPressUp:p}=e,{selectionManager:s}=t;!e["aria-label"]&&!e["aria-labelledby"]&&console.warn("An aria-label or aria-labelledby prop is required for accessibility.");let b=ze({usage:"search",sensitivity:"base"}),{direction:v}=ue(),g=t.selectionManager.disabledBehavior,x=B.useMemo(()=>n||new yt({collection:t.collection,disabledKeys:t.disabledKeys,disabledBehavior:g,ref:l,direction:v,collator:b,focusMode:i}),[n,t.collection,t.disabledKeys,g,l,v,b,i]),{collectionProps:D}=Ol({ref:l,selectionManager:s,keyboardDelegate:x,isVirtualized:u,scrollRef:a,disallowTypeAhead:o,escapeKeyBehavior:r}),y=pe(e.id);ve.set(t,{keyboardDelegate:x,actions:{onRowAction:c,onCellAction:d},shouldSelectOnPressUp:p});let $=hu({selectionManager:s,hasItemActions:!!(c||d)}),f=Hl(e,{labelable:!0}),E=B.useCallback(C=>{if(s.isFocused){C.currentTarget.contains(C.target)||s.setFocused(!1);return}C.currentTarget.contains(C.target)&&s.setFocused(!0)},[s]),S=B.useMemo(()=>({onBlur:D.onBlur,onFocus:E}),[E,D.onBlur]),A=au(l,{isDisabled:t.collection.size!==0}),k=J(f,{role:"grid",id:y,"aria-multiselectable":s.selectionMode==="multiple"?"true":void 0},t.isKeyboardNavigationDisabled?S:D,t.collection.size===0&&{tabIndex:A?-1:0}||void 0,$);return u&&(k["aria-rowcount"]=t.collection.size,k["aria-colcount"]=t.collection.columnCount),bu({getRowText:m},t),{gridProps:k}}function gu(){return{rowGroupProps:{role:"rowgroup"}}}function $u(e,t,l){var u,o;let{node:n,isVirtualized:i,shouldSelectOnPressUp:a,onAction:m}=e,{actions:c,shouldSelectOnPressUp:d}=ve.get(t),r=c.onRowAction?()=>{var g;return(g=c.onRowAction)===null||g===void 0?void 0:g.call(c,n.key)}:m,{itemProps:p,...s}=je({selectionManager:t.selectionManager,key:n.key,ref:l,isVirtualized:i,shouldSelectOnPressUp:d||a,onAction:r||!(n==null||(u=n.props)===null||u===void 0)&&u.onAction?Ll(n==null||(o=n.props)===null||o===void 0?void 0:o.onAction,r):void 0,isDisabled:t.collection.size===0}),b=t.selectionManager.isSelected(n.key),v={role:"row","aria-selected":t.selectionManager.selectionMode!=="none"?b:void 0,"aria-disabled":s.isDisabled||void 0,...p};return i&&(v["aria-rowindex"]=n.index+1),{rowProps:v,...s}}function ul(e,t,l){let{node:u,isVirtualized:o,focusMode:n="child",shouldSelectOnPressUp:i,onAction:a}=e,{direction:m}=ue(),{keyboardDelegate:c,actions:{onCellAction:d}}=ve.get(t),r=B.useRef(null),p=()=>{if(l.current){let y=ae(l.current);if(n==="child"){if(l.current.contains(document.activeElement)&&l.current!==document.activeElement)return;let $=t.selectionManager.childFocusStrategy==="last"?re(y):y.firstChild();if($){L($);return}}(r.current!=null&&u.key!==r.current||!l.current.contains(document.activeElement))&&L(l.current)}},{itemProps:s,isPressed:b}=je({selectionManager:t.selectionManager,key:u.key,ref:l,isVirtualized:o,focus:p,shouldSelectOnPressUp:i,onAction:d?()=>d(u.key):a,isDisabled:t.collection.size===0}),v=y=>{if(!y.currentTarget.contains(y.target)||t.isKeyboardNavigationDisabled||!l.current||!document.activeElement)return;let $=ae(l.current);switch($.currentNode=document.activeElement,y.key){case"ArrowLeft":{let C=m==="rtl"?$.nextNode():$.previousNode();if(n==="child"&&C===l.current&&(C=null),y.preventDefault(),y.stopPropagation(),C)L(C),Y(C,{containingElement:Z(l.current)});else{var f;if(((f=c.getKeyLeftOf)===null||f===void 0?void 0:f.call(c,u.key))!==u.key){var E;(E=l.current.parentElement)===null||E===void 0||E.dispatchEvent(new KeyboardEvent(y.nativeEvent.type,y.nativeEvent));break}n==="cell"&&m==="rtl"?(L(l.current),Y(l.current,{containingElement:Z(l.current)})):($.currentNode=l.current,C=m==="rtl"?$.firstChild():re($),C&&(L(C),Y(C,{containingElement:Z(l.current)})))}break}case"ArrowRight":{let C=m==="rtl"?$.previousNode():$.nextNode();if(n==="child"&&C===l.current&&(C=null),y.preventDefault(),y.stopPropagation(),C)L(C),Y(C,{containingElement:Z(l.current)});else{var S;if(((S=c.getKeyRightOf)===null||S===void 0?void 0:S.call(c,u.key))!==u.key){var A;(A=l.current.parentElement)===null||A===void 0||A.dispatchEvent(new KeyboardEvent(y.nativeEvent.type,y.nativeEvent));break}n==="cell"&&m==="ltr"?(L(l.current),Y(l.current,{containingElement:Z(l.current)})):($.currentNode=l.current,C=m==="rtl"?re($):$.firstChild(),C&&(L(C),Y(C,{containingElement:Z(l.current)})))}break}case"ArrowUp":case"ArrowDown":if(!y.altKey&&l.current.contains(y.target)){var k;y.stopPropagation(),y.preventDefault(),(k=l.current.parentElement)===null||k===void 0||k.dispatchEvent(new KeyboardEvent(y.nativeEvent.type,y.nativeEvent))}break}},g=y=>{if(r.current=u.key,y.target!==l.current){Ul()||t.selectionManager.setFocusedKey(u.key);return}requestAnimationFrame(()=>{n==="child"&&document.activeElement===l.current&&p()})},x=J(s,{role:"gridcell",onKeyDownCapture:v,"aria-colspan":u.colSpan,"aria-colindex":u.colIndex!=null?u.colIndex+1:void 0,colSpan:o?void 0:u.colSpan,onFocus:g});var D;return o&&(x["aria-colindex"]=((D=u.colIndex)!==null&&D!==void 0?D:u.index)+1),i&&x.tabIndex!=null&&x.onPointerDown==null&&(x.onPointerDown=y=>{let $=y.currentTarget,f=$.getAttribute("tabindex");$.removeAttribute("tabindex"),requestAnimationFrame(()=>{f!=null&&$.setAttribute("tabindex",f)})}),{gridCellProps:x,isPressed:b}}function re(e){let t=null,l=null;do l=e.lastChild(),l&&(t=l);while(l);return t}function yu(e){return e&&e.__esModule?e.default:e}function xu(e,t){let{key:l}=e,u=t.selectionManager,o=pe(),n=!t.selectionManager.canSelectItem(l),i=t.selectionManager.isSelected(l),a=()=>u.toggleSelection(l);const m=_(yu(oe),"@react-aria/grid");return{checkboxProps:{id:o,"aria-label":m.format("select"),isSelected:i,isDisabled:n,onChange:a}}}class Cu extends yt{isCell(t){return t.type==="cell"||t.type==="rowheader"||t.type==="column"}getKeyBelow(t){let l=this.collection.getItem(t);if(!l)return null;if(l.type==="column"){let u=U(z(l,this.collection));if(u)return u.key;let o=this.getFirstKey();return o==null||!this.collection.getItem(o)?null:super.getKeyForItemInRowByIndex(o,l.index)}return super.getKeyBelow(t)}getKeyAbove(t){let l=this.collection.getItem(t);if(!l)return null;if(l.type==="column"){let n=l.parentKey!=null?this.collection.getItem(l.parentKey):null;return n&&n.type==="column"?n.key:null}let u=super.getKeyAbove(t),o=u!=null?this.collection.getItem(u):null;return o&&o.type!=="headerrow"?u:this.isCell(l)?this.collection.columns[l.index].key:this.collection.columns[0].key}findNextColumnKey(t){let l=this.findNextKey(t.key,o=>o.type==="column");if(l!=null)return l;let u=this.collection.headerRows[t.level];for(let o of z(u,this.collection))if(o.type==="column")return o.key;return null}findPreviousColumnKey(t){let l=this.findPreviousKey(t.key,n=>n.type==="column");if(l!=null)return l;let u=this.collection.headerRows[t.level],o=[...z(u,this.collection)];for(let n=o.length-1;n>=0;n--){let i=o[n];if(i.type==="column")return i.key}return null}getKeyRightOf(t){let l=this.collection.getItem(t);return l?l.type==="column"?this.direction==="rtl"?this.findPreviousColumnKey(l):this.findNextColumnKey(l):super.getKeyRightOf(t):null}getKeyLeftOf(t){let l=this.collection.getItem(t);return l?l.type==="column"?this.direction==="rtl"?this.findNextColumnKey(l):this.findPreviousColumnKey(l):super.getKeyLeftOf(t):null}getKeyForSearch(t,l){if(!this.collator)return null;let u=this.collection,o=l??this.getFirstKey();if(o==null)return null;let n=u.getItem(o);var i;n?.type==="cell"&&(o=(i=n.parentKey)!==null&&i!==void 0?i:null);let a=!1;for(;o!=null;){let m=u.getItem(o);if(!m)return null;if(m.textValue){let c=m.textValue.slice(0,t.length);if(this.collator.compare(c,t)===0)return m.key}for(let c of z(m,this.collection)){let d=u.columns[c.index];if(u.rowHeaderColumnKeys.has(d.key)&&c.textValue){let r=c.textValue.slice(0,t.length);if(this.collator.compare(r,t)===0){let p=l!=null?u.getItem(l):n;return p?.type==="cell"?c.key:m.key}}}o=this.getKeyBelow(o),o==null&&!a&&(o=this.getFirstKey(),a=!0)}return null}}function Du(e){return e&&e.__esModule?e.default:e}function Bu(e,t,l){let{keyboardDelegate:u,isVirtualized:o,layoutDelegate:n,layout:i}=e,a=ze({usage:"search",sensitivity:"base"}),{direction:m}=ue(),c=t.selectionManager.disabledBehavior,d=B.useMemo(()=>u||new Cu({collection:t.collection,disabledKeys:t.disabledKeys,disabledBehavior:c,ref:l,direction:m,collator:a,layoutDelegate:n,layout:i}),[u,t.collection,t.disabledKeys,c,l,m,a,n,i]),r=pe(e.id);he.set(t,r);let{gridProps:p}=vu({...e,id:r,keyboardDelegate:d},t,l);o&&(p["aria-rowcount"]=t.collection.size+t.collection.headerRows.length),le()&&"expandedKeys"in t&&(p.role="treegrid");let{column:s,direction:b}=t.sortDescriptor||{},v=_(Du(ne),"@react-aria/table"),g=B.useMemo(()=>{var D,y;let $=(y=(D=t.collection.columns.find(f=>f.key===s))===null||D===void 0?void 0:D.textValue)!==null&&y!==void 0?y:"";return b&&s?v.format(`${b}Sort`,{columnName:$}):void 0},[b,s,t.collection.columns]),x=fe(g);return Me(()=>{g&&ll(g,"assertive",500)},[g]),{gridProps:J(p,x,{"aria-describedby":[x["aria-describedby"],p["aria-describedby"]].filter(Boolean).join(" ")})}}function ku(e){return e&&e.__esModule?e.default:e}function nl(e,t,l){var u,o;let{node:n}=e,i=n.props.allowsSorting,{gridCellProps:a}=ul({...e,focusMode:"child"},t,l),m=n.props.isSelectionCell&&t.selectionManager.selectionMode==="single",{pressProps:c}=Wl({isDisabled:!i||m,onPress(){t.sort(n.key)},ref:l}),{focusableProps:d}=Gl({},l),r,p=((u=t.sortDescriptor)===null||u===void 0?void 0:u.column)===n.key,s=(o=t.sortDescriptor)===null||o===void 0?void 0:o.direction;n.props.allowsSorting&&!Ce()&&(r=p?s:"none");let b=_(ku(ne),"@react-aria/table"),v;i&&(v=`${b.format("sortable")}`,p&&s&&Ce()&&(v=`${v}, ${b.format(s)}`));let g=fe(v),x=t.collection.size===0;return B.useEffect(()=>{x&&t.selectionManager.focusedKey===n.key&&t.selectionManager.setFocusedKey(null)},[x,t.selectionManager,n.key]),{columnHeaderProps:{...J(d,a,c,g,x?{tabIndex:-1}:null),role:"columnheader",id:cu(t,n.key),"aria-colspan":n.colSpan&&n.colSpan>1?n.colSpan:void 0,"aria-sort":r}}}const Se={expand:{ltr:"ArrowRight",rtl:"ArrowLeft"},collapse:{ltr:"ArrowLeft",rtl:"ArrowRight"}};function Eu(e,t,l){let{node:u,isVirtualized:o}=e,{rowProps:n,...i}=$u(e,t,l),{direction:a}=ue();o&&!(le()&&"expandedKeys"in t)?n["aria-rowindex"]=u.index+1+t.collection.headerRows.length:delete n["aria-rowindex"];let m={};if(le()&&"expandedKeys"in t){let f=t.keyMap.get(u.key);if(f!=null){var c,d,r,p,s,b;let E=((c=f.props)===null||c===void 0?void 0:c.UNSTABLE_childItems)||((r=f.props)===null||r===void 0||(d=r.children)===null||d===void 0?void 0:d.length)>t.userColumnCount;var v,g,x,D;m={onKeyDown:S=>{(S.key===Se.expand[a]&&t.selectionManager.focusedKey===f.key&&E&&t.expandedKeys!=="all"&&!t.expandedKeys.has(f.key)||S.key===Se.collapse[a]&&t.selectionManager.focusedKey===f.key&&E&&(t.expandedKeys==="all"||t.expandedKeys.has(f.key)))&&(t.toggleKey(f.key),S.stopPropagation())},"aria-expanded":E?t.expandedKeys==="all"||t.expandedKeys.has(u.key):void 0,"aria-level":f.level,"aria-posinset":((v=f.indexOfType)!==null&&v!==void 0?v:0)+1,"aria-setsize":f.level>1?((x=(p=W((g=(s=t.keyMap.get(f.parentKey))===null||s===void 0?void 0:s.childNodes)!==null&&g!==void 0?g:[]))===null||p===void 0?void 0:p.indexOfType)!==null&&x!==void 0?x:0)+1:((D=(b=W(t.collection.body.childNodes))===null||b===void 0?void 0:b.indexOfType)!==null&&D!==void 0?D:0)+1}}}let y=Yl(u.props),$=i.hasAction?y:{};return{rowProps:{...J(n,m,$),"aria-labelledby":Re(t,u.key)},...i}}function Su(e,t,l){let{node:u,isVirtualized:o}=e,n={role:"row"};return o&&!(le()&&"expandedKeys"in t)&&(n["aria-rowindex"]=u.index+1),{rowProps:n}}function ol(e,t,l){var u;let{gridCellProps:o,isPressed:n}=ul(e,t,l),i=(u=e.node.column)===null||u===void 0?void 0:u.key;return i!=null&&t.collection.rowHeaderColumnKeys.has(i)&&(o.role="rowheader",o.id=Te(t,e.node.parentKey,i)),{gridCellProps:o,isPressed:n}}function Au(e){return e&&e.__esModule?e.default:e}function wu(e,t){let{key:l}=e;const{checkboxProps:u}=xu(e,t);return{checkboxProps:{...u,"aria-labelledby":`${u.id} ${Re(t,l)}`}}}function Nu(e){let{isEmpty:t,isSelectAll:l,selectionMode:u}=e.selectionManager;return{checkboxProps:{"aria-label":_(Au(ne),"@react-aria/table").format(u==="single"?"select":"selectAll"),isSelected:l,isDisabled:u!=="multiple"||e.collection.size===0||e.collection.rows.length===1&&e.collection.rows[0].type==="loader",isIndeterminate:!t&&!l,onChange:()=>e.selectionManager.toggleSelectAll()}}}function ge(){return gu()}var sl=T((e,t)=>{var l,u;const{as:o,className:n,node:i,slots:a,state:m,selectionMode:c,color:d,checkboxesProps:r,disableAnimation:p,classNames:s,...b}=e,v=o||"th",g=typeof v=="string",x=M(t),{columnHeaderProps:D}=nl({node:i},m,x),{isFocusVisible:y,focusProps:$}=X(),{checkboxProps:f}=Nu(m),E=K(s?.th,n,(l=i.props)==null?void 0:l.className),S=c==="single",{onChange:A,...k}=f;return h.jsx(v,{ref:x,"data-focus-visible":w(y),...I(D,$,O(i.props,{enabled:g}),O(b,{enabled:g})),className:(u=a.th)==null?void 0:u.call(a,{class:E}),children:S?h.jsx(be,{children:f["aria-label"]}):h.jsx(Fe,{color:d,disableAnimation:p,onValueChange:A,...I(r,k)})})});sl.displayName="HeroUI.TableSelectAllCheckbox";var il=sl;function zu(e){let{collection:t,focusMode:l}=e,u=e.UNSAFE_selectionState||Zl(e),o=B.useMemo(()=>e.disabledKeys?new Set(e.disabledKeys):new Set,[e.disabledKeys]),n=u.setFocusedKey;u.setFocusedKey=(m,c)=>{if(l==="cell"&&m!=null){let b=t.getItem(m);if(b?.type==="item"){var d,r;let v=z(b,t);var p,s;c==="last"?m=(p=(d=W(v))===null||d===void 0?void 0:d.key)!==null&&p!==void 0?p:null:m=(s=(r=U(v))===null||r===void 0?void 0:r.key)!==null&&s!==void 0?s:null}}n(m,c)};let i=B.useMemo(()=>new _l(t,u),[t,u]);const a=B.useRef(null);return B.useEffect(()=>{if(u.focusedKey!=null&&a.current&&!t.getItem(u.focusedKey)){const m=a.current.getItem(u.focusedKey),c=m?.parentKey!=null&&(m.type==="cell"||m.type==="rowheader"||m.type==="column")?a.current.getItem(m.parentKey):m;if(!c){u.setFocusedKey(null);return}const d=a.current.rows,r=t.rows,p=d.length-r.length;let s=Math.min(p>1?Math.max(c.index-p+1,0):c.index,r.length-1),b=null;for(;s>=0;){if(!i.isDisabled(r[s].key)&&r[s].type!=="headerrow"){b=r[s];break}sc.index&&(s=c.index),s--)}if(b){const v=b.hasChildNodes?[...z(b,t)]:[],g=b.hasChildNodes&&c!==m&&m&&m.index{let p=this.keyMap.get(r.key);t.visitNode&&(r=t.visitNode(r)),this.keyMap.set(r.key,r);let s=new Set,b=null,v=!1;if(r.type==="item"){var g;for(let f of r.childNodes)if(((g=f.props)===null||g===void 0?void 0:g.colSpan)!==void 0){v=!0;break}}for(let f of r.childNodes){if(f.type==="cell"&&v){var x,D;f.colspan=(x=f.props)===null||x===void 0?void 0:x.colSpan,f.colSpan=(D=f.props)===null||D===void 0?void 0:D.colSpan;var y,$;f.colIndex=b?((y=b.colIndex)!==null&&y!==void 0?y:b.index)+(($=b.colSpan)!==null&&$!==void 0?$:1):f.index}f.type==="cell"&&f.parentKey==null&&(f.parentKey=r.key),s.add(f.key),b?(b.nextKey=f.key,f.prevKey=b.key):f.prevKey=null,l(f),b=f}if(b&&(b.nextKey=null),p)for(let f of p.childNodes)s.has(f.key)||u(f)},u=r=>{this.keyMap.delete(r.key);for(let p of r.childNodes)this.keyMap.get(p.key)===p&&u(p)},o=null;for(let[r,p]of t.items.entries()){var n,i,a,m,c,d;let s={...p,level:(n=p.level)!==null&&n!==void 0?n:0,key:(i=p.key)!==null&&i!==void 0?i:"row-"+r,type:(a=p.type)!==null&&a!==void 0?a:"row",value:(m=p.value)!==null&&m!==void 0?m:null,hasChildNodes:!0,childNodes:[...p.childNodes],rendered:p.rendered,textValue:(c=p.textValue)!==null&&c!==void 0?c:"",index:(d=p.index)!==null&&d!==void 0?d:r};o?(o.nextKey=s.key,s.prevKey=o.key):s.prevKey=null,this.rows.push(s),l(s),o=s}o&&(o.nextKey=null)}}const rl="row-header-column-"+Math.random().toString(36).slice(2);let de="row-header-column-"+Math.random().toString(36).slice(2);for(;rl===de;)de="row-header-column-"+Math.random().toString(36).slice(2);function Pu(e,t){if(t.length===0)return[];let l=[],u=new Map;for(let d of t){let r=d.parentKey,p=[d];for(;r;){let s=e.get(r);if(!s)break;if(u.has(s)){var o,n;(n=(o=s).colSpan)!==null&&n!==void 0||(o.colSpan=0),s.colSpan++,s.colspan=s.colSpan;let{column:b,index:v}=u.get(s);if(v>p.length)break;for(let g=v;gd.length)),a=Array(i).fill(0).map(()=>[]),m=0;for(let d of l){let r=i-1;for(let p of d){if(p){let s=a[r],b=s.reduce((v,g)=>{var x;return v+((x=g.colSpan)!==null&&x!==void 0?x:1)},0);if(b0&&(s[s.length-1].nextKey=v.key,v.prevKey=s[s.length-1].key),s.push(v)}s.length>0&&(s[s.length-1].nextKey=p.key,p.prevKey=s[s.length-1].key),p.level=r,p.colIndex=m,s.push(p)}r--}m++}let c=0;for(let d of a){let r=d.reduce((p,s)=>{var b;return p+((b=s.colSpan)!==null&&b!==void 0?b:1)},0);if(r({type:"headerrow",key:"headerrow-"+r,index:r,value:null,rendered:null,level:0,hasChildNodes:!0,childNodes:d,textValue:""}))}class Ku extends Fu{*[Symbol.iterator](){yield*this.body.childNodes}get size(){return this._size}getKeys(){return this.keyMap.keys()}getKeyBefore(t){let l=this.keyMap.get(t);var u;return(u=l?.prevKey)!==null&&u!==void 0?u:null}getKeyAfter(t){let l=this.keyMap.get(t);var u;return(u=l?.nextKey)!==null&&u!==void 0?u:null}getFirstKey(){var t,l;return(l=(t=U(this.body.childNodes))===null||t===void 0?void 0:t.key)!==null&&l!==void 0?l:null}getLastKey(){var t,l;return(l=(t=W(this.body.childNodes))===null||t===void 0?void 0:t.key)!==null&&l!==void 0?l:null}getItem(t){var l;return(l=this.keyMap.get(t))!==null&&l!==void 0?l:null}at(t){const l=[...this.getKeys()];return this.getItem(l[t])}getChildren(t){return t===this.body.key?this.body.childNodes:super.getChildren(t)}getTextValue(t){let l=this.getItem(t);if(!l)return"";if(l.textValue)return l.textValue;let u=this.rowHeaderColumnKeys;if(u){let o=[];for(let n of l.childNodes){let i=this.columns[n.index];if(u.has(i.key)&&n.textValue&&o.push(n.textValue),o.length===u.size)break}return o.join(" ")}return""}constructor(t,l,u){let o=new Set,n=null,i=[];if(u?.showSelectionCheckboxes){let r={type:"column",key:rl,value:null,textValue:"",level:0,index:u?.showDragButtons?1:0,hasChildNodes:!1,rendered:null,childNodes:[],props:{isSelectionCell:!0}};i.unshift(r)}if(u?.showDragButtons){let r={type:"column",key:de,value:null,textValue:"",level:0,index:0,hasChildNodes:!1,rendered:null,childNodes:[],props:{isDragButtonCell:!0}};i.unshift(r)}let a=[],m=new Map,c=r=>{switch(r.type){case"body":n=r;break;case"column":m.set(r.key,r),r.hasChildNodes||(i.push(r),r.props.isRowHeader&&o.add(r.key));break;case"item":a.push(r);return}for(let p of r.childNodes)c(p)};for(let r of t)c(r);let d=Pu(m,i);if(d.forEach((r,p)=>a.splice(p,0,r)),super({columnCount:i.length,items:a,visitNode:r=>(r.column=i[r.index],r)}),this._size=0,this.columns=i,this.rowHeaderColumnKeys=o,this.body=n,this.headerRows=d,this._size=[...n.childNodes].length,this.rowHeaderColumnKeys.size===0){let r=this.columns.find(p=>{var s,b;return!(!((s=p.props)===null||s===void 0)&&s.isDragButtonCell)&&!(!((b=p.props)===null||b===void 0)&&b.isSelectionCell)});r&&this.rowHeaderColumnKeys.add(r.key)}}}const Iu={ascending:"descending",descending:"ascending"};function ju(e){let[t,l]=B.useState(!1),{selectionMode:u="none",showSelectionCheckboxes:o,showDragButtons:n}=e,i=B.useMemo(()=>({showSelectionCheckboxes:o&&u!=="none",showDragButtons:n,selectionMode:u,columns:[]}),[e.children,o,u,n]),a=ql(e,B.useCallback(r=>new Ku(r,null,i),[i]),i),{disabledKeys:m,selectionManager:c}=zu({...e,collection:a,disabledBehavior:e.disabledBehavior||"selection"});var d;return{collection:a,disabledKeys:m,selectionManager:c,showSelectionCheckboxes:e.showSelectionCheckboxes||!1,sortDescriptor:(d=e.sortDescriptor)!==null&&d!==void 0?d:null,isKeyboardNavigationDisabled:a.size===0||t,setKeyboardNavigationDisabled:l,sort(r,p){var s,b;(b=e.onSortChange)===null||b===void 0||b.call(e,{column:r,direction:p??(((s=e.sortDescriptor)===null||s===void 0?void 0:s.column)===r?Iu[e.sortDescriptor.direction]:"ascending")})}}}function al(e){return null}al.getCollectionNode=function*(t,l){let{children:u,columns:o}=t;if(l.columns=[],typeof u=="function"){if(!o)throw new Error("props.children was a function but props.columns is missing");for(let n of o)yield{type:"column",value:n,renderer:u}}else{let n=[];q.Children.forEach(u,i=>{n.push({type:"column",element:i})}),yield*n}};let Mu=al;function cl(e){return null}cl.getCollectionNode=function*(t){let{children:l,items:u}=t;yield{type:"body",hasChildNodes:!0,props:t,*childNodes(){if(typeof l=="function"){if(!u)throw new Error("props.children was a function but props.items is missing");for(let o of u)yield{type:"item",value:o,renderer:l}}else{let o=[];q.Children.forEach(l,n=>{o.push({type:"item",element:n})}),yield*o}}}};let Tu=cl;function dl(e){return null}dl.getCollectionNode=function*(t,l){let{title:u,children:o,childColumns:n}=t,i=u||o,a=t.textValue||(typeof i=="string"?i:"")||t["aria-label"],m=yield{type:"column",hasChildNodes:!!n||!!u&&q.Children.count(o)>0,rendered:i,textValue:a,props:t,*childNodes(){if(n)for(let d of n)yield{type:"column",value:d};else if(u){let d=[];q.Children.forEach(o,r=>{d.push({type:"column",element:r})}),yield*d}},shouldInvalidate(d){return c(d),!1}},c=d=>{for(let r of m)r.hasChildNodes||d.columns.push(r)};c(l)};let Ru=dl;function me(e){return null}me.getCollectionNode=function*(t,l){let{children:u,textValue:o,UNSTABLE_childItems:n}=t;yield{type:"item",props:t,textValue:o,"aria-label":t["aria-label"],hasChildNodes:!0,*childNodes(){if(l.showDragButtons&&(yield{type:"cell",key:"header-drag",props:{isDragButtonCell:!0}}),l.showSelectionCheckboxes&&l.selectionMode!=="none"&&(yield{type:"cell",key:"header",props:{isSelectionCell:!0}}),typeof u=="function"){for(let i of l.columns)yield{type:"cell",element:u(i.key),key:i.key};if(n)for(let i of n)yield{type:"item",value:i}}else{let i=[],a=[],m=0;if(q.Children.forEach(u,c=>{if(c.type===me){if(i.lengtha.key!==l.columns[m].key)||i.showSelectionCheckboxes!==l.showSelectionCheckboxes||i.showDragButtons!==l.showDragButtons||i.selectionMode!==l.selectionMode}}};let Vu=me;function ml(e){return null}ml.getCollectionNode=function*(t){let{children:l}=t,u=t.textValue||(typeof l=="string"?l:"")||t["aria-label"]||"";yield{type:"cell",props:t,rendered:l,textValue:u,"aria-label":t["aria-label"],hasChildNodes:!1}};let Ou=ml;function pl(e){var t;const l=Jl(),[u,o]=Pe(e,ke.variantKeys),{ref:n,as:i,baseRef:a,children:m,className:c,classNames:d,removeWrapper:r=!1,disableAnimation:p=(t=l?.disableAnimation)!=null?t:!1,isKeyboardNavigationDisabled:s=!1,selectionMode:b="none",topContentPlacement:v="inside",bottomContentPlacement:g="inside",selectionBehavior:x=b==="none"?null:"toggle",disabledBehavior:D="selection",showSelectionCheckboxes:y=b==="multiple"&&x!=="replace",BaseComponent:$="div",checkboxesProps:f,topContent:E,bottomContent:S,sortIcon:A,onRowAction:k,onCellAction:C,...N}=u,j=i||"table",F=typeof j=="string",R=M(n),Q=M(a),G=ju({...e,children:m,showSelectionCheckboxes:y});s&&!G.isKeyboardNavigationDisabled&&G.setKeyboardNavigationDisabled(!0);const{collection:se}=G,{layout:sn,...Fl}=e,{gridProps:$e}=Bu({...Fl},G,R),ee=b!=="none",ye=b==="multiple",H=B.useMemo(()=>ke({...o,isSelectable:ee,isMultiSelectable:ye}),[Ke(o),ee,ye]),xe=K(d?.base,c),Pl=B.useMemo(()=>{var P;return{state:G,slots:H,isSelectable:ee,collection:se,classNames:d,color:e?.color,disableAnimation:p,checkboxesProps:f,isHeaderSticky:(P=e?.isHeaderSticky)!=null?P:!1,selectionMode:b,selectionBehavior:x,disabledBehavior:D,showSelectionCheckboxes:y,onRowAction:k,onCellAction:C}},[H,G,se,ee,d,b,x,f,D,p,y,e?.color,e?.isHeaderSticky,k,C]),Kl=B.useCallback(P=>({...P,ref:Q,className:H.base({class:K(xe,P?.className)})}),[xe,H]),Il=B.useCallback(P=>({...P,ref:Q,className:H.wrapper({class:K(d?.wrapper,P?.className)})}),[d?.wrapper,H]),jl=B.useCallback(P=>({...I($e,O(N,{enabled:F}),P),onKeyDownCapture:void 0,ref:R,className:H.table({class:K(d?.table,P?.className)})}),[d?.table,F,H,$e,N]);return{BaseComponent:$,Component:j,children:m,state:G,collection:se,values:Pl,topContent:E,bottomContent:S,removeWrapper:r,topContentPlacement:v,bottomContentPlacement:g,sortIcon:A,getBaseProps:Kl,getWrapperProps:Il,getTableProps:jl}}var bl=T((e,t)=>{var l,u,o;const{as:n,className:i,node:a,rowKey:m,slots:c,state:d,classNames:r,...p}=e,s=n||"td",b=typeof s=="string",v=M(t),{gridCellProps:g}=ol({node:a},d,v),x=K(r?.td,i,(l=a.props)==null?void 0:l.className),{isFocusVisible:D,focusProps:y}=X(),$=d.selectionManager.isSelected(m),f=B.useMemo(()=>{const S=typeof a.rendered;return S!=="object"&&S!=="function"?h.jsx("span",{children:a.rendered}):a.rendered},[a.rendered]),E=((u=a.column)==null?void 0:u.props)||{};return h.jsx(s,{ref:v,"data-focus-visible":w(D),"data-selected":w($),...I(g,y,O(a.props,{enabled:b}),p),className:(o=c.td)==null?void 0:o.call(c,{align:E.align,class:x}),children:f})});bl.displayName="HeroUI.TableCell";var fl=bl,hl=T((e,t)=>{var l,u;const{as:o,className:n,node:i,rowKey:a,slots:m,state:c,color:d,disableAnimation:r,checkboxesProps:p,selectionMode:s,classNames:b,...v}=e,g=o||"td",x=typeof g=="string",D=M(t),{gridCellProps:y}=ol({node:i},c,D),{isFocusVisible:$,focusProps:f}=X(),{checkboxProps:E}=wu({key:i?.parentKey||i.key},c),S=K(b?.td,n,(l=i.props)==null?void 0:l.className),A=s==="single",{onChange:k,...C}=E,N=c.selectionManager.isSelected(a);return h.jsx(g,{ref:D,"data-focus-visible":w($),"data-selected":w(N),...I(y,f,O(i.props,{enabled:x}),v),className:(u=m.td)==null?void 0:u.call(m,{class:S}),children:A?h.jsx(be,{children:E["aria-label"]}):h.jsx(Fe,{color:d,disableAnimation:r,onValueChange:k,...I(p,C)})})});hl.displayName="HeroUI.TableCheckboxCell";var vl=hl,gl=T((e,t)=>{var l,u;const{as:o,className:n,children:i,node:a,slots:m,state:c,isSelectable:d,classNames:r,...p}=e,s=o||(e?.href?"a":"tr"),b=typeof s=="string",v=M(t),{rowProps:g}=Eu({node:a},c,v),x=K(r?.tr,n,(l=a.props)==null?void 0:l.className),{isFocusVisible:D,focusProps:y}=X(),$=c.disabledKeys.has(a.key),f=c.selectionManager.isSelected(a.key),{isHovered:E,hoverProps:S}=Ie({isDisabled:$}),{isFirst:A,isLast:k,isMiddle:C,isOdd:N}=B.useMemo(()=>{const j=a.key===c.collection.getFirstKey(),F=a.key===c.collection.getLastKey(),R=!j&&!F,Q=a?.index?(a.index+1)%2===0:!1;return{isFirst:j,isLast:F,isMiddle:R,isOdd:Q}},[a,c.collection]);return h.jsx(s,{ref:v,"data-disabled":w($),"data-first":w(A),"data-focus-visible":w(D),"data-hover":w(E),"data-last":w(k),"data-middle":w(C),"data-odd":w(N),"data-selected":w(f),...I(g,y,d?S:{},O(a.props,{enabled:b}),p),className:(u=m.tr)==null?void 0:u.call(m,{class:x}),children:i})});gl.displayName="HeroUI.TableRow";var $l=gl,yl=T((e,t)=>{var l;const{as:u,className:o,slots:n,state:i,collection:a,isSelectable:m,color:c,disableAnimation:d,checkboxesProps:r,selectionMode:p,classNames:s,rowVirtualizer:b,...v}=e,g=u||"tbody",x=typeof g=="string",D=M(t),{rowGroupProps:y}=ge(),$=K(s?.tbody,o),f=a?.body.props,E=f?.isLoading||f?.loadingState==="loading"||f?.loadingState==="loadingMore",S=[...a.body.childNodes],A=b.getVirtualItems();let k,C;return a.size===0&&f.emptyContent&&(k=h.jsx("tr",{role:"row",children:h.jsx("td",{className:n?.emptyWrapper({class:s?.emptyWrapper}),colSpan:a.columnCount,role:"gridcell",children:!E&&f.emptyContent})})),E&&f.loadingContent&&(C=h.jsxs("tr",{role:"row",children:[h.jsx("td",{className:n?.loadingWrapper({class:s?.loadingWrapper}),colSpan:a.columnCount,role:"gridcell",children:f.loadingContent}),!k&&a.size===0?h.jsx("td",{className:n?.emptyWrapper({class:s?.emptyWrapper})}):null]})),h.jsxs(g,{ref:D,...I(y,O(f,{enabled:x}),v),className:(l=n.tbody)==null?void 0:l.call(n,{class:$}),"data-empty":w(a.size===0),"data-loading":w(E),children:[A.map((N,j)=>{const F=S[N.index];return F?h.jsx($l,{classNames:s,isSelectable:m,node:F,slots:n,state:i,style:{transform:`translateY(${N.start-j*N.size}px)`,height:`${N.size}px`},children:[...F.childNodes].map(R=>R.props.isSelectionCell?h.jsx(vl,{checkboxesProps:r,classNames:s,color:c,disableAnimation:d,node:R,rowKey:F.key,selectionMode:p,slots:n,state:i},String(R.key)):h.jsx(fl,{classNames:s,node:R,rowKey:F.key,slots:n,state:i},String(R.key)))},String(F.key)):null}),C,k]})});yl.displayName="HeroUI.VirtualizedTableBody";var Hu=yl,xl=T((e,t)=>{var l,u,o,n,i;const{as:a,className:m,state:c,node:d,slots:r,classNames:p,sortIcon:s,...b}=e,v=a||"th",g=typeof v=="string",x=M(t),{columnHeaderProps:D}=nl({node:d},c,x),y=K(p?.th,m,(l=d.props)==null?void 0:l.className),{isFocusVisible:$,focusProps:f}=X(),{isHovered:E,hoverProps:S}=Ie({}),{hideHeader:A,align:k,...C}=d.props,N=C.allowsSorting,j={"aria-hidden":!0,"data-direction":(u=c.sortDescriptor)==null?void 0:u.direction,"data-visible":w(((o=c.sortDescriptor)==null?void 0:o.column)===d.key),className:(n=r.sortIcon)==null?void 0:n.call(r,{class:p?.sortIcon})},F=typeof s=="function"?s(j):B.isValidElement(s)&&B.cloneElement(s,j);return h.jsxs(v,{ref:x,colSpan:d.colspan,"data-focus-visible":w($),"data-hover":w(E),"data-sortable":w(N),...I(D,f,O(C,{enabled:g}),N?S:{},b),className:(i=r.th)==null?void 0:i.call(r,{align:k,class:y}),children:[A?h.jsx(be,{children:d.rendered}):d.rendered,N&&(F||h.jsx(su,{strokeWidth:3,...j}))]})});xl.displayName="HeroUI.TableColumnHeader";var Cl=xl,Dl=T((e,t)=>{var l,u;const{as:o,className:n,children:i,node:a,slots:m,classNames:c,state:d,...r}=e,p=o||"tr",s=typeof p=="string",b=M(t),{rowProps:v}=Su({node:a},d),g=K(c?.tr,n,(l=a.props)==null?void 0:l.className);return h.jsx(p,{ref:b,...I(v,O(a.props,{enabled:s}),r),className:(u=m.tr)==null?void 0:u.call(m,{class:g}),children:i})});Dl.displayName="HeroUI.TableHeaderRow";var Bl=Dl,kl=B.forwardRef((e,t)=>{var l;const{as:u,className:o,children:n,slots:i,classNames:a,...m}=e,c=u||"thead",d=M(t),{rowGroupProps:r}=ge(),p=K(a?.thead,o);return h.jsx(c,{ref:d,className:(l=i.thead)==null?void 0:l.call(i,{class:p}),...I(r,m),children:n})});kl.displayName="HeroUI.TableRowGroup";var El=kl,Lu={px:"1px",0:"0px",.5:"0.125rem",1:"0.25rem",1.5:"0.375rem",2:"0.5rem",2.5:"0.625rem",3:"0.75rem",3.5:"0.875rem",4:"1rem",5:"1.25rem",6:"1.5rem",7:"1.75rem",8:"2rem",9:"2.25rem",10:"2.5rem",11:"2.75rem",12:"3rem",14:"3.5rem",16:"4rem",20:"5rem",24:"6rem",28:"7rem",32:"8rem",36:"9rem",40:"10rem",44:"11rem",48:"12rem",52:"13rem",56:"14rem",60:"15rem",64:"16rem",72:"18rem",80:"20rem",96:"24rem"},Ae=e=>{var t;return(t=Lu[e])!=null?t:e};function Uu(e){const[t,l]=Pe(e,Be.variantKeys),{as:u,className:o,x:n=1,y:i=1,...a}=t,m=u||"span",c=B.useMemo(()=>Be({...l,className:o}),[Ke(l),o]),d=Ae(n),r=Ae(i);return{Component:m,getSpacerProps:(s={})=>({...s,...a,"aria-hidden":w(!0),className:K(c,s.className),style:{...s.style,...a.style,marginLeft:d,marginTop:r}})}}var Sl=T((e,t)=>{const{Component:l,getSpacerProps:u}=Uu({...e});return h.jsx(l,{ref:t,...u()})});Sl.displayName="HeroUI.Spacer";var Al=Sl,wl=T((e,t)=>{const{BaseComponent:l,Component:u,collection:o,values:n,topContent:i,topContentPlacement:a,bottomContentPlacement:m,bottomContent:c,getBaseProps:d,getWrapperProps:r,getTableProps:p}=pl({...e,ref:t}),{rowHeight:s=40,maxTableHeight:b=600}=e,v=B.useCallback(({children:A})=>h.jsx(l,{...r(),ref:D,style:{height:b,display:"block"},children:A}),[r,b]),x=[...o.body.childNodes].length,D=B.useRef(null),[y,$]=B.useState(0),f=B.useRef(null);B.useLayoutEffect(()=>{f.current&&$(f.current.getBoundingClientRect().height)},[f]);const E=iu({count:x,getScrollElement:()=>D.current,estimateSize:()=>s,overscan:5}),S=p();return h.jsxs("div",{...d(),children:[a==="outside"&&i,h.jsx(v,{children:h.jsxs(h.Fragment,{children:[a==="inside"&&i,h.jsxs(u,{...S,style:{height:`calc(${E.getTotalSize()+y}px)`,...S.style},children:[h.jsxs(El,{ref:f,classNames:n.classNames,slots:n.slots,children:[o.headerRows.map(A=>h.jsx(Bl,{classNames:n.classNames,node:A,slots:n.slots,state:n.state,children:[...A.childNodes].map(k=>{var C;return(C=k?.props)!=null&&C.isSelectionCell?h.jsx(il,{checkboxesProps:n.checkboxesProps,classNames:n.classNames,color:n.color,disableAnimation:n.disableAnimation,node:k,selectionMode:n.selectionMode,slots:n.slots,state:n.state},k?.key):h.jsx(Cl,{classNames:n.classNames,node:k,slots:n.slots,state:n.state},k?.key)})},A?.key)),h.jsx(Al,{as:"tr",tabIndex:-1,y:1})]}),h.jsx(Hu,{checkboxesProps:n.checkboxesProps,classNames:n.classNames,collection:n.collection,color:n.color,disableAnimation:n.disableAnimation,isSelectable:n.isSelectable,rowVirtualizer:E,selectionMode:n.selectionMode,slots:n.slots,state:n.state})]}),m==="inside"&&c]})}),m==="outside"&&c]})});wl.displayName="HeroUI.VirtualizedTable";var Wu=wl,Nl=T((e,t)=>{var l;const{as:u,className:o,slots:n,state:i,collection:a,isSelectable:m,color:c,disableAnimation:d,checkboxesProps:r,selectionMode:p,classNames:s,...b}=e,v=u||"tbody",g=typeof v=="string",x=M(t),{rowGroupProps:D}=ge(),y=K(s?.tbody,o),$=a?.body.props,f=$?.isLoading||$?.loadingState==="loading"||$?.loadingState==="loadingMore",E=B.useMemo(()=>[...a.body.childNodes].map(k=>h.jsx($l,{classNames:s,isSelectable:m,node:k,slots:n,state:i,children:[...k.childNodes].map(C=>C.props.isSelectionCell?h.jsx(vl,{checkboxesProps:r,classNames:s,color:c,disableAnimation:d,node:C,rowKey:k.key,selectionMode:p,slots:n,state:i},C.key):h.jsx(fl,{classNames:s,node:C,rowKey:k.key,slots:n,state:i},C.key))},k.key)),[a.body.childNodes,s,m,n,i]);let S,A;return a.size===0&&$.emptyContent&&(S=h.jsx("tr",{role:"row",children:h.jsx("td",{className:n?.emptyWrapper({class:s?.emptyWrapper}),colSpan:a.columnCount,role:"gridcell",children:!f&&$.emptyContent})})),f&&$.loadingContent&&(A=h.jsxs("tr",{role:"row",children:[h.jsx("td",{className:n?.loadingWrapper({class:s?.loadingWrapper}),colSpan:a.columnCount,role:"gridcell",children:$.loadingContent}),!S&&a.size===0?h.jsx("td",{className:n?.emptyWrapper({class:s?.emptyWrapper})}):null]})),h.jsxs(v,{ref:x,...I(D,O($,{enabled:g}),b),className:(l=n.tbody)==null?void 0:l.call(n,{class:y}),"data-empty":w(a.size===0),"data-loading":w(f),children:[E,A,S]})});Nl.displayName="HeroUI.TableBody";var Gu=Nl,zl=T((e,t)=>{const{BaseComponent:l,Component:u,collection:o,values:n,topContent:i,topContentPlacement:a,bottomContentPlacement:m,bottomContent:c,removeWrapper:d,sortIcon:r,getBaseProps:p,getWrapperProps:s,getTableProps:b}=pl({...e,ref:t}),{isVirtualized:v,rowHeight:g=40,maxTableHeight:x=600}=e,D=v,y=B.useCallback(({children:$})=>d?$:h.jsx(l,{...s(),children:$}),[d,s]);return D?h.jsx(Wu,{...e,ref:t,maxTableHeight:x,rowHeight:g}):h.jsxs("div",{...p(),children:[a==="outside"&&i,h.jsx(y,{children:h.jsxs(h.Fragment,{children:[a==="inside"&&i,h.jsxs(u,{...b(),children:[h.jsxs(El,{classNames:n.classNames,slots:n.slots,children:[o.headerRows.map($=>h.jsx(Bl,{classNames:n.classNames,node:$,slots:n.slots,state:n.state,children:[...$.childNodes].map(f=>{var E;return(E=f?.props)!=null&&E.isSelectionCell?h.jsx(il,{checkboxesProps:n.checkboxesProps,classNames:n.classNames,color:n.color,disableAnimation:n.disableAnimation,node:f,selectionMode:n.selectionMode,slots:n.slots,state:n.state},f?.key):h.jsx(Cl,{classNames:n.classNames,node:f,slots:n.slots,sortIcon:r,state:n.state},f?.key)})},$?.key)),h.jsx(Al,{as:"tr",tabIndex:-1,y:1})]}),h.jsx(Gu,{checkboxesProps:n.checkboxesProps,classNames:n.classNames,collection:n.collection,color:n.color,disableAnimation:n.disableAnimation,isSelectable:n.isSelectable,selectionMode:n.selectionMode,slots:n.slots,state:n.state})]}),m==="inside"&&c]})}),m==="outside"&&c]})});zl.displayName="HeroUI.Table";var Yu=zl,Zu=Ru,_u=Zu,qu=Mu,Ju=qu,Xu=Vu,Qu=Xu,en=Tu,tn=en,ln=Ou,un=ln;const nn={n_requests:"Number Of Requests",estimated_cost:"Estimated Cost ($)"},we=["model","n_requests","prompt_tokens","completion_tokens","total_tokens","estimated_cost"];function on(e){return e.replace(/(-?)(\d*)\.?(\d*)e([+-]\d+)/,function(t,l,u,o,n){return n<0?l+"0."+Array(1-n-u.length).join("0")+o+u:l+u+o+Array(n-o.length+1).join("0")})}function dn({usage:e}){const t=Object.keys(e),{isOpen:l,onOpen:u,onClose:o}=Xl(),n=()=>{o()},i=Object.keys(e[t[0]]),a=[...we.filter(s=>s==="model"||i.includes(s)),...i.filter(s=>!we.includes(s))],m=i.reduce((s,b)=>({...s,[b]:0}),{}),c=t.reduce((s,b)=>(a.reduce((v,g)=>(g==="model"||(v[g]+=e[b][g]),v),s),s),m),d=[...a.map(s=>({key:s,label:nn[s]??De.words(s).map(De.upperFirst).join(" ")}))],r=[...t.map(s=>({model:s,...e[s]})),{model:"Total",...c}],p=h.jsxs("div",{className:"p-2",children:[h.jsxs("div",{className:"flex flex-col gap-2",children:[c.prompt_tokens!==void 0&&h.jsxs("div",{className:"flex justify-between gap-2",children:[h.jsx("span",{className:"font-semibold",children:"Prompt tokens"}),h.jsx("span",{children:c.prompt_tokens})]}),c.completion_tokens!==void 0&&h.jsxs("div",{className:"flex justify-between gap-2",children:[h.jsx("span",{className:"font-semibold",children:"Completion tokens"}),h.jsx("span",{children:c.completion_tokens})]}),c.total_tokens!==void 0&&h.jsxs("div",{className:"flex justify-between gap-2",children:[h.jsx("span",{className:"font-semibold",children:"Total tokens"}),h.jsx("span",{children:c.total_tokens})]}),c.estimated_cost!==void 0&&h.jsxs("div",{className:"flex justify-between gap-2",children:[h.jsx("span",{className:"font-semibold",children:"Estimated cost"}),h.jsxs("span",{children:[on(c.estimated_cost.toString()),"$"]})]})]}),h.jsx("p",{className:"m-auto mt-2 text-center",children:"Show detailed usage breakdown by model."})]});return h.jsxs(h.Fragment,{children:[h.jsx(Ql,{content:p,placement:"bottom",children:h.jsx(eu,{isIconOnly:!0,variant:"ghost",className:"p-0","aria-label":"Open usage details",onPress:u,children:h.jsx(tu,{icon:"heroicons:information-circle"})})}),h.jsx(lu,{isOpen:l,onOpenChange:n,size:"4xl",children:h.jsx(uu,{children:h.jsxs(h.Fragment,{children:[h.jsx(ru,{className:"text-default-900 flex flex-col gap-1",children:"Usage details"}),h.jsx(nu,{children:h.jsxs(Yu,{"aria-label":"Table with detailed usage statistics for each model used to generate the message.",fullWidth:!0,children:[h.jsx(Ju,{columns:d,children:s=>h.jsx(_u,{children:s.label},s.key)}),h.jsx(tn,{items:r,children:s=>h.jsx(Qu,{className:s.model==="Total"?"border-default-200 border-t-1":"",children:b=>h.jsx(un,{children:ou(s,b)})},s.model)})]})})]})})})]})}export{dn as default}; diff --git a/packages/ragbits-chat/src/ragbits/chat/ui-build/assets/authStore-DLhLSjcY.js b/packages/ragbits-chat/src/ragbits/chat/ui-build/assets/authStore-Ur4ZGows.js similarity index 74% rename from packages/ragbits-chat/src/ragbits/chat/ui-build/assets/authStore-DLhLSjcY.js rename to packages/ragbits-chat/src/ragbits/chat/ui-build/assets/authStore-Ur4ZGows.js index 4bf39c7f1..2ac1c94e5 100644 --- a/packages/ragbits-chat/src/ragbits/chat/ui-build/assets/authStore-DLhLSjcY.js +++ b/packages/ragbits-chat/src/ragbits/chat/ui-build/assets/authStore-Ur4ZGows.js @@ -1 +1 @@ -import{bx as u,by as l,bz as c}from"./index-C75huGqt.js";const h=e=>({user_id:e.user_id,email:e.email}),d=u(l(c((e,i)=>({user:null,token:null,isAuthenticated:!1,tokenExpiration:null,hasHydrated:!1,onRehydrated:()=>{const{token:t,tokenExpiration:o,logout:n}=i(),a=Date.now(),s=(o??0)-a;!t||s<=0?n():e(r=>{r.isAuthenticated=!0}),e(r=>{r.hasHydrated=!0})},login:(t,o)=>e(n=>{n.user=t,n.token=o,n.tokenExpiration=Date.now()+o.expires_in*1e3,n.isAuthenticated=!0}),logout:()=>e(t=>{t.user=null,t.token=null,t.isAuthenticated=!1})})),{name:"ragbits-auth",partialize:e=>({token:e.token,tokenExpiration:e.tokenExpiration,user:e.user?h(e.user):null}),merge:(e,i)=>({...i,...e,isAuthenticated:!1}),onRehydrateStorage:e=>()=>{e.onRehydrated()}}));export{d as a}; +import{bo as u,bp as l,bq as p}from"./index-BTypXP0X.js";const c=e=>({user_id:e.user_id,email:e.email}),d=u(l(p((e,i)=>({user:null,token:null,isAuthenticated:!1,tokenExpiration:null,hasHydrated:!1,onRehydrated:()=>{const{token:t,tokenExpiration:o,logout:n}=i(),a=Date.now(),s=(o??0)-a;!t||s<=0?n():e(r=>{r.isAuthenticated=!0}),e(r=>{r.hasHydrated=!0})},login:(t,o)=>e(n=>{n.user=t,n.token=o,n.tokenExpiration=Date.now()+o.expires_in*1e3,n.isAuthenticated=!0}),logout:()=>e(t=>{t.user=null,t.token=null,t.isAuthenticated=!1})})),{name:"ragbits-auth",partialize:e=>({token:e.token,tokenExpiration:e.tokenExpiration,user:e.user?c(e.user):null}),merge:(e,i)=>({...i,...e,isAuthenticated:!1}),onRehydrateStorage:e=>()=>{e.onRehydrated()}}));export{d as a}; diff --git a/packages/ragbits-chat/src/ragbits/chat/ui-build/assets/chunk-IGSAU2ZA-DUS7ku-0.js b/packages/ragbits-chat/src/ragbits/chat/ui-build/assets/chunk-IGSAU2ZA-DUS7ku-0.js deleted file mode 100644 index 9841cc695..000000000 --- a/packages/ragbits-chat/src/ragbits/chat/ui-build/assets/chunk-IGSAU2ZA-DUS7ku-0.js +++ /dev/null @@ -1 +0,0 @@ -import{O as h,bo as p,A as x,r as i,j as M,J as H}from"./index-C75huGqt.js";var s=h((r,o)=>{const{as:t,children:d,className:l,...n}=r,{slots:c,classNames:a,headerId:m,setHeaderMounted:e}=p(),f=x(o),u=t||"header";return i.useEffect(()=>(e(!0),()=>e(!1)),[e]),M.jsx(u,{ref:f,className:c.header({class:H(a?.header,l)}),id:m,...n,children:d})});s.displayName="HeroUI.ModalHeader";var R=s;export{R as m}; diff --git a/packages/ragbits-chat/src/ragbits/chat/ui-build/assets/chunk-IGSAU2ZA-RYoue1Xd.js b/packages/ragbits-chat/src/ragbits/chat/ui-build/assets/chunk-IGSAU2ZA-RYoue1Xd.js new file mode 100644 index 000000000..531e980f1 --- /dev/null +++ b/packages/ragbits-chat/src/ragbits/chat/ui-build/assets/chunk-IGSAU2ZA-RYoue1Xd.js @@ -0,0 +1 @@ +import{O as h,bf as p,A as x,r as i,j as M,J as H}from"./index-BTypXP0X.js";var s=h((r,o)=>{const{as:t,children:d,className:l,...n}=r,{slots:c,classNames:a,headerId:f,setHeaderMounted:e}=p(),m=x(o),u=t||"header";return i.useEffect(()=>(e(!0),()=>e(!1)),[e]),M.jsx(u,{ref:m,className:c.header({class:H(a?.header,l)}),id:f,...n,children:d})});s.displayName="HeroUI.ModalHeader";var R=s;export{R as m}; diff --git a/packages/ragbits-chat/src/ragbits/chat/ui-build/assets/chunk-SSA7SXE4-DnKzYyYP.js b/packages/ragbits-chat/src/ragbits/chat/ui-build/assets/chunk-SSA7SXE4-CpT2ku66.js similarity index 62% rename from packages/ragbits-chat/src/ragbits/chat/ui-build/assets/chunk-SSA7SXE4-DnKzYyYP.js rename to packages/ragbits-chat/src/ragbits/chat/ui-build/assets/chunk-SSA7SXE4-CpT2ku66.js index 733f69aa8..0b4e42a0b 100644 --- a/packages/ragbits-chat/src/ragbits/chat/ui-build/assets/chunk-SSA7SXE4-DnKzYyYP.js +++ b/packages/ragbits-chat/src/ragbits/chat/ui-build/assets/chunk-SSA7SXE4-CpT2ku66.js @@ -1 +1 @@ -import{O as y,br as z,j as e,r as t,az as D}from"./index-C75huGqt.js";var E=y((O,B)=>{const{Component:H,label:u,description:r,isClearable:d,startContent:c,endContent:h,labelPlacement:L,hasHelper:x,isOutsideLeft:j,isOutsideTop:g,shouldLabelBeOutside:m,errorMessage:s,isInvalid:P,getBaseProps:w,getLabelProps:F,getInputProps:v,getInnerWrapperProps:b,getInputWrapperProps:o,getMainWrapperProps:C,getHelperWrapperProps:I,getDescriptionProps:l,getErrorMessageProps:i,getClearButtonProps:f}=z({...O,ref:B}),n=u?e.jsx("label",{...F(),children:u}):null,M=t.useMemo(()=>d?e.jsx("button",{...f(),children:h||e.jsx(D,{})}):h,[d,f]),p=t.useMemo(()=>{const W=P&&s;return!x||!(W||r)?null:e.jsx("div",{...I(),children:W?e.jsx("div",{...i(),children:s}):e.jsx("div",{...l(),children:r})})},[x,P,s,r,I,i,l]),a=t.useMemo(()=>e.jsxs("div",{...b(),children:[c,e.jsx("input",{...v()}),M]}),[c,M,v,b]),R=t.useMemo(()=>m?e.jsxs("div",{...C(),children:[e.jsxs("div",{...o(),children:[!j&&!g?n:null,a]}),p]}):e.jsxs(e.Fragment,{children:[e.jsxs("div",{...o(),children:[n,a]}),p]}),[L,p,m,n,a,s,r,C,o,i,l]);return e.jsxs(H,{...w(),children:[j||g?n:null,R]})});E.displayName="HeroUI.Input";var T=E;export{T as i}; +import{O as y,bi as z,j as e,r as t,az as D}from"./index-BTypXP0X.js";var E=y((O,B)=>{const{Component:H,label:u,description:r,isClearable:d,startContent:c,endContent:h,labelPlacement:L,hasHelper:x,isOutsideLeft:j,isOutsideTop:g,shouldLabelBeOutside:m,errorMessage:s,isInvalid:P,getBaseProps:w,getLabelProps:F,getInputProps:v,getInnerWrapperProps:b,getInputWrapperProps:o,getMainWrapperProps:C,getHelperWrapperProps:I,getDescriptionProps:i,getErrorMessageProps:l,getClearButtonProps:f}=z({...O,ref:B}),n=u?e.jsx("label",{...F(),children:u}):null,M=t.useMemo(()=>d?e.jsx("button",{...f(),children:h||e.jsx(D,{})}):h,[d,f]),p=t.useMemo(()=>{const W=P&&s;return!x||!(W||r)?null:e.jsx("div",{...I(),children:W?e.jsx("div",{...l(),children:s}):e.jsx("div",{...i(),children:r})})},[x,P,s,r,I,l,i]),a=t.useMemo(()=>e.jsxs("div",{...b(),children:[c,e.jsx("input",{...v()}),M]}),[c,M,v,b]),R=t.useMemo(()=>m?e.jsxs("div",{...C(),children:[e.jsxs("div",{...o(),children:[!j&&!g?n:null,a]}),p]}):e.jsxs(e.Fragment,{children:[e.jsxs("div",{...o(),children:[n,a]}),p]}),[L,p,m,n,a,s,r,C,o,l,i]);return e.jsxs(H,{...w(),children:[j||g?n:null,R]})});E.displayName="HeroUI.Input";var T=E;export{T as i}; diff --git a/packages/ragbits-chat/src/ragbits/chat/ui-build/assets/index-3BSSmhVm.js b/packages/ragbits-chat/src/ragbits/chat/ui-build/assets/index-3BSSmhVm.js deleted file mode 100644 index 2f842ccd5..000000000 --- a/packages/ragbits-chat/src/ragbits/chat/ui-build/assets/index-3BSSmhVm.js +++ /dev/null @@ -1 +0,0 @@ -import{bA as a,bB as e,bC as t}from"./index-C75huGqt.js";const n={renderer:t,...e,...a};var o=n;export{o as default}; diff --git a/packages/ragbits-chat/src/ragbits/chat/ui-build/assets/index-BTHsSiyo.css b/packages/ragbits-chat/src/ragbits/chat/ui-build/assets/index-BTHsSiyo.css deleted file mode 100644 index 988f13912..000000000 --- a/packages/ragbits-chat/src/ragbits/chat/ui-build/assets/index-BTHsSiyo.css +++ /dev/null @@ -1 +0,0 @@ -/*! tailwindcss v4.1.11 | MIT License | https://tailwindcss.com */@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-translate-x:0;--tw-translate-y:0;--tw-translate-z:0;--tw-scale-x:1;--tw-scale-y:1;--tw-scale-z:1;--tw-rotate-x:initial;--tw-rotate-y:initial;--tw-rotate-z:initial;--tw-skew-x:initial;--tw-skew-y:initial;--tw-scroll-snap-strictness:proximity;--tw-space-y-reverse:0;--tw-space-x-reverse:0;--tw-border-style:solid;--tw-gradient-position:initial;--tw-gradient-from:#0000;--tw-gradient-via:#0000;--tw-gradient-to:#0000;--tw-gradient-stops:initial;--tw-gradient-via-stops:initial;--tw-gradient-from-position:0%;--tw-gradient-via-position:50%;--tw-gradient-to-position:100%;--tw-leading:initial;--tw-font-weight:initial;--tw-ordinal:initial;--tw-slashed-zero:initial;--tw-numeric-figure:initial;--tw-numeric-spacing:initial;--tw-numeric-fraction:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-blur:initial;--tw-brightness:initial;--tw-contrast:initial;--tw-grayscale:initial;--tw-hue-rotate:initial;--tw-invert:initial;--tw-opacity:initial;--tw-saturate:initial;--tw-sepia:initial;--tw-drop-shadow:initial;--tw-drop-shadow-color:initial;--tw-drop-shadow-alpha:100%;--tw-drop-shadow-size:initial;--tw-backdrop-blur:initial;--tw-backdrop-brightness:initial;--tw-backdrop-contrast:initial;--tw-backdrop-grayscale:initial;--tw-backdrop-hue-rotate:initial;--tw-backdrop-invert:initial;--tw-backdrop-opacity:initial;--tw-backdrop-saturate:initial;--tw-backdrop-sepia:initial;--tw-duration:initial;--tw-ease:initial;--tw-content:"";--tw-outline-style:solid}}}@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-yellow-600:oklch(68.1% .162 75.834);--color-green-600:oklch(62.7% .194 149.214);--color-purple-500:oklch(62.7% .265 303.9);--color-black:#000;--color-white:#fff;--spacing:.25rem;--container-xs:20rem;--container-sm:24rem;--container-md:28rem;--container-lg:32rem;--container-xl:36rem;--container-2xl:42rem;--container-3xl:48rem;--container-4xl:56rem;--container-5xl:64rem;--text-xs:.75rem;--text-xs--line-height:calc(1/.75);--text-sm:.875rem;--text-sm--line-height:calc(1.25/.875);--text-lg:1.125rem;--text-lg--line-height:calc(1.75/1.125);--text-xl:1.25rem;--text-xl--line-height:calc(1.75/1.25);--text-2xl:1.5rem;--text-2xl--line-height:calc(2/1.5);--font-weight-extralight:200;--font-weight-normal:400;--font-weight-medium:500;--font-weight-semibold:600;--font-weight-bold:700;--radius-sm:.25rem;--radius-md:.375rem;--radius-lg:.5rem;--radius-xl:.75rem;--ease-in:cubic-bezier(.4,0,1,1);--ease-out:cubic-bezier(0,0,.2,1);--animate-spin:spin 1s linear infinite;--blur-sm:8px;--blur-md:12px;--blur-lg:16px;--blur-xl:24px;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4,0,.2,1);--default-font-family:var(--font-sans);--default-mono-font-family:var(--font-mono);--animate-pop-in:pop-in .2s ease-out forwards;--color-primary:#1b54ff}}@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%;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}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}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab,red,red)){::placeholder{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]){appearance:button}::file-selector-button{appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}:root,[data-theme]{color:hsl(var(--heroui-foreground));background-color:hsl(var(--heroui-background))}:root,[data-theme=light]{color-scheme:light;--heroui-background:0 0% 100%;--heroui-foreground-50:0 0% 98.04%;--heroui-foreground-100:240 4.76% 95.88%;--heroui-foreground-200:240 5.88% 90%;--heroui-foreground-300:240 4.88% 83.92%;--heroui-foreground-400:240 5.03% 64.9%;--heroui-foreground-500:240 3.83% 46.08%;--heroui-foreground-600:240 5.2% 33.92%;--heroui-foreground-700:240 5.26% 26.08%;--heroui-foreground-800:240 3.7% 15.88%;--heroui-foreground-900:240 5.88% 10%;--heroui-foreground:201.82 24.44% 8.82%;--heroui-divider:0 0% 6.67%;--heroui-focus:212.02 100% 46.67%;--heroui-overlay:0 0% 0%;--heroui-content1:0 0% 100%;--heroui-content1-foreground:201.82 24.44% 8.82%;--heroui-content2:240 4.76% 95.88%;--heroui-content2-foreground:240 3.7% 15.88%;--heroui-content3:240 5.88% 90%;--heroui-content3-foreground:240 5.26% 26.08%;--heroui-content4:240 4.88% 83.92%;--heroui-content4-foreground:240 5.2% 33.92%;--heroui-default-50:0 0% 98.04%;--heroui-default-100:240 4.76% 95.88%;--heroui-default-200:240 5.88% 90%;--heroui-default-300:240 4.88% 83.92%;--heroui-default-400:240 5.03% 64.9%;--heroui-default-500:240 3.83% 46.08%;--heroui-default-600:240 5.2% 33.92%;--heroui-default-700:240 5.26% 26.08%;--heroui-default-800:240 3.7% 15.88%;--heroui-default-900:240 5.88% 10%;--heroui-default-foreground:0 0% 0%;--heroui-default:240 4.88% 83.92%;--heroui-primary-50:212.5 92.31% 94.9%;--heroui-primary-100:211.84 92.45% 89.61%;--heroui-primary-200:211.84 92.45% 79.22%;--heroui-primary-300:212.24 92.45% 68.82%;--heroui-primary-400:212.14 92.45% 58.43%;--heroui-primary-500:212.02 100% 46.67%;--heroui-primary-600:212.14 100% 38.43%;--heroui-primary-700:212.24 100% 28.82%;--heroui-primary-800:211.84 100% 19.22%;--heroui-primary-900:211.84 100% 9.61%;--heroui-primary-foreground:0 0% 100%;--heroui-primary:212.02 100% 46.67%;--heroui-secondary-50:270 61.54% 94.9%;--heroui-secondary-100:270 59.26% 89.41%;--heroui-secondary-200:270 59.26% 78.82%;--heroui-secondary-300:270 59.26% 68.24%;--heroui-secondary-400:270 59.26% 57.65%;--heroui-secondary-500:270 66.67% 47.06%;--heroui-secondary-600:270 66.67% 37.65%;--heroui-secondary-700:270 66.67% 28.24%;--heroui-secondary-800:270 66.67% 18.82%;--heroui-secondary-900:270 66.67% 9.41%;--heroui-secondary-foreground:0 0% 100%;--heroui-secondary:270 66.67% 47.06%;--heroui-success-50:146.67 64.29% 94.51%;--heroui-success-100:145.71 61.4% 88.82%;--heroui-success-200:146.2 61.74% 77.45%;--heroui-success-300:145.79 62.57% 66.47%;--heroui-success-400:146.01 62.45% 55.1%;--heroui-success-500:145.96 79.46% 43.92%;--heroui-success-600:146.01 79.89% 35.1%;--heroui-success-700:145.79 79.26% 26.47%;--heroui-success-800:146.2 79.78% 17.45%;--heroui-success-900:145.71 77.78% 8.82%;--heroui-success-foreground:0 0% 0%;--heroui-success:145.96 79.46% 43.92%;--heroui-warning-50:54.55 91.67% 95.29%;--heroui-warning-100:37.14 91.3% 90.98%;--heroui-warning-200:37.14 91.3% 81.96%;--heroui-warning-300:36.96 91.24% 73.14%;--heroui-warning-400:37.01 91.26% 64.12%;--heroui-warning-500:37.03 91.27% 55.1%;--heroui-warning-600:37.01 74.22% 44.12%;--heroui-warning-700:36.96 73.96% 33.14%;--heroui-warning-800:37.14 75% 21.96%;--heroui-warning-900:37.14 75% 10.98%;--heroui-warning-foreground:0 0% 0%;--heroui-warning:37.03 91.27% 55.1%;--heroui-danger-50:339.13 92% 95.1%;--heroui-danger-100:340 91.84% 90.39%;--heroui-danger-200:339.33 90% 80.39%;--heroui-danger-300:339.11 90.6% 70.78%;--heroui-danger-400:339 90% 60.78%;--heroui-danger-500:339.2 90.36% 51.18%;--heroui-danger-600:339 86.54% 40.78%;--heroui-danger-700:339.11 85.99% 30.78%;--heroui-danger-800:339.33 86.54% 20.39%;--heroui-danger-900:340 84.91% 10.39%;--heroui-danger-foreground:0 0% 100%;--heroui-danger:339.2 90.36% 51.18%;--heroui-divider-weight:1px;--heroui-disabled-opacity:.5;--heroui-font-size-tiny:.75rem;--heroui-font-size-small:.875rem;--heroui-font-size-medium:1rem;--heroui-font-size-large:1.125rem;--heroui-line-height-tiny:1rem;--heroui-line-height-small:1.25rem;--heroui-line-height-medium:1.5rem;--heroui-line-height-large:1.75rem;--heroui-radius-small:8px;--heroui-radius-medium:12px;--heroui-radius-large:14px;--heroui-border-width-small:1px;--heroui-border-width-medium:2px;--heroui-border-width-large:3px;--heroui-box-shadow-small:0px 0px 5px 0px #00000005,0px 2px 10px 0px #0000000f,0px 0px 1px 0px #0000004d;--heroui-box-shadow-medium:0px 0px 15px 0px #00000008,0px 2px 30px 0px #00000014,0px 0px 1px 0px #0000004d;--heroui-box-shadow-large:0px 0px 30px 0px #0000000a,0px 30px 60px 0px #0000001f,0px 0px 1px 0px #0000004d;--heroui-hover-opacity:.8}}@layer components;@layer utilities{.pointer-events-auto{pointer-events:auto}.pointer-events-none{pointer-events:none}.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}.static{position:static}.sticky{position:sticky}.inset-0{inset:calc(var(--spacing)*0)}.inset-x-0{inset-inline:calc(var(--spacing)*0)}.inset-y-0{inset-block:calc(var(--spacing)*0)}.start-0{inset-inline-start:calc(var(--spacing)*0)}.start-1\.5{inset-inline-start:calc(var(--spacing)*1.5)}.start-2{inset-inline-start:calc(var(--spacing)*2)}.start-3{inset-inline-start:calc(var(--spacing)*3)}.start-auto{inset-inline-start:auto}.end-1{inset-inline-end:calc(var(--spacing)*1)}.end-1\.5{inset-inline-end:calc(var(--spacing)*1.5)}.end-3{inset-inline-end:calc(var(--spacing)*3)}.end-18{inset-inline-end:calc(var(--spacing)*18)}.end-auto{inset-inline-end:auto}.-top-2{top:calc(var(--spacing)*-2)}.-top-16{top:calc(var(--spacing)*-16)}.-top-px{top:-1px}.top-0{top:calc(var(--spacing)*0)}.top-1{top:calc(var(--spacing)*1)}.top-1\/2{top:50%}.top-2{top:calc(var(--spacing)*2)}.top-4{top:calc(var(--spacing)*4)}.top-\[5\%\]{top:5%}.top-\[10\%\]{top:10%}.top-\[calc\(46\%\)\]{top:46%}.top-\[calc\(100\%_\+_2px\)\]{top:calc(100% + 2px)}.top-\[var\(--navbar-height\)\]{top:var(--navbar-height)}.-right-2{right:calc(var(--spacing)*-2)}.-right-px{right:-1px}.right-0{right:calc(var(--spacing)*0)}.right-2{right:calc(var(--spacing)*2)}.right-4{right:calc(var(--spacing)*4)}.right-\[5\%\]{right:5%}.right-\[10\%\]{right:10%}.bottom-0{bottom:calc(var(--spacing)*0)}.bottom-4{bottom:calc(var(--spacing)*4)}.bottom-16{bottom:calc(var(--spacing)*16)}.bottom-\[5\%\]{bottom:5%}.bottom-\[10\%\]{bottom:10%}.left-0{left:calc(var(--spacing)*0)}.left-1\/2{left:50%}.left-4{left:calc(var(--spacing)*4)}.left-\[5\%\]{left:5%}.left-\[10\%\]{left:10%}.left-\[calc\(37\.5\%\)\]{left:37.5%}.-z-30{z-index:-30}.z-0{z-index:0}.z-10{z-index:10}.z-20{z-index:20}.z-30{z-index:30}.z-40{z-index:40}.z-50{z-index:50}.z-\[1\]{z-index:1}.z-\[100\]{z-index:100}.order-1{order:1}.order-2{order:2}.order-3{order:3}.container{width:100%}@media (min-width:28rem){.container{max-width:28rem}}@media (min-width:40rem){.container{max-width:40rem}}@media (min-width:48rem){.container{max-width:48rem}}@media (min-width:64rem){.container{max-width:64rem}}@media (min-width:80rem){.container{max-width:80rem}}@media (min-width:96rem){.container{max-width:96rem}}.-m-2{margin:calc(var(--spacing)*-2)}.-m-2\.5{margin:calc(var(--spacing)*-2.5)}.m-0{margin:calc(var(--spacing)*0)}.m-auto{margin:auto}.-mx-1{margin-inline:calc(var(--spacing)*-1)}.-mx-2{margin-inline:calc(var(--spacing)*-2)}.mx-0{margin-inline:calc(var(--spacing)*0)}.mx-1{margin-inline:calc(var(--spacing)*1)}.mx-\[calc\(\(theme\(spacing\.5\)-theme\(spacing\.1\)\)\/2\)\]{margin-inline:.5rem}.mx-\[calc\(\(theme\(spacing\.6\)-theme\(spacing\.3\)\)\/2\)\]{margin-inline:.375rem}.mx-\[calc\(\(theme\(spacing\.7\)-theme\(spacing\.5\)\)\/2\)\]{margin-inline:.25rem}.mx-auto{margin-inline:auto}.my-0{margin-block:calc(var(--spacing)*0)}.my-1{margin-block:calc(var(--spacing)*1)}.my-16{margin-block:calc(var(--spacing)*16)}.my-\[calc\(\(theme\(spacing\.5\)-theme\(spacing\.1\)\)\/2\)\]{margin-block:.5rem}.my-\[calc\(\(theme\(spacing\.6\)-theme\(spacing\.3\)\)\/2\)\]{margin-block:.375rem}.my-\[calc\(\(theme\(spacing\.7\)-theme\(spacing\.5\)\)\/2\)\]{margin-block:.25rem}.my-auto{margin-block:auto}.-ms-2{margin-inline-start:calc(var(--spacing)*-2)}.ms-2{margin-inline-start:calc(var(--spacing)*2)}.ms-3{margin-inline-start:calc(var(--spacing)*3)}.me-2{margin-inline-end:calc(var(--spacing)*2)}.me-4{margin-inline-end:calc(var(--spacing)*4)}.prose{color:var(--tw-prose-body);max-width:65ch}.prose :where(p):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.25em;margin-bottom:1.25em}.prose :where([class~=lead]):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-lead);margin-top:1.2em;margin-bottom:1.2em;font-size:1.25em;line-height:1.6}.prose :where(a):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-links);font-weight:500;text-decoration:underline}.prose :where(strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-bold);font-weight:600}.prose :where(a strong):not(:where([class~=not-prose],[class~=not-prose] *)),.prose :where(blockquote strong):not(:where([class~=not-prose],[class~=not-prose] *)),.prose :where(thead th strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(ol):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.25em;margin-bottom:1.25em;padding-inline-start:1.625em;list-style-type:decimal}.prose :where(ol[type=A]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:upper-alpha}.prose :where(ol[type=a]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:lower-alpha}.prose :where(ol[type=A s]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:upper-alpha}.prose :where(ol[type=a s]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:lower-alpha}.prose :where(ol[type=I]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:upper-roman}.prose :where(ol[type=i]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:lower-roman}.prose :where(ol[type=I s]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:upper-roman}.prose :where(ol[type=i s]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:lower-roman}.prose :where(ol[type="1"]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:decimal}.prose :where(ul):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.25em;margin-bottom:1.25em;padding-inline-start:1.625em;list-style-type:disc}.prose :where(ol>li):not(:where([class~=not-prose],[class~=not-prose] *))::marker{color:var(--tw-prose-counters);font-weight:400}.prose :where(ul>li):not(:where([class~=not-prose],[class~=not-prose] *))::marker{color:var(--tw-prose-bullets)}.prose :where(dt):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);margin-top:1.25em;font-weight:600}.prose :where(hr):not(:where([class~=not-prose],[class~=not-prose] *)){border-color:var(--tw-prose-hr);border-top-width:1px;margin-top:3em;margin-bottom:3em}.prose :where(blockquote):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-quotes);border-inline-start-width:.25rem;border-inline-start-color:var(--tw-prose-quote-borders);quotes:"“""”""‘""’";margin-top:1.6em;margin-bottom:1.6em;padding-inline-start:1em;font-style:italic;font-weight:500}.prose :where(blockquote p:first-of-type):not(:where([class~=not-prose],[class~=not-prose] *)):before{content:open-quote}.prose :where(blockquote p:last-of-type):not(:where([class~=not-prose],[class~=not-prose] *)):after{content:close-quote}.prose :where(h1):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);margin-top:0;margin-bottom:.888889em;font-size:2.25em;font-weight:800;line-height:1.11111}.prose :where(h1 strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit;font-weight:900}.prose :where(h2):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);margin-top:2em;margin-bottom:1em;font-size:1.5em;font-weight:700;line-height:1.33333}.prose :where(h2 strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit;font-weight:800}.prose :where(h3):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);margin-top:1.6em;margin-bottom:.6em;font-size:1.25em;font-weight:600;line-height:1.6}.prose :where(h3 strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit;font-weight:700}.prose :where(h4):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);margin-top:1.5em;margin-bottom:.5em;font-weight:600;line-height:1.5}.prose :where(h4 strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit;font-weight:700}.prose :where(img):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:2em;margin-bottom:2em}.prose :where(picture):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:2em;margin-bottom:2em;display:block}.prose :where(video):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:2em;margin-bottom:2em}.prose :where(kbd):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-kbd);box-shadow:0 0 0 1px rgb(var(--tw-prose-kbd-shadows)/10%),0 3px rgb(var(--tw-prose-kbd-shadows)/10%);padding-top:.1875em;padding-inline-end:.375em;padding-bottom:.1875em;border-radius:.3125rem;padding-inline-start:.375em;font-family:inherit;font-size:.875em;font-weight:500}.prose :where(code):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-code);font-size:.875em;font-weight:600}.prose :where(code):not(:where([class~=not-prose],[class~=not-prose] *)):before,.prose :where(code):not(:where([class~=not-prose],[class~=not-prose] *)):after{content:"`"}.prose :where(a code):not(:where([class~=not-prose],[class~=not-prose] *)),.prose :where(h1 code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(h2 code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit;font-size:.875em}.prose :where(h3 code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit;font-size:.9em}.prose :where(h4 code):not(:where([class~=not-prose],[class~=not-prose] *)),.prose :where(blockquote code):not(:where([class~=not-prose],[class~=not-prose] *)),.prose :where(thead th code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(pre):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-pre-code);background-color:var(--tw-prose-pre-bg);padding-top:.857143em;padding-inline-end:1.14286em;padding-bottom:.857143em;border-radius:.375rem;margin-top:1.71429em;margin-bottom:1.71429em;padding-inline-start:1.14286em;font-size:.875em;font-weight:400;line-height:1.71429;overflow-x:auto}.prose :where(pre code):not(:where([class~=not-prose],[class~=not-prose] *)){font-weight:inherit;color:inherit;font-size:inherit;font-family:inherit;line-height:inherit;background-color:#0000;border-width:0;border-radius:0;padding:0}.prose :where(pre code):not(:where([class~=not-prose],[class~=not-prose] *)):before,.prose :where(pre code):not(:where([class~=not-prose],[class~=not-prose] *)):after{content:none}.prose :where(table):not(:where([class~=not-prose],[class~=not-prose] *)){table-layout:auto;width:100%;margin-top:2em;margin-bottom:2em;font-size:.875em;line-height:1.71429}.prose :where(thead):not(:where([class~=not-prose],[class~=not-prose] *)){border-bottom-width:1px;border-bottom-color:var(--tw-prose-th-borders)}.prose :where(thead th):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);vertical-align:bottom;padding-inline-end:.571429em;padding-bottom:.571429em;padding-inline-start:.571429em;font-weight:600}.prose :where(tbody tr):not(:where([class~=not-prose],[class~=not-prose] *)){border-bottom-width:1px;border-bottom-color:var(--tw-prose-td-borders)}.prose :where(tbody tr:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){border-bottom-width:0}.prose :where(tbody td):not(:where([class~=not-prose],[class~=not-prose] *)){vertical-align:baseline}.prose :where(tfoot):not(:where([class~=not-prose],[class~=not-prose] *)){border-top-width:1px;border-top-color:var(--tw-prose-th-borders)}.prose :where(tfoot td):not(:where([class~=not-prose],[class~=not-prose] *)){vertical-align:top}.prose :where(th,td):not(:where([class~=not-prose],[class~=not-prose] *)){text-align:start}.prose :where(figure>*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0;margin-bottom:0}.prose :where(figcaption):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-captions);margin-top:.857143em;font-size:.875em;line-height:1.42857}.prose{--tw-prose-body:oklch(37.3% .034 259.733);--tw-prose-headings:oklch(21% .034 264.665);--tw-prose-lead:oklch(44.6% .03 256.802);--tw-prose-links:oklch(21% .034 264.665);--tw-prose-bold:oklch(21% .034 264.665);--tw-prose-counters:oklch(55.1% .027 264.364);--tw-prose-bullets:oklch(87.2% .01 258.338);--tw-prose-hr:oklch(92.8% .006 264.531);--tw-prose-quotes:oklch(21% .034 264.665);--tw-prose-quote-borders:oklch(92.8% .006 264.531);--tw-prose-captions:oklch(55.1% .027 264.364);--tw-prose-kbd:oklch(21% .034 264.665);--tw-prose-kbd-shadows:NaN NaN NaN;--tw-prose-code:oklch(21% .034 264.665);--tw-prose-pre-code:oklch(92.8% .006 264.531);--tw-prose-pre-bg:oklch(27.8% .033 256.848);--tw-prose-th-borders:oklch(87.2% .01 258.338);--tw-prose-td-borders:oklch(92.8% .006 264.531);--tw-prose-invert-body:oklch(87.2% .01 258.338);--tw-prose-invert-headings:#fff;--tw-prose-invert-lead:oklch(70.7% .022 261.325);--tw-prose-invert-links:#fff;--tw-prose-invert-bold:#fff;--tw-prose-invert-counters:oklch(70.7% .022 261.325);--tw-prose-invert-bullets:oklch(44.6% .03 256.802);--tw-prose-invert-hr:oklch(37.3% .034 259.733);--tw-prose-invert-quotes:oklch(96.7% .003 264.542);--tw-prose-invert-quote-borders:oklch(37.3% .034 259.733);--tw-prose-invert-captions:oklch(70.7% .022 261.325);--tw-prose-invert-kbd:#fff;--tw-prose-invert-kbd-shadows:255 255 255;--tw-prose-invert-code:#fff;--tw-prose-invert-pre-code:oklch(87.2% .01 258.338);--tw-prose-invert-pre-bg:#00000080;--tw-prose-invert-th-borders:oklch(44.6% .03 256.802);--tw-prose-invert-td-borders:oklch(37.3% .034 259.733);font-size:1rem;line-height:1.75}.prose :where(picture>img):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0;margin-bottom:0}.prose :where(li):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.5em;margin-bottom:.5em}.prose :where(ol>li):not(:where([class~=not-prose],[class~=not-prose] *)),.prose :where(ul>li):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:.375em}.prose :where(.prose>ul>li p):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.75em;margin-bottom:.75em}.prose :where(.prose>ul>li>p:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.25em}.prose :where(.prose>ul>li>p:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.25em}.prose :where(.prose>ol>li>p:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.25em}.prose :where(.prose>ol>li>p:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.25em}.prose :where(ul ul,ul ol,ol ul,ol ol):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.75em;margin-bottom:.75em}.prose :where(dl):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.25em;margin-bottom:1.25em}.prose :where(dd):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.5em;padding-inline-start:1.625em}.prose :where(hr+*):not(:where([class~=not-prose],[class~=not-prose] *)),.prose :where(h2+*):not(:where([class~=not-prose],[class~=not-prose] *)),.prose :where(h3+*):not(:where([class~=not-prose],[class~=not-prose] *)),.prose :where(h4+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.prose :where(thead th:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:0}.prose :where(thead th:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-end:0}.prose :where(tbody td,tfoot td):not(:where([class~=not-prose],[class~=not-prose] *)){padding-top:.571429em;padding-inline-end:.571429em;padding-bottom:.571429em;padding-inline-start:.571429em}.prose :where(tbody td:first-child,tfoot td:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:0}.prose :where(tbody td:last-child,tfoot td:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-end:0}.prose :where(figure):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:2em;margin-bottom:2em}.prose :where(.prose>:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.prose :where(.prose>:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:0}.mt-0\.5{margin-top:calc(var(--spacing)*.5)}.mt-1{margin-top:calc(var(--spacing)*1)}.mt-2{margin-top:calc(var(--spacing)*2)}.mt-4{margin-top:calc(var(--spacing)*4)}.mt-auto{margin-top:auto}.-mr-2{margin-right:calc(var(--spacing)*-2)}.mr-4{margin-right:calc(var(--spacing)*4)}.mr-auto{margin-right:auto}.mb-0{margin-bottom:calc(var(--spacing)*0)}.mb-1{margin-bottom:calc(var(--spacing)*1)}.mb-1\.5{margin-bottom:calc(var(--spacing)*1.5)}.mb-2{margin-bottom:calc(var(--spacing)*2)}.mb-4{margin-bottom:calc(var(--spacing)*4)}.mb-5{margin-bottom:calc(var(--spacing)*5)}.mb-px{margin-bottom:1px}.ml-1{margin-left:calc(var(--spacing)*1)}.ml-4{margin-left:calc(var(--spacing)*4)}.ml-auto{margin-left:auto}.box-border{box-sizing:border-box}.box-content{box-sizing:content-box}.scrollbar-default{-ms-overflow-style:auto;scrollbar-width:auto}.scrollbar-default::-webkit-scrollbar{display:block}.scrollbar-hide{-ms-overflow-style:none;scrollbar-width:none}.scrollbar-hide::-webkit-scrollbar{display:none}.block{display:block}.flex{display:flex}.grid{display:grid}.hidden{display:none}.inline-block{display:inline-block}.inline-flex{display:inline-flex}.inline-grid{display:inline-grid}.table{display:table}.aspect-square{aspect-ratio:1}.size-1{width:calc(var(--spacing)*1);height:calc(var(--spacing)*1)}.size-1\.5{width:calc(var(--spacing)*1.5);height:calc(var(--spacing)*1.5)}.size-2{width:calc(var(--spacing)*2);height:calc(var(--spacing)*2)}.\!h-auto{height:auto!important}.h-0\.5{height:calc(var(--spacing)*.5)}.h-1{height:calc(var(--spacing)*1)}.h-1\.5{height:calc(var(--spacing)*1.5)}.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-12{height:calc(var(--spacing)*12)}.h-14{height:calc(var(--spacing)*14)}.h-16{height:calc(var(--spacing)*16)}.h-40{height:calc(var(--spacing)*40)}.h-\[--visual-viewport-height\]{height:--visual-viewport-height}.h-\[2px\]{height:2px}.h-\[8\%\]{height:8%}.h-\[50\%\]{height:50%}.h-\[100dvh\]{height:100dvh}.h-\[calc\(100dvh_-_var\(--navbar-height\)\)\]{height:calc(100dvh - var(--navbar-height))}.h-\[var\(--navbar-height\)\]{height:var(--navbar-height)}.h-\[var\(--picker-height\)\]{height:var(--picker-height)}.h-auto{height:auto}.h-divider{height:var(--heroui-divider-weight)}.h-fit{height:fit-content}.h-full{height:100%}.h-px{height:1px}.h-screen{height:100vh}.max-h-\[20rem\]{max-height:20rem}.max-h-\[24rem\]{max-height:24rem}.max-h-\[28rem\]{max-height:28rem}.max-h-\[32rem\]{max-height:32rem}.max-h-\[36rem\]{max-height:36rem}.max-h-\[42rem\]{max-height:42rem}.max-h-\[48rem\]{max-height:48rem}.max-h-\[56rem\]{max-height:56rem}.max-h-\[64rem\]{max-height:64rem}.max-h-\[90vh\]{max-height:90vh}.max-h-\[664px\]{max-height:664px}.max-h-\[calc\(100\%_-_8rem\)\]{max-height:calc(100% - 8rem)}.max-h-\[none\]{max-height:none}.max-h-full{max-height:100%}.min-h-3{min-height:calc(var(--spacing)*3)}.min-h-3\.5{min-height:calc(var(--spacing)*3.5)}.min-h-4{min-height:calc(var(--spacing)*4)}.min-h-5{min-height:calc(var(--spacing)*5)}.min-h-6{min-height:calc(var(--spacing)*6)}.min-h-7{min-height:calc(var(--spacing)*7)}.min-h-8{min-height:calc(var(--spacing)*8)}.min-h-10{min-height:calc(var(--spacing)*10)}.min-h-12{min-height:calc(var(--spacing)*12)}.min-h-14{min-height:calc(var(--spacing)*14)}.min-h-16{min-height:calc(var(--spacing)*16)}.min-h-\[32px\]{min-height:32px}.min-h-\[48rem\]{min-height:48rem}.min-h-\[50px\]{min-height:50px}.min-h-\[100dvh\]{min-height:100dvh}.min-h-screen{min-height:100vh}.w-1{width:calc(var(--spacing)*1)}.w-1\.5{width:calc(var(--spacing)*1.5)}.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-10{width:calc(var(--spacing)*10)}.w-12{width:calc(var(--spacing)*12)}.w-14{width:calc(var(--spacing)*14)}.w-\[25\%\]{width:25%}.w-\[80\%\]{width:80%}.w-\[calc\(100\%_-_16px\)\]{width:calc(100% - 16px)}.w-\[calc\(100\%_-theme\(spacing\.6\)\)\]{width:calc(100% - 1.5rem)}.w-\[calc\(var\(--visible-months\)_\*_var\(--calendar-width\)\)\]{width:calc(var(--visible-months)*var(--calendar-width))}.w-auto{width:auto}.w-divider{width:var(--heroui-divider-weight)}.w-fit{width:fit-content}.w-full{width:100%}.w-max{width:max-content}.w-px{width:1px}.w-screen{width:100vw}.max-w-2xl{max-width:var(--container-2xl)}.max-w-3xl{max-width:var(--container-3xl)}.max-w-4xl{max-width:var(--container-4xl)}.max-w-5xl{max-width:var(--container-5xl)}.max-w-\[33\%\]{max-width:33%}.max-w-\[75\%\]{max-width:75%}.max-w-\[90vw\]{max-width:90vw}.max-w-\[270px\]{max-width:270px}.max-w-\[600px\]{max-width:600px}.max-w-\[640px\]{max-width:640px}.max-w-\[768px\]{max-width:768px}.max-w-\[1024px\]{max-width:1024px}.max-w-\[1280px\]{max-width:1280px}.max-w-\[1536px\]{max-width:1536px}.max-w-\[none\]{max-width:none}.max-w-fit{max-width:fit-content}.max-w-full{max-width:100%}.max-w-lg{max-width:var(--container-lg)}.max-w-md{max-width:var(--container-md)}.max-w-sm{max-width:var(--container-sm)}.max-w-xl{max-width:var(--container-xl)}.max-w-xs{max-width:var(--container-xs)}.min-w-3{min-width:calc(var(--spacing)*3)}.min-w-3\.5{min-width:calc(var(--spacing)*3.5)}.min-w-4{min-width:calc(var(--spacing)*4)}.min-w-5{min-width:calc(var(--spacing)*5)}.min-w-6{min-width:calc(var(--spacing)*6)}.min-w-7{min-width:calc(var(--spacing)*7)}.min-w-8{min-width:calc(var(--spacing)*8)}.min-w-9{min-width:calc(var(--spacing)*9)}.min-w-10{min-width:calc(var(--spacing)*10)}.min-w-12{min-width:calc(var(--spacing)*12)}.min-w-16{min-width:calc(var(--spacing)*16)}.min-w-20{min-width:calc(var(--spacing)*20)}.min-w-24{min-width:calc(var(--spacing)*24)}.min-w-40{min-width:calc(var(--spacing)*40)}.min-w-\[4\.5rem\]{min-width:4.5rem}.min-w-\[120px\]{min-width:120px}.min-w-\[200px\]{min-width:200px}.min-w-full{min-width:100%}.min-w-max{min-width:max-content}.min-w-min{min-width:min-content}.flex-1{flex:1}.flex-auto{flex:auto}.flex-initial{flex:0 auto}.flex-none{flex:none}.flex-shrink-0,.shrink-0{flex-shrink:0}.flex-grow,.grow{flex-grow:1}.basis-0{flex-basis:calc(var(--spacing)*0)}.table-auto{table-layout:auto}.table-fixed{table-layout:fixed}.border-collapse{border-collapse:collapse}.origin-center{transform-origin:50%}.origin-left{transform-origin:0}.origin-right{transform-origin:100%}.origin-top{transform-origin:top}.origin-top-left{transform-origin:0 0}.-translate-x-1\/2{--tw-translate-x: -50% ;translate:var(--tw-translate-x)var(--tw-translate-y)}.translate-x-1{--tw-translate-x:calc(var(--spacing)*1);translate:var(--tw-translate-x)var(--tw-translate-y)}.translate-x-1\/2{--tw-translate-x: 50% ;translate:var(--tw-translate-x)var(--tw-translate-y)}.-translate-y-1{--tw-translate-y:calc(var(--spacing)*-1);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-1{--tw-translate-y:calc(var(--spacing)*1);translate:var(--tw-translate-x)var(--tw-translate-y)}.translate-y-1\/2,.translate-y-2\/4{--tw-translate-y: 50% ;translate:var(--tw-translate-x)var(--tw-translate-y)}.translate-y-3\/4{--tw-translate-y: 75% ;translate:var(--tw-translate-x)var(--tw-translate-y)}.scale-0{--tw-scale-x:0%;--tw-scale-y:0%;--tw-scale-z:0%;scale:var(--tw-scale-x)var(--tw-scale-y)}.scale-50{--tw-scale-x:50%;--tw-scale-y:50%;--tw-scale-z:50%;scale:var(--tw-scale-x)var(--tw-scale-y)}.scale-90{--tw-scale-x:90%;--tw-scale-y:90%;--tw-scale-z:90%;scale:var(--tw-scale-x)var(--tw-scale-y)}.scale-100{--tw-scale-x:100%;--tw-scale-y:100%;--tw-scale-z:100%;scale:var(--tw-scale-x)var(--tw-scale-y)}.scale-105{--tw-scale-x:105%;--tw-scale-y:105%;--tw-scale-z:105%;scale:var(--tw-scale-x)var(--tw-scale-y)}.scale-125{--tw-scale-x:125%;--tw-scale-y:125%;--tw-scale-z:125%;scale:var(--tw-scale-x)var(--tw-scale-y)}.-rotate-45{rotate:-45deg}.rotate-0{rotate:none}.rotate-180{rotate:180deg}.spinner-bar-animation{animation-delay:calc(-1.2s + (.1s*var(--bar-index)));transform:rotate(calc(30deg*var(--bar-index)))translate(140%)}.transform{transform:var(--tw-rotate-x,)var(--tw-rotate-y,)var(--tw-rotate-z,)var(--tw-skew-x,)var(--tw-skew-y,)}.transform-gpu{transform:translateZ(0)var(--tw-rotate-x,)var(--tw-rotate-y,)var(--tw-rotate-z,)var(--tw-skew-x,)var(--tw-skew-y,)}.animate-\[appearance-in_1s_infinite\]{animation:1s infinite appearance-in}.animate-blink{animation:1.4s infinite both blink}.animate-drip-expand{animation:.42s linear drip-expand}.animate-fade-out{animation:1.2s linear infinite fade-out}.animate-indeterminate-bar{animation:1.5s cubic-bezier(.65,.815,.735,.395) infinite indeterminate-bar}.animate-none{animation:none}.animate-spin{animation:var(--animate-spin)}.animate-spinner-ease-spin{animation:.8s infinite spinner-spin}.animate-spinner-linear-spin{animation:.8s linear infinite spinner-spin}.animate-sway{animation:.75s infinite sway}.cursor-default{cursor:default}.cursor-grab{cursor:grab}.cursor-not-allowed{cursor:not-allowed}.cursor-pointer{cursor:pointer}.cursor-text{cursor:text}.touch-none{touch-action:none}.resize-none{resize:none}.snap-y{scroll-snap-type:y var(--tw-scroll-snap-strictness)}.snap-mandatory{--tw-scroll-snap-strictness:mandatory}.snap-center{scroll-snap-align:center}.scroll-py-6{scroll-padding-block:calc(var(--spacing)*6)}.list-disc{list-style-type:disc}.list-none{list-style-type:none}.appearance-none{appearance:none}.grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.flex-col{flex-direction:column}.flex-col-reverse{flex-direction:column-reverse}.flex-row{flex-direction:row}.flex-row-reverse{flex-direction:row-reverse}.flex-nowrap{flex-wrap:nowrap}.flex-wrap{flex-wrap:wrap}.place-content-center{place-content:center}.place-items-center{place-items:center}.items-center{align-items:center}.items-end{align-items:flex-end}.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-0{gap:calc(var(--spacing)*0)!important}.gap-0{gap:calc(var(--spacing)*0)}.gap-0\.5{gap:calc(var(--spacing)*.5)}.gap-1{gap:calc(var(--spacing)*1)}.gap-1\.5{gap:calc(var(--spacing)*1.5)}.gap-2{gap:calc(var(--spacing)*2)}.gap-3{gap:calc(var(--spacing)*3)}.gap-4{gap:calc(var(--spacing)*4)}.gap-6{gap:calc(var(--spacing)*6)}: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)))}.gap-x-0{column-gap:calc(var(--spacing)*0)}.gap-x-0\.5{column-gap:calc(var(--spacing)*.5)}.gap-x-1{column-gap:calc(var(--spacing)*1)}.gap-x-2{column-gap:calc(var(--spacing)*2)}.gap-x-4{column-gap:calc(var(--spacing)*4)}.gap-x-6{column-gap:calc(var(--spacing)*6)}:where(.space-x-0\.5>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(calc(var(--spacing)*.5)*var(--tw-space-x-reverse));margin-inline-end:calc(calc(var(--spacing)*.5)*calc(1 - var(--tw-space-x-reverse)))}.gap-y-0{row-gap:calc(var(--spacing)*0)}.gap-y-1\.5{row-gap:calc(var(--spacing)*1.5)}.gap-y-2{row-gap:calc(var(--spacing)*2)}.self-center{align-self:center}.truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.overflow-auto{overflow:auto}.overflow-clip{overflow:clip}.overflow-hidden{overflow:hidden}.overflow-visible{overflow:visible}.overflow-x-auto{overflow-x:auto}.overflow-x-hidden{overflow-x:hidden}.overflow-x-scroll{overflow-x:scroll}.overflow-y-auto{overflow-y:auto}.overflow-y-hidden{overflow-y:hidden}.overflow-y-scroll{overflow-y:scroll}.\!rounded-none{border-radius:0!important}.rounded{border-radius:.25rem}.rounded-\[calc\(var\(--heroui-radius-large\)\/1\.5\)\]{border-radius:calc(var(--heroui-radius-large)/1.5)}.rounded-\[calc\(var\(--heroui-radius-medium\)\*0\.5\)\]{border-radius:calc(var(--heroui-radius-medium)*.5)}.rounded-\[calc\(var\(--heroui-radius-medium\)\*0\.6\)\]{border-radius:calc(var(--heroui-radius-medium)*.6)}.rounded-\[calc\(var\(--heroui-radius-medium\)\*0\.7\)\]{border-radius:calc(var(--heroui-radius-medium)*.7)}.rounded-\[calc\(var\(--heroui-radius-medium\)\/2\)\]{border-radius:calc(var(--heroui-radius-medium)/2)}.rounded-\[calc\(var\(--heroui-radius-small\)\/2\)\]{border-radius:calc(var(--heroui-radius-small)/2)}.rounded-full{border-radius:3.40282e38px}.rounded-large{border-radius:var(--heroui-radius-large)}.rounded-lg{border-radius:var(--radius-lg)}.rounded-md{border-radius:var(--radius-md)}.rounded-medium{border-radius:var(--heroui-radius-medium)}.rounded-none{border-radius:0}.rounded-sm{border-radius:var(--radius-sm)}.rounded-small{border-radius:var(--heroui-radius-small)}.\!rounded-s-none{border-start-start-radius:0!important;border-end-start-radius:0!important}.\!rounded-e-none{border-start-end-radius:0!important;border-end-end-radius:0!important}.rounded-t-large{border-top-left-radius:var(--heroui-radius-large);border-top-right-radius:var(--heroui-radius-large)}.rounded-t-medium{border-top-left-radius:var(--heroui-radius-medium);border-top-right-radius:var(--heroui-radius-medium)}.rounded-t-none{border-top-left-radius:0;border-top-right-radius:0}.rounded-t-small{border-top-left-radius:var(--heroui-radius-small);border-top-right-radius:var(--heroui-radius-small)}.rounded-l-medium{border-top-left-radius:var(--heroui-radius-medium);border-bottom-left-radius:var(--heroui-radius-medium)}.rounded-l-none{border-top-left-radius:0;border-bottom-left-radius:0}.rounded-r-none{border-top-right-radius:0;border-bottom-right-radius:0}.rounded-tr-medium{border-top-right-radius:var(--heroui-radius-medium)}.rounded-b-large{border-bottom-right-radius:var(--heroui-radius-large);border-bottom-left-radius:var(--heroui-radius-large)}.rounded-b-medium{border-bottom-right-radius:var(--heroui-radius-medium);border-bottom-left-radius:var(--heroui-radius-medium)}.rounded-b-none{border-bottom-right-radius:0;border-bottom-left-radius:0}.rounded-b-small{border-bottom-right-radius:var(--heroui-radius-small);border-bottom-left-radius:var(--heroui-radius-small)}.rounded-br-medium{border-bottom-right-radius:var(--heroui-radius-medium)}.border{border-style:var(--tw-border-style);border-width:1px}.border-0{border-style:var(--tw-border-style);border-width:0}.border-1{border-style:var(--tw-border-style);border-width:1px}.border-2{border-style:var(--tw-border-style);border-width:2px}.border-3{border-style:var(--tw-border-style);border-width:3px}.border-medium{border-style:var(--tw-border-style);border-width:var(--heroui-border-width-medium)}.border-small{border-style:var(--tw-border-style);border-width:var(--heroui-border-width-small)}.border-x-\[calc\(theme\(spacing\.5\)\/2\)\]{border-inline-style:var(--tw-border-style);border-inline-width:.625rem}.border-x-\[calc\(theme\(spacing\.6\)\/2\)\]{border-inline-style:var(--tw-border-style);border-inline-width:.75rem}.border-x-\[calc\(theme\(spacing\.7\)\/2\)\]{border-inline-style:var(--tw-border-style);border-inline-width:.875rem}.border-y-\[calc\(theme\(spacing\.5\)\/2\)\]{border-block-style:var(--tw-border-style);border-block-width:.625rem}.border-y-\[calc\(theme\(spacing\.6\)\/2\)\]{border-block-style:var(--tw-border-style);border-block-width:.75rem}.border-y-\[calc\(theme\(spacing\.7\)\/2\)\]{border-block-style:var(--tw-border-style);border-block-width:.875rem}.border-t-1{border-top-style:var(--tw-border-style);border-top-width:1px}.border-r{border-right-style:var(--tw-border-style);border-right-width:1px}.border-r-0{border-right-style:var(--tw-border-style);border-right-width:0}.border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.border-b-medium{border-bottom-style:var(--tw-border-style);border-bottom-width:var(--heroui-border-width-medium)}.border-b-small{border-bottom-style:var(--tw-border-style);border-bottom-width:var(--heroui-border-width-small)}.border-l{border-left-style:var(--tw-border-style);border-left-width:1px}.\!border-none{--tw-border-style:none!important;border-style:none!important}.border-dotted{--tw-border-style:dotted;border-style:dotted}.border-none{--tw-border-style:none;border-style:none}.border-solid{--tw-border-style:solid;border-style:solid}.\!border-danger{border-color:hsl(var(--heroui-danger)/1)!important}.border-background{border-color:hsl(var(--heroui-background)/1)}.border-danger{border-color:hsl(var(--heroui-danger)/1)}.border-danger-100{border-color:hsl(var(--heroui-danger-100)/1)}.border-danger-200{border-color:hsl(var(--heroui-danger-200)/1)}.border-danger-400{border-color:hsl(var(--heroui-danger-400)/1)}.border-default{border-color:hsl(var(--heroui-default)/1)}.border-default-100{border-color:hsl(var(--heroui-default-100)/1)}.border-default-200{border-color:hsl(var(--heroui-default-200)/1)}.border-default-300{border-color:hsl(var(--heroui-default-300)/1)}.border-default-400{border-color:hsl(var(--heroui-default-400)/1)}.border-divider{border-color:hsl(var(--heroui-divider)/.15)}.border-foreground{border-color:hsl(var(--heroui-foreground)/1)}.border-foreground-400{border-color:hsl(var(--heroui-foreground-400)/1)}.border-primary{border-color:var(--color-primary)}.border-primary-100{border-color:hsl(var(--heroui-primary-100)/1)}.border-primary-200{border-color:hsl(var(--heroui-primary-200)/1)}.border-primary-400{border-color:hsl(var(--heroui-primary-400)/1)}.border-secondary{border-color:hsl(var(--heroui-secondary)/1)}.border-secondary-100{border-color:hsl(var(--heroui-secondary-100)/1)}.border-secondary-200{border-color:hsl(var(--heroui-secondary-200)/1)}.border-secondary-400{border-color:hsl(var(--heroui-secondary-400)/1)}.border-success{border-color:hsl(var(--heroui-success)/1)}.border-success-100{border-color:hsl(var(--heroui-success-100)/1)}.border-success-200{border-color:hsl(var(--heroui-success-200)/1)}.border-success-300{border-color:hsl(var(--heroui-success-300)/1)}.border-success-400{border-color:hsl(var(--heroui-success-400)/1)}.border-transparent{border-color:#0000}.border-warning{border-color:hsl(var(--heroui-warning)/1)}.border-warning-100{border-color:hsl(var(--heroui-warning-100)/1)}.border-warning-200{border-color:hsl(var(--heroui-warning-200)/1)}.border-warning-300{border-color:hsl(var(--heroui-warning-300)/1)}.border-warning-400{border-color:hsl(var(--heroui-warning-400)/1)}.border-x-transparent{border-inline-color:#0000}.border-y-transparent{border-block-color:#0000}.border-t-transparent{border-top-color:#0000}.border-r-transparent{border-right-color:#0000}.border-b-current{border-bottom-color:currentColor}.border-b-danger{border-bottom-color:hsl(var(--heroui-danger)/1)}.border-b-default{border-bottom-color:hsl(var(--heroui-default)/1)}.border-b-primary{border-bottom-color:var(--color-primary)}.border-b-secondary{border-bottom-color:hsl(var(--heroui-secondary)/1)}.border-b-success{border-bottom-color:hsl(var(--heroui-success)/1)}.border-b-warning{border-bottom-color:hsl(var(--heroui-warning)/1)}.border-b-white{border-bottom-color:var(--color-white)}.border-l-transparent{border-left-color:#0000}.\!bg-danger-50{background-color:hsl(var(--heroui-danger-50)/1)!important}.\!bg-transparent{background-color:#0000!important}.bg-background,.bg-background\/10{background-color:hsl(var(--heroui-background)/1)}@supports (color:color-mix(in lab,red,red)){.bg-background\/10{background-color:color-mix(in oklab,hsl(var(--heroui-background)/1)10%,transparent)}}.bg-background\/70{background-color:hsl(var(--heroui-background)/1)}@supports (color:color-mix(in lab,red,red)){.bg-background\/70{background-color:color-mix(in oklab,hsl(var(--heroui-background)/1)70%,transparent)}}.bg-background\/80{background-color:hsl(var(--heroui-background)/1)}@supports (color:color-mix(in lab,red,red)){.bg-background\/80{background-color:color-mix(in oklab,hsl(var(--heroui-background)/1)80%,transparent)}}.bg-black\/30{background-color:#0000004d}@supports (color:color-mix(in lab,red,red)){.bg-black\/30{background-color:color-mix(in oklab,var(--color-black)30%,transparent)}}.bg-black\/50{background-color:#00000080}@supports (color:color-mix(in lab,red,red)){.bg-black\/50{background-color:color-mix(in oklab,var(--color-black)50%,transparent)}}.bg-black\/90{background-color:#000000e6}@supports (color:color-mix(in lab,red,red)){.bg-black\/90{background-color:color-mix(in oklab,var(--color-black)90%,transparent)}}.bg-content1{background-color:hsl(var(--heroui-content1)/1)}.bg-content3{background-color:hsl(var(--heroui-content3)/1)}.bg-current{background-color:currentColor}.bg-danger{background-color:hsl(var(--heroui-danger)/1)}.bg-danger-50{background-color:hsl(var(--heroui-danger-50)/1)}.bg-danger-100{background-color:hsl(var(--heroui-danger-100)/1)}.bg-danger-400{background-color:hsl(var(--heroui-danger-400)/1)}.bg-danger\/20{background-color:hsl(var(--heroui-danger)/1)}@supports (color:color-mix(in lab,red,red)){.bg-danger\/20{background-color:color-mix(in oklab,hsl(var(--heroui-danger)/1)20%,transparent)}}.bg-default{background-color:hsl(var(--heroui-default)/1)}.bg-default-50{background-color:hsl(var(--heroui-default-50)/1)}.bg-default-100{background-color:hsl(var(--heroui-default-100)/1)}.bg-default-200{background-color:hsl(var(--heroui-default-200)/1)}.bg-default-300\/50{background-color:hsl(var(--heroui-default-300)/1)}@supports (color:color-mix(in lab,red,red)){.bg-default-300\/50{background-color:color-mix(in oklab,hsl(var(--heroui-default-300)/1)50%,transparent)}}.bg-default-400{background-color:hsl(var(--heroui-default-400)/1)}.bg-default-500{background-color:hsl(var(--heroui-default-500)/1)}.bg-default-800{background-color:hsl(var(--heroui-default-800)/1)}.bg-default\/40{background-color:hsl(var(--heroui-default)/1)}@supports (color:color-mix(in lab,red,red)){.bg-default\/40{background-color:color-mix(in oklab,hsl(var(--heroui-default)/1)40%,transparent)}}.bg-divider{background-color:hsl(var(--heroui-divider)/.15)}.bg-foreground{background-color:hsl(var(--heroui-foreground)/1)}.bg-foreground-100{background-color:hsl(var(--heroui-foreground-100)/1)}.bg-foreground-400{background-color:hsl(var(--heroui-foreground-400)/1)}.bg-foreground\/10{background-color:hsl(var(--heroui-foreground)/1)}@supports (color:color-mix(in lab,red,red)){.bg-foreground\/10{background-color:color-mix(in oklab,hsl(var(--heroui-foreground)/1)10%,transparent)}}.bg-overlay\/30{background-color:hsl(var(--heroui-overlay)/1)}@supports (color:color-mix(in lab,red,red)){.bg-overlay\/30{background-color:color-mix(in oklab,hsl(var(--heroui-overlay)/1)30%,transparent)}}.bg-overlay\/50{background-color:hsl(var(--heroui-overlay)/1)}@supports (color:color-mix(in lab,red,red)){.bg-overlay\/50{background-color:color-mix(in oklab,hsl(var(--heroui-overlay)/1)50%,transparent)}}.bg-primary{background-color:var(--color-primary)}.bg-primary-50{background-color:hsl(var(--heroui-primary-50)/1)}.bg-primary-100{background-color:hsl(var(--heroui-primary-100)/1)}.bg-primary-400{background-color:hsl(var(--heroui-primary-400)/1)}.bg-primary\/20{background-color:#1b54ff33}@supports (color:color-mix(in lab,red,red)){.bg-primary\/20{background-color:color-mix(in oklab,var(--color-primary)20%,transparent)}}.bg-secondary{background-color:hsl(var(--heroui-secondary)/1)}.bg-secondary-50{background-color:hsl(var(--heroui-secondary-50)/1)}.bg-secondary-100{background-color:hsl(var(--heroui-secondary-100)/1)}.bg-secondary-400{background-color:hsl(var(--heroui-secondary-400)/1)}.bg-secondary\/20{background-color:hsl(var(--heroui-secondary)/1)}@supports (color:color-mix(in lab,red,red)){.bg-secondary\/20{background-color:color-mix(in oklab,hsl(var(--heroui-secondary)/1)20%,transparent)}}.bg-success{background-color:hsl(var(--heroui-success)/1)}.bg-success-50{background-color:hsl(var(--heroui-success-50)/1)}.bg-success-100{background-color:hsl(var(--heroui-success-100)/1)}.bg-success-400{background-color:hsl(var(--heroui-success-400)/1)}.bg-success\/20{background-color:hsl(var(--heroui-success)/1)}@supports (color:color-mix(in lab,red,red)){.bg-success\/20{background-color:color-mix(in oklab,hsl(var(--heroui-success)/1)20%,transparent)}}.bg-transparent{background-color:#0000}.bg-warning{background-color:hsl(var(--heroui-warning)/1)}.bg-warning-50{background-color:hsl(var(--heroui-warning-50)/1)}.bg-warning-100{background-color:hsl(var(--heroui-warning-100)/1)}.bg-warning-400{background-color:hsl(var(--heroui-warning-400)/1)}.bg-warning\/20{background-color:hsl(var(--heroui-warning)/1)}@supports (color:color-mix(in lab,red,red)){.bg-warning\/20{background-color:color-mix(in oklab,hsl(var(--heroui-warning)/1)20%,transparent)}}.bg-white{background-color:var(--color-white)}.bg-gradient-to-b{--tw-gradient-position:to bottom in oklab;background-image:linear-gradient(var(--tw-gradient-stops))}.bg-gradient-to-r{--tw-gradient-position:to right in oklab;background-image:linear-gradient(var(--tw-gradient-stops))}.bg-img-inherit{background-image:inherit}.bg-stripe-gradient-danger{background-image:linear-gradient(45deg,hsl(var(--heroui-danger-200))25%,hsl(var(--heroui-danger))25%50%,hsl(var(--heroui-danger-200))50%75%,hsl(var(--heroui-danger))75%,hsl(var(--heroui-danger)))}.bg-stripe-gradient-default{background-image:linear-gradient(45deg,hsl(var(--heroui-default-200))25%,hsl(var(--heroui-default-400))25%50%,hsl(var(--heroui-default-200))50%75%,hsl(var(--heroui-default-400))75%,hsl(var(--heroui-default-400)))}.bg-stripe-gradient-primary{background-image:linear-gradient(45deg,hsl(var(--heroui-primary-200))25%,hsl(var(--heroui-primary))25%50%,hsl(var(--heroui-primary-200))50%75%,hsl(var(--heroui-primary))75%,hsl(var(--heroui-primary)))}.bg-stripe-gradient-secondary{background-image:linear-gradient(45deg,hsl(var(--heroui-secondary-200))25%,hsl(var(--heroui-secondary))25%50%,hsl(var(--heroui-secondary-200))50%75%,hsl(var(--heroui-secondary))75%,hsl(var(--heroui-secondary)))}.bg-stripe-gradient-success{background-image:linear-gradient(45deg,hsl(var(--heroui-success-200))25%,hsl(var(--heroui-success))25%50%,hsl(var(--heroui-success-200))50%75%,hsl(var(--heroui-success))75%,hsl(var(--heroui-success)))}.bg-stripe-gradient-warning{background-image:linear-gradient(45deg,hsl(var(--heroui-warning-200))25%,hsl(var(--heroui-warning))25%50%,hsl(var(--heroui-warning-200))50%75%,hsl(var(--heroui-warning))75%,hsl(var(--heroui-warning)))}.from-default-600{--tw-gradient-from:hsl(var(--heroui-default-600)/1);--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))}.from-transparent{--tw-gradient-from:transparent;--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))}.via-default-200{--tw-gradient-via:hsl(var(--heroui-default-200)/1);--tw-gradient-via-stops:var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-via)var(--tw-gradient-via-position),var(--tw-gradient-to)var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-via-stops)}.via-transparent{--tw-gradient-via:transparent;--tw-gradient-via-stops:var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-via)var(--tw-gradient-via-position),var(--tw-gradient-to)var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-via-stops)}.to-current{--tw-gradient-to:currentcolor;--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-danger{--tw-gradient-to:hsl(var(--heroui-danger)/1);--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-default{--tw-gradient-to:hsl(var(--heroui-default)/1);--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-default-600{--tw-gradient-to:hsl(var(--heroui-default-600)/1);--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-primary{--tw-gradient-to:var(--color-primary);--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-secondary{--tw-gradient-to:hsl(var(--heroui-secondary)/1);--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-success{--tw-gradient-to:hsl(var(--heroui-success)/1);--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-warning{--tw-gradient-to:hsl(var(--heroui-warning)/1);--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-white{--tw-gradient-to:var(--color-white);--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))}.\[mask-image\:linear-gradient\(\#000\,\#000\,transparent_0\,\#000_var\(--scroll-shadow-size\)\,\#000_calc\(100\%_-_var\(--scroll-shadow-size\)\)\,transparent\)\]{-webkit-mask-image:linear-gradient(#000,#000,transparent 0,#000 var(--scroll-shadow-size),#000 calc(100% - var(--scroll-shadow-size)),transparent);mask-image:linear-gradient(#000,#000,transparent 0,#000 var(--scroll-shadow-size),#000 calc(100% - var(--scroll-shadow-size)),transparent)}.bg-clip-inherit{background-clip:inherit}.bg-clip-text{-webkit-background-clip:text;background-clip:text}.fill-current{fill:currentColor}.stroke-current{stroke:currentColor}.stroke-default-300\/50{stroke:hsl(var(--heroui-default-300)/1)}@supports (color:color-mix(in lab,red,red)){.stroke-default-300\/50{stroke:color-mix(in oklab,hsl(var(--heroui-default-300)/1)50%,transparent)}}.object-contain{object-fit:contain}.object-cover{object-fit:cover}.p-0{padding:calc(var(--spacing)*0)}.p-0\.5{padding:calc(var(--spacing)*.5)}.p-1{padding:calc(var(--spacing)*1)}.p-2{padding:calc(var(--spacing)*2)}.p-2\.5{padding:calc(var(--spacing)*2.5)}.p-3{padding:calc(var(--spacing)*3)}.p-4{padding:calc(var(--spacing)*4)}.p-6{padding:calc(var(--spacing)*6)}.\!px-1{padding-inline:calc(var(--spacing)*1)!important}.px-0{padding-inline:calc(var(--spacing)*0)}.px-0\.5{padding-inline:calc(var(--spacing)*.5)}.px-1{padding-inline:calc(var(--spacing)*1)}.px-1\.5{padding-inline:calc(var(--spacing)*1.5)}.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-6{padding-inline:calc(var(--spacing)*6)}.py-0{padding-block:calc(var(--spacing)*0)}.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-4{padding-block:calc(var(--spacing)*4)}.ps-1{padding-inline-start:calc(var(--spacing)*1)}.ps-2{padding-inline-start:calc(var(--spacing)*2)}.pe-2{padding-inline-end:calc(var(--spacing)*2)}.pe-6{padding-inline-end:calc(var(--spacing)*6)}.pt-0{padding-top:calc(var(--spacing)*0)}.pt-2{padding-top:calc(var(--spacing)*2)}.pr-0\.5{padding-right:calc(var(--spacing)*.5)}.pr-1{padding-right:calc(var(--spacing)*1)}.pr-2{padding-right:calc(var(--spacing)*2)}.\!pb-0{padding-bottom:calc(var(--spacing)*0)!important}.pb-0{padding-bottom:calc(var(--spacing)*0)}.pb-0\.5{padding-bottom:calc(var(--spacing)*.5)}.pb-1{padding-bottom:calc(var(--spacing)*1)}.pb-1\.5{padding-bottom:calc(var(--spacing)*1.5)}.pb-2{padding-bottom:calc(var(--spacing)*2)}.pb-4{padding-bottom:calc(var(--spacing)*4)}.pb-8{padding-bottom:calc(var(--spacing)*8)}.pl-0{padding-left:calc(var(--spacing)*0)}.pl-0\.5{padding-left:calc(var(--spacing)*.5)}.pl-1{padding-left:calc(var(--spacing)*1)}.pl-4{padding-left:calc(var(--spacing)*4)}.pl-\[1px\]{padding-left:1px}.text-center{text-align:center}.text-end{text-align:end}.text-left{text-align:left}.text-start{text-align:start}.align-middle{vertical-align:middle}.font-mono{font-family:var(--font-mono)}.font-sans{font-family:var(--font-sans)}.text-2xl{font-size:var(--text-2xl);line-height:var(--tw-leading,var(--text-2xl--line-height))}.text-large{font-size:var(--heroui-font-size-large);line-height:var(--heroui-line-height-large)}.text-lg{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}.text-medium{font-size:var(--heroui-font-size-medium);line-height:var(--heroui-line-height-medium)}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-small{font-size:var(--heroui-font-size-small);line-height:var(--heroui-line-height-small)}.text-tiny{font-size:var(--heroui-font-size-tiny);line-height:var(--heroui-line-height-tiny)}.text-xl{font-size:var(--text-xl);line-height:var(--tw-leading,var(--text-xl--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.text-\[0\.5rem\]{font-size:.5rem}.text-\[0\.6rem\]{font-size:.6rem}.text-\[0\.55rem\]{font-size:.55rem}.text-\[85\%\]{font-size:85%}.text-\[90\%\]{font-size:90%}.text-\[100\%\]{font-size:100%}.leading-5{--tw-leading:calc(var(--spacing)*5);line-height:calc(var(--spacing)*5)}.leading-\[1\.15\]{--tw-leading:1.15;line-height:1.15}.leading-\[32px\]{--tw-leading:32px;line-height:32px}.leading-inherit{line-height:inherit}.font-bold{--tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold)}.font-extralight{--tw-font-weight:var(--font-weight-extralight);font-weight:var(--font-weight-extralight)}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.font-normal{--tw-font-weight:var(--font-weight-normal);font-weight:var(--font-weight-normal)}.font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.break-words{overflow-wrap:break-word}.text-ellipsis{text-overflow:ellipsis}.whitespace-normal{white-space:normal}.whitespace-nowrap{white-space:nowrap}.\!text-danger{color:hsl(var(--heroui-danger)/1)!important}.\!text-default-900{color:hsl(var(--heroui-default-900)/1)!important}.\!text-green-600{color:var(--color-green-600)!important}.\!text-purple-500{color:var(--color-purple-500)!important}.\!text-yellow-600{color:var(--color-yellow-600)!important}.text-background{color:hsl(var(--heroui-background)/1)}.text-black{color:var(--color-black)}.text-current{color:currentColor}.text-danger{color:hsl(var(--heroui-danger)/1)}.text-danger-300{color:hsl(var(--heroui-danger-300)/1)}.text-danger-400{color:hsl(var(--heroui-danger-400)/1)}.text-danger-500{color:hsl(var(--heroui-danger-500)/1)}.text-danger-600{color:hsl(var(--heroui-danger-600)/1)}.text-danger-foreground{color:hsl(var(--heroui-danger-foreground)/1)}.text-danger\/80{color:hsl(var(--heroui-danger)/1)}@supports (color:color-mix(in lab,red,red)){.text-danger\/80{color:color-mix(in oklab,hsl(var(--heroui-danger)/1)80%,transparent)}}.text-default{color:hsl(var(--heroui-default)/1)}.text-default-400{color:hsl(var(--heroui-default-400)/1)}.text-default-500{color:hsl(var(--heroui-default-500)/1)}.text-default-600{color:hsl(var(--heroui-default-600)/1)}.text-default-700{color:hsl(var(--heroui-default-700)/1)}.text-default-900{color:hsl(var(--heroui-default-900)/1)}.text-default-foreground{color:hsl(var(--heroui-default-foreground)/1)}.text-foreground{color:hsl(var(--heroui-foreground)/1)}.text-foreground-400{color:hsl(var(--heroui-foreground-400)/1)}.text-foreground-500{color:hsl(var(--heroui-foreground-500)/1)}.text-foreground-600{color:hsl(var(--heroui-foreground-600)/1)}.text-foreground\/50{color:hsl(var(--heroui-foreground)/1)}@supports (color:color-mix(in lab,red,red)){.text-foreground\/50{color:color-mix(in oklab,hsl(var(--heroui-foreground)/1)50%,transparent)}}.text-inherit{color:inherit}.text-primary{color:var(--color-primary)}.text-primary-300{color:hsl(var(--heroui-primary-300)/1)}.text-primary-400{color:hsl(var(--heroui-primary-400)/1)}.text-primary-500{color:hsl(var(--heroui-primary-500)/1)}.text-primary-600{color:hsl(var(--heroui-primary-600)/1)}.text-primary-foreground{color:hsl(var(--heroui-primary-foreground)/1)}.text-primary\/80{color:#1b54ffcc}@supports (color:color-mix(in lab,red,red)){.text-primary\/80{color:color-mix(in oklab,var(--color-primary)80%,transparent)}}.text-secondary{color:hsl(var(--heroui-secondary)/1)}.text-secondary-300{color:hsl(var(--heroui-secondary-300)/1)}.text-secondary-400{color:hsl(var(--heroui-secondary-400)/1)}.text-secondary-500{color:hsl(var(--heroui-secondary-500)/1)}.text-secondary-600{color:hsl(var(--heroui-secondary-600)/1)}.text-secondary-foreground{color:hsl(var(--heroui-secondary-foreground)/1)}.text-secondary\/80{color:hsl(var(--heroui-secondary)/1)}@supports (color:color-mix(in lab,red,red)){.text-secondary\/80{color:color-mix(in oklab,hsl(var(--heroui-secondary)/1)80%,transparent)}}.text-success{color:hsl(var(--heroui-success)/1)}.text-success-400{color:hsl(var(--heroui-success-400)/1)}.text-success-500{color:hsl(var(--heroui-success-500)/1)}.text-success-600{color:hsl(var(--heroui-success-600)/1)}.text-success-700{color:hsl(var(--heroui-success-700)/1)}.text-success-foreground{color:hsl(var(--heroui-success-foreground)/1)}.text-success\/80{color:hsl(var(--heroui-success)/1)}@supports (color:color-mix(in lab,red,red)){.text-success\/80{color:color-mix(in oklab,hsl(var(--heroui-success)/1)80%,transparent)}}.text-transparent{color:#0000}.text-warning{color:hsl(var(--heroui-warning)/1)}.text-warning-400{color:hsl(var(--heroui-warning-400)/1)}.text-warning-500{color:hsl(var(--heroui-warning-500)/1)}.text-warning-600{color:hsl(var(--heroui-warning-600)/1)}.text-warning-700{color:hsl(var(--heroui-warning-700)/1)}.text-warning-foreground{color:hsl(var(--heroui-warning-foreground)/1)}.text-warning\/80{color:hsl(var(--heroui-warning)/1)}@supports (color:color-mix(in lab,red,red)){.text-warning\/80{color:color-mix(in oklab,hsl(var(--heroui-warning)/1)80%,transparent)}}.text-white{color:var(--color-white)}.italic{font-style:italic}.tabular-nums{--tw-numeric-spacing:tabular-nums;font-variant-numeric:var(--tw-ordinal,)var(--tw-slashed-zero,)var(--tw-numeric-figure,)var(--tw-numeric-spacing,)var(--tw-numeric-fraction,)}.no-underline{text-decoration-line:none}.underline{text-decoration-line:underline}.underline-offset-4{text-underline-offset:4px}.antialiased{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.subpixel-antialiased{-webkit-font-smoothing:auto;-moz-osx-font-smoothing:auto}.dark{color-scheme:dark;--heroui-background:0 0% 0%;--heroui-foreground-50:240 5.88% 10%;--heroui-foreground-100:240 3.7% 15.88%;--heroui-foreground-200:240 5.26% 26.08%;--heroui-foreground-300:240 5.2% 33.92%;--heroui-foreground-400:240 3.83% 46.08%;--heroui-foreground-500:240 5.03% 64.9%;--heroui-foreground-600:240 4.88% 83.92%;--heroui-foreground-700:240 5.88% 90%;--heroui-foreground-800:240 4.76% 95.88%;--heroui-foreground-900:0 0% 98.04%;--heroui-foreground:210 5.56% 92.94%;--heroui-focus:212.02 100% 46.67%;--heroui-overlay:0 0% 0%;--heroui-divider:0 0% 100%;--heroui-content1:240 5.88% 10%;--heroui-content1-foreground:0 0% 98.04%;--heroui-content2:240 3.7% 15.88%;--heroui-content2-foreground:240 4.76% 95.88%;--heroui-content3:240 5.26% 26.08%;--heroui-content3-foreground:240 5.88% 90%;--heroui-content4:240 5.2% 33.92%;--heroui-content4-foreground:240 4.88% 83.92%;--heroui-default-50:240 5.88% 10%;--heroui-default-100:240 3.7% 15.88%;--heroui-default-200:240 5.26% 26.08%;--heroui-default-300:240 5.2% 33.92%;--heroui-default-400:240 3.83% 46.08%;--heroui-default-500:240 5.03% 64.9%;--heroui-default-600:240 4.88% 83.92%;--heroui-default-700:240 5.88% 90%;--heroui-default-800:240 4.76% 95.88%;--heroui-default-900:0 0% 98.04%;--heroui-default-foreground:0 0% 100%;--heroui-default:240 5.26% 26.08%;--heroui-primary-50:211.84 100% 9.61%;--heroui-primary-100:211.84 100% 19.22%;--heroui-primary-200:212.24 100% 28.82%;--heroui-primary-300:212.14 100% 38.43%;--heroui-primary-400:212.02 100% 46.67%;--heroui-primary-500:212.14 92.45% 58.43%;--heroui-primary-600:212.24 92.45% 68.82%;--heroui-primary-700:211.84 92.45% 79.22%;--heroui-primary-800:211.84 92.45% 89.61%;--heroui-primary-900:212.5 92.31% 94.9%;--heroui-primary-foreground:0 0% 100%;--heroui-primary:212.02 100% 46.67%;--heroui-secondary-50:270 66.67% 9.41%;--heroui-secondary-100:270 66.67% 18.82%;--heroui-secondary-200:270 66.67% 28.24%;--heroui-secondary-300:270 66.67% 37.65%;--heroui-secondary-400:270 66.67% 47.06%;--heroui-secondary-500:270 59.26% 57.65%;--heroui-secondary-600:270 59.26% 68.24%;--heroui-secondary-700:270 59.26% 78.82%;--heroui-secondary-800:270 59.26% 89.41%;--heroui-secondary-900:270 61.54% 94.9%;--heroui-secondary-foreground:0 0% 100%;--heroui-secondary:270 59.26% 57.65%;--heroui-success-50:145.71 77.78% 8.82%;--heroui-success-100:146.2 79.78% 17.45%;--heroui-success-200:145.79 79.26% 26.47%;--heroui-success-300:146.01 79.89% 35.1%;--heroui-success-400:145.96 79.46% 43.92%;--heroui-success-500:146.01 62.45% 55.1%;--heroui-success-600:145.79 62.57% 66.47%;--heroui-success-700:146.2 61.74% 77.45%;--heroui-success-800:145.71 61.4% 88.82%;--heroui-success-900:146.67 64.29% 94.51%;--heroui-success-foreground:0 0% 0%;--heroui-success:145.96 79.46% 43.92%;--heroui-warning-50:37.14 75% 10.98%;--heroui-warning-100:37.14 75% 21.96%;--heroui-warning-200:36.96 73.96% 33.14%;--heroui-warning-300:37.01 74.22% 44.12%;--heroui-warning-400:37.03 91.27% 55.1%;--heroui-warning-500:37.01 91.26% 64.12%;--heroui-warning-600:36.96 91.24% 73.14%;--heroui-warning-700:37.14 91.3% 81.96%;--heroui-warning-800:37.14 91.3% 90.98%;--heroui-warning-900:54.55 91.67% 95.29%;--heroui-warning-foreground:0 0% 0%;--heroui-warning:37.03 91.27% 55.1%;--heroui-danger-50:340 84.91% 10.39%;--heroui-danger-100:339.33 86.54% 20.39%;--heroui-danger-200:339.11 85.99% 30.78%;--heroui-danger-300:339 86.54% 40.78%;--heroui-danger-400:339.2 90.36% 51.18%;--heroui-danger-500:339 90% 60.78%;--heroui-danger-600:339.11 90.6% 70.78%;--heroui-danger-700:339.33 90% 80.39%;--heroui-danger-800:340 91.84% 90.39%;--heroui-danger-900:339.13 92% 95.1%;--heroui-danger-foreground:0 0% 100%;--heroui-danger:339.2 90.36% 51.18%;--heroui-divider-weight:1px;--heroui-disabled-opacity:.5;--heroui-font-size-tiny:.75rem;--heroui-font-size-small:.875rem;--heroui-font-size-medium:1rem;--heroui-font-size-large:1.125rem;--heroui-line-height-tiny:1rem;--heroui-line-height-small:1.25rem;--heroui-line-height-medium:1.5rem;--heroui-line-height-large:1.75rem;--heroui-radius-small:8px;--heroui-radius-medium:12px;--heroui-radius-large:14px;--heroui-border-width-small:1px;--heroui-border-width-medium:2px;--heroui-border-width-large:3px;--heroui-box-shadow-small:0px 0px 5px 0px #0000000d,0px 2px 10px 0px #0003,inset 0px 0px 1px 0px #ffffff26;--heroui-box-shadow-medium:0px 0px 15px 0px #0000000f,0px 2px 30px 0px #00000038,inset 0px 0px 1px 0px #ffffff26;--heroui-box-shadow-large:0px 0px 30px 0px #00000012,0px 30px 60px 0px #00000042,inset 0px 0px 1px 0px #ffffff26;--heroui-hover-opacity:.9}.light{color-scheme:light;--heroui-background:0 0% 100%;--heroui-foreground-50:0 0% 98.04%;--heroui-foreground-100:240 4.76% 95.88%;--heroui-foreground-200:240 5.88% 90%;--heroui-foreground-300:240 4.88% 83.92%;--heroui-foreground-400:240 5.03% 64.9%;--heroui-foreground-500:240 3.83% 46.08%;--heroui-foreground-600:240 5.2% 33.92%;--heroui-foreground-700:240 5.26% 26.08%;--heroui-foreground-800:240 3.7% 15.88%;--heroui-foreground-900:240 5.88% 10%;--heroui-foreground:201.82 24.44% 8.82%;--heroui-divider:0 0% 6.67%;--heroui-focus:212.02 100% 46.67%;--heroui-overlay:0 0% 0%;--heroui-content1:0 0% 100%;--heroui-content1-foreground:201.82 24.44% 8.82%;--heroui-content2:240 4.76% 95.88%;--heroui-content2-foreground:240 3.7% 15.88%;--heroui-content3:240 5.88% 90%;--heroui-content3-foreground:240 5.26% 26.08%;--heroui-content4:240 4.88% 83.92%;--heroui-content4-foreground:240 5.2% 33.92%;--heroui-default-50:0 0% 98.04%;--heroui-default-100:240 4.76% 95.88%;--heroui-default-200:240 5.88% 90%;--heroui-default-300:240 4.88% 83.92%;--heroui-default-400:240 5.03% 64.9%;--heroui-default-500:240 3.83% 46.08%;--heroui-default-600:240 5.2% 33.92%;--heroui-default-700:240 5.26% 26.08%;--heroui-default-800:240 3.7% 15.88%;--heroui-default-900:240 5.88% 10%;--heroui-default-foreground:0 0% 0%;--heroui-default:240 4.88% 83.92%;--heroui-primary-50:212.5 92.31% 94.9%;--heroui-primary-100:211.84 92.45% 89.61%;--heroui-primary-200:211.84 92.45% 79.22%;--heroui-primary-300:212.24 92.45% 68.82%;--heroui-primary-400:212.14 92.45% 58.43%;--heroui-primary-500:212.02 100% 46.67%;--heroui-primary-600:212.14 100% 38.43%;--heroui-primary-700:212.24 100% 28.82%;--heroui-primary-800:211.84 100% 19.22%;--heroui-primary-900:211.84 100% 9.61%;--heroui-primary-foreground:0 0% 100%;--heroui-primary:212.02 100% 46.67%;--heroui-secondary-50:270 61.54% 94.9%;--heroui-secondary-100:270 59.26% 89.41%;--heroui-secondary-200:270 59.26% 78.82%;--heroui-secondary-300:270 59.26% 68.24%;--heroui-secondary-400:270 59.26% 57.65%;--heroui-secondary-500:270 66.67% 47.06%;--heroui-secondary-600:270 66.67% 37.65%;--heroui-secondary-700:270 66.67% 28.24%;--heroui-secondary-800:270 66.67% 18.82%;--heroui-secondary-900:270 66.67% 9.41%;--heroui-secondary-foreground:0 0% 100%;--heroui-secondary:270 66.67% 47.06%;--heroui-success-50:146.67 64.29% 94.51%;--heroui-success-100:145.71 61.4% 88.82%;--heroui-success-200:146.2 61.74% 77.45%;--heroui-success-300:145.79 62.57% 66.47%;--heroui-success-400:146.01 62.45% 55.1%;--heroui-success-500:145.96 79.46% 43.92%;--heroui-success-600:146.01 79.89% 35.1%;--heroui-success-700:145.79 79.26% 26.47%;--heroui-success-800:146.2 79.78% 17.45%;--heroui-success-900:145.71 77.78% 8.82%;--heroui-success-foreground:0 0% 0%;--heroui-success:145.96 79.46% 43.92%;--heroui-warning-50:54.55 91.67% 95.29%;--heroui-warning-100:37.14 91.3% 90.98%;--heroui-warning-200:37.14 91.3% 81.96%;--heroui-warning-300:36.96 91.24% 73.14%;--heroui-warning-400:37.01 91.26% 64.12%;--heroui-warning-500:37.03 91.27% 55.1%;--heroui-warning-600:37.01 74.22% 44.12%;--heroui-warning-700:36.96 73.96% 33.14%;--heroui-warning-800:37.14 75% 21.96%;--heroui-warning-900:37.14 75% 10.98%;--heroui-warning-foreground:0 0% 0%;--heroui-warning:37.03 91.27% 55.1%;--heroui-danger-50:339.13 92% 95.1%;--heroui-danger-100:340 91.84% 90.39%;--heroui-danger-200:339.33 90% 80.39%;--heroui-danger-300:339.11 90.6% 70.78%;--heroui-danger-400:339 90% 60.78%;--heroui-danger-500:339.2 90.36% 51.18%;--heroui-danger-600:339 86.54% 40.78%;--heroui-danger-700:339.11 85.99% 30.78%;--heroui-danger-800:339.33 86.54% 20.39%;--heroui-danger-900:340 84.91% 10.39%;--heroui-danger-foreground:0 0% 100%;--heroui-danger:339.2 90.36% 51.18%;--heroui-divider-weight:1px;--heroui-disabled-opacity:.5;--heroui-font-size-tiny:.75rem;--heroui-font-size-small:.875rem;--heroui-font-size-medium:1rem;--heroui-font-size-large:1.125rem;--heroui-line-height-tiny:1rem;--heroui-line-height-small:1.25rem;--heroui-line-height-medium:1.5rem;--heroui-line-height-large:1.75rem;--heroui-radius-small:8px;--heroui-radius-medium:12px;--heroui-radius-large:14px;--heroui-border-width-small:1px;--heroui-border-width-medium:2px;--heroui-border-width-large:3px;--heroui-box-shadow-small:0px 0px 5px 0px #00000005,0px 2px 10px 0px #0000000f,0px 0px 1px 0px #0000004d;--heroui-box-shadow-medium:0px 0px 15px 0px #00000008,0px 2px 30px 0px #00000014,0px 0px 1px 0px #0000004d;--heroui-box-shadow-large:0px 0px 30px 0px #0000000a,0px 30px 60px 0px #0000001f,0px 0px 1px 0px #0000004d;--heroui-hover-opacity:.8}.opacity-0{opacity:0}.opacity-20{opacity:.2}.opacity-25{opacity:.25}.opacity-30{opacity:.3}.opacity-50{opacity:.5}.opacity-70{opacity:.7}.opacity-75{opacity:.75}.opacity-100{opacity:1}.opacity-\[0\.0001\]{opacity:.0001}.opacity-\[value\]{opacity:value}.opacity-disabled{opacity:var(--heroui-disabled-opacity)}.\!shadow-none{--tw-shadow:0 0 #0000!important;box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)!important}.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_1px_0px_0_rgba\(0\,0\,0\,0\.05\)\]{--tw-shadow:0 1px 0px 0 var(--tw-shadow-color,#0000000d);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-\[0px_20px_20px_0px_rgb\(0_0_0\/0\.05\)\]{--tw-shadow:0px 20px 20px 0px var(--tw-shadow-color,#0000000d);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-large{--tw-shadow:var(--heroui-box-shadow-large);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-medium{--tw-shadow:var(--heroui-box-shadow-medium);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-none{--tw-shadow:0 0 #0000;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)}.shadow-small{--tw-shadow:var(--heroui-box-shadow-small);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-xs{--tw-shadow:0 1px 2px 0 var(--tw-shadow-color,#0000000d);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.ring,.ring-1{--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)}.ring-2{--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)}.shadow-black\/5{--tw-shadow-color:#0000000d}@supports (color:color-mix(in lab,red,red)){.shadow-black\/5{--tw-shadow-color:color-mix(in oklab,color-mix(in oklab,var(--color-black)5%,transparent)var(--tw-shadow-alpha),transparent)}}.shadow-danger\/40{--tw-shadow-color:hsl(var(--heroui-danger)/1)}@supports (color:color-mix(in lab,red,red)){.shadow-danger\/40{--tw-shadow-color:color-mix(in oklab,color-mix(in oklab,hsl(var(--heroui-danger)/1)40%,transparent)var(--tw-shadow-alpha),transparent)}}.shadow-default\/50{--tw-shadow-color:hsl(var(--heroui-default)/1)}@supports (color:color-mix(in lab,red,red)){.shadow-default\/50{--tw-shadow-color:color-mix(in oklab,color-mix(in oklab,hsl(var(--heroui-default)/1)50%,transparent)var(--tw-shadow-alpha),transparent)}}.shadow-foreground\/40{--tw-shadow-color:hsl(var(--heroui-foreground)/1)}@supports (color:color-mix(in lab,red,red)){.shadow-foreground\/40{--tw-shadow-color:color-mix(in oklab,color-mix(in oklab,hsl(var(--heroui-foreground)/1)40%,transparent)var(--tw-shadow-alpha),transparent)}}.shadow-primary\/40{--tw-shadow-color:#1b54ff66}@supports (color:color-mix(in lab,red,red)){.shadow-primary\/40{--tw-shadow-color:color-mix(in oklab,color-mix(in oklab,var(--color-primary)40%,transparent)var(--tw-shadow-alpha),transparent)}}.shadow-secondary\/40{--tw-shadow-color:hsl(var(--heroui-secondary)/1)}@supports (color:color-mix(in lab,red,red)){.shadow-secondary\/40{--tw-shadow-color:color-mix(in oklab,color-mix(in oklab,hsl(var(--heroui-secondary)/1)40%,transparent)var(--tw-shadow-alpha),transparent)}}.shadow-success\/40{--tw-shadow-color:hsl(var(--heroui-success)/1)}@supports (color:color-mix(in lab,red,red)){.shadow-success\/40{--tw-shadow-color:color-mix(in oklab,color-mix(in oklab,hsl(var(--heroui-success)/1)40%,transparent)var(--tw-shadow-alpha),transparent)}}.shadow-warning\/40{--tw-shadow-color:hsl(var(--heroui-warning)/1)}@supports (color:color-mix(in lab,red,red)){.shadow-warning\/40{--tw-shadow-color:color-mix(in oklab,color-mix(in oklab,hsl(var(--heroui-warning)/1)40%,transparent)var(--tw-shadow-alpha),transparent)}}.ring-background{--tw-ring-color:hsl(var(--heroui-background)/1)}.ring-danger{--tw-ring-color:hsl(var(--heroui-danger)/1)}.ring-default{--tw-ring-color:hsl(var(--heroui-default)/1)}.ring-focus{--tw-ring-color:hsl(var(--heroui-focus)/1)}.ring-primary{--tw-ring-color:var(--color-primary)}.ring-secondary{--tw-ring-color:hsl(var(--heroui-secondary)/1)}.ring-success{--tw-ring-color:hsl(var(--heroui-success)/1)}.ring-transparent{--tw-ring-color:transparent}.ring-warning{--tw-ring-color:hsl(var(--heroui-warning)/1)}.ring-offset-2{--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)}.ring-offset-background{--tw-ring-offset-color:hsl(var(--heroui-background)/1)}.\!outline-hidden{--tw-outline-style:none!important;outline-style:none!important}@media (forced-colors:active){.\!outline-hidden{outline-offset:2px!important;outline:2px solid #0000!important}}.outline-hidden{--tw-outline-style:none;outline-style:none}@media (forced-colors:active){.outline-hidden{outline-offset:2px;outline:2px solid #0000}}.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,)}.blur-lg{--tw-blur:blur(var(--blur-lg));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,)}.saturate-150{--tw-saturate:saturate(150%);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-md{--tw-backdrop-blur:blur(var(--blur-md));-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,)}.backdrop-blur-xl{--tw-backdrop-blur:blur(var(--blur-xl));-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-opacity-disabled{--tw-backdrop-opacity:opacity(var(--heroui-disabled-opacity));-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-saturate-150{--tw-backdrop-saturate:saturate(150%);-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,display,visibility,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-\[color\,opacity\]{transition-property:color,opacity;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-\[opacity\,transform\]{transition-property:opacity,transform;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-\[transform\,background-color\,color\]{transition-property:transform,background-color,color;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-\[transform\,color\,left\,opacity\,translate\,scale\]{transition-property:transform,color,left,opacity,translate,scale;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-background{transition-property:background;transition-duration:.25s;transition-timing-function:ease}.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-colors-opacity{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity;transition-duration:.25s;transition-timing-function:ease}.transition-height{transition-property:height;transition-duration:.25s;transition-timing-function:ease}.transition-left{transition-property:left;transition-duration:.25s;transition-timing-function:ease}.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))}.transition-size{transition-property:width,height;transition-duration:.25s;transition-timing-function:ease}.transition-transform{transition-property:transform,translate,scale,rotate;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-transform-background{transition-property:transform,scale,background;transition-duration:.25s;transition-timing-function:ease}.transition-transform-colors{transition-property:transform,scale,color,background,background-color,border-color,text-decoration-color,fill,stroke;transition-duration:.25s;transition-timing-function:ease}.transition-transform-colors-opacity{transition-property:transform,scale,color,background,background-color,border-color,text-decoration-color,fill,stroke,opacity;transition-duration:.25s;transition-timing-function:ease}.transition-transform-opacity{transition-property:transform,scale,opacity rotate;transition-duration:.25s;transition-timing-function:ease}.transition-width{transition-property:width;transition-duration:.25s;transition-timing-function:ease}.\!transition-none{transition-property:none!important}.transition-none{transition-property:none}.\!duration-100{--tw-duration:.1s!important;transition-duration:.1s!important}.\!duration-150{--tw-duration:.15s!important;transition-duration:.15s!important}.\!duration-200{--tw-duration:.2s!important;transition-duration:.2s!important}.\!duration-250{--tw-duration:.25s!important;transition-duration:.25s!important}.\!duration-300{--tw-duration:.3s!important;transition-duration:.3s!important}.\!duration-500{--tw-duration:.5s!important;transition-duration:.5s!important}.duration-150{--tw-duration:.15s;transition-duration:.15s}.duration-200{--tw-duration:.2s;transition-duration:.2s}.\!ease-out{--tw-ease:var(--ease-out)!important;transition-timing-function:var(--ease-out)!important}.\!ease-soft-spring{--tw-ease:cubic-bezier(.155,1.105,.295,1.12)!important;transition-timing-function:cubic-bezier(.155,1.105,.295,1.12)!important}.ease-in{--tw-ease:var(--ease-in);transition-timing-function:var(--ease-in)}.ease-out{--tw-ease:var(--ease-out);transition-timing-function:var(--ease-out)}.will-change-auto{will-change:auto}.will-change-transform{will-change:transform}.outline-none{--tw-outline-style:none;outline-style:none}.select-none{-webkit-user-select:none;user-select:none}.\[--picker-height\:224px\]{--picker-height:224px}.\[--scale-enter\:100\%\]{--scale-enter:100%}.\[--scale-exit\:100\%\]{--scale-exit:100%}.\[--scroll-shadow-size\:100px\]{--scroll-shadow-size:100px}.\[--slide-enter\:0px\]{--slide-enter:0px}.\[--slide-exit\:80px\]{--slide-exit:80px}.\[-webkit-mask\:radial-gradient\(closest-side\,rgba\(0\,0\,0\,0\.0\)calc\(100\%-3px\)\,rgba\(0\,0\,0\,1\)calc\(100\%-3px\)\)\]{-webkit-mask:radial-gradient(closest-side,#0000 calc(100% - 3px),#000 calc(100% - 3px))}.\[animation-duration\:1s\]{animation-duration:1s}.input-search-cancel-button-none::-webkit-search-cancel-button{-webkit-appearance:none}.spinner-dot-animation{animation-delay:calc(.25s*var(--dot-index))}.spinner-dot-blink-animation{animation-delay:calc(.2s*var(--dot-index))}.tap-highlight-transparent{-webkit-tap-highlight-color:transparent}.text-fill-inherit{-webkit-text-fill-color:inherit}@media (hover:hover){.group-hover\:pointer-events-auto:is(:where(.group):hover *){pointer-events:auto}.group-hover\:block:is(:where(.group):hover *){display:block}.group-hover\:hidden:is(:where(.group):hover *){display:none}.group-hover\:border-current:is(:where(.group):hover *){border-color:currentColor}.group-hover\:text-current:is(:where(.group):hover *){color:currentColor}.group-hover\:opacity-100:is(:where(.group):hover *){opacity:1}}.group-data-\[copied\=true\]\:scale-50:is(:where(.group)[data-copied=true] *){--tw-scale-x:50%;--tw-scale-y:50%;--tw-scale-z:50%;scale:var(--tw-scale-x)var(--tw-scale-y)}.group-data-\[copied\=true\]\:scale-100:is(:where(.group)[data-copied=true] *){--tw-scale-x:100%;--tw-scale-y:100%;--tw-scale-z:100%;scale:var(--tw-scale-x)var(--tw-scale-y)}.group-data-\[copied\=true\]\:opacity-0:is(:where(.group)[data-copied=true] *){opacity:0}.group-data-\[copied\=true\]\:opacity-100:is(:where(.group)[data-copied=true] *){opacity:1}.group-data-\[disabled\=true\]\/tr\:cursor-not-allowed:is(:where(.group\/tr)[data-disabled=true] *){cursor:not-allowed}.group-data-\[disabled\=true\]\/tr\:text-foreground-300:is(:where(.group\/tr)[data-disabled=true] *){color:hsl(var(--heroui-foreground-300)/1)}.group-data-\[filled-within\=true\]\:pointer-events-auto:is(:where(.group)[data-filled-within=true] *){pointer-events:auto}.group-data-\[filled-within\=true\]\:start-0:is(:where(.group)[data-filled-within=true] *){inset-inline-start:calc(var(--spacing)*0)}.group-data-\[filled-within\=true\]\:-translate-y-\[calc\(50\%_\+_var\(--heroui-font-size-small\)\/2_-_3\.5px\)\]:is(:where(.group)[data-filled-within=true] *){--tw-translate-y:calc(calc(50% + var(--heroui-font-size-small)/2 - 3.5px)*-1);translate:var(--tw-translate-x)var(--tw-translate-y)}.group-data-\[filled-within\=true\]\:-translate-y-\[calc\(50\%_\+_var\(--heroui-font-size-small\)\/2_-_4px\)\]:is(:where(.group)[data-filled-within=true] *){--tw-translate-y:calc(calc(50% + var(--heroui-font-size-small)/2 - 4px)*-1);translate:var(--tw-translate-x)var(--tw-translate-y)}.group-data-\[filled-within\=true\]\:-translate-y-\[calc\(50\%_\+_var\(--heroui-font-size-small\)\/2_-_6px\)\]:is(:where(.group)[data-filled-within=true] *){--tw-translate-y:calc(calc(50% + var(--heroui-font-size-small)/2 - 6px)*-1);translate:var(--tw-translate-x)var(--tw-translate-y)}.group-data-\[filled-within\=true\]\:-translate-y-\[calc\(50\%_\+_var\(--heroui-font-size-small\)\/2_-_6px_-_var\(--heroui-border-width-medium\)\)\]:is(:where(.group)[data-filled-within=true] *){--tw-translate-y:calc(calc(50% + var(--heroui-font-size-small)/2 - 6px - var(--heroui-border-width-medium))*-1);translate:var(--tw-translate-x)var(--tw-translate-y)}.group-data-\[filled-within\=true\]\:-translate-y-\[calc\(50\%_\+_var\(--heroui-font-size-small\)\/2_-_8px\)\]:is(:where(.group)[data-filled-within=true] *){--tw-translate-y:calc(calc(50% + var(--heroui-font-size-small)/2 - 8px)*-1);translate:var(--tw-translate-x)var(--tw-translate-y)}.group-data-\[filled-within\=true\]\:-translate-y-\[calc\(50\%_\+_var\(--heroui-font-size-small\)\/2_-_8px_-_var\(--heroui-border-width-medium\)\)\]:is(:where(.group)[data-filled-within=true] *){--tw-translate-y:calc(calc(50% + var(--heroui-font-size-small)/2 - 8px - var(--heroui-border-width-medium))*-1);translate:var(--tw-translate-x)var(--tw-translate-y)}.group-data-\[filled-within\=true\]\:-translate-y-\[calc\(50\%_\+_var\(--heroui-font-size-tiny\)\/2_-_5px\)\]:is(:where(.group)[data-filled-within=true] *){--tw-translate-y:calc(calc(50% + var(--heroui-font-size-tiny)/2 - 5px)*-1);translate:var(--tw-translate-x)var(--tw-translate-y)}.group-data-\[filled-within\=true\]\:-translate-y-\[calc\(50\%_\+_var\(--heroui-font-size-tiny\)\/2_-_8px\)\]:is(:where(.group)[data-filled-within=true] *){--tw-translate-y:calc(calc(50% + var(--heroui-font-size-tiny)/2 - 8px)*-1);translate:var(--tw-translate-x)var(--tw-translate-y)}.group-data-\[filled-within\=true\]\:-translate-y-\[calc\(50\%_\+_var\(--heroui-font-size-tiny\)\/2_-_8px_-_var\(--heroui-border-width-medium\)\)\]:is(:where(.group)[data-filled-within=true] *){--tw-translate-y:calc(calc(50% + var(--heroui-font-size-tiny)/2 - 8px - var(--heroui-border-width-medium))*-1);translate:var(--tw-translate-x)var(--tw-translate-y)}.group-data-\[filled-within\=true\]\:-translate-y-\[calc\(100\%_\+_var\(--heroui-font-size-small\)\/2_\+_20px\)\]:is(:where(.group)[data-filled-within=true] *){--tw-translate-y:calc(calc(100% + var(--heroui-font-size-small)/2 + 20px)*-1);translate:var(--tw-translate-x)var(--tw-translate-y)}.group-data-\[filled-within\=true\]\:-translate-y-\[calc\(100\%_\+_var\(--heroui-font-size-small\)\/2_\+_24px\)\]:is(:where(.group)[data-filled-within=true] *){--tw-translate-y:calc(calc(100% + var(--heroui-font-size-small)/2 + 24px)*-1);translate:var(--tw-translate-x)var(--tw-translate-y)}.group-data-\[filled-within\=true\]\:-translate-y-\[calc\(100\%_\+_var\(--heroui-font-size-tiny\)\/2_\+_16px\)\]:is(:where(.group)[data-filled-within=true] *){--tw-translate-y:calc(calc(100% + var(--heroui-font-size-tiny)/2 + 16px)*-1);translate:var(--tw-translate-x)var(--tw-translate-y)}.group-data-\[filled-within\=true\]\:scale-85:is(:where(.group)[data-filled-within=true] *){--tw-scale-x:.85;--tw-scale-y:.85;--tw-scale-z:.85;scale:var(--tw-scale-x)var(--tw-scale-y)}.group-data-\[filled-within\=true\]\:text-default-600:is(:where(.group)[data-filled-within=true] *){color:hsl(var(--heroui-default-600)/1)}.group-data-\[filled-within\=true\]\:text-foreground:is(:where(.group)[data-filled-within=true] *){color:hsl(var(--heroui-foreground)/1)}.group-data-\[filled\=true\]\:start-0:is(:where(.group)[data-filled=true] *){inset-inline-start:calc(var(--spacing)*0)}.group-data-\[filled\=true\]\:-translate-y-\[calc\(50\%_\+_var\(--heroui-font-size-small\)\/2_-_3\.5px\)\]:is(:where(.group)[data-filled=true] *){--tw-translate-y:calc(calc(50% + var(--heroui-font-size-small)/2 - 3.5px)*-1);translate:var(--tw-translate-x)var(--tw-translate-y)}.group-data-\[filled\=true\]\:-translate-y-\[calc\(50\%_\+_var\(--heroui-font-size-small\)\/2_-_4px\)\]:is(:where(.group)[data-filled=true] *){--tw-translate-y:calc(calc(50% + var(--heroui-font-size-small)/2 - 4px)*-1);translate:var(--tw-translate-x)var(--tw-translate-y)}.group-data-\[filled\=true\]\:-translate-y-\[calc\(50\%_\+_var\(--heroui-font-size-small\)\/2_-_6px\)\]:is(:where(.group)[data-filled=true] *){--tw-translate-y:calc(calc(50% + var(--heroui-font-size-small)/2 - 6px)*-1);translate:var(--tw-translate-x)var(--tw-translate-y)}.group-data-\[filled\=true\]\:-translate-y-\[calc\(50\%_\+_var\(--heroui-font-size-small\)\/2_-_6px_-_var\(--heroui-border-width-medium\)\)\]:is(:where(.group)[data-filled=true] *){--tw-translate-y:calc(calc(50% + var(--heroui-font-size-small)/2 - 6px - var(--heroui-border-width-medium))*-1);translate:var(--tw-translate-x)var(--tw-translate-y)}.group-data-\[filled\=true\]\:-translate-y-\[calc\(50\%_\+_var\(--heroui-font-size-small\)\/2_-_8px\)\]:is(:where(.group)[data-filled=true] *){--tw-translate-y:calc(calc(50% + var(--heroui-font-size-small)/2 - 8px)*-1);translate:var(--tw-translate-x)var(--tw-translate-y)}.group-data-\[filled\=true\]\:-translate-y-\[calc\(50\%_\+_var\(--heroui-font-size-small\)\/2_-_8px_-_var\(--heroui-border-width-medium\)\)\]:is(:where(.group)[data-filled=true] *){--tw-translate-y:calc(calc(50% + var(--heroui-font-size-small)/2 - 8px - var(--heroui-border-width-medium))*-1);translate:var(--tw-translate-x)var(--tw-translate-y)}.group-data-\[filled\=true\]\:-translate-y-\[calc\(50\%_\+_var\(--heroui-font-size-tiny\)\/2_-_5px\)\]:is(:where(.group)[data-filled=true] *){--tw-translate-y:calc(calc(50% + var(--heroui-font-size-tiny)/2 - 5px)*-1);translate:var(--tw-translate-x)var(--tw-translate-y)}.group-data-\[filled\=true\]\:-translate-y-\[calc\(50\%_\+_var\(--heroui-font-size-tiny\)\/2_-_8px\)\]:is(:where(.group)[data-filled=true] *){--tw-translate-y:calc(calc(50% + var(--heroui-font-size-tiny)/2 - 8px)*-1);translate:var(--tw-translate-x)var(--tw-translate-y)}.group-data-\[filled\=true\]\:-translate-y-\[calc\(50\%_\+_var\(--heroui-font-size-tiny\)\/2_-_8px_-_var\(--heroui-border-width-medium\)\)\]:is(:where(.group)[data-filled=true] *){--tw-translate-y:calc(calc(50% + var(--heroui-font-size-tiny)/2 - 8px - var(--heroui-border-width-medium))*-1);translate:var(--tw-translate-x)var(--tw-translate-y)}.group-data-\[filled\=true\]\:-translate-y-\[calc\(100\%_\+_var\(--heroui-font-size-small\)\/2_\+_20px\)\]:is(:where(.group)[data-filled=true] *){--tw-translate-y:calc(calc(100% + var(--heroui-font-size-small)/2 + 20px)*-1);translate:var(--tw-translate-x)var(--tw-translate-y)}.group-data-\[filled\=true\]\:-translate-y-\[calc\(100\%_\+_var\(--heroui-font-size-small\)\/2_\+_24px\)\]:is(:where(.group)[data-filled=true] *){--tw-translate-y:calc(calc(100% + var(--heroui-font-size-small)/2 + 24px)*-1);translate:var(--tw-translate-x)var(--tw-translate-y)}.group-data-\[filled\=true\]\:-translate-y-\[calc\(100\%_\+var\(--heroui-font-size-tiny\)\/2_\+_16px\)\]:is(:where(.group)[data-filled=true] *){--tw-translate-y:calc(calc(100% + var(--heroui-font-size-tiny)/2 + 16px)*-1);translate:var(--tw-translate-x)var(--tw-translate-y)}.group-data-\[filled\=true\]\:scale-85:is(:where(.group)[data-filled=true] *){--tw-scale-x:.85;--tw-scale-y:.85;--tw-scale-z:.85;scale:var(--tw-scale-x)var(--tw-scale-y)}.group-data-\[filled\=true\]\:text-default-600:is(:where(.group)[data-filled=true] *){color:hsl(var(--heroui-default-600)/1)}.group-data-\[filled\=true\]\:text-foreground:is(:where(.group)[data-filled=true] *){color:hsl(var(--heroui-foreground)/1)}.group-data-\[focus-visible\=true\]\:z-10:is(:where(.group)[data-focus-visible=true] *){z-index:10}.group-data-\[focus-visible\=true\]\:block:is(:where(.group)[data-focus-visible=true] *){display:block}.group-data-\[focus-visible\=true\]\:hidden:is(:where(.group)[data-focus-visible=true] *){display:none}.group-data-\[focus-visible\=true\]\:ring-0:is(:where(.group)[data-focus-visible=true] *){--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)}.group-data-\[focus-visible\=true\]\:ring-2:is(:where(.group)[data-focus-visible=true] *){--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)}.group-data-\[focus-visible\=true\]\:ring-focus:is(:where(.group)[data-focus-visible=true] *){--tw-ring-color:hsl(var(--heroui-focus)/1)}.group-data-\[focus-visible\=true\]\:ring-offset-0:is(:where(.group)[data-focus-visible=true] *){--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)}.group-data-\[focus-visible\=true\]\:ring-offset-2:is(:where(.group)[data-focus-visible=true] *){--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)}.group-data-\[focus-visible\=true\]\:ring-offset-background:is(:where(.group)[data-focus-visible=true] *){--tw-ring-offset-color:hsl(var(--heroui-background)/1)}.group-data-\[focus\=true\]\:\!border-danger:is(:where(.group)[data-focus=true] *){border-color:hsl(var(--heroui-danger)/1)!important}.group-data-\[focus\=true\]\:border-danger:is(:where(.group)[data-focus=true] *){border-color:hsl(var(--heroui-danger)/1)}.group-data-\[focus\=true\]\:border-default-foreground:is(:where(.group)[data-focus=true] *){border-color:hsl(var(--heroui-default-foreground)/1)}.group-data-\[focus\=true\]\:border-primary:is(:where(.group)[data-focus=true] *){border-color:var(--color-primary)}.group-data-\[focus\=true\]\:border-secondary:is(:where(.group)[data-focus=true] *){border-color:hsl(var(--heroui-secondary)/1)}.group-data-\[focus\=true\]\:border-success:is(:where(.group)[data-focus=true] *){border-color:hsl(var(--heroui-success)/1)}.group-data-\[focus\=true\]\:border-warning:is(:where(.group)[data-focus=true] *){border-color:hsl(var(--heroui-warning)/1)}.group-data-\[focus\=true\]\:\!bg-danger-50:is(:where(.group)[data-focus=true] *){background-color:hsl(var(--heroui-danger-50)/1)!important}.group-data-\[focus\=true\]\:bg-danger-50:is(:where(.group)[data-focus=true] *){background-color:hsl(var(--heroui-danger-50)/1)}.group-data-\[focus\=true\]\:bg-default-100:is(:where(.group)[data-focus=true] *){background-color:hsl(var(--heroui-default-100)/1)}.group-data-\[focus\=true\]\:bg-default-200:is(:where(.group)[data-focus=true] *){background-color:hsl(var(--heroui-default-200)/1)}.group-data-\[focus\=true\]\:bg-primary-50:is(:where(.group)[data-focus=true] *){background-color:hsl(var(--heroui-primary-50)/1)}.group-data-\[focus\=true\]\:bg-secondary-50:is(:where(.group)[data-focus=true] *){background-color:hsl(var(--heroui-secondary-50)/1)}.group-data-\[focus\=true\]\:bg-success-50:is(:where(.group)[data-focus=true] *){background-color:hsl(var(--heroui-success-50)/1)}.group-data-\[focus\=true\]\:bg-warning-50:is(:where(.group)[data-focus=true] *){background-color:hsl(var(--heroui-warning-50)/1)}.group-data-\[has-end-content\=true\]\:left-2:is(:where(.group)[data-has-end-content=true] *){left:calc(var(--spacing)*2)}.group-data-\[has-end-content\=true\]\:mt-4:is(:where(.group)[data-has-end-content=true] *){margin-top:calc(var(--spacing)*4)}.group-data-\[has-helper\=true\]\:flex:is(:where(.group)[data-has-helper=true] *){display:flex}.group-data-\[has-helper\=true\]\:-translate-y-\[calc\(100\%_\+_var\(--heroui-font-size-small\)\/2_\+_26px\)\]:is(:where(.group)[data-has-helper=true] *){--tw-translate-y:calc(calc(100% + var(--heroui-font-size-small)/2 + 26px)*-1);translate:var(--tw-translate-x)var(--tw-translate-y)}.group-data-\[has-helper\=true\]\:-translate-y-\[calc\(100\%_\+_var\(--heroui-font-size-small\)\/2_\+_30px\)\]:is(:where(.group)[data-has-helper=true] *){--tw-translate-y:calc(calc(100% + var(--heroui-font-size-small)/2 + 30px)*-1);translate:var(--tw-translate-x)var(--tw-translate-y)}.group-data-\[has-helper\=true\]\:-translate-y-\[calc\(100\%_\+_var\(--heroui-font-size-small\)\/2_\+_34px\)\]:is(:where(.group)[data-has-helper=true] *){--tw-translate-y:calc(calc(100% + var(--heroui-font-size-small)/2 + 34px)*-1);translate:var(--tw-translate-x)var(--tw-translate-y)}.group-data-\[has-helper\=true\]\:pt-2:is(:where(.group)[data-has-helper=true] *){padding-top:calc(var(--spacing)*2)}.group-data-\[has-helper\=true\]\:pt-3:is(:where(.group)[data-has-helper=true] *){padding-top:calc(var(--spacing)*3)}.group-data-\[has-helper\=true\]\:pt-4:is(:where(.group)[data-has-helper=true] *){padding-top:calc(var(--spacing)*4)}.group-data-\[has-label-outside\=true\]\:pointer-events-auto:is(:where(.group)[data-has-label-outside=true] *){pointer-events:auto}.group-data-\[has-label\=true\]\:items-end:is(:where(.group)[data-has-label=true] *){align-items:flex-end}.group-data-\[has-label\=true\]\:items-start:is(:where(.group)[data-has-label=true] *){align-items:flex-start}.group-data-\[has-label\=true\]\:pt-4:is(:where(.group)[data-has-label=true] *){padding-top:calc(var(--spacing)*4)}.group-data-\[has-label\=true\]\:pt-5:is(:where(.group)[data-has-label=true] *){padding-top:calc(var(--spacing)*5)}.group-data-\[has-multiple-months\=true\]\:flex-row:is(:where(.group)[data-has-multiple-months=true] *){flex-direction:row}.group-data-\[has-value\=true\]\:pointer-events-auto:is(:where(.group)[data-has-value=true] *){pointer-events:auto}.group-data-\[has-value\=true\]\:block:is(:where(.group)[data-has-value=true] *){display:block}.group-data-\[has-value\=true\]\:scale-100:is(:where(.group)[data-has-value=true] *){--tw-scale-x:100%;--tw-scale-y:100%;--tw-scale-z:100%;scale:var(--tw-scale-x)var(--tw-scale-y)}.group-data-\[has-value\=true\]\:text-default-foreground:is(:where(.group)[data-has-value=true] *){color:hsl(var(--heroui-default-foreground)/1)}.group-data-\[has-value\=true\]\:text-foreground:is(:where(.group)[data-has-value=true] *){color:hsl(var(--heroui-foreground)/1)}.group-data-\[has-value\=true\]\:opacity-70:is(:where(.group)[data-has-value=true] *){opacity:.7}.group-data-\[hover-unselected\=true\]\:bg-default-100:is(:where(.group)[data-hover-unselected=true] *){background-color:hsl(var(--heroui-default-100)/1)}.group-data-\[hover\=true\]\/th\:opacity-100:is(:where(.group\/th)[data-hover=true] *){opacity:1}.group-data-\[invalid\=true\]\:border-danger:is(:where(.group)[data-invalid=true] *){border-color:hsl(var(--heroui-danger)/1)}.group-data-\[invalid\=true\]\:bg-danger-50:is(:where(.group)[data-invalid=true] *){background-color:hsl(var(--heroui-danger-50)/1)}.group-data-\[invalid\=true\]\:text-danger:is(:where(.group)[data-invalid=true] *){color:hsl(var(--heroui-danger)/1)}.group-data-\[loaded\=true\]\:opacity-100:is(:where(.group)[data-loaded=true] *){opacity:1}.group-data-\[pressed\=true\]\:w-5:is(:where(.group)[data-pressed=true] *){width:calc(var(--spacing)*5)}.group-data-\[pressed\=true\]\:w-6:is(:where(.group)[data-pressed=true] *){width:calc(var(--spacing)*6)}.group-data-\[pressed\=true\]\:w-7:is(:where(.group)[data-pressed=true] *){width:calc(var(--spacing)*7)}.group-data-\[pressed\=true\]\:scale-95:is(:where(.group)[data-pressed=true] *){--tw-scale-x:95%;--tw-scale-y:95%;--tw-scale-z:95%;scale:var(--tw-scale-x)var(--tw-scale-y)}.group-data-\[pressed\=true\]\:opacity-70:is(:where(.group)[data-pressed=true] *){opacity:.7}.group-data-\[selected\]\:group-data-\[pressed\]\:ml-3:is(:where(.group)[data-selected] *):is(:where(.group)[data-pressed] *){margin-left:calc(var(--spacing)*3)}.group-data-\[selected\]\:group-data-\[pressed\]\:ml-4:is(:where(.group)[data-selected] *):is(:where(.group)[data-pressed] *){margin-left:calc(var(--spacing)*4)}.group-data-\[selected\]\:group-data-\[pressed\]\:ml-5:is(:where(.group)[data-selected] *):is(:where(.group)[data-pressed] *){margin-left:calc(var(--spacing)*5)}.group-data-\[selected\=true\]\:ms-4:is(:where(.group)[data-selected=true] *){margin-inline-start:calc(var(--spacing)*4)}.group-data-\[selected\=true\]\:ms-5:is(:where(.group)[data-selected=true] *){margin-inline-start:calc(var(--spacing)*5)}.group-data-\[selected\=true\]\:ms-6:is(:where(.group)[data-selected=true] *){margin-inline-start:calc(var(--spacing)*6)}.group-data-\[selected\=true\]\:translate-x-3:is(:where(.group)[data-selected=true] *){--tw-translate-x:calc(var(--spacing)*3);translate:var(--tw-translate-x)var(--tw-translate-y)}.group-data-\[selected\=true\]\:scale-100:is(:where(.group)[data-selected=true] *){--tw-scale-x:100%;--tw-scale-y:100%;--tw-scale-z:100%;scale:var(--tw-scale-x)var(--tw-scale-y)}.group-data-\[selected\=true\]\:border-danger:is(:where(.group)[data-selected=true] *){border-color:hsl(var(--heroui-danger)/1)}.group-data-\[selected\=true\]\:border-default-500:is(:where(.group)[data-selected=true] *){border-color:hsl(var(--heroui-default-500)/1)}.group-data-\[selected\=true\]\:border-primary:is(:where(.group)[data-selected=true] *){border-color:var(--color-primary)}.group-data-\[selected\=true\]\:border-secondary:is(:where(.group)[data-selected=true] *){border-color:hsl(var(--heroui-secondary)/1)}.group-data-\[selected\=true\]\:border-success:is(:where(.group)[data-selected=true] *){border-color:hsl(var(--heroui-success)/1)}.group-data-\[selected\=true\]\:border-warning:is(:where(.group)[data-selected=true] *){border-color:hsl(var(--heroui-warning)/1)}.group-data-\[selected\=true\]\:bg-danger:is(:where(.group)[data-selected=true] *){background-color:hsl(var(--heroui-danger)/1)}.group-data-\[selected\=true\]\:bg-default-400:is(:where(.group)[data-selected=true] *){background-color:hsl(var(--heroui-default-400)/1)}.group-data-\[selected\=true\]\:bg-primary:is(:where(.group)[data-selected=true] *){background-color:var(--color-primary)}.group-data-\[selected\=true\]\:bg-secondary:is(:where(.group)[data-selected=true] *){background-color:hsl(var(--heroui-secondary)/1)}.group-data-\[selected\=true\]\:bg-success:is(:where(.group)[data-selected=true] *){background-color:hsl(var(--heroui-success)/1)}.group-data-\[selected\=true\]\:bg-warning:is(:where(.group)[data-selected=true] *){background-color:hsl(var(--heroui-warning)/1)}.group-data-\[selected\=true\]\:text-danger:is(:where(.group)[data-selected=true] *){color:hsl(var(--heroui-danger)/1)}.group-data-\[selected\=true\]\:text-danger-foreground:is(:where(.group)[data-selected=true] *){color:hsl(var(--heroui-danger-foreground)/1)}.group-data-\[selected\=true\]\:text-default-foreground:is(:where(.group)[data-selected=true] *){color:hsl(var(--heroui-default-foreground)/1)}.group-data-\[selected\=true\]\:text-foreground:is(:where(.group)[data-selected=true] *){color:hsl(var(--heroui-foreground)/1)}.group-data-\[selected\=true\]\:text-primary:is(:where(.group)[data-selected=true] *){color:var(--color-primary)}.group-data-\[selected\=true\]\:text-primary-foreground:is(:where(.group)[data-selected=true] *){color:hsl(var(--heroui-primary-foreground)/1)}.group-data-\[selected\=true\]\:text-secondary:is(:where(.group)[data-selected=true] *){color:hsl(var(--heroui-secondary)/1)}.group-data-\[selected\=true\]\:text-secondary-foreground:is(:where(.group)[data-selected=true] *){color:hsl(var(--heroui-secondary-foreground)/1)}.group-data-\[selected\=true\]\:text-success:is(:where(.group)[data-selected=true] *){color:hsl(var(--heroui-success)/1)}.group-data-\[selected\=true\]\:text-success-foreground:is(:where(.group)[data-selected=true] *){color:hsl(var(--heroui-success-foreground)/1)}.group-data-\[selected\=true\]\:text-warning:is(:where(.group)[data-selected=true] *){color:hsl(var(--heroui-warning)/1)}.group-data-\[selected\=true\]\:text-warning-foreground:is(:where(.group)[data-selected=true] *){color:hsl(var(--heroui-warning-foreground)/1)}.group-data-\[selected\=true\]\:opacity-0:is(:where(.group)[data-selected=true] *){opacity:0}.group-data-\[selected\=true\]\:opacity-60:is(:where(.group)[data-selected=true] *){opacity:.6}.group-data-\[selected\=true\]\:opacity-100:is(:where(.group)[data-selected=true] *){opacity:1}.peer-data-\[filled\=true\]\:pointer-events-auto:is(:where(.peer)[data-filled=true]~*){pointer-events:auto}.peer-data-\[filled\=true\]\:block:is(:where(.peer)[data-filled=true]~*){display:block}.peer-data-\[filled\=true\]\:scale-100:is(:where(.peer)[data-filled=true]~*){--tw-scale-x:100%;--tw-scale-y:100%;--tw-scale-z:100%;scale:var(--tw-scale-x)var(--tw-scale-y)}.peer-data-\[filled\=true\]\:opacity-70:is(:where(.peer)[data-filled=true]~*){opacity:.7}.file\:cursor-pointer::file-selector-button{cursor:pointer}.file\:border-0::file-selector-button{border-style:var(--tw-border-style);border-width:0}.file\:bg-transparent::file-selector-button{background-color:#0000}.placeholder\:text-danger::placeholder{color:hsl(var(--heroui-danger)/1)}.placeholder\:text-foreground-500::placeholder{color:hsl(var(--heroui-foreground-500)/1)}.placeholder\:text-primary::placeholder{color:var(--color-primary)}.placeholder\:text-secondary::placeholder{color:hsl(var(--heroui-secondary)/1)}.placeholder\:text-success-600::placeholder{color:hsl(var(--heroui-success-600)/1)}.placeholder\:text-warning-600::placeholder{color:hsl(var(--heroui-warning-600)/1)}.before\:pointer-events-auto:before{content:var(--tw-content);pointer-events:auto}.before\:pointer-events-none:before{content:var(--tw-content);pointer-events:none}.before\:absolute:before{content:var(--tw-content);position:absolute}.before\:inset-0:before{content:var(--tw-content);inset:calc(var(--spacing)*0)}.before\:right-0:before{content:var(--tw-content);right:calc(var(--spacing)*0)}.before\:left-0:before{content:var(--tw-content);left:calc(var(--spacing)*0)}.before\:z-0:before{content:var(--tw-content);z-index:0}.before\:z-\[-1\]:before{content:var(--tw-content);z-index:-1}.before\:box-border:before{content:var(--tw-content);box-sizing:border-box}.before\:block:before{content:var(--tw-content);display:block}.before\:hidden:before{content:var(--tw-content);display:none}.before\:h-0\.5:before{content:var(--tw-content);height:calc(var(--spacing)*.5)}.before\:h-2\.5:before{content:var(--tw-content);height:calc(var(--spacing)*2.5)}.before\:h-4:before{content:var(--tw-content);height:calc(var(--spacing)*4)}.before\:h-6:before{content:var(--tw-content);height:calc(var(--spacing)*6)}.before\:h-8:before{content:var(--tw-content);height:calc(var(--spacing)*8)}.before\:h-11:before{content:var(--tw-content);height:calc(var(--spacing)*11)}.before\:h-px:before{content:var(--tw-content);height:1px}.before\:w-0:before{content:var(--tw-content);width:calc(var(--spacing)*0)}.before\:w-2\.5:before{content:var(--tw-content);width:calc(var(--spacing)*2.5)}.before\:w-6:before{content:var(--tw-content);width:calc(var(--spacing)*6)}.before\:w-8:before{content:var(--tw-content);width:calc(var(--spacing)*8)}.before\:w-11:before{content:var(--tw-content);width:calc(var(--spacing)*11)}.before\:-translate-x-full:before{content:var(--tw-content);--tw-translate-x:-100%;translate:var(--tw-translate-x)var(--tw-translate-y)}.before\:-translate-y-1:before{content:var(--tw-content);--tw-translate-y:calc(var(--spacing)*-1);translate:var(--tw-translate-x)var(--tw-translate-y)}.before\:rotate-0:before{content:var(--tw-content);rotate:none}.before\:rotate-45:before{content:var(--tw-content);rotate:45deg}.before\:animate-none:before{content:var(--tw-content);animation:none}.before\:animate-shimmer:before{content:var(--tw-content);animation:2s infinite shimmer}.before\:rounded-\[calc\(var\(--heroui-radius-medium\)\*0\.5\)\]:before{content:var(--tw-content);border-radius:calc(var(--heroui-radius-medium)*.5)}.before\:rounded-\[calc\(var\(--heroui-radius-medium\)\*0\.6\)\]:before{content:var(--tw-content);border-radius:calc(var(--heroui-radius-medium)*.6)}.before\:rounded-\[calc\(var\(--heroui-radius-medium\)\*0\.7\)\]:before{content:var(--tw-content);border-radius:calc(var(--heroui-radius-medium)*.7)}.before\:rounded-full:before{content:var(--tw-content);border-radius:3.40282e38px}.before\:rounded-none:before{content:var(--tw-content);border-radius:0}.before\:rounded-sm:before{content:var(--tw-content);border-radius:var(--radius-sm)}.before\:border-2:before{content:var(--tw-content);border-style:var(--tw-border-style);border-width:2px}.before\:border-t:before{content:var(--tw-content);border-top-style:var(--tw-border-style);border-top-width:1px}.before\:border-solid:before{content:var(--tw-content);--tw-border-style:solid;border-style:solid}.before\:border-content4\/30:before{content:var(--tw-content);border-color:hsl(var(--heroui-content4)/1)}@supports (color:color-mix(in lab,red,red)){.before\:border-content4\/30:before{border-color:color-mix(in oklab,hsl(var(--heroui-content4)/1)30%,transparent)}}.before\:border-danger:before{content:var(--tw-content);border-color:hsl(var(--heroui-danger)/1)}.before\:border-default:before{content:var(--tw-content);border-color:hsl(var(--heroui-default)/1)}.before\:bg-content1:before{content:var(--tw-content);background-color:hsl(var(--heroui-content1)/1)}.before\:bg-current:before{content:var(--tw-content);background-color:currentColor}.before\:bg-danger:before,.before\:bg-danger\/20:before{content:var(--tw-content);background-color:hsl(var(--heroui-danger)/1)}@supports (color:color-mix(in lab,red,red)){.before\:bg-danger\/20:before{background-color:color-mix(in oklab,hsl(var(--heroui-danger)/1)20%,transparent)}}.before\:bg-default\/60:before{content:var(--tw-content);background-color:hsl(var(--heroui-default)/1)}@supports (color:color-mix(in lab,red,red)){.before\:bg-default\/60:before{background-color:color-mix(in oklab,hsl(var(--heroui-default)/1)60%,transparent)}}.before\:bg-foreground:before{content:var(--tw-content);background-color:hsl(var(--heroui-foreground)/1)}.before\:bg-primary:before{content:var(--tw-content);background-color:var(--color-primary)}.before\:bg-primary\/20:before{content:var(--tw-content);background-color:#1b54ff33}@supports (color:color-mix(in lab,red,red)){.before\:bg-primary\/20:before{background-color:color-mix(in oklab,var(--color-primary)20%,transparent)}}.before\:bg-secondary:before,.before\:bg-secondary\/20:before{content:var(--tw-content);background-color:hsl(var(--heroui-secondary)/1)}@supports (color:color-mix(in lab,red,red)){.before\:bg-secondary\/20:before{background-color:color-mix(in oklab,hsl(var(--heroui-secondary)/1)20%,transparent)}}.before\:bg-success:before,.before\:bg-success\/20:before{content:var(--tw-content);background-color:hsl(var(--heroui-success)/1)}@supports (color:color-mix(in lab,red,red)){.before\:bg-success\/20:before{background-color:color-mix(in oklab,hsl(var(--heroui-success)/1)20%,transparent)}}.before\:bg-transparent:before{content:var(--tw-content);background-color:#0000}.before\:bg-warning:before,.before\:bg-warning\/20:before{content:var(--tw-content);background-color:hsl(var(--heroui-warning)/1)}@supports (color:color-mix(in lab,red,red)){.before\:bg-warning\/20:before{background-color:color-mix(in oklab,hsl(var(--heroui-warning)/1)20%,transparent)}}.before\:bg-gradient-to-r:before{content:var(--tw-content);--tw-gradient-position:to right in oklab;background-image:linear-gradient(var(--tw-gradient-stops))}.before\:from-transparent:before{content:var(--tw-content);--tw-gradient-from:transparent;--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))}.before\:via-content4:before{content:var(--tw-content);--tw-gradient-via:hsl(var(--heroui-content4)/1);--tw-gradient-via-stops:var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-via)var(--tw-gradient-via-position),var(--tw-gradient-to)var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-via-stops)}.before\:to-transparent:before{content:var(--tw-content);--tw-gradient-to:transparent;--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))}.before\:opacity-0:before{content:var(--tw-content);opacity:0}.before\:opacity-100:before{content:var(--tw-content);opacity:1}.before\:shadow-small:before{content:var(--tw-content);--tw-shadow:var(--heroui-box-shadow-small);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.before\:transition-colors:before{content:var(--tw-content);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))}.before\:transition-transform:before{content:var(--tw-content);transition-property:transform,translate,scale,rotate;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.before\:transition-width:before{content:var(--tw-content);transition-property:width;transition-duration:.25s;transition-timing-function:ease}.before\:transition-none:before{content:var(--tw-content);transition-property:none}.before\:duration-150:before{content:var(--tw-content);--tw-duration:.15s;transition-duration:.15s}.before\:content-\[\'\'\]:before{--tw-content:"";content:var(--tw-content)}.group-data-\[hover\=true\]\:before\:bg-default-100:is(:where(.group)[data-hover=true] *):before,.group-aria-\[selected\=false\]\/tr\:group-data-\[hover\=true\]\/tr\:before\:bg-default-100:is(:where(.group\/tr)[aria-selected=false] *):is(:where(.group\/tr)[data-hover=true] *):before{content:var(--tw-content);background-color:hsl(var(--heroui-default-100)/1)}.group-aria-\[selected\=false\]\/tr\:group-data-\[hover\=true\]\/tr\:before\:opacity-70:is(:where(.group\/tr)[aria-selected=false] *):is(:where(.group\/tr)[data-hover=true] *):before{content:var(--tw-content);opacity:.7}.group-data-\[middle\=true\]\/tr\:before\:rounded-none:is(:where(.group\/tr)[data-middle=true] *):before{content:var(--tw-content);border-radius:0}.group-data-\[odd\=true\]\/tr\:before\:-z-10:is(:where(.group\/tr)[data-odd=true] *):before{content:var(--tw-content);z-index:-10}.group-data-\[odd\=true\]\/tr\:before\:bg-default-100:is(:where(.group\/tr)[data-odd=true] *):before{content:var(--tw-content);background-color:hsl(var(--heroui-default-100)/1)}.group-data-\[odd\=true\]\/tr\:before\:opacity-100:is(:where(.group\/tr)[data-odd=true] *):before{content:var(--tw-content);opacity:1}.group-data-\[open\=true\]\:before\:translate-y-px:is(:where(.group)[data-open=true] *):before{content:var(--tw-content);--tw-translate-y:1px;translate:var(--tw-translate-x)var(--tw-translate-y)}.group-data-\[open\=true\]\:before\:rotate-45:is(:where(.group)[data-open=true] *):before{content:var(--tw-content);rotate:45deg}.group-data-\[selected\=true\]\:before\:w-full:is(:where(.group)[data-selected=true] *):before{content:var(--tw-content);width:100%}.after\:pointer-events-auto:after{content:var(--tw-content);pointer-events:auto}.after\:absolute:after{content:var(--tw-content);position:absolute}.after\:inset-0:after{content:var(--tw-content);inset:calc(var(--spacing)*0)}.after\:top-0:after{content:var(--tw-content);top:calc(var(--spacing)*0)}.after\:right-0:after{content:var(--tw-content);right:calc(var(--spacing)*0)}.after\:-bottom-1:after{content:var(--tw-content);bottom:calc(var(--spacing)*-1)}.after\:-bottom-\[2px\]:after{content:var(--tw-content);bottom:-2px}.after\:bottom-0:after{content:var(--tw-content);bottom:calc(var(--spacing)*0)}.after\:left-0:after{content:var(--tw-content);left:calc(var(--spacing)*0)}.after\:left-1\/2:after{content:var(--tw-content);left:50%}.after\:-z-10:after{content:var(--tw-content);z-index:-10}.after\:z-0:after{content:var(--tw-content);z-index:0}.after\:z-\[-1\]:after{content:var(--tw-content);z-index:-1}.after\:ms-0\.5:after{content:var(--tw-content);margin-inline-start:calc(var(--spacing)*.5)}.after\:ml-0\.5:after{content:var(--tw-content);margin-left:calc(var(--spacing)*.5)}.after\:block:after{content:var(--tw-content);display:block}.after\:h-0:after{content:var(--tw-content);height:calc(var(--spacing)*0)}.after\:h-4:after{content:var(--tw-content);height:calc(var(--spacing)*4)}.after\:h-5:after{content:var(--tw-content);height:calc(var(--spacing)*5)}.after\:h-\[2px\]:after{content:var(--tw-content);height:2px}.after\:h-divider:after{content:var(--tw-content);height:var(--heroui-divider-weight)}.after\:h-full:after{content:var(--tw-content);height:100%}.after\:h-px:after{content:var(--tw-content);height:1px}.after\:w-0:after{content:var(--tw-content);width:calc(var(--spacing)*0)}.after\:w-4:after{content:var(--tw-content);width:calc(var(--spacing)*4)}.after\:w-5:after{content:var(--tw-content);width:calc(var(--spacing)*5)}.after\:w-6:after{content:var(--tw-content);width:calc(var(--spacing)*6)}.after\:w-\[80\%\]:after{content:var(--tw-content);width:80%}.after\:w-full:after{content:var(--tw-content);width:100%}.after\:origin-center:after{content:var(--tw-content);transform-origin:50%}.after\:-translate-x-1\/2:after{content:var(--tw-content);--tw-translate-x: -50% ;translate:var(--tw-translate-x)var(--tw-translate-y)}.after\:translate-y-1:after{content:var(--tw-content);--tw-translate-y:calc(var(--spacing)*1);translate:var(--tw-translate-x)var(--tw-translate-y)}.after\:scale-50:after{content:var(--tw-content);--tw-scale-x:50%;--tw-scale-y:50%;--tw-scale-z:50%;scale:var(--tw-scale-x)var(--tw-scale-y)}.after\:rotate-0:after{content:var(--tw-content);rotate:none}.after\:rounded-\[calc\(var\(--heroui-radius-large\)\/2\)\]:after{content:var(--tw-content);border-radius:calc(var(--heroui-radius-large)/2)}.after\:rounded-\[calc\(var\(--heroui-radius-medium\)\*0\.5\)\]:after{content:var(--tw-content);border-radius:calc(var(--heroui-radius-medium)*.5)}.after\:rounded-\[calc\(var\(--heroui-radius-medium\)\*0\.6\)\]:after{content:var(--tw-content);border-radius:calc(var(--heroui-radius-medium)*.6)}.after\:rounded-\[calc\(var\(--heroui-radius-medium\)\*0\.7\)\]:after{content:var(--tw-content);border-radius:calc(var(--heroui-radius-medium)*.7)}.after\:rounded-\[calc\(var\(--heroui-radius-medium\)\/3\)\]:after{content:var(--tw-content);border-radius:calc(var(--heroui-radius-medium)/3)}.after\:rounded-\[calc\(var\(--heroui-radius-small\)\/3\)\]:after{content:var(--tw-content);border-radius:calc(var(--heroui-radius-small)/3)}.after\:rounded-full:after{content:var(--tw-content);border-radius:3.40282e38px}.after\:rounded-none:after{content:var(--tw-content);border-radius:0}.after\:rounded-xl:after{content:var(--tw-content);border-radius:var(--radius-xl)}.after\:\!bg-danger:after{content:var(--tw-content);background-color:hsl(var(--heroui-danger)/1)!important}.after\:bg-background:after{content:var(--tw-content);background-color:hsl(var(--heroui-background)/1)}.after\:bg-content1:after{content:var(--tw-content);background-color:hsl(var(--heroui-content1)/1)}.after\:bg-content3:after{content:var(--tw-content);background-color:hsl(var(--heroui-content3)/1)}.after\:bg-current:after{content:var(--tw-content);background-color:currentColor}.after\:bg-danger:after{content:var(--tw-content);background-color:hsl(var(--heroui-danger)/1)}.after\:bg-default:after{content:var(--tw-content);background-color:hsl(var(--heroui-default)/1)}.after\:bg-default-foreground:after{content:var(--tw-content);background-color:hsl(var(--heroui-default-foreground)/1)}.after\:bg-divider:after{content:var(--tw-content);background-color:hsl(var(--heroui-divider)/.15)}.after\:bg-foreground:after{content:var(--tw-content);background-color:hsl(var(--heroui-foreground)/1)}.after\:bg-primary:after{content:var(--tw-content);background-color:var(--color-primary)}.after\:bg-secondary:after{content:var(--tw-content);background-color:hsl(var(--heroui-secondary)/1)}.after\:bg-success:after{content:var(--tw-content);background-color:hsl(var(--heroui-success)/1)}.after\:bg-transparent:after{content:var(--tw-content);background-color:#0000}.after\:bg-warning:after{content:var(--tw-content);background-color:hsl(var(--heroui-warning)/1)}.after\:text-danger:after{content:var(--tw-content);color:hsl(var(--heroui-danger)/1)}.after\:text-danger-foreground:after{content:var(--tw-content);color:hsl(var(--heroui-danger-foreground)/1)}.after\:text-default-foreground:after{content:var(--tw-content);color:hsl(var(--heroui-default-foreground)/1)}.after\:text-primary-foreground:after{content:var(--tw-content);color:hsl(var(--heroui-primary-foreground)/1)}.after\:text-secondary-foreground:after{content:var(--tw-content);color:hsl(var(--heroui-secondary-foreground)/1)}.after\:text-success-foreground:after{content:var(--tw-content);color:hsl(var(--heroui-success-foreground)/1)}.after\:text-warning-foreground:after{content:var(--tw-content);color:hsl(var(--heroui-warning-foreground)/1)}.after\:opacity-0:after{content:var(--tw-content);opacity:0}.after\:opacity-100:after{content:var(--tw-content);opacity:1}.after\:shadow-\[0_1px_0px_0_rgba\(0\,0\,0\,0\.05\)\]:after{content:var(--tw-content);--tw-shadow:0 1px 0px 0 var(--tw-shadow-color,#0000000d);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.after\:shadow-small:after{content:var(--tw-content);--tw-shadow:var(--heroui-box-shadow-small);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.after\:transition-all:after{content:var(--tw-content);transition-property:all;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.after\:transition-background:after{content:var(--tw-content);transition-property:background;transition-duration:.25s;transition-timing-function:ease}.after\:transition-height:after{content:var(--tw-content);transition-property:height;transition-duration:.25s;transition-timing-function:ease}.after\:transition-transform:after{content:var(--tw-content);transition-property:transform,translate,scale,rotate;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.after\:transition-transform-opacity:after{content:var(--tw-content);transition-property:transform,scale,opacity rotate;transition-duration:.25s;transition-timing-function:ease}.after\:transition-width:after{content:var(--tw-content);transition-property:width;transition-duration:.25s;transition-timing-function:ease}.after\:transition-none:after{content:var(--tw-content);transition-property:none}.after\:\!duration-200:after{content:var(--tw-content);--tw-duration:.2s!important;transition-duration:.2s!important}.after\:duration-150:after{content:var(--tw-content);--tw-duration:.15s;transition-duration:.15s}.after\:\!ease-linear:after{content:var(--tw-content);--tw-ease:linear!important;transition-timing-function:linear!important}.after\:content-\[\'\'\]:after{--tw-content:"";content:var(--tw-content)}.after\:content-\[\'\*\'\]:after{--tw-content:"*";content:var(--tw-content)}.group-data-\[focus\=true\]\:after\:w-full:is(:where(.group)[data-focus=true] *):after{content:var(--tw-content);width:100%}.group-data-\[invalid\=true\]\:after\:bg-danger:is(:where(.group)[data-invalid=true] *):after{content:var(--tw-content);background-color:hsl(var(--heroui-danger)/1)}.group-data-\[open\=true\]\:after\:translate-y-0:is(:where(.group)[data-open=true] *):after{content:var(--tw-content);--tw-translate-y:calc(var(--spacing)*0);translate:var(--tw-translate-x)var(--tw-translate-y)}.group-data-\[open\=true\]\:after\:-rotate-45:is(:where(.group)[data-open=true] *):after{content:var(--tw-content);rotate:-45deg}.group-data-\[required\=true\]\:after\:ml-0\.5:is(:where(.group)[data-required=true] *):after{content:var(--tw-content);margin-left:calc(var(--spacing)*.5)}.group-data-\[required\=true\]\:after\:text-danger:is(:where(.group)[data-required=true] *):after{content:var(--tw-content);color:hsl(var(--heroui-danger)/1)}.group-data-\[required\=true\]\:after\:content-\[\'\*\'\]:is(:where(.group)[data-required=true] *):after{--tw-content:"*";content:var(--tw-content)}.group-data-\[selected\=true\]\:after\:scale-100:is(:where(.group)[data-selected=true] *):after{content:var(--tw-content);--tw-scale-x:100%;--tw-scale-y:100%;--tw-scale-z:100%;scale:var(--tw-scale-x)var(--tw-scale-y)}.group-data-\[selected\=true\]\:after\:opacity-100:is(:where(.group)[data-selected=true] *):after{content:var(--tw-content);opacity:1}.first\:mt-2:first-child{margin-top:calc(var(--spacing)*2)}.first\:-ml-0\.5:first-child{margin-left:calc(var(--spacing)*-.5)}.first\:rounded-s-full:first-child{border-start-start-radius:3.40282e38px;border-end-start-radius:3.40282e38px}.first\:rounded-s-large:first-child{border-start-start-radius:var(--heroui-radius-large);border-end-start-radius:var(--heroui-radius-large)}.first\:rounded-s-lg:first-child{border-start-start-radius:var(--radius-lg);border-end-start-radius:var(--radius-lg)}.first\:rounded-s-medium:first-child{border-start-start-radius:var(--heroui-radius-medium);border-end-start-radius:var(--heroui-radius-medium)}.first\:rounded-s-none:first-child{border-start-start-radius:0;border-end-start-radius:0}.first\:rounded-s-small:first-child{border-start-start-radius:var(--heroui-radius-small);border-end-start-radius:var(--heroui-radius-small)}.first\:before\:rounded-s-lg:first-child:before{content:var(--tw-content);border-start-start-radius:var(--radius-lg);border-end-start-radius:var(--radius-lg)}.first\:before\:rounded-s-none:first-child:before{content:var(--tw-content);border-start-start-radius:0;border-end-start-radius:0}.group-data-\[first\=true\]\/tr\:first\:before\:rounded-ss-lg:is(:where(.group\/tr)[data-first=true] *):first-child:before{content:var(--tw-content);border-start-start-radius:var(--radius-lg)}.group-data-\[first\=true\]\/tr\:first\:before\:rounded-ss-none:is(:where(.group\/tr)[data-first=true] *):first-child:before{content:var(--tw-content);border-start-start-radius:0}.group-data-\[last\=true\]\/tr\:first\:before\:rounded-es-lg:is(:where(.group\/tr)[data-last=true] *):first-child:before{content:var(--tw-content);border-end-start-radius:var(--radius-lg)}.group-data-\[last\=true\]\/tr\:first\:before\:rounded-es-none:is(:where(.group\/tr)[data-last=true] *):first-child:before{content:var(--tw-content);border-end-start-radius:0}.last\:rounded-e-full:last-child{border-start-end-radius:3.40282e38px;border-end-end-radius:3.40282e38px}.last\:rounded-e-large:last-child{border-start-end-radius:var(--heroui-radius-large);border-end-end-radius:var(--heroui-radius-large)}.last\:rounded-e-lg:last-child{border-start-end-radius:var(--radius-lg);border-end-end-radius:var(--radius-lg)}.last\:rounded-e-medium:last-child{border-start-end-radius:var(--heroui-radius-medium);border-end-end-radius:var(--heroui-radius-medium)}.last\:rounded-e-none:last-child{border-start-end-radius:0;border-end-end-radius:0}.last\:rounded-e-small:last-child{border-start-end-radius:var(--heroui-radius-small);border-end-end-radius:var(--heroui-radius-small)}.last\:before\:rounded-e-lg:last-child:before{content:var(--tw-content);border-start-end-radius:var(--radius-lg);border-end-end-radius:var(--radius-lg)}.last\:before\:rounded-e-none:last-child:before{content:var(--tw-content);border-start-end-radius:0;border-end-end-radius:0}.group-data-\[first\=true\]\/tr\:last\:before\:rounded-se-lg:is(:where(.group\/tr)[data-first=true] *):last-child:before{content:var(--tw-content);border-start-end-radius:var(--radius-lg)}.group-data-\[first\=true\]\/tr\:last\:before\:rounded-se-none:is(:where(.group\/tr)[data-first=true] *):last-child:before{content:var(--tw-content);border-start-end-radius:0}.group-data-\[last\=true\]\/tr\:last\:before\:rounded-ee-lg:is(:where(.group\/tr)[data-last=true] *):last-child:before{content:var(--tw-content);border-end-end-radius:var(--radius-lg)}.group-data-\[last\=true\]\/tr\:last\:before\:rounded-ee-none:is(:where(.group\/tr)[data-last=true] *):last-child:before{content:var(--tw-content);border-end-end-radius:0}.first-of-type\:rounded-e-none:first-of-type{border-start-end-radius:0;border-end-end-radius:0}.last-of-type\:rounded-s-none:last-of-type{border-start-start-radius:0;border-end-start-radius:0}.autofill\:bg-transparent:autofill{background-color:#0000}.focus-within\:border-danger:focus-within{border-color:hsl(var(--heroui-danger)/1)}.focus-within\:border-default-400:focus-within{border-color:hsl(var(--heroui-default-400)/1)}.focus-within\:border-default-foreground:focus-within{border-color:hsl(var(--heroui-default-foreground)/1)}.focus-within\:border-primary:focus-within{border-color:var(--color-primary)}.focus-within\:border-secondary:focus-within{border-color:hsl(var(--heroui-secondary)/1)}.focus-within\:border-success:focus-within{border-color:hsl(var(--heroui-success)/1)}.focus-within\:border-warning:focus-within{border-color:hsl(var(--heroui-warning)/1)}.focus-within\:bg-danger-50:focus-within{background-color:hsl(var(--heroui-danger-50)/1)}.focus-within\:bg-primary-50:focus-within{background-color:hsl(var(--heroui-primary-50)/1)}.focus-within\:bg-secondary-50:focus-within{background-color:hsl(var(--heroui-secondary-50)/1)}.focus-within\:bg-success-50:focus-within{background-color:hsl(var(--heroui-success-50)/1)}.focus-within\:bg-warning-50:focus-within{background-color:hsl(var(--heroui-warning-50)/1)}.focus-within\:after\:w-full:focus-within:after{content:var(--tw-content);width:100%}@media (hover:hover){.hover\:-translate-x-0:hover{--tw-translate-x:calc(var(--spacing)*0);translate:var(--tw-translate-x)var(--tw-translate-y)}.hover\:scale-110:hover{--tw-scale-x:110%;--tw-scale-y:110%;--tw-scale-z:110%;scale:var(--tw-scale-x)var(--tw-scale-y)}.hover\:scale-125:hover{--tw-scale-x:125%;--tw-scale-y:125%;--tw-scale-z:125%;scale:var(--tw-scale-x)var(--tw-scale-y)}.hover\:border-danger:hover{border-color:hsl(var(--heroui-danger)/1)}.hover\:border-default:hover{border-color:hsl(var(--heroui-default)/1)}.hover\:border-default-300:hover{border-color:hsl(var(--heroui-default-300)/1)}.hover\:border-default-400:hover{border-color:hsl(var(--heroui-default-400)/1)}.hover\:border-primary:hover{border-color:var(--color-primary)}.hover\:border-secondary:hover{border-color:hsl(var(--heroui-secondary)/1)}.hover\:border-success:hover{border-color:hsl(var(--heroui-success)/1)}.hover\:border-warning:hover{border-color:hsl(var(--heroui-warning)/1)}.hover\:\!bg-foreground:hover{background-color:hsl(var(--heroui-foreground)/1)!important}.hover\:bg-danger:hover{background-color:hsl(var(--heroui-danger)/1)}.hover\:bg-danger-50:hover{background-color:hsl(var(--heroui-danger-50)/1)}.hover\:bg-default-100:hover{background-color:hsl(var(--heroui-default-100)/1)}.hover\:bg-default-200:hover{background-color:hsl(var(--heroui-default-200)/1)}.hover\:bg-primary-50:hover{background-color:hsl(var(--heroui-primary-50)/1)}.hover\:bg-secondary-50:hover{background-color:hsl(var(--heroui-secondary-50)/1)}.hover\:bg-success-50:hover{background-color:hsl(var(--heroui-success-50)/1)}.hover\:bg-warning-50:hover{background-color:hsl(var(--heroui-warning-50)/1)}.hover\:text-danger-600:hover{color:hsl(var(--heroui-danger-600)/1)}.hover\:text-default-600:hover{color:hsl(var(--heroui-default-600)/1)}.hover\:text-foreground-600:hover{color:hsl(var(--heroui-foreground-600)/1)}.hover\:text-primary-600:hover{color:hsl(var(--heroui-primary-600)/1)}.hover\:text-secondary-600:hover{color:hsl(var(--heroui-secondary-600)/1)}.hover\:text-success-600:hover{color:hsl(var(--heroui-success-600)/1)}.hover\:text-warning-600:hover{color:hsl(var(--heroui-warning-600)/1)}.hover\:underline:hover{text-decoration-line:underline}.hover\:\!opacity-100:hover{opacity:1!important}.hover\:opacity-100:hover{opacity:1}.hover\:opacity-hover:hover{opacity:var(--heroui-hover-opacity)}.group-data-\[invalid\=true\]\:hover\:border-danger:is(:where(.group)[data-invalid=true] *):hover{border-color:hsl(var(--heroui-danger)/1)}.group-data-\[invalid\=true\]\:hover\:bg-danger-100:is(:where(.group)[data-invalid=true] *):hover{background-color:hsl(var(--heroui-danger-100)/1)}.hover\:after\:bg-danger\/20:hover:after{content:var(--tw-content);background-color:hsl(var(--heroui-danger)/1)}@supports (color:color-mix(in lab,red,red)){.hover\:after\:bg-danger\/20:hover:after{background-color:color-mix(in oklab,hsl(var(--heroui-danger)/1)20%,transparent)}}.hover\:after\:bg-foreground\/10:hover:after{content:var(--tw-content);background-color:hsl(var(--heroui-foreground)/1)}@supports (color:color-mix(in lab,red,red)){.hover\:after\:bg-foreground\/10:hover:after{background-color:color-mix(in oklab,hsl(var(--heroui-foreground)/1)10%,transparent)}}.hover\:after\:bg-primary\/20:hover:after{content:var(--tw-content);background-color:#1b54ff33}@supports (color:color-mix(in lab,red,red)){.hover\:after\:bg-primary\/20:hover:after{background-color:color-mix(in oklab,var(--color-primary)20%,transparent)}}.hover\:after\:bg-secondary\/20:hover:after{content:var(--tw-content);background-color:hsl(var(--heroui-secondary)/1)}@supports (color:color-mix(in lab,red,red)){.hover\:after\:bg-secondary\/20:hover:after{background-color:color-mix(in oklab,hsl(var(--heroui-secondary)/1)20%,transparent)}}.hover\:after\:bg-success\/20:hover:after{content:var(--tw-content);background-color:hsl(var(--heroui-success)/1)}@supports (color:color-mix(in lab,red,red)){.hover\:after\:bg-success\/20:hover:after{background-color:color-mix(in oklab,hsl(var(--heroui-success)/1)20%,transparent)}}.hover\:after\:bg-warning\/20:hover:after{content:var(--tw-content);background-color:hsl(var(--heroui-warning)/1)}@supports (color:color-mix(in lab,red,red)){.hover\:after\:bg-warning\/20:hover:after{background-color:color-mix(in oklab,hsl(var(--heroui-warning)/1)20%,transparent)}}.hover\:after\:opacity-100:hover:after{content:var(--tw-content);opacity:1}.focus-within\:hover\:border-danger:focus-within:hover{border-color:hsl(var(--heroui-danger)/1)}.focus-within\:hover\:border-default-foreground:focus-within:hover{border-color:hsl(var(--heroui-default-foreground)/1)}.focus-within\:hover\:border-primary:focus-within:hover{border-color:var(--color-primary)}.focus-within\:hover\:border-secondary:focus-within:hover{border-color:hsl(var(--heroui-secondary)/1)}.focus-within\:hover\:border-success:focus-within:hover{border-color:hsl(var(--heroui-success)/1)}.focus-within\:hover\:border-warning:focus-within:hover{border-color:hsl(var(--heroui-warning)/1)}.focus-within\:hover\:bg-default-100:focus-within:hover{background-color:hsl(var(--heroui-default-100)/1)}.group-data-\[invalid\=true\]\:focus-within\:hover\:border-danger:is(:where(.group)[data-invalid=true] *):focus-within:hover{border-color:hsl(var(--heroui-danger)/1)}.group-data-\[invalid\=true\]\:focus-within\:hover\:bg-danger-50:is(:where(.group)[data-invalid=true] *):focus-within:hover{background-color:hsl(var(--heroui-danger-50)/1)}}.focus\:bg-danger-400\/50:focus{background-color:hsl(var(--heroui-danger-400)/1)}@supports (color:color-mix(in lab,red,red)){.focus\:bg-danger-400\/50:focus{background-color:color-mix(in oklab,hsl(var(--heroui-danger-400)/1)50%,transparent)}}.focus\:bg-default-400\/50:focus{background-color:hsl(var(--heroui-default-400)/1)}@supports (color:color-mix(in lab,red,red)){.focus\:bg-default-400\/50:focus{background-color:color-mix(in oklab,hsl(var(--heroui-default-400)/1)50%,transparent)}}.focus\:bg-primary-400\/50:focus{background-color:hsl(var(--heroui-primary-400)/1)}@supports (color:color-mix(in lab,red,red)){.focus\:bg-primary-400\/50:focus{background-color:color-mix(in oklab,hsl(var(--heroui-primary-400)/1)50%,transparent)}}.focus\:bg-secondary-400\/50:focus{background-color:hsl(var(--heroui-secondary-400)/1)}@supports (color:color-mix(in lab,red,red)){.focus\:bg-secondary-400\/50:focus{background-color:color-mix(in oklab,hsl(var(--heroui-secondary-400)/1)50%,transparent)}}.focus\:bg-success-400\/50:focus{background-color:hsl(var(--heroui-success-400)/1)}@supports (color:color-mix(in lab,red,red)){.focus\:bg-success-400\/50:focus{background-color:color-mix(in oklab,hsl(var(--heroui-success-400)/1)50%,transparent)}}.focus\:bg-warning-400\/50:focus{background-color:hsl(var(--heroui-warning-400)/1)}@supports (color:color-mix(in lab,red,red)){.focus\:bg-warning-400\/50:focus{background-color:color-mix(in oklab,hsl(var(--heroui-warning-400)/1)50%,transparent)}}.focus\:underline:focus{text-decoration-line:underline}.focus\:shadow-xs:focus{--tw-shadow:0 1px 2px 0 var(--tw-shadow-color,#0000000d);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\:z-10:focus-visible{z-index:10}.focus-visible\:outline-hidden:focus-visible{--tw-outline-style:none;outline-style:none}@media (forced-colors:active){.focus-visible\:outline-hidden:focus-visible{outline-offset:2px;outline:2px solid #0000}}.focus-visible\:outline-2:focus-visible{outline-style:var(--tw-outline-style);outline-width:2px}.focus-visible\:outline-offset-2:focus-visible{outline-offset:2px}.focus-visible\:outline-focus:focus-visible{outline-color:hsl(var(--heroui-focus)/1)}.active\:bg-default-200:active{background-color:hsl(var(--heroui-default-200)/1)}.active\:bg-default-300:active{background-color:hsl(var(--heroui-default-300)/1)}.active\:underline:active{text-decoration-line:underline}.active\:\!opacity-70:active{opacity:.7!important}.active\:opacity-disabled:active{opacity:var(--heroui-disabled-opacity)}.disabled\:cursor-default:disabled{cursor:default}.has-\[\:disabled\]\:opacity-60:has(:disabled){opacity:.6}.aria-expanded\:scale-\[0\.97\][aria-expanded=true]{scale:.97}.aria-expanded\:opacity-70[aria-expanded=true]{opacity:.7}.data-\[active\=true\]\:scale-100[data-active=true]{--tw-scale-x:100%;--tw-scale-y:100%;--tw-scale-z:100%;scale:var(--tw-scale-x)var(--tw-scale-y)}.data-\[active\=true\]\:scale-110[data-active=true]{--tw-scale-x:110%;--tw-scale-y:110%;--tw-scale-z:110%;scale:var(--tw-scale-x)var(--tw-scale-y)}.data-\[active\=true\]\:border-danger[data-active=true]{border-color:hsl(var(--heroui-danger)/1)}.data-\[active\=true\]\:border-danger-400[data-active=true]{border-color:hsl(var(--heroui-danger-400)/1)}.data-\[active\=true\]\:border-default-300[data-active=true]{border-color:hsl(var(--heroui-default-300)/1)}.data-\[active\=true\]\:border-default-400[data-active=true]{border-color:hsl(var(--heroui-default-400)/1)}.data-\[active\=true\]\:border-foreground[data-active=true]{border-color:hsl(var(--heroui-foreground)/1)}.data-\[active\=true\]\:border-primary[data-active=true]{border-color:var(--color-primary)}.data-\[active\=true\]\:border-secondary[data-active=true]{border-color:hsl(var(--heroui-secondary)/1)}.data-\[active\=true\]\:border-success[data-active=true]{border-color:hsl(var(--heroui-success)/1)}.data-\[active\=true\]\:border-warning[data-active=true]{border-color:hsl(var(--heroui-warning)/1)}.data-\[active\=true\]\:bg-danger[data-active=true]{background-color:hsl(var(--heroui-danger)/1)}.data-\[active\=true\]\:bg-danger-100[data-active=true]{background-color:hsl(var(--heroui-danger-100)/1)}.data-\[active\=true\]\:bg-danger-200[data-active=true]{background-color:hsl(var(--heroui-danger-200)/1)}.data-\[active\=true\]\:bg-default-200[data-active=true]{background-color:hsl(var(--heroui-default-200)/1)}.data-\[active\=true\]\:bg-default-400[data-active=true]{background-color:hsl(var(--heroui-default-400)/1)}.data-\[active\=true\]\:bg-primary[data-active=true]{background-color:var(--color-primary)}.data-\[active\=true\]\:bg-primary-200[data-active=true]{background-color:hsl(var(--heroui-primary-200)/1)}.data-\[active\=true\]\:bg-secondary[data-active=true]{background-color:hsl(var(--heroui-secondary)/1)}.data-\[active\=true\]\:bg-secondary-200[data-active=true]{background-color:hsl(var(--heroui-secondary-200)/1)}.data-\[active\=true\]\:bg-success[data-active=true]{background-color:hsl(var(--heroui-success)/1)}.data-\[active\=true\]\:bg-success-200[data-active=true]{background-color:hsl(var(--heroui-success-200)/1)}.data-\[active\=true\]\:bg-warning[data-active=true]{background-color:hsl(var(--heroui-warning)/1)}.data-\[active\=true\]\:bg-warning-200[data-active=true]{background-color:hsl(var(--heroui-warning-200)/1)}.data-\[active\=true\]\:font-semibold[data-active=true]{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.data-\[active\=true\]\:text-danger-foreground[data-active=true]{color:hsl(var(--heroui-danger-foreground)/1)}.data-\[active\=true\]\:text-default-foreground[data-active=true]{color:hsl(var(--heroui-default-foreground)/1)}.data-\[active\=true\]\:text-primary-foreground[data-active=true]{color:hsl(var(--heroui-primary-foreground)/1)}.data-\[active\=true\]\:text-secondary-foreground[data-active=true]{color:hsl(var(--heroui-secondary-foreground)/1)}.data-\[active\=true\]\:text-success-foreground[data-active=true]{color:hsl(var(--heroui-success-foreground)/1)}.data-\[active\=true\]\:text-warning-foreground[data-active=true]{color:hsl(var(--heroui-warning-foreground)/1)}.data-\[active\=true\]\:shadow-md[data-active=true]{--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)}.data-\[active\=true\]\:shadow-danger\/40[data-active=true]{--tw-shadow-color:hsl(var(--heroui-danger)/1)}@supports (color:color-mix(in lab,red,red)){.data-\[active\=true\]\:shadow-danger\/40[data-active=true]{--tw-shadow-color:color-mix(in oklab,color-mix(in oklab,hsl(var(--heroui-danger)/1)40%,transparent)var(--tw-shadow-alpha),transparent)}}.data-\[active\=true\]\:shadow-default\/50[data-active=true]{--tw-shadow-color:hsl(var(--heroui-default)/1)}@supports (color:color-mix(in lab,red,red)){.data-\[active\=true\]\:shadow-default\/50[data-active=true]{--tw-shadow-color:color-mix(in oklab,color-mix(in oklab,hsl(var(--heroui-default)/1)50%,transparent)var(--tw-shadow-alpha),transparent)}}.data-\[active\=true\]\:shadow-primary\/40[data-active=true]{--tw-shadow-color:#1b54ff66}@supports (color:color-mix(in lab,red,red)){.data-\[active\=true\]\:shadow-primary\/40[data-active=true]{--tw-shadow-color:color-mix(in oklab,color-mix(in oklab,var(--color-primary)40%,transparent)var(--tw-shadow-alpha),transparent)}}.data-\[active\=true\]\:shadow-secondary\/40[data-active=true]{--tw-shadow-color:hsl(var(--heroui-secondary)/1)}@supports (color:color-mix(in lab,red,red)){.data-\[active\=true\]\:shadow-secondary\/40[data-active=true]{--tw-shadow-color:color-mix(in oklab,color-mix(in oklab,hsl(var(--heroui-secondary)/1)40%,transparent)var(--tw-shadow-alpha),transparent)}}.data-\[active\=true\]\:shadow-success\/40[data-active=true]{--tw-shadow-color:hsl(var(--heroui-success)/1)}@supports (color:color-mix(in lab,red,red)){.data-\[active\=true\]\:shadow-success\/40[data-active=true]{--tw-shadow-color:color-mix(in oklab,color-mix(in oklab,hsl(var(--heroui-success)/1)40%,transparent)var(--tw-shadow-alpha),transparent)}}.data-\[active\=true\]\:shadow-warning\/40[data-active=true]{--tw-shadow-color:hsl(var(--heroui-warning)/1)}@supports (color:color-mix(in lab,red,red)){.data-\[active\=true\]\:shadow-warning\/40[data-active=true]{--tw-shadow-color:color-mix(in oklab,color-mix(in oklab,hsl(var(--heroui-warning)/1)40%,transparent)var(--tw-shadow-alpha),transparent)}}.data-\[active\=true\]\:after\:w-full[data-active=true]:after{content:var(--tw-content);width:100%}.data-\[active\=true\]\:after\:bg-danger-400[data-active=true]:after{content:var(--tw-content);background-color:hsl(var(--heroui-danger-400)/1)}.data-\[animation\=exiting\]\:opacity-0[data-animation=exiting]{opacity:0}.data-\[arrow\=true\]\:before\:block[data-arrow=true]:before{content:var(--tw-content);display:block}.data-\[before\=true\]\:rotate-180[data-before=true]{rotate:180deg}.data-\[bottom-scroll\=true\]\:\[mask-image\:linear-gradient\(180deg\,\#000_calc\(100\%_-_var\(--scroll-shadow-size\)\)\,transparent\)\][data-bottom-scroll=true]{-webkit-mask-image:linear-gradient(180deg,#000 calc(100% - var(--scroll-shadow-size)),transparent);mask-image:linear-gradient(180deg,#000 calc(100% - var(--scroll-shadow-size)),transparent)}.data-\[direction\=ascending\]\:rotate-180[data-direction=ascending]{rotate:180deg}.data-\[disabled\=true\]\:pointer-events-none[data-disabled=true]{pointer-events:none}.data-\[disabled\=true\]\:cursor-default[data-disabled=true]{cursor:default}.data-\[disabled\=true\]\:cursor-not-allowed[data-disabled=true]{cursor:not-allowed}.data-\[disabled\=true\]\:text-default-300[data-disabled=true]{color:hsl(var(--heroui-default-300)/1)}.data-\[disabled\=true\]\:opacity-30[data-disabled=true]{opacity:.3}.data-\[disabled\=true\]\:transition-none[data-disabled=true]{transition-property:none}.data-\[dragging\=true\]\:cursor-grabbing[data-dragging=true]{cursor:grabbing}.data-\[dragging\=true\]\:after\:scale-80[data-dragging=true]:after{content:var(--tw-content);--tw-scale-x:.8;--tw-scale-y:.8;--tw-scale-z:.8;scale:var(--tw-scale-x)var(--tw-scale-y)}.data-\[dragging\=true\]\:after\:scale-100[data-dragging=true]:after{content:var(--tw-content);--tw-scale-x:100%;--tw-scale-y:100%;--tw-scale-z:100%;scale:var(--tw-scale-x)var(--tw-scale-y)}.data-\[editable\=true\]\:text-danger[data-editable=true]{color:hsl(var(--heroui-danger)/1)}.data-\[editable\=true\]\:text-foreground[data-editable=true]{color:hsl(var(--heroui-foreground)/1)}.data-\[editable\=true\]\:text-primary[data-editable=true]{color:var(--color-primary)}.data-\[editable\=true\]\:text-secondary[data-editable=true]{color:hsl(var(--heroui-secondary)/1)}.data-\[editable\=true\]\:text-success-600[data-editable=true]{color:hsl(var(--heroui-success-600)/1)}.data-\[editable\=true\]\:text-warning-600[data-editable=true]{color:hsl(var(--heroui-warning-600)/1)}.data-\[editable\=true\]\:focus\:text-danger[data-editable=true]:focus{color:hsl(var(--heroui-danger)/1)}.data-\[editable\=true\]\:focus\:text-default-foreground[data-editable=true]:focus{color:hsl(var(--heroui-default-foreground)/1)}.data-\[editable\=true\]\:focus\:text-primary[data-editable=true]:focus{color:var(--color-primary)}.data-\[editable\=true\]\:focus\:text-secondary[data-editable=true]:focus{color:hsl(var(--heroui-secondary)/1)}.data-\[editable\=true\]\:focus\:text-success[data-editable=true]:focus{color:hsl(var(--heroui-success)/1)}.data-\[editable\=true\]\:focus\:text-success-600[data-editable=true]:focus{color:hsl(var(--heroui-success-600)/1)}.data-\[editable\=true\]\:focus\:text-warning[data-editable=true]:focus{color:hsl(var(--heroui-warning)/1)}.data-\[editable\=true\]\:focus\:text-warning-600[data-editable=true]:focus{color:hsl(var(--heroui-warning-600)/1)}.data-\[fill-end\=true\]\:border-e-danger[data-fill-end=true]{border-inline-end-color:hsl(var(--heroui-danger)/1)}.data-\[fill-end\=true\]\:border-e-foreground[data-fill-end=true]{border-inline-end-color:hsl(var(--heroui-foreground)/1)}.data-\[fill-end\=true\]\:border-e-primary[data-fill-end=true]{border-inline-end-color:var(--color-primary)}.data-\[fill-end\=true\]\:border-e-secondary[data-fill-end=true]{border-inline-end-color:hsl(var(--heroui-secondary)/1)}.data-\[fill-end\=true\]\:border-e-success[data-fill-end=true]{border-inline-end-color:hsl(var(--heroui-success)/1)}.data-\[fill-end\=true\]\:border-e-warning[data-fill-end=true]{border-inline-end-color:hsl(var(--heroui-warning)/1)}.data-\[fill-end\=true\]\:border-t-danger[data-fill-end=true]{border-top-color:hsl(var(--heroui-danger)/1)}.data-\[fill-end\=true\]\:border-t-foreground[data-fill-end=true]{border-top-color:hsl(var(--heroui-foreground)/1)}.data-\[fill-end\=true\]\:border-t-primary[data-fill-end=true]{border-top-color:var(--color-primary)}.data-\[fill-end\=true\]\:border-t-secondary[data-fill-end=true]{border-top-color:hsl(var(--heroui-secondary)/1)}.data-\[fill-end\=true\]\:border-t-success[data-fill-end=true]{border-top-color:hsl(var(--heroui-success)/1)}.data-\[fill-end\=true\]\:border-t-warning[data-fill-end=true]{border-top-color:hsl(var(--heroui-warning)/1)}.data-\[fill-start\=true\]\:border-s-danger[data-fill-start=true]{border-inline-start-color:hsl(var(--heroui-danger)/1)}.data-\[fill-start\=true\]\:border-s-foreground[data-fill-start=true]{border-inline-start-color:hsl(var(--heroui-foreground)/1)}.data-\[fill-start\=true\]\:border-s-primary[data-fill-start=true]{border-inline-start-color:var(--color-primary)}.data-\[fill-start\=true\]\:border-s-secondary[data-fill-start=true]{border-inline-start-color:hsl(var(--heroui-secondary)/1)}.data-\[fill-start\=true\]\:border-s-success[data-fill-start=true]{border-inline-start-color:hsl(var(--heroui-success)/1)}.data-\[fill-start\=true\]\:border-s-warning[data-fill-start=true]{border-inline-start-color:hsl(var(--heroui-warning)/1)}.data-\[fill-start\=true\]\:border-b-danger[data-fill-start=true]{border-bottom-color:hsl(var(--heroui-danger)/1)}.data-\[fill-start\=true\]\:border-b-foreground[data-fill-start=true]{border-bottom-color:hsl(var(--heroui-foreground)/1)}.data-\[fill-start\=true\]\:border-b-primary[data-fill-start=true]{border-bottom-color:var(--color-primary)}.data-\[fill-start\=true\]\:border-b-secondary[data-fill-start=true]{border-bottom-color:hsl(var(--heroui-secondary)/1)}.data-\[fill-start\=true\]\:border-b-success[data-fill-start=true]{border-bottom-color:hsl(var(--heroui-success)/1)}.data-\[fill-start\=true\]\:border-b-warning[data-fill-start=true]{border-bottom-color:hsl(var(--heroui-warning)/1)}.data-\[focus-visible\]\:outline-danger-foreground[data-focus-visible]{outline-color:hsl(var(--heroui-danger-foreground)/1)}.data-\[focus-visible\]\:outline-default-foreground[data-focus-visible]{outline-color:hsl(var(--heroui-default-foreground)/1)}.data-\[focus-visible\]\:outline-primary-foreground[data-focus-visible]{outline-color:hsl(var(--heroui-primary-foreground)/1)}.data-\[focus-visible\]\:outline-secondary-foreground[data-focus-visible]{outline-color:hsl(var(--heroui-secondary-foreground)/1)}.data-\[focus-visible\]\:outline-success-foreground[data-focus-visible]{outline-color:hsl(var(--heroui-success-foreground)/1)}.data-\[focus-visible\]\:outline-warning-foreground[data-focus-visible]{outline-color:hsl(var(--heroui-warning-foreground)/1)}.data-\[focus-visible\=true\]\:z-10[data-focus-visible=true]{z-index:10}.data-\[focus-visible\=true\]\:-translate-x-3[data-focus-visible=true]{--tw-translate-x:calc(var(--spacing)*-3);translate:var(--tw-translate-x)var(--tw-translate-y)}.data-\[focus-visible\=true\]\:outline-2[data-focus-visible=true]{outline-style:var(--tw-outline-style);outline-width:2px}.data-\[focus-visible\=true\]\:outline-offset-2[data-focus-visible=true]{outline-offset:2px}.data-\[focus-visible\=true\]\:outline-focus[data-focus-visible=true]{outline-color:hsl(var(--heroui-focus)/1)}.data-\[focus\=true\]\:border-danger[data-focus=true]{border-color:hsl(var(--heroui-danger)/1)}.data-\[focus\=true\]\:border-default-400[data-focus=true]{border-color:hsl(var(--heroui-default-400)/1)}.data-\[focus\=true\]\:border-default-foreground[data-focus=true]{border-color:hsl(var(--heroui-default-foreground)/1)}.data-\[focus\=true\]\:border-primary[data-focus=true]{border-color:var(--color-primary)}.data-\[focus\=true\]\:border-secondary[data-focus=true]{border-color:hsl(var(--heroui-secondary)/1)}.data-\[focus\=true\]\:border-success[data-focus=true]{border-color:hsl(var(--heroui-success)/1)}.data-\[focus\=true\]\:border-warning[data-focus=true]{border-color:hsl(var(--heroui-warning)/1)}.data-\[focus\=true\]\:after\:w-full[data-focus=true]:after{content:var(--tw-content);width:100%}.data-\[focused\=true\]\:z-10[data-focused=true]{z-index:10}.data-\[has-end-content\=true\]\:pe-1\.5[data-has-end-content=true]{padding-inline-end:calc(var(--spacing)*1.5)}.data-\[has-helper\=true\]\:items-start[data-has-helper=true]{align-items:flex-start}.data-\[has-helper\=true\]\:pb-\[calc\(var\(--heroui-font-size-tiny\)_\+8px\)\][data-has-helper=true],.data-\[has-helper\=true\]\:pb-\[calc\(var\(--heroui-font-size-tiny\)_\+_8px\)\][data-has-helper=true]{padding-bottom:calc(var(--heroui-font-size-tiny) + 8px)}.data-\[has-label\=true\]\:mt-\[calc\(var\(--heroui-font-size-small\)_\+_8px\)\][data-has-label=true]{margin-top:calc(var(--heroui-font-size-small) + 8px)}.data-\[has-label\=true\]\:mt-\[calc\(var\(--heroui-font-size-small\)_\+_10px\)\][data-has-label=true]{margin-top:calc(var(--heroui-font-size-small) + 10px)}.data-\[has-label\=true\]\:mt-\[calc\(var\(--heroui-font-size-small\)_\+_12px\)\][data-has-label=true]{margin-top:calc(var(--heroui-font-size-small) + 12px)}.data-\[has-multiple-rows\=true\]\:rounded-large[data-has-multiple-rows=true]{border-radius:var(--heroui-radius-large)}.data-\[has-start-content\=true\]\:ps-1\.5[data-has-start-content=true]{padding-inline-start:calc(var(--spacing)*1.5)}.data-\[has-title\=true\]\:pt-1[data-has-title=true]{padding-top:calc(var(--spacing)*1)}.data-\[has-value\=true\]\:text-default-foreground[data-has-value=true]{color:hsl(var(--heroui-default-foreground)/1)}.data-\[hidden\=true\]\:hidden[data-hidden=true]{display:none}.data-\[hide-scroll\=true\]\:scrollbar-hide[data-hide-scroll=true]{-ms-overflow-style:none;scrollbar-width:none}.data-\[hide-scroll\=true\]\:scrollbar-hide[data-hide-scroll=true]::-webkit-scrollbar{display:none}.data-\[hover\]\:bg-danger-50[data-hover]{background-color:hsl(var(--heroui-danger-50)/1)}.data-\[hover\]\:bg-danger-200[data-hover]{background-color:hsl(var(--heroui-danger-200)/1)}.data-\[hover\]\:bg-default-100[data-hover]{background-color:hsl(var(--heroui-default-100)/1)}.data-\[hover\]\:bg-primary-50[data-hover]{background-color:hsl(var(--heroui-primary-50)/1)}.data-\[hover\]\:bg-primary-200[data-hover]{background-color:hsl(var(--heroui-primary-200)/1)}.data-\[hover\]\:bg-secondary-50[data-hover]{background-color:hsl(var(--heroui-secondary-50)/1)}.data-\[hover\]\:bg-secondary-200[data-hover]{background-color:hsl(var(--heroui-secondary-200)/1)}.data-\[hover\]\:bg-success-50[data-hover]{background-color:hsl(var(--heroui-success-50)/1)}.data-\[hover\]\:bg-success-200[data-hover]{background-color:hsl(var(--heroui-success-200)/1)}.data-\[hover\]\:bg-warning-100[data-hover]{background-color:hsl(var(--heroui-warning-100)/1)}.data-\[hover\]\:bg-warning-200[data-hover]{background-color:hsl(var(--heroui-warning-200)/1)}.data-\[hover-unselected\=true\]\:opacity-disabled[data-hover-unselected=true]{opacity:var(--heroui-disabled-opacity)}.data-\[hover\=true\]\:-translate-x-3[data-hover=true]{--tw-translate-x:calc(var(--spacing)*-3);translate:var(--tw-translate-x)var(--tw-translate-y)}.data-\[hover\=true\]\:translate-x-0[data-hover=true]{--tw-translate-x:calc(var(--spacing)*0);translate:var(--tw-translate-x)var(--tw-translate-y)}.data-\[hover\=true\]\:border-danger[data-hover=true]{border-color:hsl(var(--heroui-danger)/1)}.data-\[hover\=true\]\:border-default[data-hover=true]{border-color:hsl(var(--heroui-default)/1)}.data-\[hover\=true\]\:border-default-400[data-hover=true]{border-color:hsl(var(--heroui-default-400)/1)}.data-\[hover\=true\]\:border-primary[data-hover=true]{border-color:var(--color-primary)}.data-\[hover\=true\]\:border-secondary[data-hover=true]{border-color:hsl(var(--heroui-secondary)/1)}.data-\[hover\=true\]\:border-success[data-hover=true]{border-color:hsl(var(--heroui-success)/1)}.data-\[hover\=true\]\:border-warning[data-hover=true]{border-color:hsl(var(--heroui-warning)/1)}.data-\[hover\=true\]\:\!bg-danger[data-hover=true]{background-color:hsl(var(--heroui-danger)/1)!important}.data-\[hover\=true\]\:\!bg-danger-100[data-hover=true]{background-color:hsl(var(--heroui-danger-100)/1)!important}.data-\[hover\=true\]\:\!bg-default[data-hover=true]{background-color:hsl(var(--heroui-default)/1)!important}.data-\[hover\=true\]\:\!bg-primary[data-hover=true]{background-color:var(--color-primary)!important}.data-\[hover\=true\]\:\!bg-secondary[data-hover=true]{background-color:hsl(var(--heroui-secondary)/1)!important}.data-\[hover\=true\]\:\!bg-success[data-hover=true]{background-color:hsl(var(--heroui-success)/1)!important}.data-\[hover\=true\]\:\!bg-warning[data-hover=true]{background-color:hsl(var(--heroui-warning)/1)!important}.data-\[hover\=true\]\:bg-content2[data-hover=true]{background-color:hsl(var(--heroui-content2)/1)}.data-\[hover\=true\]\:bg-danger[data-hover=true]{background-color:hsl(var(--heroui-danger)/1)}.data-\[hover\=true\]\:bg-danger-50[data-hover=true]{background-color:hsl(var(--heroui-danger-50)/1)}.data-\[hover\=true\]\:bg-danger-100[data-hover=true]{background-color:hsl(var(--heroui-danger-100)/1)}.data-\[hover\=true\]\:bg-danger\/20[data-hover=true]{background-color:hsl(var(--heroui-danger)/1)}@supports (color:color-mix(in lab,red,red)){.data-\[hover\=true\]\:bg-danger\/20[data-hover=true]{background-color:color-mix(in oklab,hsl(var(--heroui-danger)/1)20%,transparent)}}.data-\[hover\=true\]\:bg-default[data-hover=true]{background-color:hsl(var(--heroui-default)/1)}.data-\[hover\=true\]\:bg-default-100[data-hover=true]{background-color:hsl(var(--heroui-default-100)/1)}.data-\[hover\=true\]\:bg-default-200[data-hover=true]{background-color:hsl(var(--heroui-default-200)/1)}.data-\[hover\=true\]\:bg-default\/40[data-hover=true]{background-color:hsl(var(--heroui-default)/1)}@supports (color:color-mix(in lab,red,red)){.data-\[hover\=true\]\:bg-default\/40[data-hover=true]{background-color:color-mix(in oklab,hsl(var(--heroui-default)/1)40%,transparent)}}.data-\[hover\=true\]\:bg-foreground-200[data-hover=true]{background-color:hsl(var(--heroui-foreground-200)/1)}.data-\[hover\=true\]\:bg-primary[data-hover=true]{background-color:var(--color-primary)}.data-\[hover\=true\]\:bg-primary-50[data-hover=true]{background-color:hsl(var(--heroui-primary-50)/1)}.data-\[hover\=true\]\:bg-primary\/20[data-hover=true]{background-color:#1b54ff33}@supports (color:color-mix(in lab,red,red)){.data-\[hover\=true\]\:bg-primary\/20[data-hover=true]{background-color:color-mix(in oklab,var(--color-primary)20%,transparent)}}.data-\[hover\=true\]\:bg-secondary[data-hover=true]{background-color:hsl(var(--heroui-secondary)/1)}.data-\[hover\=true\]\:bg-secondary-50[data-hover=true]{background-color:hsl(var(--heroui-secondary-50)/1)}.data-\[hover\=true\]\:bg-secondary\/20[data-hover=true]{background-color:hsl(var(--heroui-secondary)/1)}@supports (color:color-mix(in lab,red,red)){.data-\[hover\=true\]\:bg-secondary\/20[data-hover=true]{background-color:color-mix(in oklab,hsl(var(--heroui-secondary)/1)20%,transparent)}}.data-\[hover\=true\]\:bg-success[data-hover=true]{background-color:hsl(var(--heroui-success)/1)}.data-\[hover\=true\]\:bg-success-50[data-hover=true]{background-color:hsl(var(--heroui-success-50)/1)}.data-\[hover\=true\]\:bg-success-100[data-hover=true]{background-color:hsl(var(--heroui-success-100)/1)}.data-\[hover\=true\]\:bg-success\/20[data-hover=true]{background-color:hsl(var(--heroui-success)/1)}@supports (color:color-mix(in lab,red,red)){.data-\[hover\=true\]\:bg-success\/20[data-hover=true]{background-color:color-mix(in oklab,hsl(var(--heroui-success)/1)20%,transparent)}}.data-\[hover\=true\]\:bg-transparent[data-hover=true]{background-color:#0000}.data-\[hover\=true\]\:bg-warning[data-hover=true]{background-color:hsl(var(--heroui-warning)/1)}.data-\[hover\=true\]\:bg-warning-50[data-hover=true]{background-color:hsl(var(--heroui-warning-50)/1)}.data-\[hover\=true\]\:bg-warning-100[data-hover=true]{background-color:hsl(var(--heroui-warning-100)/1)}.data-\[hover\=true\]\:bg-warning\/20[data-hover=true]{background-color:hsl(var(--heroui-warning)/1)}@supports (color:color-mix(in lab,red,red)){.data-\[hover\=true\]\:bg-warning\/20[data-hover=true]{background-color:color-mix(in oklab,hsl(var(--heroui-warning)/1)20%,transparent)}}.data-\[hover\=true\]\:\!text-danger-foreground[data-hover=true]{color:hsl(var(--heroui-danger-foreground)/1)!important}.data-\[hover\=true\]\:\!text-primary-foreground[data-hover=true]{color:hsl(var(--heroui-primary-foreground)/1)!important}.data-\[hover\=true\]\:\!text-secondary-foreground[data-hover=true]{color:hsl(var(--heroui-secondary-foreground)/1)!important}.data-\[hover\=true\]\:\!text-success-foreground[data-hover=true]{color:hsl(var(--heroui-success-foreground)/1)!important}.data-\[hover\=true\]\:\!text-warning-foreground[data-hover=true]{color:hsl(var(--heroui-warning-foreground)/1)!important}.data-\[hover\=true\]\:text-danger[data-hover=true]{color:hsl(var(--heroui-danger)/1)}.data-\[hover\=true\]\:text-danger-500[data-hover=true]{color:hsl(var(--heroui-danger-500)/1)}.data-\[hover\=true\]\:text-danger-foreground[data-hover=true]{color:hsl(var(--heroui-danger-foreground)/1)}.data-\[hover\=true\]\:text-default-500[data-hover=true]{color:hsl(var(--heroui-default-500)/1)}.data-\[hover\=true\]\:text-default-foreground[data-hover=true]{color:hsl(var(--heroui-default-foreground)/1)}.data-\[hover\=true\]\:text-foreground-400[data-hover=true]{color:hsl(var(--heroui-foreground-400)/1)}.data-\[hover\=true\]\:text-foreground-600[data-hover=true]{color:hsl(var(--heroui-foreground-600)/1)}.data-\[hover\=true\]\:text-primary[data-hover=true]{color:var(--color-primary)}.data-\[hover\=true\]\:text-primary-400[data-hover=true]{color:hsl(var(--heroui-primary-400)/1)}.data-\[hover\=true\]\:text-primary-foreground[data-hover=true]{color:hsl(var(--heroui-primary-foreground)/1)}.data-\[hover\=true\]\:text-secondary[data-hover=true]{color:hsl(var(--heroui-secondary)/1)}.data-\[hover\=true\]\:text-secondary-400[data-hover=true]{color:hsl(var(--heroui-secondary-400)/1)}.data-\[hover\=true\]\:text-secondary-foreground[data-hover=true]{color:hsl(var(--heroui-secondary-foreground)/1)}.data-\[hover\=true\]\:text-success[data-hover=true]{color:hsl(var(--heroui-success)/1)}.data-\[hover\=true\]\:text-success-600[data-hover=true]{color:hsl(var(--heroui-success-600)/1)}.data-\[hover\=true\]\:text-success-foreground[data-hover=true]{color:hsl(var(--heroui-success-foreground)/1)}.data-\[hover\=true\]\:text-warning[data-hover=true]{color:hsl(var(--heroui-warning)/1)}.data-\[hover\=true\]\:text-warning-600[data-hover=true]{color:hsl(var(--heroui-warning-600)/1)}.data-\[hover\=true\]\:text-warning-foreground[data-hover=true]{color:hsl(var(--heroui-warning-foreground)/1)}.data-\[hover\=true\]\:opacity-70[data-hover=true]{opacity:.7}.data-\[hover\=true\]\:opacity-hover[data-hover=true]{opacity:var(--heroui-hover-opacity)}.data-\[hover\=true\]\:shadow-lg[data-hover=true]{--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)}.data-\[hover\=true\]\:shadow-danger\/30[data-hover=true]{--tw-shadow-color:hsl(var(--heroui-danger)/1)}@supports (color:color-mix(in lab,red,red)){.data-\[hover\=true\]\:shadow-danger\/30[data-hover=true]{--tw-shadow-color:color-mix(in oklab,color-mix(in oklab,hsl(var(--heroui-danger)/1)30%,transparent)var(--tw-shadow-alpha),transparent)}}.data-\[hover\=true\]\:shadow-default\/50[data-hover=true]{--tw-shadow-color:hsl(var(--heroui-default)/1)}@supports (color:color-mix(in lab,red,red)){.data-\[hover\=true\]\:shadow-default\/50[data-hover=true]{--tw-shadow-color:color-mix(in oklab,color-mix(in oklab,hsl(var(--heroui-default)/1)50%,transparent)var(--tw-shadow-alpha),transparent)}}.data-\[hover\=true\]\:shadow-primary\/30[data-hover=true]{--tw-shadow-color:#1b54ff4d}@supports (color:color-mix(in lab,red,red)){.data-\[hover\=true\]\:shadow-primary\/30[data-hover=true]{--tw-shadow-color:color-mix(in oklab,color-mix(in oklab,var(--color-primary)30%,transparent)var(--tw-shadow-alpha),transparent)}}.data-\[hover\=true\]\:shadow-secondary\/30[data-hover=true]{--tw-shadow-color:hsl(var(--heroui-secondary)/1)}@supports (color:color-mix(in lab,red,red)){.data-\[hover\=true\]\:shadow-secondary\/30[data-hover=true]{--tw-shadow-color:color-mix(in oklab,color-mix(in oklab,hsl(var(--heroui-secondary)/1)30%,transparent)var(--tw-shadow-alpha),transparent)}}.data-\[hover\=true\]\:shadow-success\/30[data-hover=true]{--tw-shadow-color:hsl(var(--heroui-success)/1)}@supports (color:color-mix(in lab,red,red)){.data-\[hover\=true\]\:shadow-success\/30[data-hover=true]{--tw-shadow-color:color-mix(in oklab,color-mix(in oklab,hsl(var(--heroui-success)/1)30%,transparent)var(--tw-shadow-alpha),transparent)}}.data-\[hover\=true\]\:shadow-warning\/30[data-hover=true]{--tw-shadow-color:hsl(var(--heroui-warning)/1)}@supports (color:color-mix(in lab,red,red)){.data-\[hover\=true\]\:shadow-warning\/30[data-hover=true]{--tw-shadow-color:color-mix(in oklab,color-mix(in oklab,hsl(var(--heroui-warning)/1)30%,transparent)var(--tw-shadow-alpha),transparent)}}.data-\[hover\=true\]\:transition-colors[data-hover=true]{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))}.data-\[in-range\=false\]\:bg-default-200[data-in-range=false]{background-color:hsl(var(--heroui-default-200)/1)}.data-\[in-range\=true\]\:bg-background\/50[data-in-range=true]{background-color:hsl(var(--heroui-background)/1)}@supports (color:color-mix(in lab,red,red)){.data-\[in-range\=true\]\:bg-background\/50[data-in-range=true]{background-color:color-mix(in oklab,hsl(var(--heroui-background)/1)50%,transparent)}}.data-\[in-range\=true\]\:bg-danger[data-in-range=true]{background-color:hsl(var(--heroui-danger)/1)}.data-\[in-range\=true\]\:bg-foreground[data-in-range=true]{background-color:hsl(var(--heroui-foreground)/1)}.data-\[in-range\=true\]\:bg-primary[data-in-range=true]{background-color:var(--color-primary)}.data-\[in-range\=true\]\:bg-secondary[data-in-range=true]{background-color:hsl(var(--heroui-secondary)/1)}.data-\[in-range\=true\]\:bg-success[data-in-range=true]{background-color:hsl(var(--heroui-success)/1)}.data-\[in-range\=true\]\:bg-warning[data-in-range=true]{background-color:hsl(var(--heroui-warning)/1)}.data-\[in-range\=true\]\:opacity-100[data-in-range=true]{opacity:1}.data-\[inert\=true\]\:hidden[data-inert=true]{display:none}.data-\[invalid\=true\]\:text-danger-300[data-invalid=true]{color:hsl(var(--heroui-danger-300)/1)}.data-\[invalid\=true\]\:focus\:bg-danger-400\/50[data-invalid=true]:focus{background-color:hsl(var(--heroui-danger-400)/1)}@supports (color:color-mix(in lab,red,red)){.data-\[invalid\=true\]\:focus\:bg-danger-400\/50[data-invalid=true]:focus{background-color:color-mix(in oklab,hsl(var(--heroui-danger-400)/1)50%,transparent)}}.data-\[invalid\=true\]\:data-\[editable\=true\]\:text-danger[data-invalid=true][data-editable=true],.data-\[invalid\=true\]\:data-\[editable\=true\]\:focus\:text-danger[data-invalid=true][data-editable=true]:focus{color:hsl(var(--heroui-danger)/1)}.data-\[invisible\=true\]\:scale-0[data-invisible=true]{--tw-scale-x:0%;--tw-scale-y:0%;--tw-scale-z:0%;scale:var(--tw-scale-x)var(--tw-scale-y)}.data-\[invisible\=true\]\:opacity-0[data-invisible=true]{opacity:0}.data-\[justify\=center\]\:justify-center[data-justify=center]{justify-content:center}.data-\[justify\=end\]\:flex-grow[data-justify=end]{flex-grow:1}.data-\[justify\=end\]\:basis-0[data-justify=end]{flex-basis:calc(var(--spacing)*0)}.data-\[justify\=end\]\:justify-end[data-justify=end]{justify-content:flex-end}.data-\[justify\=start\]\:flex-grow[data-justify=start]{flex-grow:1}.data-\[justify\=start\]\:basis-0[data-justify=start]{flex-basis:calc(var(--spacing)*0)}.data-\[justify\=start\]\:justify-start[data-justify=start]{justify-content:flex-start}.data-\[left-right-scroll\=true\]\:\[mask-image\:linear-gradient\(to_right\,\#000\,\#000\,transparent_0\,\#000_var\(--scroll-shadow-size\)\,\#000_calc\(100\%_-_var\(--scroll-shadow-size\)\)\,transparent\)\][data-left-right-scroll=true]{-webkit-mask-image:linear-gradient(to right,#000,#000,transparent 0,#000 var(--scroll-shadow-size),#000 calc(100% - var(--scroll-shadow-size)),transparent);mask-image:linear-gradient(to right,#000,#000,transparent 0,#000 var(--scroll-shadow-size),#000 calc(100% - var(--scroll-shadow-size)),transparent)}.data-\[left-scroll\=true\]\:\[mask-image\:linear-gradient\(270deg\,\#000_calc\(100\%_-_var\(--scroll-shadow-size\)\)\,transparent\)\][data-left-scroll=true]{-webkit-mask-image:linear-gradient(270deg,#000 calc(100% - var(--scroll-shadow-size)),transparent);mask-image:linear-gradient(270deg,#000 calc(100% - var(--scroll-shadow-size)),transparent)}.data-\[loaded\=true\]\:pointer-events-auto[data-loaded=true]{pointer-events:auto}.data-\[loaded\=true\]\:overflow-visible[data-loaded=true]{overflow:visible}.data-\[loaded\=true\]\:\!bg-transparent[data-loaded=true]{background-color:#0000!important}.data-\[loaded\=true\]\:opacity-100[data-loaded=true]{opacity:1}.data-\[loaded\=true\]\:before\:-z-10[data-loaded=true]:before{content:var(--tw-content);z-index:-10}.data-\[loaded\=true\]\:before\:animate-none[data-loaded=true]:before{content:var(--tw-content);animation:none}.data-\[loaded\=true\]\:before\:opacity-0[data-loaded=true]:before,.data-\[loaded\=true\]\:after\:opacity-0[data-loaded=true]:after{content:var(--tw-content);opacity:0}.data-\[menu-open\=true\]\:border-none[data-menu-open=true]{--tw-border-style:none;border-style:none}.data-\[menu-open\=true\]\:backdrop-blur-xl[data-menu-open=true]{--tw-backdrop-blur:blur(var(--blur-xl));-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,)}.data-\[moving\]\:opacity-100[data-moving]{opacity:1}.data-\[moving\=true\]\:transition-transform[data-moving=true]{transition-property:transform,translate,scale,rotate;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.data-\[open\=true\]\:block[data-open=true]{display:block}.data-\[open\=true\]\:flex[data-open=true]{display:flex}.data-\[open\=true\]\:-rotate-90[data-open=true]{rotate:-90deg}.data-\[open\=true\]\:rotate-180[data-open=true]{rotate:180deg}.data-\[open\=true\]\:border-danger[data-open=true]{border-color:hsl(var(--heroui-danger)/1)}.data-\[open\=true\]\:border-default-400[data-open=true]{border-color:hsl(var(--heroui-default-400)/1)}.data-\[open\=true\]\:border-default-foreground[data-open=true]{border-color:hsl(var(--heroui-default-foreground)/1)}.data-\[open\=true\]\:border-primary[data-open=true]{border-color:var(--color-primary)}.data-\[open\=true\]\:border-secondary[data-open=true]{border-color:hsl(var(--heroui-secondary)/1)}.data-\[open\=true\]\:border-success[data-open=true]{border-color:hsl(var(--heroui-success)/1)}.data-\[open\=true\]\:border-warning[data-open=true]{border-color:hsl(var(--heroui-warning)/1)}.data-\[open\=true\]\:after\:w-full[data-open=true]:after{content:var(--tw-content);width:100%}.data-\[orientation\=horizontal\]\:flex-row[data-orientation=horizontal]{flex-direction:row}.data-\[outside-month\=true\]\:before\:hidden[data-outside-month=true]:before{content:var(--tw-content);display:none}.data-\[disabled\=true\]\:data-\[outside-month\=true\]\:opacity-0[data-disabled=true][data-outside-month=true]{opacity:0}.data-\[editable\=true\]\:data-\[placeholder\=true\]\:text-danger-300[data-editable=true][data-placeholder=true]{color:hsl(var(--heroui-danger-300)/1)}.data-\[editable\=true\]\:data-\[placeholder\=true\]\:text-foreground-500[data-editable=true][data-placeholder=true]{color:hsl(var(--heroui-foreground-500)/1)}.data-\[editable\=true\]\:data-\[placeholder\=true\]\:text-primary-300[data-editable=true][data-placeholder=true]{color:hsl(var(--heroui-primary-300)/1)}.data-\[editable\=true\]\:data-\[placeholder\=true\]\:text-secondary-300[data-editable=true][data-placeholder=true]{color:hsl(var(--heroui-secondary-300)/1)}.data-\[editable\=true\]\:data-\[placeholder\=true\]\:text-success-400[data-editable=true][data-placeholder=true]{color:hsl(var(--heroui-success-400)/1)}.data-\[editable\=true\]\:data-\[placeholder\=true\]\:text-warning-400[data-editable=true][data-placeholder=true]{color:hsl(var(--heroui-warning-400)/1)}.data-\[placement\=bottom\]\:before\:-top-\[calc\(theme\(spacing\.5\)\/4_-_1\.5px\)\][data-placement=bottom]:before{content:var(--tw-content);top:calc(1.5px - .3125rem)}.data-\[placement\=bottom\]\:before\:left-1\/2[data-placement=bottom]:before{content:var(--tw-content);left:50%}.data-\[placement\=bottom\]\:before\:-translate-x-1\/2[data-placement=bottom]:before{content:var(--tw-content);--tw-translate-x: -50% ;translate:var(--tw-translate-x)var(--tw-translate-y)}.data-\[placement\=bottom-center\]\:fixed[data-placement=bottom-center]{position:fixed}.data-\[placement\=bottom-center\]\:right-0[data-placement=bottom-center]{right:calc(var(--spacing)*0)}.data-\[placement\=bottom-center\]\:bottom-0[data-placement=bottom-center]{bottom:calc(var(--spacing)*0)}.data-\[placement\=bottom-center\]\:left-0[data-placement=bottom-center]{left:calc(var(--spacing)*0)}.data-\[placement\=bottom-center\]\:left-1\/2[data-placement=bottom-center]{left:50%}.data-\[placement\=bottom-center\]\:flex[data-placement=bottom-center]{display:flex}.data-\[placement\=bottom-center\]\:-translate-x-1\/2[data-placement=bottom-center]{--tw-translate-x: -50% ;translate:var(--tw-translate-x)var(--tw-translate-y)}.data-\[placement\=bottom-center\]\:flex-col[data-placement=bottom-center]{flex-direction:column}.data-\[placement\=bottom-center\]\:before\:top-\[calc\(-1\*var\(--top-extension\,16px\)\)\][data-placement=bottom-center]:before{content:var(--tw-content);top:calc(-1*var(--top-extension,16px))}.data-\[placement\=bottom-center\]\:before\:h-\[var\(--top-extension\,16px\)\][data-placement=bottom-center]:before{content:var(--tw-content);height:var(--top-extension,16px)}.data-\[placement\=bottom-center\]\:after\:bottom-\[calc\(-1\*var\(--bottom-extension\,16px\)\)\][data-placement=bottom-center]:after{content:var(--tw-content);bottom:calc(-1*var(--bottom-extension,16px))}.data-\[placement\=bottom-center\]\:after\:h-\[var\(--bottom-extension\,16px\)\][data-placement=bottom-center]:after{content:var(--tw-content);height:var(--bottom-extension,16px)}.data-\[placement\=bottom-end\]\:before\:-top-\[calc\(theme\(spacing\.5\)\/4_-_1\.5px\)\][data-placement=bottom-end]:before{content:var(--tw-content);top:calc(1.5px - .3125rem)}.data-\[placement\=bottom-end\]\:before\:right-3[data-placement=bottom-end]:before{content:var(--tw-content);right:calc(var(--spacing)*3)}.data-\[placement\=bottom-left\]\:fixed[data-placement=bottom-left]{position:fixed}.data-\[placement\=bottom-left\]\:bottom-0[data-placement=bottom-left]{bottom:calc(var(--spacing)*0)}.data-\[placement\=bottom-left\]\:left-0[data-placement=bottom-left]{left:calc(var(--spacing)*0)}.data-\[placement\=bottom-left\]\:mx-auto[data-placement=bottom-left]{margin-inline:auto}.data-\[placement\=bottom-left\]\:flex[data-placement=bottom-left]{display:flex}.data-\[placement\=bottom-left\]\:flex-col[data-placement=bottom-left]{flex-direction:column}.data-\[placement\=bottom-left\]\:before\:top-\[calc\(-1\*var\(--top-extension\,16px\)\)\][data-placement=bottom-left]:before{content:var(--tw-content);top:calc(-1*var(--top-extension,16px))}.data-\[placement\=bottom-left\]\:before\:h-\[var\(--top-extension\,16px\)\][data-placement=bottom-left]:before{content:var(--tw-content);height:var(--top-extension,16px)}.data-\[placement\=bottom-left\]\:after\:bottom-\[calc\(-1\*var\(--bottom-extension\,16px\)\)\][data-placement=bottom-left]:after{content:var(--tw-content);bottom:calc(-1*var(--bottom-extension,16px))}.data-\[placement\=bottom-left\]\:after\:h-\[var\(--bottom-extension\,16px\)\][data-placement=bottom-left]:after{content:var(--tw-content);height:var(--bottom-extension,16px)}.data-\[placement\=bottom-right\]\:fixed[data-placement=bottom-right]{position:fixed}.data-\[placement\=bottom-right\]\:right-0[data-placement=bottom-right]{right:calc(var(--spacing)*0)}.data-\[placement\=bottom-right\]\:bottom-0[data-placement=bottom-right]{bottom:calc(var(--spacing)*0)}.data-\[placement\=bottom-right\]\:mx-auto[data-placement=bottom-right]{margin-inline:auto}.data-\[placement\=bottom-right\]\:flex[data-placement=bottom-right]{display:flex}.data-\[placement\=bottom-right\]\:flex-col[data-placement=bottom-right]{flex-direction:column}.data-\[placement\=bottom-right\]\:before\:top-\[calc\(-1\*var\(--top-extension\,16px\)\)\][data-placement=bottom-right]:before{content:var(--tw-content);top:calc(-1*var(--top-extension,16px))}.data-\[placement\=bottom-right\]\:before\:h-\[var\(--top-extension\,16px\)\][data-placement=bottom-right]:before{content:var(--tw-content);height:var(--top-extension,16px)}.data-\[placement\=bottom-right\]\:after\:bottom-\[calc\(-1\*var\(--bottom-extension\,16px\)\)\][data-placement=bottom-right]:after{content:var(--tw-content);bottom:calc(-1*var(--bottom-extension,16px))}.data-\[placement\=bottom-right\]\:after\:h-\[var\(--bottom-extension\,16px\)\][data-placement=bottom-right]:after{content:var(--tw-content);height:var(--bottom-extension,16px)}.data-\[placement\=bottom-start\]\:before\:-top-\[calc\(theme\(spacing\.5\)\/4_-_1\.5px\)\][data-placement=bottom-start]:before{content:var(--tw-content);top:calc(1.5px - .3125rem)}.data-\[placement\=bottom-start\]\:before\:left-3[data-placement=bottom-start]:before{content:var(--tw-content);left:calc(var(--spacing)*3)}.data-\[placement\=left\]\:before\:top-1\/2[data-placement=left]:before{content:var(--tw-content);top:50%}.data-\[placement\=left\]\:before\:-right-\[calc\(theme\(spacing\.5\)\/4_-_2px\)\][data-placement=left]:before{content:var(--tw-content);right:calc(2px - .3125rem)}.data-\[placement\=left\]\:before\:-translate-y-1\/2[data-placement=left]:before{content:var(--tw-content);--tw-translate-y: -50% ;translate:var(--tw-translate-x)var(--tw-translate-y)}.data-\[placement\=left-end\]\:before\:-right-\[calc\(theme\(spacing\.5\)\/4_-_3px\)\][data-placement=left-end]:before{content:var(--tw-content);right:calc(3px - .3125rem)}.data-\[placement\=left-end\]\:before\:bottom-1\/4[data-placement=left-end]:before{content:var(--tw-content);bottom:25%}.data-\[placement\=left-start\]\:before\:top-1\/4[data-placement=left-start]:before{content:var(--tw-content);top:25%}.data-\[placement\=left-start\]\:before\:-right-\[calc\(theme\(spacing\.5\)\/4_-_3px\)\][data-placement=left-start]:before{content:var(--tw-content);right:calc(3px - .3125rem)}.data-\[placement\=right\]\:before\:top-1\/2[data-placement=right]:before{content:var(--tw-content);top:50%}.data-\[placement\=right\]\:before\:-left-\[calc\(theme\(spacing\.5\)\/4_-_2px\)\][data-placement=right]:before{content:var(--tw-content);left:calc(2px - .3125rem)}.data-\[placement\=right\]\:before\:-translate-y-1\/2[data-placement=right]:before{content:var(--tw-content);--tw-translate-y: -50% ;translate:var(--tw-translate-x)var(--tw-translate-y)}.data-\[placement\=right-end\]\:before\:bottom-1\/4[data-placement=right-end]:before{content:var(--tw-content);bottom:25%}.data-\[placement\=right-end\]\:before\:-left-\[calc\(theme\(spacing\.5\)\/4_-_3px\)\][data-placement=right-end]:before{content:var(--tw-content);left:calc(3px - .3125rem)}.data-\[placement\=right-start\]\:before\:top-1\/4[data-placement=right-start]:before{content:var(--tw-content);top:25%}.data-\[placement\=right-start\]\:before\:-left-\[calc\(theme\(spacing\.5\)\/4_-_3px\)\][data-placement=right-start]:before{content:var(--tw-content);left:calc(3px - .3125rem)}.data-\[placement\=top\]\:before\:-bottom-\[calc\(theme\(spacing\.5\)\/4_-_1\.5px\)\][data-placement=top]:before{content:var(--tw-content);bottom:calc(1.5px - .3125rem)}.data-\[placement\=top\]\:before\:left-1\/2[data-placement=top]:before{content:var(--tw-content);left:50%}.data-\[placement\=top\]\:before\:-translate-x-1\/2[data-placement=top]:before{content:var(--tw-content);--tw-translate-x: -50% ;translate:var(--tw-translate-x)var(--tw-translate-y)}.data-\[placement\=top-center\]\:fixed[data-placement=top-center]{position:fixed}.data-\[placement\=top-center\]\:top-0[data-placement=top-center]{top:calc(var(--spacing)*0)}.data-\[placement\=top-center\]\:right-0[data-placement=top-center]{right:calc(var(--spacing)*0)}.data-\[placement\=top-center\]\:left-0[data-placement=top-center]{left:calc(var(--spacing)*0)}.data-\[placement\=top-center\]\:left-1\/2[data-placement=top-center]{left:50%}.data-\[placement\=top-center\]\:flex[data-placement=top-center]{display:flex}.data-\[placement\=top-center\]\:-translate-x-1\/2[data-placement=top-center]{--tw-translate-x: -50% ;translate:var(--tw-translate-x)var(--tw-translate-y)}.data-\[placement\=top-center\]\:flex-col[data-placement=top-center]{flex-direction:column}.data-\[placement\=top-end\]\:before\:right-3[data-placement=top-end]:before{content:var(--tw-content);right:calc(var(--spacing)*3)}.data-\[placement\=top-end\]\:before\:-bottom-\[calc\(theme\(spacing\.5\)\/4_-_1\.5px\)\][data-placement=top-end]:before{content:var(--tw-content);bottom:calc(1.5px - .3125rem)}.data-\[placement\=top-left\]\:fixed[data-placement=top-left]{position:fixed}.data-\[placement\=top-left\]\:top-0[data-placement=top-left]{top:calc(var(--spacing)*0)}.data-\[placement\=top-left\]\:left-0[data-placement=top-left]{left:calc(var(--spacing)*0)}.data-\[placement\=top-left\]\:mx-auto[data-placement=top-left]{margin-inline:auto}.data-\[placement\=top-left\]\:flex[data-placement=top-left]{display:flex}.data-\[placement\=top-left\]\:flex-col[data-placement=top-left]{flex-direction:column}.data-\[placement\=top-right\]\:fixed[data-placement=top-right]{position:fixed}.data-\[placement\=top-right\]\:top-0[data-placement=top-right]{top:calc(var(--spacing)*0)}.data-\[placement\=top-right\]\:right-0[data-placement=top-right]{right:calc(var(--spacing)*0)}.data-\[placement\=top-right\]\:mx-auto[data-placement=top-right]{margin-inline:auto}.data-\[placement\=top-right\]\:flex[data-placement=top-right]{display:flex}.data-\[placement\=top-right\]\:flex-col[data-placement=top-right]{flex-direction:column}.data-\[placement\=top-start\]\:before\:-bottom-\[calc\(theme\(spacing\.5\)\/4_-_1\.5px\)\][data-placement=top-start]:before{content:var(--tw-content);bottom:calc(1.5px - .3125rem)}.data-\[placement\=top-start\]\:before\:left-3[data-placement=top-start]:before{content:var(--tw-content);left:calc(var(--spacing)*3)}.data-\[pressed\=true\]\:scale-100[data-pressed=true]{--tw-scale-x:100%;--tw-scale-y:100%;--tw-scale-z:100%;scale:var(--tw-scale-x)var(--tw-scale-y)}.data-\[pressed\=true\]\:scale-\[0\.97\][data-pressed=true]{scale:.97}.data-\[pressed\=true\]\:opacity-50[data-pressed=true]{opacity:.5}.data-\[pressed\=true\]\:opacity-70[data-pressed=true]{opacity:.7}.data-\[pressed\=true\]\:opacity-disabled[data-pressed=true]{opacity:var(--heroui-disabled-opacity)}.data-\[range-end\=true\]\:before\:rounded-e-full[data-range-end=true]:before{content:var(--tw-content);border-start-end-radius:3.40282e38px;border-end-end-radius:3.40282e38px}.data-\[range-start\=true\]\:before\:rounded-s-full[data-range-start=true]:before{content:var(--tw-content);border-start-start-radius:3.40282e38px;border-end-start-radius:3.40282e38px}.data-\[readonly\=true\]\:cursor-default[data-readonly=true]{cursor:default}.data-\[right-scroll\=true\]\:\[mask-image\:linear-gradient\(90deg\,\#000_calc\(100\%_-_var\(--scroll-shadow-size\)\)\,transparent\)\][data-right-scroll=true]{-webkit-mask-image:linear-gradient(90deg,#000 calc(100% - var(--scroll-shadow-size)),transparent);mask-image:linear-gradient(90deg,#000 calc(100% - var(--scroll-shadow-size)),transparent)}.data-\[selectable\=true\]\:focus\:border-danger[data-selectable=true]:focus{border-color:hsl(var(--heroui-danger)/1)}.data-\[selectable\=true\]\:focus\:border-default[data-selectable=true]:focus{border-color:hsl(var(--heroui-default)/1)}.data-\[selectable\=true\]\:focus\:border-primary[data-selectable=true]:focus{border-color:var(--color-primary)}.data-\[selectable\=true\]\:focus\:border-secondary[data-selectable=true]:focus{border-color:hsl(var(--heroui-secondary)/1)}.data-\[selectable\=true\]\:focus\:border-success[data-selectable=true]:focus{border-color:hsl(var(--heroui-success)/1)}.data-\[selectable\=true\]\:focus\:border-warning[data-selectable=true]:focus{border-color:hsl(var(--heroui-warning)/1)}.data-\[selectable\=true\]\:focus\:bg-danger[data-selectable=true]:focus,.data-\[selectable\=true\]\:focus\:bg-danger\/20[data-selectable=true]:focus{background-color:hsl(var(--heroui-danger)/1)}@supports (color:color-mix(in lab,red,red)){.data-\[selectable\=true\]\:focus\:bg-danger\/20[data-selectable=true]:focus{background-color:color-mix(in oklab,hsl(var(--heroui-danger)/1)20%,transparent)}}.data-\[selectable\=true\]\:focus\:bg-default[data-selectable=true]:focus{background-color:hsl(var(--heroui-default)/1)}.data-\[selectable\=true\]\:focus\:bg-default-100[data-selectable=true]:focus{background-color:hsl(var(--heroui-default-100)/1)}.data-\[selectable\=true\]\:focus\:bg-default\/40[data-selectable=true]:focus{background-color:hsl(var(--heroui-default)/1)}@supports (color:color-mix(in lab,red,red)){.data-\[selectable\=true\]\:focus\:bg-default\/40[data-selectable=true]:focus{background-color:color-mix(in oklab,hsl(var(--heroui-default)/1)40%,transparent)}}.data-\[selectable\=true\]\:focus\:bg-primary[data-selectable=true]:focus{background-color:var(--color-primary)}.data-\[selectable\=true\]\:focus\:bg-primary\/20[data-selectable=true]:focus{background-color:#1b54ff33}@supports (color:color-mix(in lab,red,red)){.data-\[selectable\=true\]\:focus\:bg-primary\/20[data-selectable=true]:focus{background-color:color-mix(in oklab,var(--color-primary)20%,transparent)}}.data-\[selectable\=true\]\:focus\:bg-secondary[data-selectable=true]:focus,.data-\[selectable\=true\]\:focus\:bg-secondary\/20[data-selectable=true]:focus{background-color:hsl(var(--heroui-secondary)/1)}@supports (color:color-mix(in lab,red,red)){.data-\[selectable\=true\]\:focus\:bg-secondary\/20[data-selectable=true]:focus{background-color:color-mix(in oklab,hsl(var(--heroui-secondary)/1)20%,transparent)}}.data-\[selectable\=true\]\:focus\:bg-success[data-selectable=true]:focus,.data-\[selectable\=true\]\:focus\:bg-success\/20[data-selectable=true]:focus{background-color:hsl(var(--heroui-success)/1)}@supports (color:color-mix(in lab,red,red)){.data-\[selectable\=true\]\:focus\:bg-success\/20[data-selectable=true]:focus{background-color:color-mix(in oklab,hsl(var(--heroui-success)/1)20%,transparent)}}.data-\[selectable\=true\]\:focus\:bg-warning[data-selectable=true]:focus,.data-\[selectable\=true\]\:focus\:bg-warning\/20[data-selectable=true]:focus{background-color:hsl(var(--heroui-warning)/1)}@supports (color:color-mix(in lab,red,red)){.data-\[selectable\=true\]\:focus\:bg-warning\/20[data-selectable=true]:focus{background-color:color-mix(in oklab,hsl(var(--heroui-warning)/1)20%,transparent)}}.data-\[selectable\=true\]\:focus\:text-danger[data-selectable=true]:focus{color:hsl(var(--heroui-danger)/1)}.data-\[selectable\=true\]\:focus\:text-danger-foreground[data-selectable=true]:focus{color:hsl(var(--heroui-danger-foreground)/1)}.data-\[selectable\=true\]\:focus\:text-default-500[data-selectable=true]:focus{color:hsl(var(--heroui-default-500)/1)}.data-\[selectable\=true\]\:focus\:text-default-foreground[data-selectable=true]:focus{color:hsl(var(--heroui-default-foreground)/1)}.data-\[selectable\=true\]\:focus\:text-primary[data-selectable=true]:focus{color:var(--color-primary)}.data-\[selectable\=true\]\:focus\:text-primary-foreground[data-selectable=true]:focus{color:hsl(var(--heroui-primary-foreground)/1)}.data-\[selectable\=true\]\:focus\:text-secondary[data-selectable=true]:focus{color:hsl(var(--heroui-secondary)/1)}.data-\[selectable\=true\]\:focus\:text-secondary-foreground[data-selectable=true]:focus{color:hsl(var(--heroui-secondary-foreground)/1)}.data-\[selectable\=true\]\:focus\:text-success[data-selectable=true]:focus{color:hsl(var(--heroui-success)/1)}.data-\[selectable\=true\]\:focus\:text-success-foreground[data-selectable=true]:focus{color:hsl(var(--heroui-success-foreground)/1)}.data-\[selectable\=true\]\:focus\:text-warning[data-selectable=true]:focus{color:hsl(var(--heroui-warning)/1)}.data-\[selectable\=true\]\:focus\:text-warning-foreground[data-selectable=true]:focus{color:hsl(var(--heroui-warning-foreground)/1)}.data-\[selectable\=true\]\:focus\:shadow-danger\/30[data-selectable=true]:focus{--tw-shadow-color:hsl(var(--heroui-danger)/1)}@supports (color:color-mix(in lab,red,red)){.data-\[selectable\=true\]\:focus\:shadow-danger\/30[data-selectable=true]:focus{--tw-shadow-color:color-mix(in oklab,color-mix(in oklab,hsl(var(--heroui-danger)/1)30%,transparent)var(--tw-shadow-alpha),transparent)}}.data-\[selectable\=true\]\:focus\:shadow-default\/50[data-selectable=true]:focus{--tw-shadow-color:hsl(var(--heroui-default)/1)}@supports (color:color-mix(in lab,red,red)){.data-\[selectable\=true\]\:focus\:shadow-default\/50[data-selectable=true]:focus{--tw-shadow-color:color-mix(in oklab,color-mix(in oklab,hsl(var(--heroui-default)/1)50%,transparent)var(--tw-shadow-alpha),transparent)}}.data-\[selectable\=true\]\:focus\:shadow-primary\/30[data-selectable=true]:focus{--tw-shadow-color:#1b54ff4d}@supports (color:color-mix(in lab,red,red)){.data-\[selectable\=true\]\:focus\:shadow-primary\/30[data-selectable=true]:focus{--tw-shadow-color:color-mix(in oklab,color-mix(in oklab,var(--color-primary)30%,transparent)var(--tw-shadow-alpha),transparent)}}.data-\[selectable\=true\]\:focus\:shadow-secondary\/30[data-selectable=true]:focus{--tw-shadow-color:hsl(var(--heroui-secondary)/1)}@supports (color:color-mix(in lab,red,red)){.data-\[selectable\=true\]\:focus\:shadow-secondary\/30[data-selectable=true]:focus{--tw-shadow-color:color-mix(in oklab,color-mix(in oklab,hsl(var(--heroui-secondary)/1)30%,transparent)var(--tw-shadow-alpha),transparent)}}.data-\[selectable\=true\]\:focus\:shadow-success\/30[data-selectable=true]:focus{--tw-shadow-color:hsl(var(--heroui-success)/1)}@supports (color:color-mix(in lab,red,red)){.data-\[selectable\=true\]\:focus\:shadow-success\/30[data-selectable=true]:focus{--tw-shadow-color:color-mix(in oklab,color-mix(in oklab,hsl(var(--heroui-success)/1)30%,transparent)var(--tw-shadow-alpha),transparent)}}.data-\[selectable\=true\]\:focus\:shadow-warning\/30[data-selectable=true]:focus{--tw-shadow-color:hsl(var(--heroui-warning)/1)}@supports (color:color-mix(in lab,red,red)){.data-\[selectable\=true\]\:focus\:shadow-warning\/30[data-selectable=true]:focus{--tw-shadow-color:color-mix(in oklab,color-mix(in oklab,hsl(var(--heroui-warning)/1)30%,transparent)var(--tw-shadow-alpha),transparent)}}.data-\[selected\=true\]\:bg-danger[data-selected=true]{background-color:hsl(var(--heroui-danger)/1)}.data-\[selected\=true\]\:bg-default[data-selected=true]{background-color:hsl(var(--heroui-default)/1)}.data-\[selected\=true\]\:bg-foreground[data-selected=true]{background-color:hsl(var(--heroui-foreground)/1)}.data-\[selected\=true\]\:bg-primary[data-selected=true]{background-color:var(--color-primary)}.data-\[selected\=true\]\:bg-secondary[data-selected=true]{background-color:hsl(var(--heroui-secondary)/1)}.data-\[selected\=true\]\:bg-success[data-selected=true]{background-color:hsl(var(--heroui-success)/1)}.data-\[selected\=true\]\:bg-warning[data-selected=true]{background-color:hsl(var(--heroui-warning)/1)}.data-\[selected\=true\]\:text-background[data-selected=true]{color:hsl(var(--heroui-background)/1)}.data-\[selected\=true\]\:text-danger[data-selected=true]{color:hsl(var(--heroui-danger)/1)}.data-\[selected\=true\]\:text-danger-foreground[data-selected=true]{color:hsl(var(--heroui-danger-foreground)/1)}.data-\[selected\=true\]\:text-default-foreground[data-selected=true]{color:hsl(var(--heroui-default-foreground)/1)}.data-\[selected\=true\]\:text-primary[data-selected=true]{color:var(--color-primary)}.data-\[selected\=true\]\:text-primary-foreground[data-selected=true]{color:hsl(var(--heroui-primary-foreground)/1)}.data-\[selected\=true\]\:text-secondary[data-selected=true]{color:hsl(var(--heroui-secondary)/1)}.data-\[selected\=true\]\:text-secondary-foreground[data-selected=true]{color:hsl(var(--heroui-secondary-foreground)/1)}.data-\[selected\=true\]\:text-success-600[data-selected=true]{color:hsl(var(--heroui-success-600)/1)}.data-\[selected\=true\]\:text-success-foreground[data-selected=true]{color:hsl(var(--heroui-success-foreground)/1)}.data-\[selected\=true\]\:text-warning-600[data-selected=true]{color:hsl(var(--heroui-warning-600)/1)}.data-\[selected\=true\]\:text-warning-foreground[data-selected=true]{color:hsl(var(--heroui-warning-foreground)/1)}.data-\[selected\=true\]\:shadow-md[data-selected=true]{--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)}.data-\[selected\=true\]\:shadow-none[data-selected=true]{--tw-shadow:0 0 #0000;box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.data-\[selected\=true\]\:shadow-danger\/40[data-selected=true]{--tw-shadow-color:hsl(var(--heroui-danger)/1)}@supports (color:color-mix(in lab,red,red)){.data-\[selected\=true\]\:shadow-danger\/40[data-selected=true]{--tw-shadow-color:color-mix(in oklab,color-mix(in oklab,hsl(var(--heroui-danger)/1)40%,transparent)var(--tw-shadow-alpha),transparent)}}.data-\[selected\=true\]\:shadow-foreground\/40[data-selected=true]{--tw-shadow-color:hsl(var(--heroui-foreground)/1)}@supports (color:color-mix(in lab,red,red)){.data-\[selected\=true\]\:shadow-foreground\/40[data-selected=true]{--tw-shadow-color:color-mix(in oklab,color-mix(in oklab,hsl(var(--heroui-foreground)/1)40%,transparent)var(--tw-shadow-alpha),transparent)}}.data-\[selected\=true\]\:shadow-primary\/40[data-selected=true]{--tw-shadow-color:#1b54ff66}@supports (color:color-mix(in lab,red,red)){.data-\[selected\=true\]\:shadow-primary\/40[data-selected=true]{--tw-shadow-color:color-mix(in oklab,color-mix(in oklab,var(--color-primary)40%,transparent)var(--tw-shadow-alpha),transparent)}}.data-\[selected\=true\]\:shadow-secondary\/40[data-selected=true]{--tw-shadow-color:hsl(var(--heroui-secondary)/1)}@supports (color:color-mix(in lab,red,red)){.data-\[selected\=true\]\:shadow-secondary\/40[data-selected=true]{--tw-shadow-color:color-mix(in oklab,color-mix(in oklab,hsl(var(--heroui-secondary)/1)40%,transparent)var(--tw-shadow-alpha),transparent)}}.data-\[selected\=true\]\:shadow-success\/40[data-selected=true]{--tw-shadow-color:hsl(var(--heroui-success)/1)}@supports (color:color-mix(in lab,red,red)){.data-\[selected\=true\]\:shadow-success\/40[data-selected=true]{--tw-shadow-color:color-mix(in oklab,color-mix(in oklab,hsl(var(--heroui-success)/1)40%,transparent)var(--tw-shadow-alpha),transparent)}}.data-\[selected\=true\]\:shadow-warning\/40[data-selected=true]{--tw-shadow-color:hsl(var(--heroui-warning)/1)}@supports (color:color-mix(in lab,red,red)){.data-\[selected\=true\]\:shadow-warning\/40[data-selected=true]{--tw-shadow-color:color-mix(in oklab,color-mix(in oklab,hsl(var(--heroui-warning)/1)40%,transparent)var(--tw-shadow-alpha),transparent)}}.data-\[selected\=true\]\:before\:opacity-100[data-selected=true]:before{content:var(--tw-content);opacity:1}.data-\[selected\=true\]\:after\:bg-danger[data-selected=true]:after{content:var(--tw-content);background-color:hsl(var(--heroui-danger)/1)}.data-\[selected\=true\]\:after\:bg-foreground[data-selected=true]:after{content:var(--tw-content);background-color:hsl(var(--heroui-foreground)/1)}.data-\[selected\=true\]\:after\:bg-primary[data-selected=true]:after{content:var(--tw-content);background-color:var(--color-primary)}.data-\[selected\=true\]\:after\:bg-secondary[data-selected=true]:after{content:var(--tw-content);background-color:hsl(var(--heroui-secondary)/1)}.data-\[selected\=true\]\:after\:bg-success[data-selected=true]:after{content:var(--tw-content);background-color:hsl(var(--heroui-success)/1)}.data-\[selected\=true\]\:after\:bg-warning[data-selected=true]:after{content:var(--tw-content);background-color:hsl(var(--heroui-warning)/1)}.data-\[selected\=true\]\:after\:opacity-100[data-selected=true]:after{content:var(--tw-content);opacity:1}.data-\[selected\=true\]\:data-\[hover\=true\]\:bg-danger[data-selected=true][data-hover=true]{background-color:hsl(var(--heroui-danger)/1)}.data-\[selected\=true\]\:data-\[hover\=true\]\:bg-foreground[data-selected=true][data-hover=true]{background-color:hsl(var(--heroui-foreground)/1)}.data-\[selected\=true\]\:data-\[hover\=true\]\:bg-primary[data-selected=true][data-hover=true]{background-color:var(--color-primary)}.data-\[selected\=true\]\:data-\[hover\=true\]\:bg-secondary[data-selected=true][data-hover=true]{background-color:hsl(var(--heroui-secondary)/1)}.data-\[selected\=true\]\:data-\[hover\=true\]\:bg-success[data-selected=true][data-hover=true]{background-color:hsl(var(--heroui-success)/1)}.data-\[selected\=true\]\:data-\[hover\=true\]\:bg-warning[data-selected=true][data-hover=true]{background-color:hsl(var(--heroui-warning)/1)}.data-\[selected\=true\]\:data-\[hover\=true\]\:text-background[data-selected=true][data-hover=true]{color:hsl(var(--heroui-background)/1)}.data-\[selected\=true\]\:data-\[hover\=true\]\:text-danger-foreground[data-selected=true][data-hover=true]{color:hsl(var(--heroui-danger-foreground)/1)}.data-\[selected\=true\]\:data-\[hover\=true\]\:text-primary-foreground[data-selected=true][data-hover=true]{color:hsl(var(--heroui-primary-foreground)/1)}.data-\[selected\=true\]\:data-\[hover\=true\]\:text-secondary-foreground[data-selected=true][data-hover=true]{color:hsl(var(--heroui-secondary-foreground)/1)}.data-\[selected\=true\]\:data-\[hover\=true\]\:text-success-foreground[data-selected=true][data-hover=true]{color:hsl(var(--heroui-success-foreground)/1)}.data-\[selected\=true\]\:data-\[hover\=true\]\:text-warning-foreground[data-selected=true][data-hover=true]{color:hsl(var(--heroui-warning-foreground)/1)}.data-\[selected\=true\]\:data-\[range-selection\=true\]\:bg-transparent[data-selected=true][data-range-selection=true]{background-color:#0000}.data-\[selected\=true\]\:data-\[range-selection\=true\]\:text-danger-500[data-selected=true][data-range-selection=true]{color:hsl(var(--heroui-danger-500)/1)}.data-\[selected\=true\]\:data-\[range-selection\=true\]\:text-foreground[data-selected=true][data-range-selection=true]{color:hsl(var(--heroui-foreground)/1)}.data-\[selected\=true\]\:data-\[range-selection\=true\]\:text-primary[data-selected=true][data-range-selection=true]{color:var(--color-primary)}.data-\[selected\=true\]\:data-\[range-selection\=true\]\:text-secondary[data-selected=true][data-range-selection=true]{color:hsl(var(--heroui-secondary)/1)}.data-\[selected\=true\]\:data-\[range-selection\=true\]\:text-success-600[data-selected=true][data-range-selection=true]{color:hsl(var(--heroui-success-600)/1)}.data-\[selected\=true\]\:data-\[range-selection\=true\]\:text-warning-500[data-selected=true][data-range-selection=true]{color:hsl(var(--heroui-warning-500)/1)}.data-\[selected\=true\]\:data-\[range-selection\=true\]\:before\:bg-danger-50[data-selected=true][data-range-selection=true]:before{content:var(--tw-content);background-color:hsl(var(--heroui-danger-50)/1)}.data-\[selected\=true\]\:data-\[range-selection\=true\]\:before\:bg-foreground\/10[data-selected=true][data-range-selection=true]:before{content:var(--tw-content);background-color:hsl(var(--heroui-foreground)/1)}@supports (color:color-mix(in lab,red,red)){.data-\[selected\=true\]\:data-\[range-selection\=true\]\:before\:bg-foreground\/10[data-selected=true][data-range-selection=true]:before{background-color:color-mix(in oklab,hsl(var(--heroui-foreground)/1)10%,transparent)}}.data-\[selected\=true\]\:data-\[range-selection\=true\]\:before\:bg-primary-50[data-selected=true][data-range-selection=true]:before{content:var(--tw-content);background-color:hsl(var(--heroui-primary-50)/1)}.data-\[selected\=true\]\:data-\[range-selection\=true\]\:before\:bg-secondary-50[data-selected=true][data-range-selection=true]:before{content:var(--tw-content);background-color:hsl(var(--heroui-secondary-50)/1)}.data-\[selected\=true\]\:data-\[range-selection\=true\]\:before\:bg-success-100[data-selected=true][data-range-selection=true]:before{content:var(--tw-content);background-color:hsl(var(--heroui-success-100)/1)}.data-\[selected\=true\]\:data-\[range-selection\=true\]\:before\:bg-warning-100[data-selected=true][data-range-selection=true]:before{content:var(--tw-content);background-color:hsl(var(--heroui-warning-100)/1)}.data-\[selected\=true\]\:data-\[range-selection\=true\]\:data-\[outside-month\=true\]\:bg-transparent[data-selected=true][data-range-selection=true][data-outside-month=true]{background-color:#0000}.data-\[selected\=true\]\:data-\[range-selection\=true\]\:data-\[outside-month\=true\]\:text-default-300[data-selected=true][data-range-selection=true][data-outside-month=true]{color:hsl(var(--heroui-default-300)/1)}.data-\[selection-end\=true\]\:before\:rounded-e-full[data-selection-end=true]:before{content:var(--tw-content);border-start-end-radius:3.40282e38px;border-end-end-radius:3.40282e38px}.data-\[selected\=true\]\:data-\[selection-end\=true\]\:shadow-md[data-selected=true][data-selection-end=true]{--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)}.data-\[selected\=true\]\:data-\[selection-end\=true\]\:data-\[range-selection\=true\]\:rounded-full[data-selected=true][data-selection-end=true][data-range-selection=true]{border-radius:3.40282e38px}.data-\[selected\=true\]\:data-\[selection-end\=true\]\:data-\[range-selection\=true\]\:bg-danger[data-selected=true][data-selection-end=true][data-range-selection=true]{background-color:hsl(var(--heroui-danger)/1)}.data-\[selected\=true\]\:data-\[selection-end\=true\]\:data-\[range-selection\=true\]\:bg-foreground[data-selected=true][data-selection-end=true][data-range-selection=true]{background-color:hsl(var(--heroui-foreground)/1)}.data-\[selected\=true\]\:data-\[selection-end\=true\]\:data-\[range-selection\=true\]\:bg-primary[data-selected=true][data-selection-end=true][data-range-selection=true]{background-color:var(--color-primary)}.data-\[selected\=true\]\:data-\[selection-end\=true\]\:data-\[range-selection\=true\]\:bg-secondary[data-selected=true][data-selection-end=true][data-range-selection=true]{background-color:hsl(var(--heroui-secondary)/1)}.data-\[selected\=true\]\:data-\[selection-end\=true\]\:data-\[range-selection\=true\]\:bg-success[data-selected=true][data-selection-end=true][data-range-selection=true]{background-color:hsl(var(--heroui-success)/1)}.data-\[selected\=true\]\:data-\[selection-end\=true\]\:data-\[range-selection\=true\]\:bg-warning[data-selected=true][data-selection-end=true][data-range-selection=true]{background-color:hsl(var(--heroui-warning)/1)}.data-\[selected\=true\]\:data-\[selection-end\=true\]\:data-\[range-selection\=true\]\:text-background[data-selected=true][data-selection-end=true][data-range-selection=true]{color:hsl(var(--heroui-background)/1)}.data-\[selected\=true\]\:data-\[selection-end\=true\]\:data-\[range-selection\=true\]\:text-danger-foreground[data-selected=true][data-selection-end=true][data-range-selection=true]{color:hsl(var(--heroui-danger-foreground)/1)}.data-\[selected\=true\]\:data-\[selection-end\=true\]\:data-\[range-selection\=true\]\:text-primary-foreground[data-selected=true][data-selection-end=true][data-range-selection=true]{color:hsl(var(--heroui-primary-foreground)/1)}.data-\[selected\=true\]\:data-\[selection-end\=true\]\:data-\[range-selection\=true\]\:text-secondary-foreground[data-selected=true][data-selection-end=true][data-range-selection=true]{color:hsl(var(--heroui-secondary-foreground)/1)}.data-\[selected\=true\]\:data-\[selection-end\=true\]\:data-\[range-selection\=true\]\:text-success-foreground[data-selected=true][data-selection-end=true][data-range-selection=true]{color:hsl(var(--heroui-success-foreground)/1)}.data-\[selected\=true\]\:data-\[selection-end\=true\]\:data-\[range-selection\=true\]\:text-warning-foreground[data-selected=true][data-selection-end=true][data-range-selection=true]{color:hsl(var(--heroui-warning-foreground)/1)}.data-\[selection-start\=true\]\:before\:rounded-s-full[data-selection-start=true]:before{content:var(--tw-content);border-start-start-radius:3.40282e38px;border-end-start-radius:3.40282e38px}.data-\[selected\=true\]\:data-\[selection-start\=true\]\:shadow-md[data-selected=true][data-selection-start=true]{--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)}.data-\[selected\=true\]\:data-\[selection-start\=true\]\:data-\[range-selection\=true\]\:rounded-full[data-selected=true][data-selection-start=true][data-range-selection=true]{border-radius:3.40282e38px}.data-\[selected\=true\]\:data-\[selection-start\=true\]\:data-\[range-selection\=true\]\:bg-danger[data-selected=true][data-selection-start=true][data-range-selection=true]{background-color:hsl(var(--heroui-danger)/1)}.data-\[selected\=true\]\:data-\[selection-start\=true\]\:data-\[range-selection\=true\]\:bg-foreground[data-selected=true][data-selection-start=true][data-range-selection=true]{background-color:hsl(var(--heroui-foreground)/1)}.data-\[selected\=true\]\:data-\[selection-start\=true\]\:data-\[range-selection\=true\]\:bg-primary[data-selected=true][data-selection-start=true][data-range-selection=true]{background-color:var(--color-primary)}.data-\[selected\=true\]\:data-\[selection-start\=true\]\:data-\[range-selection\=true\]\:bg-secondary[data-selected=true][data-selection-start=true][data-range-selection=true]{background-color:hsl(var(--heroui-secondary)/1)}.data-\[selected\=true\]\:data-\[selection-start\=true\]\:data-\[range-selection\=true\]\:bg-success[data-selected=true][data-selection-start=true][data-range-selection=true]{background-color:hsl(var(--heroui-success)/1)}.data-\[selected\=true\]\:data-\[selection-start\=true\]\:data-\[range-selection\=true\]\:bg-warning[data-selected=true][data-selection-start=true][data-range-selection=true]{background-color:hsl(var(--heroui-warning)/1)}.data-\[selected\=true\]\:data-\[selection-start\=true\]\:data-\[range-selection\=true\]\:text-background[data-selected=true][data-selection-start=true][data-range-selection=true]{color:hsl(var(--heroui-background)/1)}.data-\[selected\=true\]\:data-\[selection-start\=true\]\:data-\[range-selection\=true\]\:text-danger-foreground[data-selected=true][data-selection-start=true][data-range-selection=true]{color:hsl(var(--heroui-danger-foreground)/1)}.data-\[selected\=true\]\:data-\[selection-start\=true\]\:data-\[range-selection\=true\]\:text-primary-foreground[data-selected=true][data-selection-start=true][data-range-selection=true]{color:hsl(var(--heroui-primary-foreground)/1)}.data-\[selected\=true\]\:data-\[selection-start\=true\]\:data-\[range-selection\=true\]\:text-secondary-foreground[data-selected=true][data-selection-start=true][data-range-selection=true]{color:hsl(var(--heroui-secondary-foreground)/1)}.data-\[selected\=true\]\:data-\[selection-start\=true\]\:data-\[range-selection\=true\]\:text-success-foreground[data-selected=true][data-selection-start=true][data-range-selection=true]{color:hsl(var(--heroui-success-foreground)/1)}.data-\[selected\=true\]\:data-\[selection-start\=true\]\:data-\[range-selection\=true\]\:text-warning-foreground[data-selected=true][data-selection-start=true][data-range-selection=true]{color:hsl(var(--heroui-warning-foreground)/1)}.data-\[sortable\=true\]\:cursor-pointer[data-sortable=true]{cursor:pointer}.data-\[toast-exiting\=true\]\:transform-gpu[data-toast-exiting=true]{transform:translateZ(0)var(--tw-rotate-x,)var(--tw-rotate-y,)var(--tw-rotate-z,)var(--tw-skew-x,)var(--tw-skew-y,)}.data-\[toast-exiting\=true\]\:opacity-0[data-toast-exiting=true]{opacity:0}.data-\[toast-exiting\=true\]\:transition-all[data-toast-exiting=true]{transition-property:all;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.data-\[toast-exiting\=true\]\:duration-300[data-toast-exiting=true]{--tw-duration:.3s;transition-duration:.3s}.data-\[toast-exiting\=true\]\:ease-out[data-toast-exiting=true]{--tw-ease:var(--ease-out);transition-timing-function:var(--ease-out)}.data-\[toast-exiting\=true\]\:will-change-transform[data-toast-exiting=true]{will-change:transform}.data-\[toast-exiting\=true\]\:data-\[placement\=bottom-center\]\:translate-y-full[data-toast-exiting=true][data-placement=bottom-center]{--tw-translate-y:100%;translate:var(--tw-translate-x)var(--tw-translate-y)}.data-\[toast-exiting\=true\]\:data-\[placement\=bottom-left\]\:-translate-x-full[data-toast-exiting=true][data-placement=bottom-left]{--tw-translate-x:-100%;translate:var(--tw-translate-x)var(--tw-translate-y)}.data-\[toast-exiting\=true\]\:data-\[placement\=bottom-right\]\:translate-x-full[data-toast-exiting=true][data-placement=bottom-right]{--tw-translate-x:100%;translate:var(--tw-translate-x)var(--tw-translate-y)}.data-\[toast-exiting\=true\]\:data-\[placement\=top-center\]\:-translate-y-full[data-toast-exiting=true][data-placement=top-center]{--tw-translate-y:-100%;translate:var(--tw-translate-x)var(--tw-translate-y)}.data-\[toast-exiting\=true\]\:data-\[placement\=top-left\]\:-translate-x-full[data-toast-exiting=true][data-placement=top-left]{--tw-translate-x:-100%;translate:var(--tw-translate-x)var(--tw-translate-y)}.data-\[toast-exiting\=true\]\:data-\[placement\=top-right\]\:translate-x-full[data-toast-exiting=true][data-placement=top-right]{--tw-translate-x:100%;translate:var(--tw-translate-x)var(--tw-translate-y)}.data-\[top-bottom-scroll\=true\]\:\[mask-image\:linear-gradient\(\#000\,\#000\,transparent_0\,\#000_var\(--scroll-shadow-size\)\,\#000_calc\(100\%_-_var\(--scroll-shadow-size\)\)\,transparent\)\][data-top-bottom-scroll=true]{-webkit-mask-image:linear-gradient(#000,#000,transparent 0,#000 var(--scroll-shadow-size),#000 calc(100% - var(--scroll-shadow-size)),transparent);mask-image:linear-gradient(#000,#000,transparent 0,#000 var(--scroll-shadow-size),#000 calc(100% - var(--scroll-shadow-size)),transparent)}.data-\[top-scroll\=true\]\:\[mask-image\:linear-gradient\(0deg\,\#000_calc\(100\%_-_var\(--scroll-shadow-size\)\)\,transparent\)\][data-top-scroll=true]{-webkit-mask-image:linear-gradient(0deg,#000 calc(100% - var(--scroll-shadow-size)),transparent);mask-image:linear-gradient(0deg,#000 calc(100% - var(--scroll-shadow-size)),transparent)}.data-\[type\=color\]\:rounded-none[data-type=color]{border-radius:0}.data-\[unavailable\=true\]\:cursor-default[data-unavailable=true]{cursor:default}.data-\[unavailable\=true\]\:text-default-300[data-unavailable=true]{color:hsl(var(--heroui-default-300)/1)}.data-\[unavailable\=true\]\:line-through[data-unavailable=true]{text-decoration-line:line-through}.data-\[visible\=true\]\:pointer-events-auto[data-visible=true]{pointer-events:auto}.data-\[visible\=true\]\:cursor-pointer[data-visible=true]{cursor:pointer}.data-\[visible\=true\]\:opacity-100[data-visible=true]{opacity:1}@media (prefers-reduced-motion:no-preference){.motion-safe\:animate-pop-in{animation:var(--animate-pop-in)}}@media (prefers-reduced-motion:reduce){.motion-reduce\:scale-100{--tw-scale-x:100%;--tw-scale-y:100%;--tw-scale-z:100%;scale:var(--tw-scale-x)var(--tw-scale-y)}.motion-reduce\:transition-none{transition-property:none}.motion-reduce\:after\:transition-none:after{content:var(--tw-content);transition-property:none}}@media (min-width:28rem){.xs\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}}@media (min-width:40rem){.sm\:m-0{margin:calc(var(--spacing)*0)}.sm\:mx-0{margin-inline:calc(var(--spacing)*0)}.sm\:mx-1{margin-inline:calc(var(--spacing)*1)}.sm\:mx-6{margin-inline:calc(var(--spacing)*6)}.sm\:my-0{margin-block:calc(var(--spacing)*0)}.sm\:my-16{margin-block:calc(var(--spacing)*16)}.sm\:w-\[356px\]{width:356px}.sm\:w-auto{width:auto}.sm\:max-w-\[1200px\]{max-width:1200px}.sm\:grid-cols-6{grid-template-columns:repeat(6,minmax(0,1fr))}.sm\:items-center{align-items:center}.sm\:items-end{align-items:flex-end}.sm\:items-start{align-items:flex-start}.sm\:px-0{padding-inline:calc(var(--spacing)*0)}.sm\:\[--scale-enter\:100\%\]{--scale-enter:100%}.sm\:\[--scale-exit\:103\%\]{--scale-exit:103%}.sm\:\[--slide-enter\:0px\]{--slide-enter:0px}.sm\:\[--slide-exit\:0px\]{--slide-exit:0px}.sm\:data-\[placement\=bottom-center\]\:mx-auto[data-placement=bottom-center]{margin-inline:auto}.sm\:data-\[placement\=bottom-center\]\:w-max[data-placement=bottom-center]{width:max-content}.sm\:data-\[placement\=bottom-left\]\:ml-2[data-placement=bottom-left]{margin-left:calc(var(--spacing)*2)}.sm\:data-\[placement\=bottom-left\]\:w-max[data-placement=bottom-left]{width:max-content}.sm\:data-\[placement\=bottom-right\]\:mr-2[data-placement=bottom-right]{margin-right:calc(var(--spacing)*2)}.sm\:data-\[placement\=bottom-right\]\:w-max[data-placement=bottom-right]{width:max-content}.sm\:data-\[placement\=top-center\]\:mx-auto[data-placement=top-center]{margin-inline:auto}.sm\:data-\[placement\=top-center\]\:w-max[data-placement=top-center]{width:max-content}.sm\:data-\[placement\=top-left\]\:ml-2[data-placement=top-left]{margin-left:calc(var(--spacing)*2)}.sm\:data-\[placement\=top-left\]\:w-max[data-placement=top-left]{width:max-content}.sm\:data-\[placement\=top-right\]\:mr-2[data-placement=top-right]{margin-right:calc(var(--spacing)*2)}.sm\:data-\[placement\=top-right\]\:w-max[data-placement=top-right]{width:max-content}.sm\:data-\[visible\=true\]\:pointer-events-none[data-visible=true]{pointer-events:none}.sm\:data-\[visible\=true\]\:opacity-0[data-visible=true]{opacity:0}.sm\:group-data-\[hover\=true\]\:data-\[visible\=true\]\:pointer-events-auto:is(:where(.group)[data-hover=true] *)[data-visible=true]{pointer-events:auto}.sm\:group-data-\[hover\=true\]\:data-\[visible\=true\]\:opacity-100:is(:where(.group)[data-hover=true] *)[data-visible=true]{opacity:1}}@media (min-width:48rem){.md\:grid-cols-8{grid-template-columns:repeat(8,minmax(0,1fr))}}@media (min-width:64rem){.lg\:grid-cols-12{grid-template-columns:repeat(12,minmax(0,1fr))}}.rtl\:right-auto:where(:dir(rtl),[dir=rtl],[dir=rtl] *){right:auto}.rtl\:left-2:where(:dir(rtl),[dir=rtl],[dir=rtl] *){left:calc(var(--spacing)*2)}.rtl\:origin-top-right:where(:dir(rtl),[dir=rtl],[dir=rtl] *){transform-origin:100% 0}.rtl\:-rotate-180:where(:dir(rtl),[dir=rtl],[dir=rtl] *){rotate:-180deg}.rtl\:rotate-180:where(:dir(rtl),[dir=rtl],[dir=rtl] *){rotate:180deg}.rtl\:flex-row-reverse:where(:dir(rtl),[dir=rtl],[dir=rtl] *){flex-direction:row-reverse}:where(.rtl\:space-x-reverse:where(:dir(rtl),[dir=rtl],[dir=rtl] *)>:not(:last-child)){--tw-space-x-reverse:1}.rtl\:data-\[focus-visible\=true\]\:translate-x-3:where(:dir(rtl),[dir=rtl],[dir=rtl] *)[data-focus-visible=true],.rtl\:data-\[hover\=true\]\:translate-x-3:where(:dir(rtl),[dir=rtl],[dir=rtl] *)[data-hover=true]{--tw-translate-x:calc(var(--spacing)*3);translate:var(--tw-translate-x)var(--tw-translate-y)}.rtl\:data-\[open\=true\]\:-rotate-90:where(:dir(rtl),[dir=rtl],[dir=rtl] *)[data-open=true]{rotate:-90deg}.dark\:border-danger-100:is(.dark *){border-color:hsl(var(--heroui-danger-100)/1)}.dark\:border-default-200:is(.dark *){border-color:hsl(var(--heroui-default-200)/1)}.dark\:border-primary-100:is(.dark *){border-color:hsl(var(--heroui-primary-100)/1)}.dark\:border-success-100:is(.dark *){border-color:hsl(var(--heroui-success-100)/1)}.dark\:border-warning-100:is(.dark *){border-color:hsl(var(--heroui-warning-100)/1)}.dark\:bg-background:is(.dark *),.dark\:bg-background\/20:is(.dark *){background-color:hsl(var(--heroui-background)/1)}@supports (color:color-mix(in lab,red,red)){.dark\:bg-background\/20:is(.dark *){background-color:color-mix(in oklab,hsl(var(--heroui-background)/1)20%,transparent)}}.dark\:bg-content2:is(.dark *){background-color:hsl(var(--heroui-content2)/1)}.dark\:bg-danger-50:is(.dark *),.dark\:bg-danger-50\/50:is(.dark *){background-color:hsl(var(--heroui-danger-50)/1)}@supports (color:color-mix(in lab,red,red)){.dark\:bg-danger-50\/50:is(.dark *){background-color:color-mix(in oklab,hsl(var(--heroui-danger-50)/1)50%,transparent)}}.dark\:bg-danger-100:is(.dark *){background-color:hsl(var(--heroui-danger-100)/1)}.dark\:bg-default:is(.dark *){background-color:hsl(var(--heroui-default)/1)}.dark\:bg-default-50\/50:is(.dark *){background-color:hsl(var(--heroui-default-50)/1)}@supports (color:color-mix(in lab,red,red)){.dark\:bg-default-50\/50:is(.dark *){background-color:color-mix(in oklab,hsl(var(--heroui-default-50)/1)50%,transparent)}}.dark\:bg-default-100:is(.dark *){background-color:hsl(var(--heroui-default-100)/1)}.dark\:bg-primary-50:is(.dark *),.dark\:bg-primary-50\/50:is(.dark *){background-color:hsl(var(--heroui-primary-50)/1)}@supports (color:color-mix(in lab,red,red)){.dark\:bg-primary-50\/50:is(.dark *){background-color:color-mix(in oklab,hsl(var(--heroui-primary-50)/1)50%,transparent)}}.dark\:bg-primary-100:is(.dark *){background-color:hsl(var(--heroui-primary-100)/1)}.dark\:bg-secondary-50:is(.dark *),.dark\:bg-secondary-50\/50:is(.dark *){background-color:hsl(var(--heroui-secondary-50)/1)}@supports (color:color-mix(in lab,red,red)){.dark\:bg-secondary-50\/50:is(.dark *){background-color:color-mix(in oklab,hsl(var(--heroui-secondary-50)/1)50%,transparent)}}.dark\:bg-secondary-100:is(.dark *){background-color:hsl(var(--heroui-secondary-100)/1)}.dark\:bg-success-50:is(.dark *),.dark\:bg-success-50\/50:is(.dark *){background-color:hsl(var(--heroui-success-50)/1)}@supports (color:color-mix(in lab,red,red)){.dark\:bg-success-50\/50:is(.dark *){background-color:color-mix(in oklab,hsl(var(--heroui-success-50)/1)50%,transparent)}}.dark\:bg-success-100:is(.dark *){background-color:hsl(var(--heroui-success-100)/1)}.dark\:bg-transparent:is(.dark *){background-color:#0000}.dark\:bg-warning-50:is(.dark *),.dark\:bg-warning-50\/50:is(.dark *){background-color:hsl(var(--heroui-warning-50)/1)}@supports (color:color-mix(in lab,red,red)){.dark\:bg-warning-50\/50:is(.dark *){background-color:color-mix(in oklab,hsl(var(--heroui-warning-50)/1)50%,transparent)}}.dark\:bg-warning-100:is(.dark *){background-color:hsl(var(--heroui-warning-100)/1)}.dark\:text-danger-500:is(.dark *){color:hsl(var(--heroui-danger-500)/1)}.dark\:text-success:is(.dark *){color:hsl(var(--heroui-success)/1)}.dark\:text-warning:is(.dark *){color:hsl(var(--heroui-warning)/1)}.dark\:prose-invert:is(.dark *){--tw-prose-body:var(--tw-prose-invert-body);--tw-prose-headings:var(--tw-prose-invert-headings);--tw-prose-lead:var(--tw-prose-invert-lead);--tw-prose-links:var(--tw-prose-invert-links);--tw-prose-bold:var(--tw-prose-invert-bold);--tw-prose-counters:var(--tw-prose-invert-counters);--tw-prose-bullets:var(--tw-prose-invert-bullets);--tw-prose-hr:var(--tw-prose-invert-hr);--tw-prose-quotes:var(--tw-prose-invert-quotes);--tw-prose-quote-borders:var(--tw-prose-invert-quote-borders);--tw-prose-captions:var(--tw-prose-invert-captions);--tw-prose-kbd:var(--tw-prose-invert-kbd);--tw-prose-kbd-shadows:var(--tw-prose-invert-kbd-shadows);--tw-prose-code:var(--tw-prose-invert-code);--tw-prose-pre-code:var(--tw-prose-invert-pre-code);--tw-prose-pre-bg:var(--tw-prose-invert-pre-bg);--tw-prose-th-borders:var(--tw-prose-invert-th-borders);--tw-prose-td-borders:var(--tw-prose-invert-td-borders)}.dark\:placeholder\:text-danger-500:is(.dark *)::placeholder{color:hsl(var(--heroui-danger-500)/1)}.dark\:placeholder\:text-success:is(.dark *)::placeholder{color:hsl(var(--heroui-success)/1)}.dark\:placeholder\:text-warning:is(.dark *)::placeholder{color:hsl(var(--heroui-warning)/1)}.dark\:before\:via-default-700\/10:is(.dark *):before{content:var(--tw-content);--tw-gradient-via:hsl(var(--heroui-default-700)/1)}@supports (color:color-mix(in lab,red,red)){.dark\:before\:via-default-700\/10:is(.dark *):before{--tw-gradient-via:color-mix(in oklab,hsl(var(--heroui-default-700)/1)10%,transparent)}}.dark\:before\:via-default-700\/10:is(.dark *):before{--tw-gradient-via-stops:var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-via)var(--tw-gradient-via-position),var(--tw-gradient-to)var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-via-stops)}.dark\:after\:bg-content2:is(.dark *):after{content:var(--tw-content);background-color:hsl(var(--heroui-content2)/1)}.dark\:focus\:bg-danger-400\/20:is(.dark *):focus{background-color:hsl(var(--heroui-danger-400)/1)}@supports (color:color-mix(in lab,red,red)){.dark\:focus\:bg-danger-400\/20:is(.dark *):focus{background-color:color-mix(in oklab,hsl(var(--heroui-danger-400)/1)20%,transparent)}}.dark\:focus\:bg-success-400\/20:is(.dark *):focus{background-color:hsl(var(--heroui-success-400)/1)}@supports (color:color-mix(in lab,red,red)){.dark\:focus\:bg-success-400\/20:is(.dark *):focus{background-color:color-mix(in oklab,hsl(var(--heroui-success-400)/1)20%,transparent)}}.dark\:focus\:bg-warning-400\/20:is(.dark *):focus{background-color:hsl(var(--heroui-warning-400)/1)}@supports (color:color-mix(in lab,red,red)){.dark\:focus\:bg-warning-400\/20:is(.dark *):focus{background-color:color-mix(in oklab,hsl(var(--heroui-warning-400)/1)20%,transparent)}}.dark\:data-\[hover\=true\]\:bg-content2:is(.dark *)[data-hover=true]{background-color:hsl(var(--heroui-content2)/1)}.dark\:data-\[hover\=true\]\:bg-danger-50:is(.dark *)[data-hover=true]{background-color:hsl(var(--heroui-danger-50)/1)}.dark\:data-\[hover\=true\]\:bg-success-50:is(.dark *)[data-hover=true]{background-color:hsl(var(--heroui-success-50)/1)}.dark\:data-\[hover\=true\]\:bg-warning-50:is(.dark *)[data-hover=true]{background-color:hsl(var(--heroui-warning-50)/1)}.dark\:data-\[hover\=true\]\:text-danger-500:is(.dark *)[data-hover=true]{color:hsl(var(--heroui-danger-500)/1)}.dark\:data-\[hover\=true\]\:text-success-500:is(.dark *)[data-hover=true]{color:hsl(var(--heroui-success-500)/1)}.dark\:data-\[hover\=true\]\:text-warning-500:is(.dark *)[data-hover=true]{color:hsl(var(--heroui-warning-500)/1)}.dark\:data-\[invalid\=true\]\:focus\:bg-danger-400\/20:is(.dark *)[data-invalid=true]:focus{background-color:hsl(var(--heroui-danger-400)/1)}@supports (color:color-mix(in lab,red,red)){.dark\:data-\[invalid\=true\]\:focus\:bg-danger-400\/20:is(.dark *)[data-invalid=true]:focus{background-color:color-mix(in oklab,hsl(var(--heroui-danger-400)/1)20%,transparent)}}.dark\:data-\[selected\=true\]\:text-danger-500:is(.dark *)[data-selected=true]{color:hsl(var(--heroui-danger-500)/1)}.dark\:data-\[selected\=true\]\:text-success:is(.dark *)[data-selected=true]{color:hsl(var(--heroui-success)/1)}.dark\:data-\[selected\=true\]\:text-warning:is(.dark *)[data-selected=true]{color:hsl(var(--heroui-warning)/1)}.dark\:data-\[selected\=true\]\:data-\[hover\=true\]\:bg-danger:is(.dark *)[data-selected=true][data-hover=true]{background-color:hsl(var(--heroui-danger)/1)}.dark\:data-\[selected\=true\]\:data-\[hover\=true\]\:bg-success:is(.dark *)[data-selected=true][data-hover=true]{background-color:hsl(var(--heroui-success)/1)}.dark\:data-\[selected\=true\]\:data-\[hover\=true\]\:bg-warning:is(.dark *)[data-selected=true][data-hover=true]{background-color:hsl(var(--heroui-warning)/1)}.dark\:data-\[selected\=true\]\:data-\[hover\=true\]\:text-danger-foreground:is(.dark *)[data-selected=true][data-hover=true]{color:hsl(var(--heroui-danger-foreground)/1)}.dark\:data-\[selected\=true\]\:data-\[hover\=true\]\:text-success-foreground:is(.dark *)[data-selected=true][data-hover=true]{color:hsl(var(--heroui-success-foreground)/1)}.dark\:data-\[selected\=true\]\:data-\[hover\=true\]\:text-warning-foreground:is(.dark *)[data-selected=true][data-hover=true]{color:hsl(var(--heroui-warning-foreground)/1)}.dark\:data-\[selected\=true\]\:data-\[range-selection\=true\]\:text-success-500:is(.dark *)[data-selected=true][data-range-selection=true]{color:hsl(var(--heroui-success-500)/1)}.dark\:data-\[selected\=true\]\:data-\[range-selection\=true\]\:before\:bg-success-50:is(.dark *)[data-selected=true][data-range-selection=true]:before{content:var(--tw-content);background-color:hsl(var(--heroui-success-50)/1)}.dark\:data-\[selected\=true\]\:data-\[range-selection\=true\]\:before\:bg-warning-50:is(.dark *)[data-selected=true][data-range-selection=true]:before{content:var(--tw-content);background-color:hsl(var(--heroui-warning-50)/1)}.dark\:data-\[selected\=true\]\:data-\[selection-end\=true\]\:data-\[range-selection\=true\]\:text-success-foreground:is(.dark *)[data-selected=true][data-selection-end=true][data-range-selection=true],.dark\:data-\[selected\=true\]\:data-\[selection-start\=true\]\:data-\[range-selection\=true\]\:text-success-foreground:is(.dark *)[data-selected=true][data-selection-start=true][data-range-selection=true]{color:hsl(var(--heroui-success-foreground)/1)}.\[\&_\.chevron-icon\]\:flex-none .chevron-icon{flex:none}.\[\&_\.chevron-icon\]\:rotate-180 .chevron-icon{rotate:180deg}.\[\&_\.chevron-icon\]\:transition-transform .chevron-icon{transition-property:transform,translate,scale,rotate;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.\[\&\+\.border-medium\.border-danger\]\:ms-\[calc\(var\(--heroui-border-width-medium\)\*-1\)\]+.border-medium.border-danger,.\[\&\+\.border-medium\.border-default\]\:ms-\[calc\(var\(--heroui-border-width-medium\)\*-1\)\]+.border-medium.border-default,.\[\&\+\.border-medium\.border-primary\]\:ms-\[calc\(var\(--heroui-border-width-medium\)\*-1\)\]+.border-medium.border-primary,.\[\&\+\.border-medium\.border-secondary\]\:ms-\[calc\(var\(--heroui-border-width-medium\)\*-1\)\]+.border-medium.border-secondary,.\[\&\+\.border-medium\.border-success\]\:ms-\[calc\(var\(--heroui-border-width-medium\)\*-1\)\]+.border-medium.border-success,.\[\&\+\.border-medium\.border-warning\]\:ms-\[calc\(var\(--heroui-border-width-medium\)\*-1\)\]+.border-medium.border-warning{margin-inline-start:calc(var(--heroui-border-width-medium)*-1)}.\[\&\:not\(\:first-child\)\]\:-ml-1:not(:first-child){margin-left:calc(var(--spacing)*-1)}.\[\&\:not\(\:first-child\)\:not\(\:last-child\)\]\:rounded-none:not(:first-child):not(:last-child){border-radius:0}.\[\&\:not\(\:first-of-type\)\]\:ms-\[calc\(theme\(borderWidth\.2\)\*-1\)\]:not(:first-of-type){margin-inline-start:-2px}.\[\&\:not\(\:first-of-type\)\:not\(\:last-of-type\)\]\:rounded-none:not(:first-of-type):not(:last-of-type){border-radius:0}.\[\&\>\*\]\:relative>*{position:relative}.\[\&\>\*\]\:z-1>*{z-index:1}.\[\&\>svg\]\:max-w-\[theme\(spacing\.8\)\]>svg{max-width:2rem}.\[\&\>tr\]\:first\:rounded-lg>tr:first-child{border-radius:var(--radius-lg)}.\[\&\>tr\]\:first\:shadow-small>tr:first-child{--tw-shadow:var(--heroui-box-shadow-small);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.\[\&\[data-hover\=true\]\:not\(\[data-active\=true\]\)\]\:bg-default-100[data-hover=true]:not([data-active=true]){background-color:hsl(var(--heroui-default-100)/1)}.\[\&\[data-hover\=true\]\:not\(\[data-active\=true\]\)\]\:bg-default-200[data-hover=true]:not([data-active=true]){background-color:hsl(var(--heroui-default-200)/1)}}.markdown-container code:before,.markdown-container code:after{content:none}.prose{overflow-wrap:break-word}@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}@property --tw-rotate-y{syntax:"*";inherits:false}@property --tw-rotate-z{syntax:"*";inherits:false}@property --tw-skew-x{syntax:"*";inherits:false}@property --tw-skew-y{syntax:"*";inherits:false}@property --tw-scroll-snap-strictness{syntax:"*";inherits:false;initial-value:proximity}@property --tw-space-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-space-x-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-ordinal{syntax:"*";inherits:false}@property --tw-slashed-zero{syntax:"*";inherits:false}@property --tw-numeric-figure{syntax:"*";inherits:false}@property --tw-numeric-spacing{syntax:"*";inherits:false}@property --tw-numeric-fraction{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@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-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-drop-shadow-color{syntax:"*";inherits:false}@property --tw-drop-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-drop-shadow-size{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-ease{syntax:"*";inherits:false}@property --tw-content{syntax:"*";inherits:false;initial-value:""}@property --tw-outline-style{syntax:"*";inherits:false;initial-value:solid}@keyframes spin{to{transform:rotate(360deg)}}@keyframes pop-in{0%{opacity:0;transform:scale(.8)}to{opacity:1;transform:scale(1)}}@keyframes shimmer{to{transform:translate(200%)}}@keyframes spinner-spin{0%{transform:rotate(0)}to{transform:rotate(360deg)}}@keyframes drip-expand{0%{opacity:.2;transform:scale(0)}to{opacity:0;transform:scale(2)}}@keyframes appearance-in{0%{opacity:0;transform:translateZ(0)scale(.95)}60%{opacity:.75;backface-visibility:hidden;webkit-font-smoothing:antialiased;transform:translateZ(0)scale(1.05)}to{opacity:1;transform:translateZ(0)scale(1)}}@keyframes indeterminate-bar{0%{transform:translate(-50%)scaleX(.2)}to{transform:translate(100%)scaleX(1)}}@keyframes sway{0%{transform:translate(0)}50%{transform:translateY(-150%)}to{transform:translate(0)}}@keyframes blink{0%{opacity:.2}20%{opacity:1}to{opacity:.2}}@keyframes fade-out{0%{opacity:1}to{opacity:.15}}._GzYRV{line-height:1.2;white-space:pre-wrap;white-space:-moz-pre-wrap;white-space:-pre-wrap;white-space:-o-pre-wrap;word-wrap:break-word}._3eOF8{margin-right:5px;font-weight:700}._3eOF8+._3eOF8{margin-left:-5px}._1MFti{cursor:pointer}._f10Tu{font-size:1.2em;margin-right:5px;-webkit-user-select:none;-moz-user-select:none;user-select:none}._1UmXx:after{content:"▸"}._1LId0:after{content:"▾"}._1pNG9{margin-right:5px}._1pNG9:after{content:"...";font-size:.8em}._2IvMF{background:#eee}._2bkNM{margin:0;padding:0 10px}._1BXBN{margin:0;padding:0}._1MGIk{font-weight:600;margin-right:5px;color:#000}._3uHL6{color:#000}._2T6PJ,._1Gho6{color:#df113a}._vGjyY{color:#2a3f3c}._1bQdo{color:#0b75f5}._3zQKs{color:#469038}._1xvuR{color:#43413d}._oLqym,._2AXVT,._2KJWg{color:#000}._11RoI{background:#002b36}._17H2C,._3QHg2,._3fDAz{color:#fdf6e3}._2bSDX{font-weight:bolder;margin-right:5px;color:#fdf6e3}._gsbQL{color:#fdf6e3}._LaAZe,._GTKgm{color:#81b5ac}._Chy1W{color:#cb4b16}._2bveF{color:#d33682}._2vRm-{color:#ae81ff}._1prJR{color:#268bd2} diff --git a/packages/ragbits-chat/src/ragbits/chat/ui-build/assets/index-BTypXP0X.js b/packages/ragbits-chat/src/ragbits/chat/ui-build/assets/index-BTypXP0X.js new file mode 100644 index 000000000..a56a1ea16 --- /dev/null +++ b/packages/ragbits-chat/src/ragbits/chat/ui-build/assets/index-BTypXP0X.js @@ -0,0 +1,127 @@ +const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/FeedbackForm-Cuu7ROp3.js","assets/index-CTrBaHsz.js","assets/chunk-SSA7SXE4-CpT2ku66.js","assets/index-nfbmdcVN.js","assets/chunk-IGSAU2ZA-RYoue1Xd.js","assets/ChatOptionsForm-CUT15Ecj.js","assets/ShareButton-DpNGX0tU.js","assets/UsageButton-I3vvJAZH.js","assets/Login-xlop2v42.js","assets/authStore-Ur4ZGows.js","assets/AuthGuard-Cg314rC1.js","assets/LogoutButton-Cp3E_g1o.js"])))=>i.map(i=>d[i]); +(function(){const t=document.createElement("link").relList;if(t&&t.supports&&t.supports("modulepreload"))return;for(const i of document.querySelectorAll('link[rel="modulepreload"]'))r(i);new MutationObserver(i=>{for(const s of i)if(s.type==="childList")for(const l of s.addedNodes)l.tagName==="LINK"&&l.rel==="modulepreload"&&r(l)}).observe(document,{childList:!0,subtree:!0});function n(i){const s={};return i.integrity&&(s.integrity=i.integrity),i.referrerPolicy&&(s.referrerPolicy=i.referrerPolicy),i.crossOrigin==="use-credentials"?s.credentials="include":i.crossOrigin==="anonymous"?s.credentials="omit":s.credentials="same-origin",s}function r(i){if(i.ep)return;i.ep=!0;const s=n(i);fetch(i.href,s)}})();var og=typeof globalThis<"u"?globalThis:typeof window<"u"?window:typeof global<"u"?global:typeof self<"u"?self:{};function dv(e){return e&&e.__esModule&&Object.prototype.hasOwnProperty.call(e,"default")?e.default:e}var zy={exports:{}},hp={},jy={exports:{}},ht={};/** + * @license React + * react.production.min.js + * + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */var n1;function XR(){if(n1)return ht;n1=1;var e=Symbol.for("react.element"),t=Symbol.for("react.portal"),n=Symbol.for("react.fragment"),r=Symbol.for("react.strict_mode"),i=Symbol.for("react.profiler"),s=Symbol.for("react.provider"),l=Symbol.for("react.context"),c=Symbol.for("react.forward_ref"),d=Symbol.for("react.suspense"),h=Symbol.for("react.memo"),m=Symbol.for("react.lazy"),g=Symbol.iterator;function b(U){return U===null||typeof U!="object"?null:(U=g&&U[g]||U["@@iterator"],typeof U=="function"?U:null)}var x={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},k=Object.assign,P={};function _(U,ie,O){this.props=U,this.context=ie,this.refs=P,this.updater=O||x}_.prototype.isReactComponent={},_.prototype.setState=function(U,ie){if(typeof U!="object"&&typeof U!="function"&&U!=null)throw Error("setState(...): takes an object of state variables to update or a function which returns an object of state variables.");this.updater.enqueueSetState(this,U,ie,"setState")},_.prototype.forceUpdate=function(U){this.updater.enqueueForceUpdate(this,U,"forceUpdate")};function T(){}T.prototype=_.prototype;function $(U,ie,O){this.props=U,this.context=ie,this.refs=P,this.updater=O||x}var L=$.prototype=new T;L.constructor=$,k(L,_.prototype),L.isPureReactComponent=!0;var z=Array.isArray,K=Object.prototype.hasOwnProperty,M={current:null},J={key:!0,ref:!0,__self:!0,__source:!0};function re(U,ie,O){var me,Ce={},ye=null,Fe=null;if(ie!=null)for(me in ie.ref!==void 0&&(Fe=ie.ref),ie.key!==void 0&&(ye=""+ie.key),ie)K.call(ie,me)&&!J.hasOwnProperty(me)&&(Ce[me]=ie[me]);var De=arguments.length-2;if(De===1)Ce.children=O;else if(1>>1,ie=V[U];if(0>>1;Ui(Ce,R))yei(Fe,Ce)?(V[U]=Fe,V[ye]=R,U=ye):(V[U]=Ce,V[me]=R,U=me);else if(yei(Fe,R))V[U]=Fe,V[ye]=R,U=ye;else break e}}return se}function i(V,se){var R=V.sortIndex-se.sortIndex;return R!==0?R:V.id-se.id}if(typeof performance=="object"&&typeof performance.now=="function"){var s=performance;e.unstable_now=function(){return s.now()}}else{var l=Date,c=l.now();e.unstable_now=function(){return l.now()-c}}var d=[],h=[],m=1,g=null,b=3,x=!1,k=!1,P=!1,_=typeof setTimeout=="function"?setTimeout:null,T=typeof clearTimeout=="function"?clearTimeout:null,$=typeof setImmediate<"u"?setImmediate:null;typeof navigator<"u"&&navigator.scheduling!==void 0&&navigator.scheduling.isInputPending!==void 0&&navigator.scheduling.isInputPending.bind(navigator.scheduling);function L(V){for(var se=n(h);se!==null;){if(se.callback===null)r(h);else if(se.startTime<=V)r(h),se.sortIndex=se.expirationTime,t(d,se);else break;se=n(h)}}function z(V){if(P=!1,L(V),!k)if(n(d)!==null)k=!0,Z(K);else{var se=n(h);se!==null&&q(z,se.startTime-V)}}function K(V,se){k=!1,P&&(P=!1,T(re),re=-1),x=!0;var R=b;try{for(L(se),g=n(d);g!==null&&(!(g.expirationTime>se)||V&&!B());){var U=g.callback;if(typeof U=="function"){g.callback=null,b=g.priorityLevel;var ie=U(g.expirationTime<=se);se=e.unstable_now(),typeof ie=="function"?g.callback=ie:g===n(d)&&r(d),L(se)}else r(d);g=n(d)}if(g!==null)var O=!0;else{var me=n(h);me!==null&&q(z,me.startTime-se),O=!1}return O}finally{g=null,b=R,x=!1}}var M=!1,J=null,re=-1,ae=5,j=-1;function B(){return!(e.unstable_now()-jV||125U?(V.sortIndex=R,t(h,V),n(d)===null&&V===n(h)&&(P?(T(re),re=-1):P=!0,q(z,R-U))):(V.sortIndex=ie,t(d,V),k||x||(k=!0,Z(K))),V},e.unstable_shouldYield=B,e.unstable_wrapCallback=function(V){var se=b;return function(){var R=b;b=se;try{return V.apply(this,arguments)}finally{b=R}}}}(Uy)),Uy}var l1;function eL(){return l1||(l1=1,Vy.exports=ZR()),Vy.exports}/** + * @license React + * react-dom.production.min.js + * + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */var a1;function tL(){if(a1)return ni;a1=1;var e=ix(),t=eL();function n(o){for(var a="https://reactjs.org/docs/error-decoder.html?invariant="+o,p=1;p"u"||typeof window.document>"u"||typeof window.document.createElement>"u"),d=Object.prototype.hasOwnProperty,h=/^[:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD][:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD\-.0-9\u00B7\u0300-\u036F\u203F-\u2040]*$/,m={},g={};function b(o){return d.call(g,o)?!0:d.call(m,o)?!1:h.test(o)?g[o]=!0:(m[o]=!0,!1)}function x(o,a,p,v){if(p!==null&&p.type===0)return!1;switch(typeof a){case"function":case"symbol":return!0;case"boolean":return v?!1:p!==null?!p.acceptsBooleans:(o=o.toLowerCase().slice(0,5),o!=="data-"&&o!=="aria-");default:return!1}}function k(o,a,p,v){if(a===null||typeof a>"u"||x(o,a,p,v))return!0;if(v)return!1;if(p!==null)switch(p.type){case 3:return!a;case 4:return a===!1;case 5:return isNaN(a);case 6:return isNaN(a)||1>a}return!1}function P(o,a,p,v,w,C,A){this.acceptsBooleans=a===2||a===3||a===4,this.attributeName=v,this.attributeNamespace=w,this.mustUseProperty=p,this.propertyName=o,this.type=a,this.sanitizeURL=C,this.removeEmptyString=A}var _={};"children dangerouslySetInnerHTML defaultValue defaultChecked innerHTML suppressContentEditableWarning suppressHydrationWarning style".split(" ").forEach(function(o){_[o]=new P(o,0,!1,o,null,!1,!1)}),[["acceptCharset","accept-charset"],["className","class"],["htmlFor","for"],["httpEquiv","http-equiv"]].forEach(function(o){var a=o[0];_[a]=new P(a,1,!1,o[1],null,!1,!1)}),["contentEditable","draggable","spellCheck","value"].forEach(function(o){_[o]=new P(o,2,!1,o.toLowerCase(),null,!1,!1)}),["autoReverse","externalResourcesRequired","focusable","preserveAlpha"].forEach(function(o){_[o]=new P(o,2,!1,o,null,!1,!1)}),"allowFullScreen async autoFocus autoPlay controls default defer disabled disablePictureInPicture disableRemotePlayback formNoValidate hidden loop noModule noValidate open playsInline readOnly required reversed scoped seamless itemScope".split(" ").forEach(function(o){_[o]=new P(o,3,!1,o.toLowerCase(),null,!1,!1)}),["checked","multiple","muted","selected"].forEach(function(o){_[o]=new P(o,3,!0,o,null,!1,!1)}),["capture","download"].forEach(function(o){_[o]=new P(o,4,!1,o,null,!1,!1)}),["cols","rows","size","span"].forEach(function(o){_[o]=new P(o,6,!1,o,null,!1,!1)}),["rowSpan","start"].forEach(function(o){_[o]=new P(o,5,!1,o.toLowerCase(),null,!1,!1)});var T=/[\-:]([a-z])/g;function $(o){return o[1].toUpperCase()}"accent-height alignment-baseline arabic-form baseline-shift cap-height clip-path clip-rule color-interpolation color-interpolation-filters color-profile color-rendering dominant-baseline enable-background fill-opacity fill-rule flood-color flood-opacity font-family font-size font-size-adjust font-stretch font-style font-variant font-weight glyph-name glyph-orientation-horizontal glyph-orientation-vertical horiz-adv-x horiz-origin-x image-rendering letter-spacing lighting-color marker-end marker-mid marker-start overline-position overline-thickness paint-order panose-1 pointer-events rendering-intent shape-rendering stop-color stop-opacity strikethrough-position strikethrough-thickness stroke-dasharray stroke-dashoffset stroke-linecap stroke-linejoin stroke-miterlimit stroke-opacity stroke-width text-anchor text-decoration text-rendering underline-position underline-thickness unicode-bidi unicode-range units-per-em v-alphabetic v-hanging v-ideographic v-mathematical vector-effect vert-adv-y vert-origin-x vert-origin-y word-spacing writing-mode xmlns:xlink x-height".split(" ").forEach(function(o){var a=o.replace(T,$);_[a]=new P(a,1,!1,o,null,!1,!1)}),"xlink:actuate xlink:arcrole xlink:role xlink:show xlink:title xlink:type".split(" ").forEach(function(o){var a=o.replace(T,$);_[a]=new P(a,1,!1,o,"http://www.w3.org/1999/xlink",!1,!1)}),["xml:base","xml:lang","xml:space"].forEach(function(o){var a=o.replace(T,$);_[a]=new P(a,1,!1,o,"http://www.w3.org/XML/1998/namespace",!1,!1)}),["tabIndex","crossOrigin"].forEach(function(o){_[o]=new P(o,1,!1,o.toLowerCase(),null,!1,!1)}),_.xlinkHref=new P("xlinkHref",1,!1,"xlink:href","http://www.w3.org/1999/xlink",!0,!1),["src","href","action","formAction"].forEach(function(o){_[o]=new P(o,1,!1,o.toLowerCase(),null,!0,!0)});function L(o,a,p,v){var w=_.hasOwnProperty(a)?_[a]:null;(w!==null?w.type!==0:v||!(2W||w[A]!==C[W]){var X=` +`+w[A].replace(" at new "," at ");return o.displayName&&X.includes("")&&(X=X.replace("",o.displayName)),X}while(1<=A&&0<=W);break}}}finally{O=!1,Error.prepareStackTrace=p}return(o=o?o.displayName||o.name:"")?ie(o):""}function Ce(o){switch(o.tag){case 5:return ie(o.type);case 16:return ie("Lazy");case 13:return ie("Suspense");case 19:return ie("SuspenseList");case 0:case 2:case 15:return o=me(o.type,!1),o;case 11:return o=me(o.type.render,!1),o;case 1:return o=me(o.type,!0),o;default:return""}}function ye(o){if(o==null)return null;if(typeof o=="function")return o.displayName||o.name||null;if(typeof o=="string")return o;switch(o){case J:return"Fragment";case M:return"Portal";case ae:return"Profiler";case re:return"StrictMode";case te:return"Suspense";case G:return"SuspenseList"}if(typeof o=="object")switch(o.$$typeof){case B:return(o.displayName||"Context")+".Consumer";case j:return(o._context.displayName||"Context")+".Provider";case Y:var a=o.render;return o=o.displayName,o||(o=a.displayName||a.name||"",o=o!==""?"ForwardRef("+o+")":"ForwardRef"),o;case ce:return a=o.displayName||null,a!==null?a:ye(o.type)||"Memo";case Z:a=o._payload,o=o._init;try{return ye(o(a))}catch{}}return null}function Fe(o){var a=o.type;switch(o.tag){case 24:return"Cache";case 9:return(a.displayName||"Context")+".Consumer";case 10:return(a._context.displayName||"Context")+".Provider";case 18:return"DehydratedFragment";case 11:return o=a.render,o=o.displayName||o.name||"",a.displayName||(o!==""?"ForwardRef("+o+")":"ForwardRef");case 7:return"Fragment";case 5:return a;case 4:return"Portal";case 3:return"Root";case 6:return"Text";case 16:return ye(a);case 8:return a===re?"StrictMode":"Mode";case 22:return"Offscreen";case 12:return"Profiler";case 21:return"Scope";case 13:return"Suspense";case 19:return"SuspenseList";case 25:return"TracingMarker";case 1:case 0:case 17:case 2:case 14:case 15:if(typeof a=="function")return a.displayName||a.name||null;if(typeof a=="string")return a}return null}function De(o){switch(typeof o){case"boolean":case"number":case"string":case"undefined":return o;case"object":return o;default:return""}}function Te(o){var a=o.type;return(o=o.nodeName)&&o.toLowerCase()==="input"&&(a==="checkbox"||a==="radio")}function Xe(o){var a=Te(o)?"checked":"value",p=Object.getOwnPropertyDescriptor(o.constructor.prototype,a),v=""+o[a];if(!o.hasOwnProperty(a)&&typeof p<"u"&&typeof p.get=="function"&&typeof p.set=="function"){var w=p.get,C=p.set;return Object.defineProperty(o,a,{configurable:!0,get:function(){return w.call(this)},set:function(A){v=""+A,C.call(this,A)}}),Object.defineProperty(o,a,{enumerable:p.enumerable}),{getValue:function(){return v},setValue:function(A){v=""+A},stopTracking:function(){o._valueTracker=null,delete o[a]}}}}function lt(o){o._valueTracker||(o._valueTracker=Xe(o))}function _e(o){if(!o)return!1;var a=o._valueTracker;if(!a)return!0;var p=a.getValue(),v="";return o&&(v=Te(o)?o.checked?"true":"false":o.value),o=v,o!==p?(a.setValue(o),!0):!1}function mt(o){if(o=o||(typeof document<"u"?document:void 0),typeof o>"u")return null;try{return o.activeElement||o.body}catch{return o.body}}function pt(o,a){var p=a.checked;return R({},a,{defaultChecked:void 0,defaultValue:void 0,value:void 0,checked:p??o._wrapperState.initialChecked})}function Vt(o,a){var p=a.defaultValue==null?"":a.defaultValue,v=a.checked!=null?a.checked:a.defaultChecked;p=De(a.value!=null?a.value:p),o._wrapperState={initialChecked:v,initialValue:p,controlled:a.type==="checkbox"||a.type==="radio"?a.checked!=null:a.value!=null}}function Ve(o,a){a=a.checked,a!=null&&L(o,"checked",a,!1)}function it(o,a){Ve(o,a);var p=De(a.value),v=a.type;if(p!=null)v==="number"?(p===0&&o.value===""||o.value!=p)&&(o.value=""+p):o.value!==""+p&&(o.value=""+p);else if(v==="submit"||v==="reset"){o.removeAttribute("value");return}a.hasOwnProperty("value")?Zn(o,a.type,p):a.hasOwnProperty("defaultValue")&&Zn(o,a.type,De(a.defaultValue)),a.checked==null&&a.defaultChecked!=null&&(o.defaultChecked=!!a.defaultChecked)}function Ut(o,a,p){if(a.hasOwnProperty("value")||a.hasOwnProperty("defaultValue")){var v=a.type;if(!(v!=="submit"&&v!=="reset"||a.value!==void 0&&a.value!==null))return;a=""+o._wrapperState.initialValue,p||a===o.value||(o.value=a),o.defaultValue=a}p=o.name,p!==""&&(o.name=""),o.defaultChecked=!!o._wrapperState.initialChecked,p!==""&&(o.name=p)}function Zn(o,a,p){(a!=="number"||mt(o.ownerDocument)!==o)&&(p==null?o.defaultValue=""+o._wrapperState.initialValue:o.defaultValue!==""+p&&(o.defaultValue=""+p))}var ln=Array.isArray;function _t(o,a,p,v){if(o=o.options,a){a={};for(var w=0;w"+a.valueOf().toString()+"",a=Oe.firstChild;o.firstChild;)o.removeChild(o.firstChild);for(;a.firstChild;)o.appendChild(a.firstChild)}});function at(o,a){if(a){var p=o.firstChild;if(p&&p===o.lastChild&&p.nodeType===3){p.nodeValue=a;return}}o.textContent=a}var Kt={animationIterationCount:!0,aspectRatio:!0,borderImageOutset:!0,borderImageSlice:!0,borderImageWidth:!0,boxFlex:!0,boxFlexGroup:!0,boxOrdinalGroup:!0,columnCount:!0,columns:!0,flex:!0,flexGrow:!0,flexPositive:!0,flexShrink:!0,flexNegative:!0,flexOrder:!0,gridArea:!0,gridRow:!0,gridRowEnd:!0,gridRowSpan:!0,gridRowStart:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnSpan:!0,gridColumnStart:!0,fontWeight:!0,lineClamp:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,tabSize:!0,widows:!0,zIndex:!0,zoom:!0,fillOpacity:!0,floodOpacity:!0,stopOpacity:!0,strokeDasharray:!0,strokeDashoffset:!0,strokeMiterlimit:!0,strokeOpacity:!0,strokeWidth:!0},Bn=["Webkit","ms","Moz","O"];Object.keys(Kt).forEach(function(o){Bn.forEach(function(a){a=a+o.charAt(0).toUpperCase()+o.substring(1),Kt[a]=Kt[o]})});function Qt(o,a,p){return a==null||typeof a=="boolean"||a===""?"":p||typeof a!="number"||a===0||Kt.hasOwnProperty(o)&&Kt[o]?(""+a).trim():a+"px"}function Pt(o,a){o=o.style;for(var p in a)if(a.hasOwnProperty(p)){var v=p.indexOf("--")===0,w=Qt(p,a[p],v);p==="float"&&(p="cssFloat"),v?o.setProperty(p,w):o[p]=w}}var Er=R({menuitem:!0},{area:!0,base:!0,br:!0,col:!0,embed:!0,hr:!0,img:!0,input:!0,keygen:!0,link:!0,meta:!0,param:!0,source:!0,track:!0,wbr:!0});function Ft(o,a){if(a){if(Er[o]&&(a.children!=null||a.dangerouslySetInnerHTML!=null))throw Error(n(137,o));if(a.dangerouslySetInnerHTML!=null){if(a.children!=null)throw Error(n(60));if(typeof a.dangerouslySetInnerHTML!="object"||!("__html"in a.dangerouslySetInnerHTML))throw Error(n(61))}if(a.style!=null&&typeof a.style!="object")throw Error(n(62))}}function er(o,a){if(o.indexOf("-")===-1)return typeof a.is=="string";switch(o){case"annotation-xml":case"color-profile":case"font-face":case"font-face-src":case"font-face-uri":case"font-face-format":case"font-face-name":case"missing-glyph":return!1;default:return!0}}var an=null;function ol(o){return o=o.target||o.srcElement||window,o.correspondingUseElement&&(o=o.correspondingUseElement),o.nodeType===3?o.parentNode:o}var hs=null,ci=null,fi=null;function la(o){if(o=Kn(o)){if(typeof hs!="function")throw Error(n(280));var a=o.stateNode;a&&(a=uc(a),hs(o.stateNode,o.type,a))}}function Mu(o){ci?fi?fi.push(o):fi=[o]:ci=o}function ms(){if(ci){var o=ci,a=fi;if(fi=ci=null,la(o),a)for(o=0;o>>=0,o===0?32:31-(Oh(o)/zh|0)|0}var al=64,Fu=4194304;function ul(o){switch(o&-o){case 1:return 1;case 2:return 2;case 4:return 4;case 8:return 8;case 16:return 16;case 32:return 32;case 64:case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:return o&4194240;case 4194304:case 8388608:case 16777216:case 33554432:case 67108864:return o&130023424;case 134217728:return 134217728;case 268435456:return 268435456;case 536870912:return 536870912;case 1073741824:return 1073741824;default:return o}}function bs(o,a){var p=o.pendingLanes;if(p===0)return 0;var v=0,w=o.suspendedLanes,C=o.pingedLanes,A=p&268435455;if(A!==0){var W=A&~w;W!==0?v=ul(W):(C&=A,C!==0&&(v=ul(C)))}else A=p&~w,A!==0?v=ul(A):C!==0&&(v=ul(C));if(v===0)return 0;if(a!==0&&a!==v&&(a&w)===0&&(w=v&-v,C=a&-a,w>=C||w===16&&(C&4194240)!==0))return a;if((v&4)!==0&&(v|=p&16),a=o.entangledLanes,a!==0)for(o=o.entanglements,a&=v;0p;p++)a.push(o);return a}function ha(o,a,p){o.pendingLanes|=a,a!==536870912&&(o.suspendedLanes=0,o.pingedLanes=0),o=o.eventTimes,a=31-di(a),o[a]=p}function Vh(o,a){var p=o.pendingLanes&~a;o.pendingLanes=a,o.suspendedLanes=0,o.pingedLanes=0,o.expiredLanes&=a,o.mutableReadLanes&=a,o.entangledLanes&=a,a=o.entanglements;var v=o.eventTimes;for(o=o.expirationTimes;0=so),nm=" ",rm=!1;function im(o,a){switch(o){case"keyup":return Pr.indexOf(a.keyCode)!==-1;case"keydown":return a.keyCode!==229;case"keypress":case"mousedown":case"focusout":return!0;default:return!1}}function om(o){return o=o.detail,typeof o=="object"&&"data"in o?o.data:null}var ml=!1;function gl(o,a){switch(o){case"compositionend":return om(a);case"keypress":return a.which!==32?null:(rm=!0,nm);case"textInput":return o=a.data,o===nm&&rm?null:o;default:return null}}function Zv(o,a){if(ml)return o==="compositionend"||!ba&&im(o,a)?(o=td(),Ai=ya=Ht=null,ml=!1,o):null;switch(o){case"paste":return null;case"keypress":if(!(a.ctrlKey||a.altKey||a.metaKey)||a.ctrlKey&&a.altKey){if(a.char&&1=a)return{node:p,offset:a-o};o=v}e:{for(;p;){if(p.nextSibling){p=p.nextSibling;break e}p=p.parentNode}p=void 0}p=rt(p)}}function pn(o,a){return o&&a?o===a?!0:o&&o.nodeType===3?!1:a&&a.nodeType===3?pn(o,a.parentNode):"contains"in o?o.contains(a):o.compareDocumentPosition?!!(o.compareDocumentPosition(a)&16):!1:!1}function $t(){for(var o=window,a=mt();a instanceof o.HTMLIFrameElement;){try{var p=typeof a.contentWindow.location.href=="string"}catch{p=!1}if(p)o=a.contentWindow;else break;a=mt(o.document)}return a}function xa(o){var a=o&&o.nodeName&&o.nodeName.toLowerCase();return a&&(a==="input"&&(o.type==="text"||o.type==="search"||o.type==="tel"||o.type==="url"||o.type==="password")||a==="textarea"||o.contentEditable==="true")}function oy(o){var a=$t(),p=o.focusedElem,v=o.selectionRange;if(a!==p&&p&&p.ownerDocument&&pn(p.ownerDocument.documentElement,p)){if(v!==null&&xa(p)){if(a=v.start,o=v.end,o===void 0&&(o=a),"selectionStart"in p)p.selectionStart=a,p.selectionEnd=Math.min(o,p.value.length);else if(o=(a=p.ownerDocument||document)&&a.defaultView||window,o.getSelection){o=o.getSelection();var w=p.textContent.length,C=Math.min(v.start,w);v=v.end===void 0?C:Math.min(v.end,w),!o.extend&&C>v&&(w=v,v=C,C=w),w=wt(p,C);var A=wt(p,v);w&&A&&(o.rangeCount!==1||o.anchorNode!==w.node||o.anchorOffset!==w.offset||o.focusNode!==A.node||o.focusOffset!==A.offset)&&(a=a.createRange(),a.setStart(w.node,w.offset),o.removeAllRanges(),C>v?(o.addRange(a),o.extend(A.node,A.offset)):(a.setEnd(A.node,A.offset),o.addRange(a)))}}for(a=[],o=p;o=o.parentNode;)o.nodeType===1&&a.push({element:o,left:o.scrollLeft,top:o.scrollTop});for(typeof p.focus=="function"&&p.focus(),p=0;p=document.documentMode,lo=null,hd=null,Ri=null,yl=!1;function wa(o,a,p){var v=p.window===p?p.document:p.nodeType===9?p:p.ownerDocument;yl||lo==null||lo!==mt(v)||(v=lo,"selectionStart"in v&&xa(v)?v={start:v.selectionStart,end:v.selectionEnd}:(v=(v.ownerDocument&&v.ownerDocument.defaultView||window).getSelection(),v={anchorNode:v.anchorNode,anchorOffset:v.anchorOffset,focusNode:v.focusNode,focusOffset:v.focusOffset}),Ri&&Ae(Ri,v)||(Ri=v,v=oc(hd,"onSelect"),0Pl||(o.current=bd[Pl],bd[Pl]=null,Pl--)}function Mt(o,a){Pl++,bd[Pl]=o.current,o.current=a}var Ko={},Wn=pr(Ko),hr=pr(!1),rr=Ko;function Tl(o,a){var p=o.type.contextTypes;if(!p)return Ko;var v=o.stateNode;if(v&&v.__reactInternalMemoizedUnmaskedChildContext===a)return v.__reactInternalMemoizedMaskedChildContext;var w={},C;for(C in p)w[C]=a[C];return v&&(o=o.stateNode,o.__reactInternalMemoizedUnmaskedChildContext=a,o.__reactInternalMemoizedMaskedChildContext=w),w}function mr(o){return o=o.childContextTypes,o!=null}function cc(){zt(hr),zt(Wn)}function mm(o,a,p){if(Wn.current!==Ko)throw Error(n(168));Mt(Wn,a),Mt(hr,p)}function gm(o,a,p){var v=o.stateNode;if(a=a.childContextTypes,typeof v.getChildContext!="function")return p;v=v.getChildContext();for(var w in v)if(!(w in a))throw Error(n(108,Fe(o)||"Unknown",w));return R({},p,v)}function Ur(o){return o=(o=o.stateNode)&&o.__reactInternalMemoizedMergedChildContext||Ko,rr=Wn.current,Mt(Wn,o),Mt(hr,hr.current),!0}function vm(o,a,p){var v=o.stateNode;if(!v)throw Error(n(169));p?(o=gm(o,a,rr),v.__reactInternalMemoizedMergedChildContext=o,zt(hr),zt(Wn),Mt(Wn,o)):zt(hr),Mt(hr,p)}var co=null,fc=!1,xd=!1;function ym(o){co===null?co=[o]:co.push(o)}function Ts(o){fc=!0,ym(o)}function Wo(){if(!xd&&co!==null){xd=!0;var o=0,a=Et;try{var p=co;for(Et=1;o>=A,w-=A,Di=1<<32-di(a)+w|p<Qe?($n=Ke,Ke=null):$n=Ke.sibling;var kt=be(le,Ke,ue[Qe],Ee);if(kt===null){Ke===null&&(Ke=$n);break}o&&Ke&&kt.alternate===null&&a(le,Ke),ee=C(kt,ee,Qe),He===null?Be=kt:He.sibling=kt,He=kt,Ke=$n}if(Qe===ue.length)return p(le,Ke),jt&&Is(le,Qe),Be;if(Ke===null){for(;QeQe?($n=Ke,Ke=null):$n=Ke.sibling;var rs=be(le,Ke,kt.value,Ee);if(rs===null){Ke===null&&(Ke=$n);break}o&&Ke&&rs.alternate===null&&a(le,Ke),ee=C(rs,ee,Qe),He===null?Be=rs:He.sibling=rs,He=rs,Ke=$n}if(kt.done)return p(le,Ke),jt&&Is(le,Qe),Be;if(Ke===null){for(;!kt.done;Qe++,kt=ue.next())kt=ke(le,kt.value,Ee),kt!==null&&(ee=C(kt,ee,Qe),He===null?Be=kt:He.sibling=kt,He=kt);return jt&&Is(le,Qe),Be}for(Ke=v(le,Ke);!kt.done;Qe++,kt=ue.next())kt=Re(Ke,le,Qe,kt.value,Ee),kt!==null&&(o&&kt.alternate!==null&&Ke.delete(kt.key===null?Qe:kt.key),ee=C(kt,ee,Qe),He===null?Be=kt:He.sibling=kt,He=kt);return o&&Ke.forEach(function(Ty){return a(le,Ty)}),jt&&Is(le,Qe),Be}function cn(le,ee,ue,Ee){if(typeof ue=="object"&&ue!==null&&ue.type===J&&ue.key===null&&(ue=ue.props.children),typeof ue=="object"&&ue!==null){switch(ue.$$typeof){case K:e:{for(var Be=ue.key,He=ee;He!==null;){if(He.key===Be){if(Be=ue.type,Be===J){if(He.tag===7){p(le,He.sibling),ee=w(He,ue.props.children),ee.return=le,le=ee;break e}}else if(He.elementType===Be||typeof Be=="object"&&Be!==null&&Be.$$typeof===Z&&Sm(Be)===He.type){p(le,He.sibling),ee=w(He,ue.props),ee.ref=Ra(le,He,ue),ee.return=le,le=ee;break e}p(le,He);break}else a(le,He);He=He.sibling}ue.type===J?(ee=Vs(ue.props.children,le.mode,Ee,ue.key),ee.return=le,le=ee):(Ee=Yc(ue.type,ue.key,ue.props,null,le.mode,Ee),Ee.ref=Ra(le,ee,ue),Ee.return=le,le=Ee)}return A(le);case M:e:{for(He=ue.key;ee!==null;){if(ee.key===He)if(ee.tag===4&&ee.stateNode.containerInfo===ue.containerInfo&&ee.stateNode.implementation===ue.implementation){p(le,ee.sibling),ee=w(ee,ue.children||[]),ee.return=le,le=ee;break e}else{p(le,ee);break}else a(le,ee);ee=ee.sibling}ee=up(ue,le.mode,Ee),ee.return=le,le=ee}return A(le);case Z:return He=ue._init,cn(le,ee,He(ue._payload),Ee)}if(ln(ue))return Me(le,ee,ue,Ee);if(se(ue))return Ne(le,ee,ue,Ee);As(le,ue)}return typeof ue=="string"&&ue!==""||typeof ue=="number"?(ue=""+ue,ee!==null&&ee.tag===6?(p(le,ee.sibling),ee=w(ee,ue),ee.return=le,le=ee):(p(le,ee),ee=ap(ue,le.mode,Ee),ee.return=le,le=ee),A(le)):p(le,ee)}return cn}var rn=Sd(!0),mc=Sd(!1),La=pr(null),$r=null,Ho=null,Il=null;function po(){Il=Ho=$r=null}function gc(o){var a=La.current;zt(La),o._currentValue=a}function Dn(o,a,p){for(;o!==null;){var v=o.alternate;if((o.childLanes&a)!==a?(o.childLanes|=a,v!==null&&(v.childLanes|=a)):v!==null&&(v.childLanes&a)!==a&&(v.childLanes|=a),o===p)break;o=o.return}}function Go(o,a){$r=o,Il=Ho=null,o=o.dependencies,o!==null&&o.firstContext!==null&&((o.lanes&a)!==0&&(or=!0),o.firstContext=null)}function Hr(o){var a=o._currentValue;if(Il!==o)if(o={context:o,memoizedValue:a,next:null},Ho===null){if($r===null)throw Error(n(308));Ho=o,$r.dependencies={lanes:0,firstContext:o}}else Ho=Ho.next=o;return a}var Rs=null;function kd(o){Rs===null?Rs=[o]:Rs.push(o)}function vc(o,a,p,v){var w=a.interleaved;return w===null?(p.next=p,kd(a)):(p.next=w.next,w.next=p),a.interleaved=p,ho(o,v)}function ho(o,a){o.lanes|=a;var p=o.alternate;for(p!==null&&(p.lanes|=a),p=o,o=o.return;o!==null;)o.childLanes|=a,p=o.alternate,p!==null&&(p.childLanes|=a),p=o,o=o.return;return p.tag===3?p.stateNode:null}var Gr=!1;function yc(o){o.updateQueue={baseState:o.memoizedState,firstBaseUpdate:null,lastBaseUpdate:null,shared:{pending:null,interleaved:null,lanes:0},effects:null}}function km(o,a){o=o.updateQueue,a.updateQueue===o&&(a.updateQueue={baseState:o.baseState,firstBaseUpdate:o.firstBaseUpdate,lastBaseUpdate:o.lastBaseUpdate,shared:o.shared,effects:o.effects})}function mo(o,a){return{eventTime:o,lane:a,tag:0,payload:null,callback:null,next:null}}function qr(o,a,p){var v=o.updateQueue;if(v===null)return null;if(v=v.shared,(bt&2)!==0){var w=v.pending;return w===null?a.next=a:(a.next=w.next,w.next=a),v.pending=a,ho(o,p)}return w=v.interleaved,w===null?(a.next=a,kd(v)):(a.next=w.next,w.next=a),v.interleaved=a,ho(o,p)}function bc(o,a,p){if(a=a.updateQueue,a!==null&&(a=a.shared,(p&4194240)!==0)){var v=a.lanes;v&=o.pendingLanes,p|=v,a.lanes=p,ma(o,p)}}function Cm(o,a){var p=o.updateQueue,v=o.alternate;if(v!==null&&(v=v.updateQueue,p===v)){var w=null,C=null;if(p=p.firstBaseUpdate,p!==null){do{var A={eventTime:p.eventTime,lane:p.lane,tag:p.tag,payload:p.payload,callback:p.callback,next:null};C===null?w=C=A:C=C.next=A,p=p.next}while(p!==null);C===null?w=C=a:C=C.next=a}else w=C=a;p={baseState:v.baseState,firstBaseUpdate:w,lastBaseUpdate:C,shared:v.shared,effects:v.effects},o.updateQueue=p;return}o=p.lastBaseUpdate,o===null?p.firstBaseUpdate=a:o.next=a,p.lastBaseUpdate=a}function $l(o,a,p,v){var w=o.updateQueue;Gr=!1;var C=w.firstBaseUpdate,A=w.lastBaseUpdate,W=w.shared.pending;if(W!==null){w.shared.pending=null;var X=W,de=X.next;X.next=null,A===null?C=de:A.next=de,A=X;var xe=o.alternate;xe!==null&&(xe=xe.updateQueue,W=xe.lastBaseUpdate,W!==A&&(W===null?xe.firstBaseUpdate=de:W.next=de,xe.lastBaseUpdate=X))}if(C!==null){var ke=w.baseState;A=0,xe=de=X=null,W=C;do{var be=W.lane,Re=W.eventTime;if((v&be)===be){xe!==null&&(xe=xe.next={eventTime:Re,lane:0,tag:W.tag,payload:W.payload,callback:W.callback,next:null});e:{var Me=o,Ne=W;switch(be=a,Re=p,Ne.tag){case 1:if(Me=Ne.payload,typeof Me=="function"){ke=Me.call(Re,ke,be);break e}ke=Me;break e;case 3:Me.flags=Me.flags&-65537|128;case 0:if(Me=Ne.payload,be=typeof Me=="function"?Me.call(Re,ke,be):Me,be==null)break e;ke=R({},ke,be);break e;case 2:Gr=!0}}W.callback!==null&&W.lane!==0&&(o.flags|=64,be=w.effects,be===null?w.effects=[W]:be.push(W))}else Re={eventTime:Re,lane:be,tag:W.tag,payload:W.payload,callback:W.callback,next:null},xe===null?(de=xe=Re,X=ke):xe=xe.next=Re,A|=be;if(W=W.next,W===null){if(W=w.shared.pending,W===null)break;be=W,W=be.next,be.next=null,w.lastBaseUpdate=be,w.shared.pending=null}}while(!0);if(xe===null&&(X=ke),w.baseState=X,w.firstBaseUpdate=de,w.lastBaseUpdate=xe,a=w.shared.interleaved,a!==null){w=a;do A|=w.lane,w=w.next;while(w!==a)}else C===null&&(w.shared.lanes=0);Jo|=A,o.lanes=A,o.memoizedState=ke}}function Cd(o,a,p){if(o=a.effects,a.effects=null,o!==null)for(a=0;ap?p:4,o(!0);var v=_d.transition;_d.transition={};try{o(!1),a()}finally{Et=p,_d.transition=v}}function Nd(){return Yr().memoizedState}function ly(o,a,p){var v=ts(o);if(p={lane:v,action:p,hasEagerState:!1,eagerState:null,next:null},Fd(o))ir(a,p);else if(p=vc(o,a,p,v),p!==null){var w=ar();xi(p,o,v,w),mi(p,a,v)}}function $m(o,a,p){var v=ts(o),w={lane:v,action:p,hasEagerState:!1,eagerState:null,next:null};if(Fd(o))ir(a,w);else{var C=o.alternate;if(o.lanes===0&&(C===null||C.lanes===0)&&(C=a.lastRenderedReducer,C!==null))try{var A=a.lastRenderedState,W=C(A,p);if(w.hasEagerState=!0,w.eagerState=W,fe(W,A)){var X=a.interleaved;X===null?(w.next=w,kd(a)):(w.next=X.next,X.next=w),a.interleaved=w;return}}catch{}finally{}p=vc(o,a,w,v),p!==null&&(w=ar(),xi(p,o,v,w),mi(p,a,v))}}function Fd(o){var a=o.alternate;return o===Zt||a!==null&&a===Zt}function ir(o,a){Fa=Rl=!0;var p=o.pending;p===null?a.next=a:(a.next=p.next,p.next=a),o.pending=a}function mi(o,a,p){if((p&4194240)!==0){var v=a.lanes;v&=o.pendingLanes,p|=v,a.lanes=p,ma(o,p)}}var Tc={readContext:Hr,useCallback:qn,useContext:qn,useEffect:qn,useImperativeHandle:qn,useInsertionEffect:qn,useLayoutEffect:qn,useMemo:qn,useReducer:qn,useRef:qn,useState:qn,useDebugValue:qn,useDeferredValue:qn,useTransition:qn,useMutableSource:qn,useSyncExternalStore:qn,useId:qn,unstable_isNewReconciler:!1},ay={readContext:Hr,useCallback:function(o,a){return Bi().memoizedState=[o,a===void 0?null:a],o},useContext:Hr,useEffect:Pc,useImperativeHandle:function(o,a,p){return p=p!=null?p.concat([o]):null,za(4194308,4,Md.bind(null,a,o),p)},useLayoutEffect:function(o,a){return za(4194308,4,o,a)},useInsertionEffect:function(o,a){return za(4,2,o,a)},useMemo:function(o,a){var p=Bi();return a=a===void 0?null:a,o=o(),p.memoizedState=[o,a],o},useReducer:function(o,a,p){var v=Bi();return a=p!==void 0?p(a):a,v.memoizedState=v.baseState=a,o={pending:null,interleaved:null,lanes:0,dispatch:null,lastRenderedReducer:o,lastRenderedState:a},v.queue=o,o=o.dispatch=ly.bind(null,Zt,o),[v.memoizedState,o]},useRef:function(o){var a=Bi();return o={current:o},a.memoizedState=o},useState:Oa,useDebugValue:ja,useDeferredValue:function(o){return Bi().memoizedState=o},useTransition:function(){var o=Oa(!1),a=o[0];return o=Im.bind(null,o[1]),Bi().memoizedState=o,[a,o]},useMutableSource:function(){},useSyncExternalStore:function(o,a,p){var v=Zt,w=Bi();if(jt){if(p===void 0)throw Error(n(407));p=p()}else{if(p=a(),In===null)throw Error(n(349));(Yo&30)!==0||Rd(v,a,p)}w.memoizedState=p;var C={value:p,getSnapshot:a};return w.queue=C,Pc(vo.bind(null,v,C,o),[o]),v.flags|=2048,Ml(9,vr.bind(null,v,C,p,a),void 0,null),p},useId:function(){var o=Bi(),a=In.identifierPrefix;if(jt){var p=Ni,v=Di;p=(v&~(1<<32-di(v)-1)).toString(32)+p,a=":"+a+"R"+p,p=Ms++,0<\/script>",o=o.removeChild(o.firstChild)):typeof v.is=="string"?o=A.createElement(p,{is:v.is}):(o=A.createElement(p),p==="select"&&(A=o,v.multiple?A.multiple=!0:v.size&&(A.size=v.size))):o=A.createElementNS(o,p),o[Li]=a,o[Uo]=v,Fn(o,a,!1,!1),a.stateNode=o;e:{switch(A=er(p,v),p){case"dialog":Ot("cancel",o),Ot("close",o),w=v;break;case"iframe":case"object":case"embed":Ot("load",o),w=v;break;case"video":case"audio":for(w=0;wOs&&(a.flags|=128,v=!0,Ga(C,!1),a.lanes=4194304)}else{if(!v)if(o=Ls(A),o!==null){if(a.flags|=128,v=!0,p=o.updateQueue,p!==null&&(a.updateQueue=p,a.flags|=4),Ga(C,!0),C.tail===null&&C.tailMode==="hidden"&&!A.alternate&&!jt)return On(a),null}else 2*Wt()-C.renderingStartTime>Os&&p!==1073741824&&(a.flags|=128,v=!0,Ga(C,!1),a.lanes=4194304);C.isBackwards?(A.sibling=a.child,a.child=A):(p=C.last,p!==null?p.sibling=A:a.child=A,C.last=A)}return C.tail!==null?(a=C.tail,C.rendering=a,C.tail=a.sibling,C.renderingStartTime=Wt(),a.sibling=null,p=Gt.current,Mt(Gt,v?p&1|2:p&1),a):(On(a),null);case 22:case 23:return sp(),v=a.memoizedState!==null,o!==null&&o.memoizedState!==null!==v&&(a.flags|=8192),v&&(a.mode&1)!==0?(Rr&1073741824)!==0&&(On(a),a.subtreeFlags&6&&(a.flags|=8192)):On(a),null;case 24:return null;case 25:return null}throw Error(n(156,a.tag))}function cy(o,a){switch($s(a),a.tag){case 1:return mr(a.type)&&cc(),o=a.flags,o&65536?(a.flags=o&-65537|128,a):null;case 3:return qo(),zt(hr),zt(Wn),wc(),o=a.flags,(o&65536)!==0&&(o&128)===0?(a.flags=o&-65537|128,a):null;case 5:return xc(a),null;case 13:if(zt(Gt),o=a.memoizedState,o!==null&&o.dehydrated!==null){if(a.alternate===null)throw Error(n(340));Oi()}return o=a.flags,o&65536?(a.flags=o&-65537|128,a):null;case 19:return zt(Gt),null;case 4:return qo(),null;case 10:return gc(a.type._context),null;case 22:case 23:return sp(),null;case 24:return null;default:return null}}var Nc=!1,qt=!1,sr=typeof WeakSet=="function"?WeakSet:Set,Le=null;function jl(o,a){var p=o.ref;if(p!==null)if(typeof p=="function")try{p(null)}catch(v){en(o,a,v)}else p.current=null}function qa(o,a,p){try{p()}catch(v){en(o,a,v)}}var Fm=!1;function fy(o,a){if(Ta=Vu,o=$t(),xa(o)){if("selectionStart"in o)var p={start:o.selectionStart,end:o.selectionEnd};else e:{p=(p=o.ownerDocument)&&p.defaultView||window;var v=p.getSelection&&p.getSelection();if(v&&v.rangeCount!==0){p=v.anchorNode;var w=v.anchorOffset,C=v.focusNode;v=v.focusOffset;try{p.nodeType,C.nodeType}catch{p=null;break e}var A=0,W=-1,X=-1,de=0,xe=0,ke=o,be=null;t:for(;;){for(var Re;ke!==p||w!==0&&ke.nodeType!==3||(W=A+w),ke!==C||v!==0&&ke.nodeType!==3||(X=A+v),ke.nodeType===3&&(A+=ke.nodeValue.length),(Re=ke.firstChild)!==null;)be=ke,ke=Re;for(;;){if(ke===o)break t;if(be===p&&++de===w&&(W=A),be===C&&++xe===v&&(X=A),(Re=ke.nextSibling)!==null)break;ke=be,be=ke.parentNode}ke=Re}p=W===-1||X===-1?null:{start:W,end:X}}else p=null}p=p||{start:0,end:0}}else p=null;for(Ps={focusedElem:o,selectionRange:p},Vu=!1,Le=a;Le!==null;)if(a=Le,o=a.child,(a.subtreeFlags&1028)!==0&&o!==null)o.return=a,Le=o;else for(;Le!==null;){a=Le;try{var Me=a.alternate;if((a.flags&1024)!==0)switch(a.tag){case 0:case 11:case 15:break;case 1:if(Me!==null){var Ne=Me.memoizedProps,cn=Me.memoizedState,le=a.stateNode,ee=le.getSnapshotBeforeUpdate(a.elementType===a.type?Ne:Xr(a.type,Ne),cn);le.__reactInternalSnapshotBeforeUpdate=ee}break;case 3:var ue=a.stateNode.containerInfo;ue.nodeType===1?ue.textContent="":ue.nodeType===9&&ue.documentElement&&ue.removeChild(ue.documentElement);break;case 5:case 6:case 4:case 17:break;default:throw Error(n(163))}}catch(Ee){en(a,a.return,Ee)}if(o=a.sibling,o!==null){o.return=a.return,Le=o;break}Le=a.return}return Me=Fm,Fm=!1,Me}function xo(o,a,p){var v=a.updateQueue;if(v=v!==null?v.lastEffect:null,v!==null){var w=v=v.next;do{if((w.tag&o)===o){var C=w.destroy;w.destroy=void 0,C!==void 0&&qa(a,p,C)}w=w.next}while(w!==v)}}function Ya(o,a){if(a=a.updateQueue,a=a!==null?a.lastEffect:null,a!==null){var p=a=a.next;do{if((p.tag&o)===o){var v=p.create;p.destroy=v()}p=p.next}while(p!==a)}}function Fc(o){var a=o.ref;if(a!==null){var p=o.stateNode;switch(o.tag){case 5:o=p;break;default:o=p}typeof a=="function"?a(o):a.current=o}}function Om(o){var a=o.alternate;a!==null&&(o.alternate=null,Om(a)),o.child=null,o.deletions=null,o.sibling=null,o.tag===5&&(a=o.stateNode,a!==null&&(delete a[Li],delete a[Uo],delete a[ac],delete a[N],delete a[El])),o.stateNode=null,o.return=null,o.dependencies=null,o.memoizedProps=null,o.memoizedState=null,o.pendingProps=null,o.stateNode=null,o.updateQueue=null}function zm(o){return o.tag===5||o.tag===3||o.tag===4}function jm(o){e:for(;;){for(;o.sibling===null;){if(o.return===null||zm(o.return))return null;o=o.return}for(o.sibling.return=o.return,o=o.sibling;o.tag!==5&&o.tag!==6&&o.tag!==18;){if(o.flags&2||o.child===null||o.tag===4)continue e;o.child.return=o,o=o.child}if(!(o.flags&2))return o.stateNode}}function Yd(o,a,p){var v=o.tag;if(v===5||v===6)o=o.stateNode,a?p.nodeType===8?p.parentNode.insertBefore(o,a):p.insertBefore(o,a):(p.nodeType===8?(a=p.parentNode,a.insertBefore(o,p)):(a=p,a.appendChild(o)),p=p._reactRootContainer,p!=null||a.onclick!==null||(a.onclick=sc));else if(v!==4&&(o=o.child,o!==null))for(Yd(o,a,p),o=o.sibling;o!==null;)Yd(o,a,p),o=o.sibling}function Oc(o,a,p){var v=o.tag;if(v===5||v===6)o=o.stateNode,a?p.insertBefore(o,a):p.appendChild(o);else if(v!==4&&(o=o.child,o!==null))for(Oc(o,a,p),o=o.sibling;o!==null;)Oc(o,a,p),o=o.sibling}var _n=null,vi=!1;function Wi(o,a,p){for(p=p.child;p!==null;)Xd(o,a,p),p=p.sibling}function Xd(o,a,p){if($i&&typeof $i.onCommitFiberUnmount=="function")try{$i.onCommitFiberUnmount(Nu,p)}catch{}switch(p.tag){case 5:qt||jl(p,a);case 6:var v=_n,w=vi;_n=null,Wi(o,a,p),_n=v,vi=w,_n!==null&&(vi?(o=_n,p=p.stateNode,o.nodeType===8?o.parentNode.removeChild(p):o.removeChild(p)):_n.removeChild(p.stateNode));break;case 18:_n!==null&&(vi?(o=_n,p=p.stateNode,o.nodeType===8?yd(o.parentNode,p):o.nodeType===1&&yd(o,p),Tt(o)):yd(_n,p.stateNode));break;case 4:v=_n,w=vi,_n=p.stateNode.containerInfo,vi=!0,Wi(o,a,p),_n=v,vi=w;break;case 0:case 11:case 14:case 15:if(!qt&&(v=p.updateQueue,v!==null&&(v=v.lastEffect,v!==null))){w=v=v.next;do{var C=w,A=C.destroy;C=C.tag,A!==void 0&&((C&2)!==0||(C&4)!==0)&&qa(p,a,A),w=w.next}while(w!==v)}Wi(o,a,p);break;case 1:if(!qt&&(jl(p,a),v=p.stateNode,typeof v.componentWillUnmount=="function"))try{v.props=p.memoizedProps,v.state=p.memoizedState,v.componentWillUnmount()}catch(W){en(p,a,W)}Wi(o,a,p);break;case 21:Wi(o,a,p);break;case 22:p.mode&1?(qt=(v=qt)||p.memoizedState!==null,Wi(o,a,p),qt=v):Wi(o,a,p);break;default:Wi(o,a,p)}}function Bl(o){var a=o.updateQueue;if(a!==null){o.updateQueue=null;var p=o.stateNode;p===null&&(p=o.stateNode=new sr),a.forEach(function(v){var w=yy.bind(null,o,v);p.has(v)||(p.add(v),v.then(w,w))})}}function Ar(o,a){var p=a.deletions;if(p!==null)for(var v=0;vw&&(w=A),v&=~C}if(v=w,v=Wt()-v,v=(120>v?120:480>v?480:1080>v?1080:1920>v?1920:3e3>v?3e3:4320>v?4320:1960*Vm(v/1960))-v,10o?16:o,es===null)var v=!1;else{if(o=es,es=null,lr=0,(bt&6)!==0)throw Error(n(331));var w=bt;for(bt|=4,Le=o.current;Le!==null;){var C=Le,A=C.child;if((Le.flags&16)!==0){var W=C.deletions;if(W!==null){for(var X=0;XWt()-ep?js(o,0):Bc|=p),br(o,a)}function qm(o,a){a===0&&((o.mode&1)===0?a=1:(a=Fu,Fu<<=1,(Fu&130023424)===0&&(Fu=4194304)));var p=ar();o=ho(o,a),o!==null&&(ha(o,a,p),br(o,p))}function vy(o){var a=o.memoizedState,p=0;a!==null&&(p=a.retryLane),qm(o,p)}function yy(o,a){var p=0;switch(o.tag){case 13:var v=o.stateNode,w=o.memoizedState;w!==null&&(p=w.retryLane);break;case 19:v=o.stateNode;break;default:throw Error(n(314))}v!==null&&v.delete(a),qm(o,p)}var Ym;Ym=function(o,a,p){if(o!==null)if(o.memoizedProps!==a.pendingProps||hr.current)or=!0;else{if((o.lanes&p)===0&&(a.flags&128)===0)return or=!1,Dm(o,a,p);or=(o.flags&131072)!==0}else or=!1,jt&&(a.flags&1048576)!==0&&bm(a,pc,a.index);switch(a.lanes=0,a.tag){case 2:var v=a.type;Dc(o,a),o=a.pendingProps;var w=Tl(a,Wn.current);Go(a,p),w=Ds(null,a,v,o,w,p);var C=Sc();return a.flags|=1,typeof w=="object"&&w!==null&&typeof w.render=="function"&&w.$$typeof===void 0?(a.tag=1,a.memoizedState=null,a.updateQueue=null,mr(v)?(C=!0,Ur(a)):C=!1,a.memoizedState=w.state!==null&&w.state!==void 0?w.state:null,yc(a),w.updater=$c,a.stateNode=w,w._reactInternals=a,zd(a,v,o,p),a=Hd(null,a,v,!0,C,p)):(a.tag=0,jt&&C&&$a(a),Nn(null,a,w,p),a=a.child),a;case 16:v=a.elementType;e:{switch(Dc(o,a),o=a.pendingProps,w=v._init,v=w(v._payload),a.type=v,w=a.tag=xy(v),o=Xr(v,o),w){case 0:a=Kd(null,a,v,o,p);break e;case 1:a=Wd(null,a,v,o,p);break e;case 11:a=Lm(null,a,v,o,p);break e;case 14:a=Bd(null,a,v,Xr(v.type,o),p);break e}throw Error(n(306,v,""))}return a;case 0:return v=a.type,w=a.pendingProps,w=a.elementType===v?w:Xr(v,w),Kd(o,a,v,w,p);case 1:return v=a.type,w=a.pendingProps,w=a.elementType===v?w:Xr(v,w),Wd(o,a,v,w,p);case 3:e:{if(Mm(a),o===null)throw Error(n(387));v=a.pendingProps,C=a.memoizedState,w=C.element,km(o,a),$l(a,v,null,p);var A=a.memoizedState;if(v=A.element,C.isDehydrated)if(C={element:v,isDehydrated:!1,cache:A.cache,pendingSuspenseBoundaries:A.pendingSuspenseBoundaries,transitions:A.transitions},a.updateQueue.baseState=C,a.memoizedState=C,a.flags&256){w=Fs(Error(n(423)),a),a=Ki(o,a,v,p,w);break e}else if(v!==w){w=Fs(Error(n(424)),a),a=Ki(o,a,v,p,w);break e}else for(Ir=Vo(a.stateNode.containerInfo.firstChild),Gn=a,jt=!0,hi=null,p=mc(a,null,v,p),a.child=p;p;)p.flags=p.flags&-3|4096,p=p.sibling;else{if(Oi(),v===w){a=gi(o,a,p);break e}Nn(o,a,v,p)}a=a.child}return a;case 5:return Pd(a),o===null&&gr(a),v=a.type,w=a.pendingProps,C=o!==null?o.memoizedProps:null,A=w.children,_a(v,w)?A=null:C!==null&&_a(v,C)&&(a.flags|=32),Ud(o,a),Nn(o,a,A,p),a.child;case 6:return o===null&&gr(a),null;case 13:return Mc(o,a,p);case 4:return Ed(a,a.stateNode.containerInfo),v=a.pendingProps,o===null?a.child=rn(a,null,v,p):Nn(o,a,v,p),a.child;case 11:return v=a.type,w=a.pendingProps,w=a.elementType===v?w:Xr(v,w),Lm(o,a,v,w,p);case 7:return Nn(o,a,a.pendingProps,p),a.child;case 8:return Nn(o,a,a.pendingProps.children,p),a.child;case 12:return Nn(o,a,a.pendingProps.children,p),a.child;case 10:e:{if(v=a.type._context,w=a.pendingProps,C=a.memoizedProps,A=w.value,Mt(La,v._currentValue),v._currentValue=A,C!==null)if(fe(C.value,A)){if(C.children===w.children&&!hr.current){a=gi(o,a,p);break e}}else for(C=a.child,C!==null&&(C.return=a);C!==null;){var W=C.dependencies;if(W!==null){A=C.child;for(var X=W.firstContext;X!==null;){if(X.context===v){if(C.tag===1){X=mo(-1,p&-p),X.tag=2;var de=C.updateQueue;if(de!==null){de=de.shared;var xe=de.pending;xe===null?X.next=X:(X.next=xe.next,xe.next=X),de.pending=X}}C.lanes|=p,X=C.alternate,X!==null&&(X.lanes|=p),Dn(C.return,p,a),W.lanes|=p;break}X=X.next}}else if(C.tag===10)A=C.type===a.type?null:C.child;else if(C.tag===18){if(A=C.return,A===null)throw Error(n(341));A.lanes|=p,W=A.alternate,W!==null&&(W.lanes|=p),Dn(A,p,a),A=C.sibling}else A=C.child;if(A!==null)A.return=C;else for(A=C;A!==null;){if(A===a){A=null;break}if(C=A.sibling,C!==null){C.return=A.return,A=C;break}A=A.return}C=A}Nn(o,a,w.children,p),a=a.child}return a;case 9:return w=a.type,v=a.pendingProps.children,Go(a,p),w=Hr(w),v=v(w),a.flags|=1,Nn(o,a,v,p),a.child;case 14:return v=a.type,w=Xr(v,a.pendingProps),w=Xr(v.type,w),Bd(o,a,v,w,p);case 15:return Ui(o,a,a.type,a.pendingProps,p);case 17:return v=a.type,w=a.pendingProps,w=a.elementType===v?w:Xr(v,w),Dc(o,a),a.tag=1,mr(v)?(o=!0,Ur(a)):o=!1,Go(a,p),Ns(a,v,w),zd(a,v,w,p),Hd(null,a,v,!0,o,p);case 19:return Xo(o,a,p);case 22:return Vd(o,a,p)}throw Error(n(156,a.tag))};function Xm(o,a){return Mh(o,a)}function by(o,a,p,v){this.tag=o,this.key=p,this.sibling=this.child=this.return=this.stateNode=this.type=this.elementType=null,this.index=0,this.ref=null,this.pendingProps=a,this.dependencies=this.memoizedState=this.updateQueue=this.memoizedProps=null,this.mode=v,this.subtreeFlags=this.flags=0,this.deletions=null,this.childLanes=this.lanes=0,this.alternate=null}function Jr(o,a,p,v){return new by(o,a,p,v)}function qc(o){return o=o.prototype,!(!o||!o.isReactComponent)}function xy(o){if(typeof o=="function")return qc(o)?1:0;if(o!=null){if(o=o.$$typeof,o===Y)return 11;if(o===ce)return 14}return 2}function wi(o,a){var p=o.alternate;return p===null?(p=Jr(o.tag,a,o.key,o.mode),p.elementType=o.elementType,p.type=o.type,p.stateNode=o.stateNode,p.alternate=o,o.alternate=p):(p.pendingProps=a,p.type=o.type,p.flags=0,p.subtreeFlags=0,p.deletions=null),p.flags=o.flags&14680064,p.childLanes=o.childLanes,p.lanes=o.lanes,p.child=o.child,p.memoizedProps=o.memoizedProps,p.memoizedState=o.memoizedState,p.updateQueue=o.updateQueue,a=o.dependencies,p.dependencies=a===null?null:{lanes:a.lanes,firstContext:a.firstContext},p.sibling=o.sibling,p.index=o.index,p.ref=o.ref,p}function Yc(o,a,p,v,w,C){var A=2;if(v=o,typeof o=="function")qc(o)&&(A=1);else if(typeof o=="string")A=5;else e:switch(o){case J:return Vs(p.children,w,C,a);case re:A=8,w|=8;break;case ae:return o=Jr(12,p,a,w|2),o.elementType=ae,o.lanes=C,o;case te:return o=Jr(13,p,a,w),o.elementType=te,o.lanes=C,o;case G:return o=Jr(19,p,a,w),o.elementType=G,o.lanes=C,o;case q:return Xc(p,w,C,a);default:if(typeof o=="object"&&o!==null)switch(o.$$typeof){case j:A=10;break e;case B:A=9;break e;case Y:A=11;break e;case ce:A=14;break e;case Z:A=16,v=null;break e}throw Error(n(130,o==null?o:typeof o,""))}return a=Jr(A,p,a,w),a.elementType=o,a.type=v,a.lanes=C,a}function Vs(o,a,p,v){return o=Jr(7,o,v,a),o.lanes=p,o}function Xc(o,a,p,v){return o=Jr(22,o,v,a),o.elementType=q,o.lanes=p,o.stateNode={isHidden:!1},o}function ap(o,a,p){return o=Jr(6,o,null,a),o.lanes=p,o}function up(o,a,p){return a=Jr(4,o.children!==null?o.children:[],o.key,a),a.lanes=p,a.stateNode={containerInfo:o.containerInfo,pendingChildren:null,implementation:o.implementation},a}function wy(o,a,p,v,w){this.tag=a,this.containerInfo=o,this.finishedWork=this.pingCache=this.current=this.pendingChildren=null,this.timeoutHandle=-1,this.callbackNode=this.pendingContext=this.context=null,this.callbackPriority=0,this.eventTimes=pa(0),this.expirationTimes=pa(-1),this.entangledLanes=this.finishedLanes=this.mutableReadLanes=this.expiredLanes=this.pingedLanes=this.suspendedLanes=this.pendingLanes=0,this.entanglements=pa(0),this.identifierPrefix=v,this.onRecoverableError=w,this.mutableSourceEagerHydrationData=null}function cp(o,a,p,v,w,C,A,W,X){return o=new wy(o,a,p,W,X),a===1?(a=1,C===!0&&(a|=8)):a=0,C=Jr(3,null,null,a),o.current=C,C.stateNode=o,C.memoizedState={element:v,isDehydrated:p,cache:null,transitions:null,pendingSuspenseBoundaries:null},yc(C),o}function Sy(o,a,p){var v=3"u"||typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE!="function"))try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(e)}catch(t){console.error(t)}}return e(),By.exports=tL(),By.exports}var c1;function nL(){if(c1)return sg;c1=1;var e=cE();return sg.createRoot=e.createRoot,sg.hydrateRoot=e.hydrateRoot,sg}var rL=nL();function pv(e={}){const{strict:t=!0,errorMessage:n="useContext: `context` is undefined. Seems you forgot to wrap component within the Provider",name:r}=e,i=S.createContext(void 0);i.displayName=r;function s(){var l;const c=S.useContext(i);if(!c&&t){const d=new Error(n);throw d.name="ContextError",(l=Error.captureStackTrace)==null||l.call(Error,d,s),d}return c}return[i.Provider,s,i]}function iL(e){return{UNSAFE_getDOMNode(){return e.current}}}function Ji(e){const t=S.useRef(null);return S.useImperativeHandle(e,()=>t.current),t}function ox(e){return Array.isArray(e)}function oL(e){return ox(e)&&e.length===0}function sx(e){const t=typeof e;return e!=null&&(t==="object"||t==="function")&&!ox(e)}function sL(e){return sx(e)&&Object.keys(e).length===0}function lL(e){return ox(e)?oL(e):sx(e)?sL(e):e==null||e===""}function aL(e){return typeof e=="function"}var $e=e=>e?"true":void 0;function fE(e){var t,n,r="";if(typeof e=="string"||typeof e=="number")r+=e;else if(typeof e=="object")if(Array.isArray(e))for(t=0;tsx(e)?e instanceof Array?[...e]:e[t]:e,dE=(...e)=>{let t=" ";for(const n of e)if(typeof n=="string"&&n.length>0){t=n;break}return t},uL=e=>e?e.charAt(0).toUpperCase()+e.slice(1).toLowerCase():"";function f1(...e){return function(n){e.some(r=>(r?.(n),n?.defaultPrevented))}}function cL(e){return`${e}-${Math.floor(Math.random()*1e6)}`}function RG(e){for(const t in e)t.startsWith("on")&&delete e[t];return e}function nl(e){if(!e||typeof e!="object")return"";try{return JSON.stringify(e)}catch{return""}}function fL(e,t,n){return Math.min(Math.max(e,t),n)}function dL(e,t=100){return Math.min(Math.max(e,0),t)}var d1={};function pL(e,t,...n){const i=`[Hero UI] : ${e}`;typeof console>"u"||d1[i]||(d1[i]=!0)}function Jl(...e){return(...t)=>{for(let n of e)typeof n=="function"&&n(...t)}}var p1=new Map;function hL(e,t){if(e===t)return e;let n=p1.get(e);if(n)return n.forEach(i=>i.current=t),t;let r=p1.get(t);return r?(r.forEach(i=>i.current=e),e):t}function on(...e){let t={...e[0]};for(let n=1;n=65&&i.charCodeAt(2)<=90?t[i]=Jl(s,l):(i==="className"||i==="UNSAFE_className")&&typeof s=="string"&&typeof l=="string"?t[i]=tn(s,l):i==="id"&&s&&l?t.id=hL(s,l):t[i]=l!==void 0?l:s}}return t}function pE(...e){return e.length===1&&e[0]?e[0]:t=>{let n=!1;const r=e.map(i=>{const s=h1(i,t);return n||(n=typeof s=="function"),s});if(n)return()=>{r.forEach((i,s)=>{typeof i=="function"?i?.():h1(e[s],null)})}}}function h1(e,t){if(typeof e=="function")return()=>e(t);e!=null&&"current"in e&&(e.current=t)}function mL(e,t){if(e!=null){if(aL(e)){e(t);return}try{e.current=t}catch{throw new Error(`Cannot assign value '${t}' to ref '${e}'`)}}}function hE(...e){return t=>{e.forEach(n=>mL(n,t))}}function gL(){const e=()=>()=>{};return S.useSyncExternalStore(e,()=>!0,()=>!1)}var vL=new Set(["id","type","style","title","role","tabIndex","htmlFor","width","height","abbr","accept","acceptCharset","accessKey","action","allowFullScreen","allowTransparency","alt","async","autoComplete","autoFocus","autoPlay","cellPadding","cellSpacing","challenge","charset","checked","cite","class","className","cols","colSpan","command","content","contentEditable","contextMenu","controls","coords","crossOrigin","data","dateTime","default","defer","dir","disabled","download","draggable","dropzone","encType","enterKeyHint","for","form","formAction","formEncType","formMethod","formNoValidate","formTarget","frameBorder","headers","hidden","high","href","hrefLang","httpEquiv","icon","inputMode","isMap","itemId","itemProp","itemRef","itemScope","itemType","kind","label","lang","list","loop","manifest","max","maxLength","media","mediaGroup","method","min","minLength","multiple","muted","name","noValidate","open","optimum","pattern","ping","placeholder","poster","preload","radioGroup","referrerPolicy","readOnly","rel","required","rows","rowSpan","sandbox","scope","scoped","scrolling","seamless","selected","shape","size","sizes","slot","sortable","span","spellCheck","src","srcDoc","srcSet","start","step","target","translate","typeMustMatch","useMap","value","wmode","wrap"]),yL=new Set(["onCopy","onCut","onPaste","onLoad","onError","onWheel","onScroll","onCompositionEnd","onCompositionStart","onCompositionUpdate","onKeyDown","onKeyPress","onKeyUp","onFocus","onBlur","onChange","onInput","onSubmit","onClick","onContextMenu","onDoubleClick","onDrag","onDragEnd","onDragEnter","onDragExit","onDragLeave","onDragOver","onDragStart","onDrop","onMouseDown","onMouseEnter","onMouseLeave","onMouseMove","onMouseOut","onMouseOver","onMouseUp","onPointerDown","onPointerEnter","onPointerLeave","onPointerUp","onSelect","onTouchCancel","onTouchEnd","onTouchMove","onTouchStart","onAnimationStart","onAnimationEnd","onAnimationIteration","onTransitionEnd"]),m1=/^(data-.*)$/,bL=/^(aria-.*)$/,lg=/^(on[A-Z].*)$/;function Ef(e,t={}){let{labelable:n=!0,enabled:r=!0,propNames:i,omitPropNames:s,omitEventNames:l,omitDataProps:c,omitEventProps:d}=t,h={};if(!r)return e;for(const m in e)s?.has(m)||l?.has(m)&&lg.test(m)||lg.test(m)&&!yL.has(m)||c&&m1.test(m)||d&&lg.test(m)||(Object.prototype.hasOwnProperty.call(e,m)&&(vL.has(m)||n&&bL.test(m)||i?.has(m)||m1.test(m))||lg.test(m))&&(h[m]=e[m]);return h}var[xL,li]=pv({name:"ProviderContext",strict:!1});const wL=new Set(["Arab","Syrc","Samr","Mand","Thaa","Mend","Nkoo","Adlm","Rohg","Hebr"]),SL=new Set(["ae","ar","arc","bcc","bqi","ckb","dv","fa","glk","he","ku","mzn","nqo","pnb","ps","sd","ug","ur","yi"]);function mE(e){if(Intl.Locale){let n=new Intl.Locale(e).maximize(),r=typeof n.getTextInfo=="function"?n.getTextInfo():n.textInfo;if(r)return r.direction==="rtl";if(n.script)return wL.has(n.script)}let t=e.split("-")[0];return SL.has(t)}const gE={prefix:String(Math.round(Math.random()*1e10)),current:0},vE=We.createContext(gE),kL=We.createContext(!1);let Ky=new WeakMap;function CL(e=!1){let t=S.useContext(vE),n=S.useRef(null);if(n.current===null&&!e){var r,i;let s=(i=We.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED)===null||i===void 0||(r=i.ReactCurrentOwner)===null||r===void 0?void 0:r.current;if(s){let l=Ky.get(s);l==null?Ky.set(s,{id:t.current,state:s.memoizedState}):s.memoizedState!==l.state&&(t.current=l.id,Ky.delete(s))}n.current=++t.current}return n.current}function EL(e){let t=S.useContext(vE),n=CL(!!e),r=`react-aria${t.prefix}`;return e||`${r}-${n}`}function PL(e){let t=We.useId(),[n]=S.useState(hh()),r=n?"react-aria":`react-aria${gE.prefix}`;return e||`${r}-${t}`}const TL=typeof We.useId=="function"?PL:EL;function _L(){return!1}function IL(){return!0}function $L(e){return()=>{}}function hh(){return typeof We.useSyncExternalStore=="function"?We.useSyncExternalStore($L,_L,IL):S.useContext(kL)}const AL=Symbol.for("react-aria.i18n.locale");function yE(){let e=typeof window<"u"&&window[AL]||typeof navigator<"u"&&(navigator.language||navigator.userLanguage)||"en-US";try{Intl.DateTimeFormat.supportedLocalesOf([e])}catch{e="en-US"}return{locale:e,direction:mE(e)?"rtl":"ltr"}}let K0=yE(),Ip=new Set;function g1(){K0=yE();for(let e of Ip)e(K0)}function bE(){let e=hh(),[t,n]=S.useState(K0);return S.useEffect(()=>(Ip.size===0&&window.addEventListener("languagechange",g1),Ip.add(n),()=>{Ip.delete(n),Ip.size===0&&window.removeEventListener("languagechange",g1)}),[]),e?{locale:"en-US",direction:"ltr"}:t}const xE=We.createContext(null);function RL(e){let{locale:t,children:n}=e,r=bE(),i=We.useMemo(()=>t?{locale:t,direction:mE(t)?"rtl":"ltr"}:r,[r,t]);return We.createElement(xE.Provider,{value:i},n)}function mh(){let e=bE();return S.useContext(xE)||e}const LL=Symbol.for("react-aria.i18n.locale"),ML=Symbol.for("react-aria.i18n.strings");let of;class hv{getStringForLocale(t,n){let i=this.getStringsForLocale(n)[t];if(!i)throw new Error(`Could not find intl message ${t} in ${n} locale`);return i}getStringsForLocale(t){let n=this.strings[t];return n||(n=DL(t,this.strings,this.defaultLocale),this.strings[t]=n),n}static getGlobalDictionaryForPackage(t){if(typeof window>"u")return null;let n=window[LL];if(of===void 0){let i=window[ML];if(!i)return null;of={};for(let s in i)of[s]=new hv({[n]:i[s]},n)}let r=of?.[t];if(!r)throw new Error(`Strings for package "${t}" were not included by LocalizedStringProvider. Please add it to the list passed to createLocalizedStringDictionary.`);return r}constructor(t,n="en-US"){this.strings=Object.fromEntries(Object.entries(t).filter(([,r])=>r)),this.defaultLocale=n}}function DL(e,t,n="en-US"){if(t[e])return t[e];let r=NL(e);if(t[r])return t[r];for(let i in t)if(i.startsWith(r+"-"))return t[i];return t[n]}function NL(e){return Intl.Locale?new Intl.Locale(e).language:e.split("-")[0]}const v1=new Map,y1=new Map;class FL{format(t,n){let r=this.strings.getStringForLocale(t,this.locale);return typeof r=="function"?r(n,this):r}plural(t,n,r="cardinal"){let i=n["="+t];if(i)return typeof i=="function"?i():i;let s=this.locale+":"+r,l=v1.get(s);l||(l=new Intl.PluralRules(this.locale,{type:r}),v1.set(s,l));let c=l.select(t);return i=n[c]||n.other,typeof i=="function"?i():i}number(t){let n=y1.get(this.locale);return n||(n=new Intl.NumberFormat(this.locale),y1.set(this.locale,n)),n.format(t)}select(t,n){let r=t[n]||t.other;return typeof r=="function"?r():r}constructor(t,n){this.locale=t,this.strings=n}}const b1=new WeakMap;function OL(e){let t=b1.get(e);return t||(t=new hv(e),b1.set(e,t)),t}function zL(e,t){return t&&hv.getGlobalDictionaryForPackage(t)||OL(e)}function jL(e,t){let{locale:n}=mh(),r=zL(e,t);return S.useMemo(()=>new FL(n,r),[n,r])}function BL(e,t){if(t.has(e))throw new TypeError("Cannot initialize the same private elements twice on an object")}function VL(e,t,n){BL(e,t),t.set(e,n)}const sn=typeof document<"u"?We.useLayoutEffect:()=>{};function jn(e){const t=S.useRef(null);return sn(()=>{t.current=e},[e]),S.useCallback((...n)=>{const r=t.current;return r?.(...n)},[])}function UL(e){let[t,n]=S.useState(e),r=S.useRef(null),i=jn(()=>{if(!r.current)return;let l=r.current.next();if(l.done){r.current=null;return}t===l.value?i():n(l.value)});sn(()=>{r.current&&i()});let s=jn(l=>{r.current=l(t),i()});return[t,s]}let KL=!!(typeof window<"u"&&window.document&&window.document.createElement),bf=new Map,$p;typeof FinalizationRegistry<"u"&&($p=new FinalizationRegistry(e=>{bf.delete(e)}));function Pf(e){let[t,n]=S.useState(e),r=S.useRef(null),i=TL(t),s=S.useRef(null);if($p&&$p.register(s,i),KL){const l=bf.get(i);l&&!l.includes(r)?l.push(r):bf.set(i,[r])}return sn(()=>{let l=i;return()=>{$p&&$p.unregister(s),bf.delete(l)}},[i]),S.useEffect(()=>{let l=r.current;return l&&n(l),()=>{l&&(r.current=null)}}),i}function WL(e,t){if(e===t)return e;let n=bf.get(e);if(n)return n.forEach(i=>i.current=t),t;let r=bf.get(t);return r?(r.forEach(i=>i.current=e),e):t}function W0(e=[]){let t=Pf(),[n,r]=UL(t),i=S.useCallback(()=>{r(function*(){yield t,yield document.getElementById(t)?t:void 0})},[t,r]);return sn(i,[t,i,...e]),n}function Tf(...e){return(...t)=>{for(let n of e)typeof n=="function"&&n(...t)}}const Dt=e=>{var t;return(t=e?.ownerDocument)!==null&&t!==void 0?t:document},Zi=e=>e&&"window"in e&&e.window===e?e:Dt(e).defaultView||window;function HL(e){return e!==null&&typeof e=="object"&&"nodeType"in e&&typeof e.nodeType=="number"}function GL(e){return HL(e)&&e.nodeType===Node.DOCUMENT_FRAGMENT_NODE&&"host"in e}let qL=!1,YL=!1;function LG(){return qL}function mv(){return YL}function oi(e,t){if(!mv())return t&&e?e.contains(t):!1;if(!e||!t)return!1;let n=t;for(;n!==null;){if(n===e)return!0;n.tagName==="SLOT"&&n.assignedSlot?n=n.assignedSlot.parentNode:GL(n)?n=n.host:n=n.parentNode}return!1}const Or=(e=document)=>{var t;if(!mv())return e.activeElement;let n=e.activeElement;for(;n&&"shadowRoot"in n&&(!((t=n.shadowRoot)===null||t===void 0)&&t.activeElement);)n=n.shadowRoot.activeElement;return n};function En(e){return mv()&&e.target.shadowRoot&&e.composedPath?e.composedPath()[0]:e.target}class XL{get currentNode(){return this._currentNode}set currentNode(t){if(!oi(this.root,t))throw new Error("Cannot set currentNode to a node that is not contained by the root node.");const n=[];let r=t,i=t;for(this._currentNode=t;r&&r!==this.root;)if(r.nodeType===Node.DOCUMENT_FRAGMENT_NODE){const l=r,c=this._doc.createTreeWalker(l,this.whatToShow,{acceptNode:this._acceptNode});n.push(c),c.currentNode=i,this._currentSetFor.add(c),r=i=l.host}else r=r.parentNode;const s=this._doc.createTreeWalker(this.root,this.whatToShow,{acceptNode:this._acceptNode});n.push(s),s.currentNode=i,this._currentSetFor.add(s),this._walkerStack=n}get doc(){return this._doc}firstChild(){let t=this.currentNode,n=this.nextNode();return oi(t,n)?(n&&(this.currentNode=n),n):(this.currentNode=t,null)}lastChild(){let n=this._walkerStack[0].lastChild();return n&&(this.currentNode=n),n}nextNode(){const t=this._walkerStack[0].nextNode();if(t){if(t.shadowRoot){var n;let i;if(typeof this.filter=="function"?i=this.filter(t):!((n=this.filter)===null||n===void 0)&&n.acceptNode&&(i=this.filter.acceptNode(t)),i===NodeFilter.FILTER_ACCEPT)return this.currentNode=t,t;let s=this.nextNode();return s&&(this.currentNode=s),s}return t&&(this.currentNode=t),t}else if(this._walkerStack.length>1){this._walkerStack.shift();let r=this.nextNode();return r&&(this.currentNode=r),r}else return null}previousNode(){const t=this._walkerStack[0];if(t.currentNode===t.root){if(this._currentSetFor.has(t))if(this._currentSetFor.delete(t),this._walkerStack.length>1){this._walkerStack.shift();let i=this.previousNode();return i&&(this.currentNode=i),i}else return null;return null}const n=t.previousNode();if(n){if(n.shadowRoot){var r;let s;if(typeof this.filter=="function"?s=this.filter(n):!((r=this.filter)===null||r===void 0)&&r.acceptNode&&(s=this.filter.acceptNode(n)),s===NodeFilter.FILTER_ACCEPT)return n&&(this.currentNode=n),n;let l=this.lastChild();return l&&(this.currentNode=l),l}return n&&(this.currentNode=n),n}else if(this._walkerStack.length>1){this._walkerStack.shift();let i=this.previousNode();return i&&(this.currentNode=i),i}else return null}nextSibling(){return null}previousSibling(){return null}parentNode(){return null}constructor(t,n,r,i){this._walkerStack=[],this._currentSetFor=new Set,this._acceptNode=l=>{if(l.nodeType===Node.ELEMENT_NODE){const d=l.shadowRoot;if(d){const h=this._doc.createTreeWalker(d,this.whatToShow,{acceptNode:this._acceptNode});return this._walkerStack.unshift(h),NodeFilter.FILTER_ACCEPT}else{var c;if(typeof this.filter=="function")return this.filter(l);if(!((c=this.filter)===null||c===void 0)&&c.acceptNode)return this.filter.acceptNode(l);if(this.filter===null)return NodeFilter.FILTER_ACCEPT}}return NodeFilter.FILTER_SKIP},this._doc=t,this.root=n,this.filter=i??null,this.whatToShow=r??NodeFilter.SHOW_ALL,this._currentNode=n,this._walkerStack.unshift(t.createTreeWalker(n,r,this._acceptNode));const s=n.shadowRoot;if(s){const l=this._doc.createTreeWalker(s,this.whatToShow,{acceptNode:this._acceptNode});this._walkerStack.unshift(l)}}}function QL(e,t,n,r){return mv()?new XL(e,t,n,r):e.createTreeWalker(t,n,r)}function wE(e){var t,n,r="";if(typeof e=="string"||typeof e=="number")r+=e;else if(typeof e=="object")if(Array.isArray(e)){var i=e.length;for(t=0;t=65&&i.charCodeAt(2)<=90?t[i]=Tf(s,l):(i==="className"||i==="UNSAFE_className")&&typeof s=="string"&&typeof l=="string"?t[i]=JL(s,l):i==="id"&&s&&l?t.id=WL(s,l):t[i]=l!==void 0?l:s}}return t}const ZL=new Set(["id"]),eM=new Set(["aria-label","aria-labelledby","aria-describedby","aria-details"]),tM=new Set(["href","hrefLang","target","rel","download","ping","referrerPolicy"]),nM=/^(data-.*)$/;function Iu(e,t={}){let{labelable:n,isLink:r,propNames:i}=t,s={};for(const l in e)Object.prototype.hasOwnProperty.call(e,l)&&(ZL.has(l)||n&&eM.has(l)||r&&tM.has(l)||i?.has(l)||nM.test(l))&&(s[l]=e[l]);return s}function Zl(e){if(rM())e.focus({preventScroll:!0});else{let t=iM(e);e.focus(),oM(t)}}let ag=null;function rM(){if(ag==null){ag=!1;try{document.createElement("div").focus({get preventScroll(){return ag=!0,!0}})}catch{}}return ag}function iM(e){let t=e.parentNode,n=[],r=document.scrollingElement||document.documentElement;for(;t instanceof HTMLElement&&t!==r;)(t.offsetHeight"u"||window.navigator==null?!1:((t=window.navigator.userAgentData)===null||t===void 0?void 0:t.brands.some(n=>e.test(n.brand)))||e.test(window.navigator.userAgent)}function lx(e){var t;return typeof window<"u"&&window.navigator!=null?e.test(((t=window.navigator.userAgentData)===null||t===void 0?void 0:t.platform)||window.navigator.platform):!1}function rl(e){let t=null;return()=>(t==null&&(t=e()),t)}const xu=rl(function(){return lx(/^Mac/i)}),sM=rl(function(){return lx(/^iPhone/i)}),SE=rl(function(){return lx(/^iPad/i)||xu()&&navigator.maxTouchPoints>1}),vv=rl(function(){return sM()||SE()}),lM=rl(function(){return xu()||vv()}),kE=rl(function(){return gv(/AppleWebKit/i)&&!CE()}),CE=rl(function(){return gv(/Chrome/i)}),ax=rl(function(){return gv(/Android/i)}),aM=rl(function(){return gv(/Firefox/i)}),EE=S.createContext({isNative:!0,open:fM,useHref:e=>e});function uM(e){let{children:t,navigate:n,useHref:r}=e,i=S.useMemo(()=>({isNative:!1,open:(s,l,c,d)=>{PE(s,h=>{cM(h,l)?n(c,d):wu(h,l)})},useHref:r||(s=>s)}),[n,r]);return We.createElement(EE.Provider,{value:i},t)}function ux(){return S.useContext(EE)}function cM(e,t){let n=e.getAttribute("target");return(!n||n==="_self")&&e.origin===location.origin&&!e.hasAttribute("download")&&!t.metaKey&&!t.ctrlKey&&!t.altKey&&!t.shiftKey}function wu(e,t,n=!0){var r,i;let{metaKey:s,ctrlKey:l,altKey:c,shiftKey:d}=t;aM()&&(!((i=window.event)===null||i===void 0||(r=i.type)===null||r===void 0)&&r.startsWith("key"))&&e.target==="_blank"&&(xu()?s=!0:l=!0);let h=kE()&&xu()&&!SE()?new KeyboardEvent("keydown",{keyIdentifier:"Enter",metaKey:s,ctrlKey:l,altKey:c,shiftKey:d}):new MouseEvent("click",{metaKey:s,ctrlKey:l,altKey:c,shiftKey:d,bubbles:!0,cancelable:!0});wu.isOpening=n,Zl(e),e.dispatchEvent(h),wu.isOpening=!1}wu.isOpening=!1;function PE(e,t){if(e instanceof HTMLAnchorElement)t(e);else if(e.hasAttribute("data-href")){let n=document.createElement("a");n.href=e.getAttribute("data-href"),e.hasAttribute("data-target")&&(n.target=e.getAttribute("data-target")),e.hasAttribute("data-rel")&&(n.rel=e.getAttribute("data-rel")),e.hasAttribute("data-download")&&(n.download=e.getAttribute("data-download")),e.hasAttribute("data-ping")&&(n.ping=e.getAttribute("data-ping")),e.hasAttribute("data-referrer-policy")&&(n.referrerPolicy=e.getAttribute("data-referrer-policy")),e.appendChild(n),t(n),e.removeChild(n)}}function fM(e,t){PE(e,n=>wu(n,t))}function MG(e){let t=ux();var n;const r=t.useHref((n=e.href)!==null&&n!==void 0?n:"");return{"data-href":e.href?r:void 0,"data-target":e.target,"data-rel":e.rel,"data-download":e.download,"data-ping":e.ping,"data-referrer-policy":e.referrerPolicy}}function DG(e){let t=ux();var n;const r=t.useHref((n=e?.href)!==null&&n!==void 0?n:"");return{href:e?.href?r:void 0,target:e?.target,rel:e?.rel,download:e?.download,ping:e?.ping,referrerPolicy:e?.referrerPolicy}}let ql=new Map,H0=new Set;function x1(){if(typeof window>"u")return;function e(r){return"propertyName"in r}let t=r=>{if(!e(r)||!r.target)return;let i=ql.get(r.target);i||(i=new Set,ql.set(r.target,i),r.target.addEventListener("transitioncancel",n,{once:!0})),i.add(r.propertyName)},n=r=>{if(!e(r)||!r.target)return;let i=ql.get(r.target);if(i&&(i.delete(r.propertyName),i.size===0&&(r.target.removeEventListener("transitioncancel",n),ql.delete(r.target)),ql.size===0)){for(let s of H0)s();H0.clear()}};document.body.addEventListener("transitionrun",t),document.body.addEventListener("transitionend",n)}typeof document<"u"&&(document.readyState!=="loading"?x1():document.addEventListener("DOMContentLoaded",x1));function dM(){for(const[e]of ql)"isConnected"in e&&!e.isConnected&&ql.delete(e)}function TE(e){requestAnimationFrame(()=>{dM(),ql.size===0?e():H0.add(e)})}function cx(){let e=S.useRef(new Map),t=S.useCallback((i,s,l,c)=>{let d=c?.once?(...h)=>{e.current.delete(l),l(...h)}:l;e.current.set(l,{type:s,eventTarget:i,fn:d,options:c}),i.addEventListener(s,d,c)},[]),n=S.useCallback((i,s,l,c)=>{var d;let h=((d=e.current.get(l))===null||d===void 0?void 0:d.fn)||l;i.removeEventListener(s,h,c),e.current.delete(l)},[]),r=S.useCallback(()=>{e.current.forEach((i,s)=>{n(i.eventTarget,i.type,s,i.options)})},[n]);return S.useEffect(()=>r,[r]),{addGlobalListener:t,removeGlobalListener:n,removeAllGlobalListeners:r}}function _E(e,t){let{id:n,"aria-label":r,"aria-labelledby":i}=e;return n=Pf(n),i&&r?i=[...new Set([n,...i.trim().split(/\s+/)])].join(" "):i&&(i=i.trim().split(/\s+/).join(" ")),!r&&!i&&t&&(r=t),{id:n,"aria-label":r,"aria-labelledby":i}}function w1(e,t){const n=S.useRef(!0),r=S.useRef(null);sn(()=>(n.current=!0,()=>{n.current=!1}),[]),sn(()=>{n.current?n.current=!1:(!r.current||t.some((i,s)=>!Object.is(i,r[s])))&&e(),r.current=t},t)}function pM(){return typeof window.ResizeObserver<"u"}function S1(e){const{ref:t,box:n,onResize:r}=e;S.useEffect(()=>{let i=t?.current;if(i)if(pM()){const s=new window.ResizeObserver(l=>{l.length&&r()});return s.observe(i,{box:n}),()=>{i&&s.unobserve(i)}}else return window.addEventListener("resize",r,!1),()=>{window.removeEventListener("resize",r,!1)}},[r,t,n])}function IE(e,t){sn(()=>{if(e&&e.ref&&t)return e.ref.current=t.current,()=>{e.ref&&(e.ref.current=null)}})}function Yp(e,t){if(!e)return!1;let n=window.getComputedStyle(e),r=/(auto|scroll)/.test(n.overflow+n.overflowX+n.overflowY);return r&&t&&(r=e.scrollHeight!==e.clientHeight||e.scrollWidth!==e.clientWidth),r}function $E(e,t){let n=e;for(Yp(n,t)&&(n=n.parentElement);n&&!Yp(n,t);)n=n.parentElement;return n||document.scrollingElement||document.documentElement}function hM(e,t){const n=[];for(;e&&e!==document.documentElement;)Yp(e,t)&&n.push(e),e=e.parentElement;return n}function ug(e,t,n,r){let i=jn(n),s=n==null;S.useEffect(()=>{if(s||!e.current)return;let l=e.current;return l.addEventListener(t,i,r),()=>{l.removeEventListener(t,i,r)}},[e,t,r,s,i])}function AE(e,t){let n=k1(e,t,"left"),r=k1(e,t,"top"),i=t.offsetWidth,s=t.offsetHeight,l=e.scrollLeft,c=e.scrollTop,{borderTopWidth:d,borderLeftWidth:h,scrollPaddingTop:m,scrollPaddingRight:g,scrollPaddingBottom:b,scrollPaddingLeft:x}=getComputedStyle(e),k=l+parseInt(h,10),P=c+parseInt(d,10),_=k+e.clientWidth,T=P+e.clientHeight,$=parseInt(m,10)||0,L=parseInt(b,10)||0,z=parseInt(g,10)||0,K=parseInt(x,10)||0;n<=l+K?l=n-parseInt(h,10)-K:n+i>_-z&&(l+=n+i-_+z),r<=P+$?c=r-parseInt(d,10)-$:r+s>T-L&&(c+=r+s-T+L),e.scrollLeft=l,e.scrollTop=c}function k1(e,t,n){const r=n==="left"?"offsetLeft":"offsetTop";let i=0;for(;t.offsetParent&&(i+=t[r],t.offsetParent!==e);){if(t.offsetParent.contains(e)){i-=e[r];break}t=t.offsetParent}return i}function C1(e,t){if(e&&document.contains(e)){let l=document.scrollingElement||document.documentElement;if(window.getComputedStyle(l).overflow==="hidden"){let d=hM(e);for(let h of d)AE(h,e)}else{var n;let{left:d,top:h}=e.getBoundingClientRect();e==null||(n=e.scrollIntoView)===null||n===void 0||n.call(e,{block:"nearest"});let{left:m,top:g}=e.getBoundingClientRect();if(Math.abs(d-m)>1||Math.abs(h-g)>1){var r,i,s;t==null||(i=t.containingElement)===null||i===void 0||(r=i.scrollIntoView)===null||r===void 0||r.call(i,{block:"center",inline:"center"}),(s=e.scrollIntoView)===null||s===void 0||s.call(e,{block:"nearest"})}}}}function RE(e){return e.mozInputSource===0&&e.isTrusted?!0:ax()&&e.pointerType?e.type==="click"&&e.buttons===1:e.detail===0&&!e.pointerType}function mM(e){return!ax()&&e.width===0&&e.height===0||e.width===1&&e.height===1&&e.pressure===0&&e.detail===0&&e.pointerType==="mouse"}function LE(e,t,n){let r=S.useRef(t),i=jn(()=>{n&&n(r.current)});S.useEffect(()=>{var s;let l=e==null||(s=e.current)===null||s===void 0?void 0:s.form;return l?.addEventListener("reset",i),()=>{l?.removeEventListener("reset",i)}},[e,i])}const gM="react-aria-clear-focus",vM="react-aria-focus";function mp(e){return xu()?e.metaKey:e.ctrlKey}var ME=cE();const DE=dv(ME),fx=["input:not([disabled]):not([type=hidden])","select:not([disabled])","textarea:not([disabled])","button:not([disabled])","a[href]","area[href]","summary","iframe","object","embed","audio[controls]","video[controls]",'[contenteditable]:not([contenteditable^="false"])'],yM=fx.join(":not([hidden]),")+",[tabindex]:not([disabled]):not([hidden])";fx.push('[tabindex]:not([tabindex="-1"]):not([disabled])');const bM=fx.join(':not([hidden]):not([tabindex="-1"]),');function NE(e){return e.matches(yM)}function xM(e){return e.matches(bM)}function $u(e,t,n){let[r,i]=S.useState(e||t),s=S.useRef(e!==void 0),l=e!==void 0;S.useEffect(()=>{s.current,s.current=l},[l]);let c=l?e:r,d=S.useCallback((h,...m)=>{let g=(b,...x)=>{n&&(Object.is(c,b)||n(b,...x)),l||(c=b)};typeof h=="function"?i((x,...k)=>{let P=h(l?c:x,...k);return g(P,...m),l?x:P}):(l||i(h),g(h,...m))},[l,c,n]);return[c,d]}function Bg(e,t=-1/0,n=1/0){return Math.min(Math.max(e,t),n)}let Wy=new Map,G0=!1;try{G0=new Intl.NumberFormat("de-DE",{signDisplay:"exceptZero"}).resolvedOptions().signDisplay==="exceptZero"}catch{}let Vg=!1;try{Vg=new Intl.NumberFormat("de-DE",{style:"unit",unit:"degree"}).resolvedOptions().style==="unit"}catch{}const FE={degree:{narrow:{default:"°","ja-JP":" 度","zh-TW":"度","sl-SI":" °"}}};class wM{format(t){let n="";if(!G0&&this.options.signDisplay!=null?n=kM(this.numberFormatter,this.options.signDisplay,t):n=this.numberFormatter.format(t),this.options.style==="unit"&&!Vg){var r;let{unit:i,unitDisplay:s="short",locale:l}=this.resolvedOptions();if(!i)return n;let c=(r=FE[i])===null||r===void 0?void 0:r[s];n+=c[l]||c.default}return n}formatToParts(t){return this.numberFormatter.formatToParts(t)}formatRange(t,n){if(typeof this.numberFormatter.formatRange=="function")return this.numberFormatter.formatRange(t,n);if(n= start date");return`${this.format(t)} – ${this.format(n)}`}formatRangeToParts(t,n){if(typeof this.numberFormatter.formatRangeToParts=="function")return this.numberFormatter.formatRangeToParts(t,n);if(n= start date");let r=this.numberFormatter.formatToParts(t),i=this.numberFormatter.formatToParts(n);return[...r.map(s=>({...s,source:"startRange"})),{type:"literal",value:" – ",source:"shared"},...i.map(s=>({...s,source:"endRange"}))]}resolvedOptions(){let t=this.numberFormatter.resolvedOptions();return!G0&&this.options.signDisplay!=null&&(t={...t,signDisplay:this.options.signDisplay}),!Vg&&this.options.style==="unit"&&(t={...t,style:"unit",unit:this.options.unit,unitDisplay:this.options.unitDisplay}),t}constructor(t,n={}){this.numberFormatter=SM(t,n),this.options=n}}function SM(e,t={}){let{numberingSystem:n}=t;if(n&&e.includes("-nu-")&&(e.includes("-u-")||(e+="-u-"),e+=`-nu-${n}`),t.style==="unit"&&!Vg){var r;let{unit:l,unitDisplay:c="short"}=t;if(!l)throw new Error('unit option must be provided with style: "unit"');if(!(!((r=FE[l])===null||r===void 0)&&r[c]))throw new Error(`Unsupported unit ${l} with unitDisplay = ${c}`);t={...t,style:"decimal"}}let i=e+(t?Object.entries(t).sort((l,c)=>l[0]0||Object.is(n,0):t==="exceptZero"&&(Object.is(n,-0)||Object.is(n,0)?n=Math.abs(n):r=n>0),r){let i=e.format(-n),s=e.format(n),l=i.replace(s,"").replace(/\u200e|\u061C/,"");return[...l].length!==1&&console.warn("@react-aria/i18n polyfill for NumberFormat signDisplay: Unsupported case"),i.replace(s,"!!!").replace(l,"+").replace("!!!",s)}else return e.format(n)}}function CM(e={}){let{locale:t}=mh();return S.useMemo(()=>new wM(t,e),[t,e])}let Hy=new Map;function EM(e){let{locale:t}=mh(),n=t+(e?Object.entries(e).sort((i,s)=>i[0]-1&&e.splice(n,1)}const Zs=(e,t,n)=>n>t?t:n{};const ds={},OE=e=>/^-?(?:\d+(?:\.\d+)?|\.\d+)$/u.test(e);function zE(e){return typeof e=="object"&&e!==null}const jE=e=>/^0[^.\s]+$/u.test(e);function vx(e){let t;return()=>(t===void 0&&(t=e()),t)}const eo=e=>e,PM=(e,t)=>n=>t(e(n)),vh=(...e)=>e.reduce(PM),Qp=(e,t,n)=>{const r=t-e;return r===0?1:(n-e)/r};class yx{constructor(){this.subscriptions=[]}add(t){return hx(this.subscriptions,t),()=>mx(this.subscriptions,t)}notify(t,n,r){const i=this.subscriptions.length;if(i)if(i===1)this.subscriptions[0](t,n,r);else for(let s=0;se*1e3,cs=e=>e/1e3;function BE(e,t){return t?e*(1e3/t):0}const VE=(e,t,n)=>(((1-3*n+3*t)*e+(3*n-6*t))*e+3*t)*e,TM=1e-7,_M=12;function IM(e,t,n,r,i){let s,l,c=0;do l=t+(n-t)/2,s=VE(l,r,i)-e,s>0?n=l:t=l;while(Math.abs(s)>TM&&++c<_M);return l}function yh(e,t,n,r){if(e===t&&n===r)return eo;const i=s=>IM(s,0,1,e,n);return s=>s===0||s===1?s:VE(i(s),t,r)}const UE=e=>t=>t<=.5?e(2*t)/2:(2-e(2*(1-t)))/2,KE=e=>t=>1-e(1-t),WE=yh(.33,1.53,.69,.99),bx=KE(WE),HE=UE(bx),GE=e=>(e*=2)<1?.5*bx(e):.5*(2-Math.pow(2,-10*(e-1))),xx=e=>1-Math.sin(Math.acos(e)),qE=KE(xx),YE=UE(xx),$M=yh(.42,0,1,1),AM=yh(0,0,.58,1),XE=yh(.42,0,.58,1),RM=e=>Array.isArray(e)&&typeof e[0]!="number",QE=e=>Array.isArray(e)&&typeof e[0]=="number",LM={linear:eo,easeIn:$M,easeInOut:XE,easeOut:AM,circIn:xx,circInOut:YE,circOut:qE,backIn:bx,backInOut:HE,backOut:WE,anticipate:GE},MM=e=>typeof e=="string",E1=e=>{if(QE(e)){gx(e.length===4);const[t,n,r,i]=e;return yh(t,n,r,i)}else if(MM(e))return LM[e];return e},cg=["setup","read","resolveKeyframes","preUpdate","update","preRender","render","postRender"];function DM(e,t){let n=new Set,r=new Set,i=!1,s=!1;const l=new WeakSet;let c={delta:0,timestamp:0,isProcessing:!1};function d(m){l.has(m)&&(h.schedule(m),e()),m(c)}const h={schedule:(m,g=!1,b=!1)=>{const k=b&&i?n:r;return g&&l.add(m),k.has(m)||k.add(m),m},cancel:m=>{r.delete(m),l.delete(m)},process:m=>{if(c=m,i){s=!0;return}i=!0,[n,r]=[r,n],n.forEach(d),n.clear(),i=!1,s&&(s=!1,h.process(m))}};return h}const NM=40;function JE(e,t){let n=!1,r=!0;const i={delta:0,timestamp:0,isProcessing:!1},s=()=>n=!0,l=cg.reduce((L,z)=>(L[z]=DM(s),L),{}),{setup:c,read:d,resolveKeyframes:h,preUpdate:m,update:g,preRender:b,render:x,postRender:k}=l,P=()=>{const L=ds.useManualTiming?i.timestamp:performance.now();n=!1,ds.useManualTiming||(i.delta=r?1e3/60:Math.max(Math.min(L-i.timestamp,NM),1)),i.timestamp=L,i.isProcessing=!0,c.process(i),d.process(i),h.process(i),m.process(i),g.process(i),b.process(i),x.process(i),k.process(i),i.isProcessing=!1,n&&t&&(r=!1,e(P))},_=()=>{n=!0,r=!0,i.isProcessing||e(P)};return{schedule:cg.reduce((L,z)=>{const K=l[z];return L[z]=(M,J=!1,re=!1)=>(n||_(),K.schedule(M,J,re)),L},{}),cancel:L=>{for(let z=0;z(Ig===void 0&&si.set(cr.isProcessing||ds.useManualTiming?cr.timestamp:performance.now()),Ig),set:e=>{Ig=e,queueMicrotask(FM)}},ZE=e=>t=>typeof t=="string"&&t.startsWith(e),wx=ZE("--"),OM=ZE("var(--"),Sx=e=>OM(e)?zM.test(e.split("/*")[0].trim()):!1,zM=/var\(--(?:[\w-]+\s*|[\w-]+\s*,(?:\s*[^)(\s]|\s*\((?:[^)(]|\([^)(]*\))*\))+\s*)\)$/iu,Ff={test:e=>typeof e=="number",parse:parseFloat,transform:e=>e},Jp={...Ff,transform:e=>Zs(0,1,e)},fg={...Ff,default:1},Np=e=>Math.round(e*1e5)/1e5,kx=/-?(?:\d+(?:\.\d+)?|\.\d+)/gu;function jM(e){return e==null}const BM=/^(?:#[\da-f]{3,8}|(?:rgb|hsl)a?\((?:-?[\d.]+%?[,\s]+){2}-?[\d.]+%?\s*(?:[,/]\s*)?(?:\b\d+(?:\.\d+)?|\.\d+)?%?\))$/iu,Cx=(e,t)=>n=>!!(typeof n=="string"&&BM.test(n)&&n.startsWith(e)||t&&!jM(n)&&Object.prototype.hasOwnProperty.call(n,t)),eP=(e,t,n)=>r=>{if(typeof r!="string")return r;const[i,s,l,c]=r.match(kx);return{[e]:parseFloat(i),[t]:parseFloat(s),[n]:parseFloat(l),alpha:c!==void 0?parseFloat(c):1}},VM=e=>Zs(0,255,e),qy={...Ff,transform:e=>Math.round(VM(e))},pu={test:Cx("rgb","red"),parse:eP("red","green","blue"),transform:({red:e,green:t,blue:n,alpha:r=1})=>"rgba("+qy.transform(e)+", "+qy.transform(t)+", "+qy.transform(n)+", "+Np(Jp.transform(r))+")"};function UM(e){let t="",n="",r="",i="";return e.length>5?(t=e.substring(1,3),n=e.substring(3,5),r=e.substring(5,7),i=e.substring(7,9)):(t=e.substring(1,2),n=e.substring(2,3),r=e.substring(3,4),i=e.substring(4,5),t+=t,n+=n,r+=r,i+=i),{red:parseInt(t,16),green:parseInt(n,16),blue:parseInt(r,16),alpha:i?parseInt(i,16)/255:1}}const q0={test:Cx("#"),parse:UM,transform:pu.transform},bh=e=>({test:t=>typeof t=="string"&&t.endsWith(e)&&t.split(" ").length===1,parse:parseFloat,transform:t=>`${t}${e}`}),Gl=bh("deg"),fs=bh("%"),tt=bh("px"),KM=bh("vh"),WM=bh("vw"),P1={...fs,parse:e=>fs.parse(e)/100,transform:e=>fs.transform(e*100)},pf={test:Cx("hsl","hue"),parse:eP("hue","saturation","lightness"),transform:({hue:e,saturation:t,lightness:n,alpha:r=1})=>"hsla("+Math.round(e)+", "+fs.transform(Np(t))+", "+fs.transform(Np(n))+", "+Np(Jp.transform(r))+")"},Rn={test:e=>pu.test(e)||q0.test(e)||pf.test(e),parse:e=>pu.test(e)?pu.parse(e):pf.test(e)?pf.parse(e):q0.parse(e),transform:e=>typeof e=="string"?e:e.hasOwnProperty("red")?pu.transform(e):pf.transform(e),getAnimatableNone:e=>{const t=Rn.parse(e);return t.alpha=0,Rn.transform(t)}},HM=/(?:#[\da-f]{3,8}|(?:rgb|hsl)a?\((?:-?[\d.]+%?[,\s]+){2}-?[\d.]+%?\s*(?:[,/]\s*)?(?:\b\d+(?:\.\d+)?|\.\d+)?%?\))/giu;function GM(e){return isNaN(e)&&typeof e=="string"&&(e.match(kx)?.length||0)+(e.match(HM)?.length||0)>0}const tP="number",nP="color",qM="var",YM="var(",T1="${}",XM=/var\s*\(\s*--(?:[\w-]+\s*|[\w-]+\s*,(?:\s*[^)(\s]|\s*\((?:[^)(]|\([^)(]*\))*\))+\s*)\)|#[\da-f]{3,8}|(?:rgb|hsl)a?\((?:-?[\d.]+%?[,\s]+){2}-?[\d.]+%?\s*(?:[,/]\s*)?(?:\b\d+(?:\.\d+)?|\.\d+)?%?\)|-?(?:\d+(?:\.\d+)?|\.\d+)/giu;function Zp(e){const t=e.toString(),n=[],r={color:[],number:[],var:[]},i=[];let s=0;const c=t.replace(XM,d=>(Rn.test(d)?(r.color.push(s),i.push(nP),n.push(Rn.parse(d))):d.startsWith(YM)?(r.var.push(s),i.push(qM),n.push(d)):(r.number.push(s),i.push(tP),n.push(parseFloat(d))),++s,T1)).split(T1);return{values:n,split:c,indexes:r,types:i}}function rP(e){return Zp(e).values}function iP(e){const{split:t,types:n}=Zp(e),r=t.length;return i=>{let s="";for(let l=0;ltypeof e=="number"?0:Rn.test(e)?Rn.getAnimatableNone(e):e;function JM(e){const t=rP(e);return iP(e)(t.map(QM))}const ta={test:GM,parse:rP,createTransformer:iP,getAnimatableNone:JM};function Yy(e,t,n){return n<0&&(n+=1),n>1&&(n-=1),n<1/6?e+(t-e)*6*n:n<1/2?t:n<2/3?e+(t-e)*(2/3-n)*6:e}function ZM({hue:e,saturation:t,lightness:n,alpha:r}){e/=360,t/=100,n/=100;let i=0,s=0,l=0;if(!t)i=s=l=n;else{const c=n<.5?n*(1+t):n+t-n*t,d=2*n-c;i=Yy(d,c,e+1/3),s=Yy(d,c,e),l=Yy(d,c,e-1/3)}return{red:Math.round(i*255),green:Math.round(s*255),blue:Math.round(l*255),alpha:r}}function Ug(e,t){return n=>n>0?t:e}const dn=(e,t,n)=>e+(t-e)*n,Xy=(e,t,n)=>{const r=e*e,i=n*(t*t-r)+r;return i<0?0:Math.sqrt(i)},eD=[q0,pu,pf],tD=e=>eD.find(t=>t.test(e));function _1(e){const t=tD(e);if(!t)return!1;let n=t.parse(e);return t===pf&&(n=ZM(n)),n}const I1=(e,t)=>{const n=_1(e),r=_1(t);if(!n||!r)return Ug(e,t);const i={...n};return s=>(i.red=Xy(n.red,r.red,s),i.green=Xy(n.green,r.green,s),i.blue=Xy(n.blue,r.blue,s),i.alpha=dn(n.alpha,r.alpha,s),pu.transform(i))},Y0=new Set(["none","hidden"]);function nD(e,t){return Y0.has(e)?n=>n<=0?e:t:n=>n>=1?t:e}function rD(e,t){return n=>dn(e,t,n)}function Ex(e){return typeof e=="number"?rD:typeof e=="string"?Sx(e)?Ug:Rn.test(e)?I1:sD:Array.isArray(e)?oP:typeof e=="object"?Rn.test(e)?I1:iD:Ug}function oP(e,t){const n=[...e],r=n.length,i=e.map((s,l)=>Ex(s)(s,t[l]));return s=>{for(let l=0;l{for(const s in r)n[s]=r[s](i);return n}}function oD(e,t){const n=[],r={color:0,var:0,number:0};for(let i=0;i{const n=ta.createTransformer(t),r=Zp(e),i=Zp(t);return r.indexes.var.length===i.indexes.var.length&&r.indexes.color.length===i.indexes.color.length&&r.indexes.number.length>=i.indexes.number.length?Y0.has(e)&&!i.values.length||Y0.has(t)&&!r.values.length?nD(e,t):vh(oP(oD(r,i),i.values),n):Ug(e,t)};function sP(e,t,n){return typeof e=="number"&&typeof t=="number"&&typeof n=="number"?dn(e,t,n):Ex(e)(e,t)}const lD=e=>{const t=({timestamp:n})=>e(n);return{start:(n=!0)=>nn.update(t,n),stop:()=>ea(t),now:()=>cr.isProcessing?cr.timestamp:si.now()}},lP=(e,t,n=10)=>{let r="";const i=Math.max(Math.round(t/n),2);for(let s=0;s=Kg?1/0:t}function aD(e,t=100,n){const r=n({...e,keyframes:[0,t]}),i=Math.min(Px(r),Kg);return{type:"keyframes",ease:s=>r.next(i*s).value/t,duration:cs(i)}}const uD=5;function aP(e,t,n){const r=Math.max(t-uD,0);return BE(n-e(r),t-r)}const vn={stiffness:100,damping:10,mass:1,velocity:0,duration:800,bounce:.3,visualDuration:.3,restSpeed:{granular:.01,default:2},restDelta:{granular:.005,default:.5},minDuration:.01,maxDuration:10,minDamping:.05,maxDamping:1},Qy=.001;function cD({duration:e=vn.duration,bounce:t=vn.bounce,velocity:n=vn.velocity,mass:r=vn.mass}){let i,s,l=1-t;l=Zs(vn.minDamping,vn.maxDamping,l),e=Zs(vn.minDuration,vn.maxDuration,cs(e)),l<1?(i=h=>{const m=h*l,g=m*e,b=m-n,x=X0(h,l),k=Math.exp(-g);return Qy-b/x*k},s=h=>{const g=h*l*e,b=g*n+n,x=Math.pow(l,2)*Math.pow(h,2)*e,k=Math.exp(-g),P=X0(Math.pow(h,2),l);return(-i(h)+Qy>0?-1:1)*((b-x)*k)/P}):(i=h=>{const m=Math.exp(-h*e),g=(h-n)*e+1;return-Qy+m*g},s=h=>{const m=Math.exp(-h*e),g=(n-h)*(e*e);return m*g});const c=5/e,d=dD(i,s,c);if(e=us(e),isNaN(d))return{stiffness:vn.stiffness,damping:vn.damping,duration:e};{const h=Math.pow(d,2)*r;return{stiffness:h,damping:l*2*Math.sqrt(r*h),duration:e}}}const fD=12;function dD(e,t,n){let r=n;for(let i=1;ie[n]!==void 0)}function mD(e){let t={velocity:vn.velocity,stiffness:vn.stiffness,damping:vn.damping,mass:vn.mass,isResolvedFromDuration:!1,...e};if(!$1(e,hD)&&$1(e,pD))if(e.visualDuration){const n=e.visualDuration,r=2*Math.PI/(n*1.2),i=r*r,s=2*Zs(.05,1,1-(e.bounce||0))*Math.sqrt(i);t={...t,mass:vn.mass,stiffness:i,damping:s}}else{const n=cD(e);t={...t,...n,mass:vn.mass},t.isResolvedFromDuration=!0}return t}function Wg(e=vn.visualDuration,t=vn.bounce){const n=typeof e!="object"?{visualDuration:e,keyframes:[0,1],bounce:t}:e;let{restSpeed:r,restDelta:i}=n;const s=n.keyframes[0],l=n.keyframes[n.keyframes.length-1],c={done:!1,value:s},{stiffness:d,damping:h,mass:m,duration:g,velocity:b,isResolvedFromDuration:x}=mD({...n,velocity:-cs(n.velocity||0)}),k=b||0,P=h/(2*Math.sqrt(d*m)),_=l-s,T=cs(Math.sqrt(d/m)),$=Math.abs(_)<5;r||(r=$?vn.restSpeed.granular:vn.restSpeed.default),i||(i=$?vn.restDelta.granular:vn.restDelta.default);let L;if(P<1){const K=X0(T,P);L=M=>{const J=Math.exp(-P*T*M);return l-J*((k+P*T*_)/K*Math.sin(K*M)+_*Math.cos(K*M))}}else if(P===1)L=K=>l-Math.exp(-T*K)*(_+(k+T*_)*K);else{const K=T*Math.sqrt(P*P-1);L=M=>{const J=Math.exp(-P*T*M),re=Math.min(K*M,300);return l-J*((k+P*T*_)*Math.sinh(re)+K*_*Math.cosh(re))/K}}const z={calculatedDuration:x&&g||null,next:K=>{const M=L(K);if(x)c.done=K>=g;else{let J=K===0?k:0;P<1&&(J=K===0?us(k):aP(L,K,M));const re=Math.abs(J)<=r,ae=Math.abs(l-M)<=i;c.done=re&&ae}return c.value=c.done?l:M,c},toString:()=>{const K=Math.min(Px(z),Kg),M=lP(J=>z.next(K*J).value,K,30);return K+"ms "+M},toTransition:()=>{}};return z}Wg.applyToOptions=e=>{const t=aD(e,100,Wg);return e.ease=t.ease,e.duration=us(t.duration),e.type="keyframes",e};function Q0({keyframes:e,velocity:t=0,power:n=.8,timeConstant:r=325,bounceDamping:i=10,bounceStiffness:s=500,modifyTarget:l,min:c,max:d,restDelta:h=.5,restSpeed:m}){const g=e[0],b={done:!1,value:g},x=re=>c!==void 0&&red,k=re=>c===void 0?d:d===void 0||Math.abs(c-re)-P*Math.exp(-re/r),L=re=>T+$(re),z=re=>{const ae=$(re),j=L(re);b.done=Math.abs(ae)<=h,b.value=b.done?T:j};let K,M;const J=re=>{x(b.value)&&(K=re,M=Wg({keyframes:[b.value,k(b.value)],velocity:aP(L,re,b.value),damping:i,stiffness:s,restDelta:h,restSpeed:m}))};return J(0),{calculatedDuration:null,next:re=>{let ae=!1;return!M&&K===void 0&&(ae=!0,z(re),J(re)),K!==void 0&&re>=K?M.next(re-K):(!ae&&z(re),b)}}}function gD(e,t,n){const r=[],i=n||ds.mix||sP,s=e.length-1;for(let l=0;lt[0];if(s===2&&t[0]===t[1])return()=>t[1];const l=e[0]===e[1];e[0]>e[s-1]&&(e=[...e].reverse(),t=[...t].reverse());const c=gD(t,r,i),d=c.length,h=m=>{if(l&&m1)for(;gh(Zs(e[0],e[s-1],m)):h}function yD(e,t){const n=e[e.length-1];for(let r=1;r<=t;r++){const i=Qp(0,t,r);e.push(dn(n,1,i))}}function bD(e){const t=[0];return yD(t,e.length-1),t}function xD(e,t){return e.map(n=>n*t)}function wD(e,t){return e.map(()=>t||XE).splice(0,e.length-1)}function Fp({duration:e=300,keyframes:t,times:n,ease:r="easeInOut"}){const i=RM(r)?r.map(E1):E1(r),s={done:!1,value:t[0]},l=xD(n&&n.length===t.length?n:bD(t),e),c=vD(l,t,{ease:Array.isArray(i)?i:wD(t,i)});return{calculatedDuration:e,next:d=>(s.value=c(d),s.done=d>=e,s)}}const SD=e=>e!==null;function Tx(e,{repeat:t,repeatType:n="loop"},r,i=1){const s=e.filter(SD),c=i<0||t&&n!=="loop"&&t%2===1?0:s.length-1;return!c||r===void 0?s[c]:r}const kD={decay:Q0,inertia:Q0,tween:Fp,keyframes:Fp,spring:Wg};function uP(e){typeof e.type=="string"&&(e.type=kD[e.type])}class _x{constructor(){this.updateFinished()}get finished(){return this._finished}updateFinished(){this._finished=new Promise(t=>{this.resolve=t})}notifyFinished(){this.resolve()}then(t,n){return this.finished.then(t,n)}}const CD=e=>e/100;class Ix extends _x{constructor(t){super(),this.state="idle",this.startTime=null,this.isStopped=!1,this.currentTime=0,this.holdTime=null,this.playbackSpeed=1,this.stop=()=>{const{motionValue:n}=this.options;n&&n.updatedAt!==si.now()&&this.tick(si.now()),this.isStopped=!0,this.state!=="idle"&&(this.teardown(),this.options.onStop?.())},this.options=t,this.initAnimation(),this.play(),t.autoplay===!1&&this.pause()}initAnimation(){const{options:t}=this;uP(t);const{type:n=Fp,repeat:r=0,repeatDelay:i=0,repeatType:s,velocity:l=0}=t;let{keyframes:c}=t;const d=n||Fp;d!==Fp&&typeof c[0]!="number"&&(this.mixKeyframes=vh(CD,sP(c[0],c[1])),c=[0,100]);const h=d({...t,keyframes:c});s==="mirror"&&(this.mirroredGenerator=d({...t,keyframes:[...c].reverse(),velocity:-l})),h.calculatedDuration===null&&(h.calculatedDuration=Px(h));const{calculatedDuration:m}=h;this.calculatedDuration=m,this.resolvedDuration=m+i,this.totalDuration=this.resolvedDuration*(r+1)-i,this.generator=h}updateTime(t){const n=Math.round(t-this.startTime)*this.playbackSpeed;this.holdTime!==null?this.currentTime=this.holdTime:this.currentTime=n}tick(t,n=!1){const{generator:r,totalDuration:i,mixKeyframes:s,mirroredGenerator:l,resolvedDuration:c,calculatedDuration:d}=this;if(this.startTime===null)return r.next(0);const{delay:h=0,keyframes:m,repeat:g,repeatType:b,repeatDelay:x,type:k,onUpdate:P,finalKeyframe:_}=this.options;this.speed>0?this.startTime=Math.min(this.startTime,t):this.speed<0&&(this.startTime=Math.min(t-i/this.speed,this.startTime)),n?this.currentTime=t:this.updateTime(t);const T=this.currentTime-h*(this.playbackSpeed>=0?1:-1),$=this.playbackSpeed>=0?T<0:T>i;this.currentTime=Math.max(T,0),this.state==="finished"&&this.holdTime===null&&(this.currentTime=i);let L=this.currentTime,z=r;if(g){const re=Math.min(this.currentTime,i)/c;let ae=Math.floor(re),j=re%1;!j&&re>=1&&(j=1),j===1&&ae--,ae=Math.min(ae,g+1),!!(ae%2)&&(b==="reverse"?(j=1-j,x&&(j-=x/c)):b==="mirror"&&(z=l)),L=Zs(0,1,j)*c}const K=$?{done:!1,value:m[0]}:z.next(L);s&&(K.value=s(K.value));let{done:M}=K;!$&&d!==null&&(M=this.playbackSpeed>=0?this.currentTime>=i:this.currentTime<=0);const J=this.holdTime===null&&(this.state==="finished"||this.state==="running"&&M);return J&&k!==Q0&&(K.value=Tx(m,this.options,_,this.speed)),P&&P(K.value),J&&this.finish(),K}then(t,n){return this.finished.then(t,n)}get duration(){return cs(this.calculatedDuration)}get time(){return cs(this.currentTime)}set time(t){t=us(t),this.currentTime=t,this.startTime===null||this.holdTime!==null||this.playbackSpeed===0?this.holdTime=t:this.driver&&(this.startTime=this.driver.now()-t/this.playbackSpeed),this.driver?.start(!1)}get speed(){return this.playbackSpeed}set speed(t){this.updateTime(si.now());const n=this.playbackSpeed!==t;this.playbackSpeed=t,n&&(this.time=cs(this.currentTime))}play(){if(this.isStopped)return;const{driver:t=lD,startTime:n}=this.options;this.driver||(this.driver=t(i=>this.tick(i))),this.options.onPlay?.();const r=this.driver.now();this.state==="finished"?(this.updateFinished(),this.startTime=r):this.holdTime!==null?this.startTime=r-this.holdTime:this.startTime||(this.startTime=n??r),this.state==="finished"&&this.speed<0&&(this.startTime+=this.calculatedDuration),this.holdTime=null,this.state="running",this.driver.start()}pause(){this.state="paused",this.updateTime(si.now()),this.holdTime=this.currentTime}complete(){this.state!=="running"&&this.play(),this.state="finished",this.holdTime=null}finish(){this.notifyFinished(),this.teardown(),this.state="finished",this.options.onComplete?.()}cancel(){this.holdTime=null,this.startTime=0,this.tick(0),this.teardown(),this.options.onCancel?.()}teardown(){this.state="idle",this.stopDriver(),this.startTime=this.holdTime=null}stopDriver(){this.driver&&(this.driver.stop(),this.driver=void 0)}sample(t){return this.startTime=0,this.tick(t,!0)}attachTimeline(t){return this.options.allowFlatten&&(this.options.type="keyframes",this.options.ease="linear",this.initAnimation()),this.driver?.stop(),t.observe(this)}}function ED(e){for(let t=1;te*180/Math.PI,J0=e=>{const t=hu(Math.atan2(e[1],e[0]));return Z0(t)},PD={x:4,y:5,translateX:4,translateY:5,scaleX:0,scaleY:3,scale:e=>(Math.abs(e[0])+Math.abs(e[3]))/2,rotate:J0,rotateZ:J0,skewX:e=>hu(Math.atan(e[1])),skewY:e=>hu(Math.atan(e[2])),skew:e=>(Math.abs(e[1])+Math.abs(e[2]))/2},Z0=e=>(e=e%360,e<0&&(e+=360),e),A1=J0,R1=e=>Math.sqrt(e[0]*e[0]+e[1]*e[1]),L1=e=>Math.sqrt(e[4]*e[4]+e[5]*e[5]),TD={x:12,y:13,z:14,translateX:12,translateY:13,translateZ:14,scaleX:R1,scaleY:L1,scale:e=>(R1(e)+L1(e))/2,rotateX:e=>Z0(hu(Math.atan2(e[6],e[5]))),rotateY:e=>Z0(hu(Math.atan2(-e[2],e[0]))),rotateZ:A1,rotate:A1,skewX:e=>hu(Math.atan(e[4])),skewY:e=>hu(Math.atan(e[1])),skew:e=>(Math.abs(e[1])+Math.abs(e[4]))/2};function eb(e){return e.includes("scale")?1:0}function tb(e,t){if(!e||e==="none")return eb(t);const n=e.match(/^matrix3d\(([-\d.e\s,]+)\)$/u);let r,i;if(n)r=TD,i=n;else{const c=e.match(/^matrix\(([-\d.e\s,]+)\)$/u);r=PD,i=c}if(!i)return eb(t);const s=r[t],l=i[1].split(",").map(ID);return typeof s=="function"?s(l):l[s]}const _D=(e,t)=>{const{transform:n="none"}=getComputedStyle(e);return tb(n,t)};function ID(e){return parseFloat(e.trim())}const Of=["transformPerspective","x","y","z","translateX","translateY","translateZ","scale","scaleX","scaleY","rotate","rotateX","rotateY","rotateZ","skew","skewX","skewY"],Au=new Set(Of),M1=e=>e===Ff||e===tt,$D=new Set(["x","y","z"]),AD=Of.filter(e=>!$D.has(e));function RD(e){const t=[];return AD.forEach(n=>{const r=e.getValue(n);r!==void 0&&(t.push([n,r.get()]),r.set(n.startsWith("scale")?1:0))}),t}const vu={width:({x:e},{paddingLeft:t="0",paddingRight:n="0"})=>e.max-e.min-parseFloat(t)-parseFloat(n),height:({y:e},{paddingTop:t="0",paddingBottom:n="0"})=>e.max-e.min-parseFloat(t)-parseFloat(n),top:(e,{top:t})=>parseFloat(t),left:(e,{left:t})=>parseFloat(t),bottom:({y:e},{top:t})=>parseFloat(t)+(e.max-e.min),right:({x:e},{left:t})=>parseFloat(t)+(e.max-e.min),x:(e,{transform:t})=>tb(t,"x"),y:(e,{transform:t})=>tb(t,"y")};vu.translateX=vu.x;vu.translateY=vu.y;const yu=new Set;let nb=!1,rb=!1,ib=!1;function cP(){if(rb){const e=Array.from(yu).filter(r=>r.needsMeasurement),t=new Set(e.map(r=>r.element)),n=new Map;t.forEach(r=>{const i=RD(r);i.length&&(n.set(r,i),r.render())}),e.forEach(r=>r.measureInitialState()),t.forEach(r=>{r.render();const i=n.get(r);i&&i.forEach(([s,l])=>{r.getValue(s)?.set(l)})}),e.forEach(r=>r.measureEndState()),e.forEach(r=>{r.suspendedScrollY!==void 0&&window.scrollTo(0,r.suspendedScrollY)})}rb=!1,nb=!1,yu.forEach(e=>e.complete(ib)),yu.clear()}function fP(){yu.forEach(e=>{e.readKeyframes(),e.needsMeasurement&&(rb=!0)})}function LD(){ib=!0,fP(),cP(),ib=!1}class $x{constructor(t,n,r,i,s,l=!1){this.state="pending",this.isAsync=!1,this.needsMeasurement=!1,this.unresolvedKeyframes=[...t],this.onComplete=n,this.name=r,this.motionValue=i,this.element=s,this.isAsync=l}scheduleResolve(){this.state="scheduled",this.isAsync?(yu.add(this),nb||(nb=!0,nn.read(fP),nn.resolveKeyframes(cP))):(this.readKeyframes(),this.complete())}readKeyframes(){const{unresolvedKeyframes:t,name:n,element:r,motionValue:i}=this;if(t[0]===null){const s=i?.get(),l=t[t.length-1];if(s!==void 0)t[0]=s;else if(r&&n){const c=r.readValue(n,l);c!=null&&(t[0]=c)}t[0]===void 0&&(t[0]=l),i&&s===void 0&&i.set(t[0])}ED(t)}setFinalKeyframe(){}measureInitialState(){}renderEndStyles(){}measureEndState(){}complete(t=!1){this.state="complete",this.onComplete(this.unresolvedKeyframes,this.finalKeyframe,t),yu.delete(this)}cancel(){this.state==="scheduled"&&(yu.delete(this),this.state="pending")}resume(){this.state==="pending"&&this.scheduleResolve()}}const MD=e=>e.startsWith("--");function DD(e,t,n){MD(t)?e.style.setProperty(t,n):e.style[t]=n}const ND=vx(()=>window.ScrollTimeline!==void 0),FD={};function OD(e,t){const n=vx(e);return()=>FD[t]??n()}const dP=OD(()=>{try{document.createElement("div").animate({opacity:0},{easing:"linear(0, 1)"})}catch{return!1}return!0},"linearEasing"),Ap=([e,t,n,r])=>`cubic-bezier(${e}, ${t}, ${n}, ${r})`,D1={linear:"linear",ease:"ease",easeIn:"ease-in",easeOut:"ease-out",easeInOut:"ease-in-out",circIn:Ap([0,.65,.55,1]),circOut:Ap([.55,0,1,.45]),backIn:Ap([.31,.01,.66,-.59]),backOut:Ap([.33,1.53,.69,.99])};function pP(e,t){if(e)return typeof e=="function"?dP()?lP(e,t):"ease-out":QE(e)?Ap(e):Array.isArray(e)?e.map(n=>pP(n,t)||D1.easeOut):D1[e]}function zD(e,t,n,{delay:r=0,duration:i=300,repeat:s=0,repeatType:l="loop",ease:c="easeOut",times:d}={},h=void 0){const m={[t]:n};d&&(m.offset=d);const g=pP(c,i);Array.isArray(g)&&(m.easing=g);const b={delay:r,duration:i,easing:Array.isArray(g)?"linear":g,fill:"both",iterations:s+1,direction:l==="reverse"?"alternate":"normal"};return h&&(b.pseudoElement=h),e.animate(m,b)}function hP(e){return typeof e=="function"&&"applyToOptions"in e}function jD({type:e,...t}){return hP(e)&&dP()?e.applyToOptions(t):(t.duration??(t.duration=300),t.ease??(t.ease="easeOut"),t)}class BD extends _x{constructor(t){if(super(),this.finishedTime=null,this.isStopped=!1,!t)return;const{element:n,name:r,keyframes:i,pseudoElement:s,allowFlatten:l=!1,finalKeyframe:c,onComplete:d}=t;this.isPseudoElement=!!s,this.allowFlatten=l,this.options=t,gx(typeof t.type!="string");const h=jD(t);this.animation=zD(n,r,i,h,s),h.autoplay===!1&&this.animation.pause(),this.animation.onfinish=()=>{if(this.finishedTime=this.time,!s){const m=Tx(i,this.options,c,this.speed);this.updateMotionValue?this.updateMotionValue(m):DD(n,r,m),this.animation.cancel()}d?.(),this.notifyFinished()}}play(){this.isStopped||(this.animation.play(),this.state==="finished"&&this.updateFinished())}pause(){this.animation.pause()}complete(){this.animation.finish?.()}cancel(){try{this.animation.cancel()}catch{}}stop(){if(this.isStopped)return;this.isStopped=!0;const{state:t}=this;t==="idle"||t==="finished"||(this.updateMotionValue?this.updateMotionValue():this.commitStyles(),this.isPseudoElement||this.cancel())}commitStyles(){this.isPseudoElement||this.animation.commitStyles?.()}get duration(){const t=this.animation.effect?.getComputedTiming?.().duration||0;return cs(Number(t))}get time(){return cs(Number(this.animation.currentTime)||0)}set time(t){this.finishedTime=null,this.animation.currentTime=us(t)}get speed(){return this.animation.playbackRate}set speed(t){t<0&&(this.finishedTime=null),this.animation.playbackRate=t}get state(){return this.finishedTime!==null?"finished":this.animation.playState}get startTime(){return Number(this.animation.startTime)}set startTime(t){this.animation.startTime=t}attachTimeline({timeline:t,observe:n}){return this.allowFlatten&&this.animation.effect?.updateTiming({easing:"linear"}),this.animation.onfinish=null,t&&ND()?(this.animation.timeline=t,eo):n(this)}}const mP={anticipate:GE,backInOut:HE,circInOut:YE};function VD(e){return e in mP}function UD(e){typeof e.ease=="string"&&VD(e.ease)&&(e.ease=mP[e.ease])}const N1=10;class KD extends BD{constructor(t){UD(t),uP(t),super(t),t.startTime&&(this.startTime=t.startTime),this.options=t}updateMotionValue(t){const{motionValue:n,onUpdate:r,onComplete:i,element:s,...l}=this.options;if(!n)return;if(t!==void 0){n.set(t);return}const c=new Ix({...l,autoplay:!1}),d=us(this.finishedTime??this.time);n.setWithVelocity(c.sample(d-N1).value,c.sample(d).value,N1),c.stop()}}const F1=(e,t)=>t==="zIndex"?!1:!!(typeof e=="number"||Array.isArray(e)||typeof e=="string"&&(ta.test(e)||e==="0")&&!e.startsWith("url("));function WD(e){const t=e[0];if(e.length===1)return!0;for(let n=0;nObject.hasOwnProperty.call(Element.prototype,"animate"));function YD(e){const{motionValue:t,name:n,repeatDelay:r,repeatType:i,damping:s,type:l}=e;if(!(t?.owner?.current instanceof HTMLElement))return!1;const{onUpdate:d,transformTemplate:h}=t.owner.getProps();return qD()&&n&&GD.has(n)&&(n!=="transform"||!h)&&!d&&!r&&i!=="mirror"&&s!==0&&l!=="inertia"}const XD=40;class QD extends _x{constructor({autoplay:t=!0,delay:n=0,type:r="keyframes",repeat:i=0,repeatDelay:s=0,repeatType:l="loop",keyframes:c,name:d,motionValue:h,element:m,...g}){super(),this.stop=()=>{this._animation&&(this._animation.stop(),this.stopTimeline?.()),this.keyframeResolver?.cancel()},this.createdAt=si.now();const b={autoplay:t,delay:n,type:r,repeat:i,repeatDelay:s,repeatType:l,name:d,motionValue:h,element:m,...g},x=m?.KeyframeResolver||$x;this.keyframeResolver=new x(c,(k,P,_)=>this.onKeyframesResolved(k,P,b,!_),d,h,m),this.keyframeResolver?.scheduleResolve()}onKeyframesResolved(t,n,r,i){this.keyframeResolver=void 0;const{name:s,type:l,velocity:c,delay:d,isHandoff:h,onUpdate:m}=r;this.resolvedAt=si.now(),HD(t,s,l,c)||((ds.instantAnimations||!d)&&m?.(Tx(t,r,n)),t[0]=t[t.length-1],r.duration=0,r.repeat=0);const b={startTime:i?this.resolvedAt?this.resolvedAt-this.createdAt>XD?this.resolvedAt:this.createdAt:this.createdAt:void 0,finalKeyframe:n,...r,keyframes:t},x=!h&&YD(b)?new KD({...b,element:b.motionValue.owner.current}):new Ix(b);x.finished.then(()=>this.notifyFinished()).catch(eo),this.pendingTimeline&&(this.stopTimeline=x.attachTimeline(this.pendingTimeline),this.pendingTimeline=void 0),this._animation=x}get finished(){return this._animation?this.animation.finished:this._finished}then(t,n){return this.finished.finally(t).then(()=>{})}get animation(){return this._animation||(this.keyframeResolver?.resume(),LD()),this._animation}get duration(){return this.animation.duration}get time(){return this.animation.time}set time(t){this.animation.time=t}get speed(){return this.animation.speed}get state(){return this.animation.state}set speed(t){this.animation.speed=t}get startTime(){return this.animation.startTime}attachTimeline(t){return this._animation?this.stopTimeline=this.animation.attachTimeline(t):this.pendingTimeline=t,()=>this.stop()}play(){this.animation.play()}pause(){this.animation.pause()}complete(){this.animation.complete()}cancel(){this._animation&&this.animation.cancel(),this.keyframeResolver?.cancel()}}const JD=/^var\(--(?:([\w-]+)|([\w-]+), ?([a-zA-Z\d ()%#.,-]+))\)/u;function ZD(e){const t=JD.exec(e);if(!t)return[,];const[,n,r,i]=t;return[`--${n??r}`,i]}function gP(e,t,n=1){const[r,i]=ZD(e);if(!r)return;const s=window.getComputedStyle(t).getPropertyValue(r);if(s){const l=s.trim();return OE(l)?parseFloat(l):l}return Sx(i)?gP(i,t,n+1):i}function Ax(e,t){return e?.[t]??e?.default??e}const vP=new Set(["width","height","top","left","right","bottom",...Of]),e3={test:e=>e==="auto",parse:e=>e},yP=e=>t=>t.test(e),bP=[Ff,tt,fs,Gl,WM,KM,e3],O1=e=>bP.find(yP(e));function t3(e){return typeof e=="number"?e===0:e!==null?e==="none"||e==="0"||jE(e):!0}const n3=new Set(["brightness","contrast","saturate","opacity"]);function r3(e){const[t,n]=e.slice(0,-1).split("(");if(t==="drop-shadow")return e;const[r]=n.match(kx)||[];if(!r)return e;const i=n.replace(r,"");let s=n3.has(t)?1:0;return r!==n&&(s*=100),t+"("+s+i+")"}const i3=/\b([a-z-]*)\(.*?\)/gu,ob={...ta,getAnimatableNone:e=>{const t=e.match(i3);return t?t.map(r3).join(" "):e}},z1={...Ff,transform:Math.round},o3={rotate:Gl,rotateX:Gl,rotateY:Gl,rotateZ:Gl,scale:fg,scaleX:fg,scaleY:fg,scaleZ:fg,skew:Gl,skewX:Gl,skewY:Gl,distance:tt,translateX:tt,translateY:tt,translateZ:tt,x:tt,y:tt,z:tt,perspective:tt,transformPerspective:tt,opacity:Jp,originX:P1,originY:P1,originZ:tt},Rx={borderWidth:tt,borderTopWidth:tt,borderRightWidth:tt,borderBottomWidth:tt,borderLeftWidth:tt,borderRadius:tt,radius:tt,borderTopLeftRadius:tt,borderTopRightRadius:tt,borderBottomRightRadius:tt,borderBottomLeftRadius:tt,width:tt,maxWidth:tt,height:tt,maxHeight:tt,top:tt,right:tt,bottom:tt,left:tt,padding:tt,paddingTop:tt,paddingRight:tt,paddingBottom:tt,paddingLeft:tt,margin:tt,marginTop:tt,marginRight:tt,marginBottom:tt,marginLeft:tt,backgroundPositionX:tt,backgroundPositionY:tt,...o3,zIndex:z1,fillOpacity:Jp,strokeOpacity:Jp,numOctaves:z1},s3={...Rx,color:Rn,backgroundColor:Rn,outlineColor:Rn,fill:Rn,stroke:Rn,borderColor:Rn,borderTopColor:Rn,borderRightColor:Rn,borderBottomColor:Rn,borderLeftColor:Rn,filter:ob,WebkitFilter:ob},xP=e=>s3[e];function wP(e,t){let n=xP(e);return n!==ob&&(n=ta),n.getAnimatableNone?n.getAnimatableNone(t):void 0}const l3=new Set(["auto","none","0"]);function a3(e,t,n){let r=0,i;for(;r{t.getValue(c).set(d)}),this.resolveNoneKeyframes()}}const c3=new Set(["opacity","clipPath","filter","transform"]);function f3(e,t,n){if(e instanceof EventTarget)return[e];if(typeof e=="string"){let r=document;const i=n?.[e]??r.querySelectorAll(e);return i?Array.from(i):[]}return Array.from(e)}const SP=(e,t)=>t&&typeof e=="number"?t.transform(e):e;function kP(e){return zE(e)&&"offsetHeight"in e}const j1=30,d3=e=>!isNaN(parseFloat(e));class CP{constructor(t,n={}){this.canTrackVelocity=null,this.events={},this.updateAndNotify=(r,i=!0)=>{const s=si.now();if(this.updatedAt!==s&&this.setPrevFrameValue(),this.prev=this.current,this.setCurrent(r),this.current!==this.prev&&(this.events.change?.notify(this.current),this.dependents))for(const l of this.dependents)l.dirty();i&&this.events.renderRequest?.notify(this.current)},this.hasAnimated=!1,this.setCurrent(t),this.owner=n.owner}setCurrent(t){this.current=t,this.updatedAt=si.now(),this.canTrackVelocity===null&&t!==void 0&&(this.canTrackVelocity=d3(this.current))}setPrevFrameValue(t=this.current){this.prevFrameValue=t,this.prevUpdatedAt=this.updatedAt}onChange(t){return this.on("change",t)}on(t,n){this.events[t]||(this.events[t]=new yx);const r=this.events[t].add(n);return t==="change"?()=>{r(),nn.read(()=>{this.events.change.getSize()||this.stop()})}:r}clearListeners(){for(const t in this.events)this.events[t].clear()}attach(t,n){this.passiveEffect=t,this.stopPassiveEffect=n}set(t,n=!0){!n||!this.passiveEffect?this.updateAndNotify(t,n):this.passiveEffect(t,this.updateAndNotify)}setWithVelocity(t,n,r){this.set(n),this.prev=void 0,this.prevFrameValue=t,this.prevUpdatedAt=this.updatedAt-r}jump(t,n=!0){this.updateAndNotify(t),this.prev=t,this.prevUpdatedAt=this.prevFrameValue=void 0,n&&this.stop(),this.stopPassiveEffect&&this.stopPassiveEffect()}dirty(){this.events.change?.notify(this.current)}addDependent(t){this.dependents||(this.dependents=new Set),this.dependents.add(t)}removeDependent(t){this.dependents&&this.dependents.delete(t)}get(){return this.current}getPrevious(){return this.prev}getVelocity(){const t=si.now();if(!this.canTrackVelocity||this.prevFrameValue===void 0||t-this.updatedAt>j1)return 0;const n=Math.min(this.updatedAt-this.prevUpdatedAt,j1);return BE(parseFloat(this.current)-parseFloat(this.prevFrameValue),n)}start(t){return this.stop(),new Promise(n=>{this.hasAnimated=!0,this.animation=t(n),this.events.animationStart&&this.events.animationStart.notify()}).then(()=>{this.events.animationComplete&&this.events.animationComplete.notify(),this.clearAnimation()})}stop(){this.animation&&(this.animation.stop(),this.events.animationCancel&&this.events.animationCancel.notify()),this.clearAnimation()}isAnimating(){return!!this.animation}clearAnimation(){delete this.animation}destroy(){this.dependents?.clear(),this.events.destroy?.notify(),this.clearListeners(),this.stop(),this.stopPassiveEffect&&this.stopPassiveEffect()}}function _f(e,t){return new CP(e,t)}const{schedule:Lx}=JE(queueMicrotask,!1),Co={x:!1,y:!1};function EP(){return Co.x||Co.y}function p3(e){return e==="x"||e==="y"?Co[e]?null:(Co[e]=!0,()=>{Co[e]=!1}):Co.x||Co.y?null:(Co.x=Co.y=!0,()=>{Co.x=Co.y=!1})}function PP(e,t){const n=f3(e),r=new AbortController,i={passive:!0,...t,signal:r.signal};return[n,i,()=>r.abort()]}function B1(e){return!(e.pointerType==="touch"||EP())}function h3(e,t,n={}){const[r,i,s]=PP(e,n),l=c=>{if(!B1(c))return;const{target:d}=c,h=t(d,c);if(typeof h!="function"||!d)return;const m=g=>{B1(g)&&(h(g),d.removeEventListener("pointerleave",m))};d.addEventListener("pointerleave",m,i)};return r.forEach(c=>{c.addEventListener("pointerenter",l,i)}),s}const TP=(e,t)=>t?e===t?!0:TP(e,t.parentElement):!1,Mx=e=>e.pointerType==="mouse"?typeof e.button!="number"||e.button<=0:e.isPrimary!==!1,m3=new Set(["BUTTON","INPUT","SELECT","TEXTAREA","A"]);function g3(e){return m3.has(e.tagName)||e.tabIndex!==-1}const $g=new WeakSet;function V1(e){return t=>{t.key==="Enter"&&e(t)}}function Jy(e,t){e.dispatchEvent(new PointerEvent("pointer"+t,{isPrimary:!0,bubbles:!0}))}const v3=(e,t)=>{const n=e.currentTarget;if(!n)return;const r=V1(()=>{if($g.has(n))return;Jy(n,"down");const i=V1(()=>{Jy(n,"up")}),s=()=>Jy(n,"cancel");n.addEventListener("keyup",i,t),n.addEventListener("blur",s,t)});n.addEventListener("keydown",r,t),n.addEventListener("blur",()=>n.removeEventListener("keydown",r),t)};function U1(e){return Mx(e)&&!EP()}function y3(e,t,n={}){const[r,i,s]=PP(e,n),l=c=>{const d=c.currentTarget;if(!U1(c))return;$g.add(d);const h=t(d,c),m=(x,k)=>{window.removeEventListener("pointerup",g),window.removeEventListener("pointercancel",b),$g.has(d)&&$g.delete(d),U1(x)&&typeof h=="function"&&h(x,{success:k})},g=x=>{m(x,d===window||d===document||n.useGlobalTarget||TP(d,x.target))},b=x=>{m(x,!1)};window.addEventListener("pointerup",g,i),window.addEventListener("pointercancel",b,i)};return r.forEach(c=>{(n.useGlobalTarget?window:c).addEventListener("pointerdown",l,i),kP(c)&&(c.addEventListener("focus",h=>v3(h,i)),!g3(c)&&!c.hasAttribute("tabindex")&&(c.tabIndex=0))}),s}function _P(e){return zE(e)&&"ownerSVGElement"in e}function b3(e){return _P(e)&&e.tagName==="svg"}const wr=e=>!!(e&&e.getVelocity),x3=[...bP,Rn,ta],w3=e=>x3.find(yP(e)),eh=S.createContext({transformPagePoint:e=>e,isStatic:!1,reducedMotion:"never"});class S3 extends S.Component{getSnapshotBeforeUpdate(t){const n=this.props.childRef.current;if(n&&t.isPresent&&!this.props.isPresent){const r=n.offsetParent,i=kP(r)&&r.offsetWidth||0,s=this.props.sizeRef.current;s.height=n.offsetHeight||0,s.width=n.offsetWidth||0,s.top=n.offsetTop,s.left=n.offsetLeft,s.right=i-s.width-s.left}return null}componentDidUpdate(){}render(){return this.props.children}}function k3({children:e,isPresent:t,anchorX:n,root:r}){const i=S.useId(),s=S.useRef(null),l=S.useRef({width:0,height:0,top:0,left:0,right:0}),{nonce:c}=S.useContext(eh);return S.useInsertionEffect(()=>{const{width:d,height:h,top:m,left:g,right:b}=l.current;if(t||!s.current||!d||!h)return;const x=n==="left"?`left: ${g}`:`right: ${b}`;s.current.dataset.motionPopId=i;const k=document.createElement("style");c&&(k.nonce=c);const P=r??document.head;return P.appendChild(k),k.sheet&&k.sheet.insertRule(` + [data-motion-pop-id="${i}"] { + position: absolute !important; + width: ${d}px !important; + height: ${h}px !important; + ${x}px !important; + top: ${m}px !important; + } + `),()=>{P.removeChild(k),P.contains(k)&&P.removeChild(k)}},[t]),D.jsx(S3,{isPresent:t,childRef:s,sizeRef:l,children:S.cloneElement(e,{ref:s})})}const C3=({children:e,initial:t,isPresent:n,onExitComplete:r,custom:i,presenceAffectsLayout:s,mode:l,anchorX:c,root:d})=>{const h=gh(E3),m=S.useId();let g=!0,b=S.useMemo(()=>(g=!1,{id:m,initial:t,isPresent:n,custom:i,onExitComplete:x=>{h.set(x,!0);for(const k of h.values())if(!k)return;r&&r()},register:x=>(h.set(x,!1),()=>h.delete(x))}),[n,h,r]);return s&&g&&(b={...b}),S.useMemo(()=>{h.forEach((x,k)=>h.set(k,!1))},[n]),S.useEffect(()=>{!n&&!h.size&&r&&r()},[n]),l==="popLayout"&&(e=D.jsx(k3,{isPresent:n,anchorX:c,root:d,children:e})),D.jsx(yv.Provider,{value:b,children:e})};function E3(){return new Map}function IP(e=!0){const t=S.useContext(yv);if(t===null)return[!0,null];const{isPresent:n,onExitComplete:r,register:i}=t,s=S.useId();S.useEffect(()=>{if(e)return i(s)},[e]);const l=S.useCallback(()=>e&&r&&r(s),[s,r,e]);return!n&&r?[!1,l]:[!0]}const dg=e=>e.key||"";function K1(e){const t=[];return S.Children.forEach(e,n=>{S.isValidElement(n)&&t.push(n)}),t}const Ru=({children:e,custom:t,initial:n=!0,onExitComplete:r,presenceAffectsLayout:i=!0,mode:s="sync",propagate:l=!1,anchorX:c="left",root:d})=>{const[h,m]=IP(l),g=S.useMemo(()=>K1(e),[e]),b=l&&!h?[]:g.map(dg),x=S.useRef(!0),k=S.useRef(g),P=gh(()=>new Map),[_,T]=S.useState(g),[$,L]=S.useState(g);px(()=>{x.current=!1,k.current=g;for(let M=0;M<$.length;M++){const J=dg($[M]);b.includes(J)?P.delete(J):P.get(J)!==!0&&P.set(J,!1)}},[$,b.length,b.join("-")]);const z=[];if(g!==_){let M=[...g];for(let J=0;J<$.length;J++){const re=$[J],ae=dg(re);b.includes(ae)||(M.splice(J,0,re),z.push(re))}return s==="wait"&&z.length&&(M=z),L(K1(M)),T(g),null}const{forceRender:K}=S.useContext(Xp);return D.jsx(D.Fragment,{children:$.map(M=>{const J=dg(M),re=l&&!h?!1:g===$||b.includes(J),ae=()=>{if(P.has(J))P.set(J,!0);else return;let j=!0;P.forEach(B=>{B||(j=!1)}),j&&(K?.(),L(k.current),l&&m?.(),r&&r())};return D.jsx(C3,{isPresent:re,initial:!x.current||n?void 0:!1,custom:t,presenceAffectsLayout:i,mode:s,root:d,onExitComplete:re?void 0:ae,anchorX:c,children:M},J)})})},P3=S.createContext(null);function T3(){const e=S.useRef(!1);return px(()=>(e.current=!0,()=>{e.current=!1}),[]),e}function _3(){const e=T3(),[t,n]=S.useState(0),r=S.useCallback(()=>{e.current&&n(t+1)},[t]);return[S.useCallback(()=>nn.postRender(r),[r]),t]}const I3=e=>!e.isLayoutDirty&&e.willUpdate(!1);function W1(){const e=new Set,t=new WeakMap,n=()=>e.forEach(I3);return{add:r=>{e.add(r),t.set(r,r.addEventListener("willUpdate",n))},remove:r=>{e.delete(r);const i=t.get(r);i&&(i(),t.delete(r)),n()},dirty:n}}const $P=e=>e===!0,$3=e=>$P(e===!0)||e==="id",A3=({children:e,id:t,inherit:n=!0})=>{const r=S.useContext(Xp),i=S.useContext(P3),[s,l]=_3(),c=S.useRef(null),d=r.id||i;c.current===null&&($3(n)&&d&&(t=t?d+"-"+t:d),c.current={id:t,group:$P(n)&&r.group||W1()});const h=S.useMemo(()=>({...c.current,forceRender:s}),[l]);return D.jsx(Xp.Provider,{value:h,children:e})},Dx=S.createContext({strict:!1}),H1={animation:["animate","variants","whileHover","whileTap","exit","whileInView","whileFocus","whileDrag"],exit:["exit"],drag:["drag","dragControls"],focus:["whileFocus"],hover:["whileHover","onHoverStart","onHoverEnd"],tap:["whileTap","onTap","onTapStart","onTapCancel"],pan:["onPan","onPanStart","onPanSessionStart","onPanEnd"],inView:["whileInView","onViewportEnter","onViewportLeave"],layout:["layout","layoutId"]},If={};for(const e in H1)If[e]={isEnabled:t=>H1[e].some(n=>!!t[n])};function sb(e){for(const t in e)If[t]={...If[t],...e[t]}}function $f({children:e,features:t,strict:n=!1}){const[,r]=S.useState(!Zy(t)),i=S.useRef(void 0);if(!Zy(t)){const{renderer:s,...l}=t;i.current=s,sb(l)}return S.useEffect(()=>{Zy(t)&&t().then(({renderer:s,...l})=>{sb(l),i.current=s,r(!0)})},[]),D.jsx(Dx.Provider,{value:{renderer:i.current,strict:n},children:e})}function Zy(e){return typeof e=="function"}const R3=new Set(["animate","exit","variants","initial","style","values","variants","transition","transformTemplate","custom","inherit","onBeforeLayoutMeasure","onAnimationStart","onAnimationComplete","onUpdate","onDragStart","onDrag","onDragEnd","onMeasureDragConstraints","onDirectionLock","onDragTransitionEnd","_dragX","_dragY","onHoverStart","onHoverEnd","onViewportEnter","onViewportLeave","globalTapTarget","ignoreStrict","viewport"]);function Hg(e){return e.startsWith("while")||e.startsWith("drag")&&e!=="draggable"||e.startsWith("layout")||e.startsWith("onTap")||e.startsWith("onPan")||e.startsWith("onLayout")||R3.has(e)}let AP=e=>!Hg(e);function RP(e){typeof e=="function"&&(AP=t=>t.startsWith("on")?!Hg(t):e(t))}try{RP(require("@emotion/is-prop-valid").default)}catch{}function L3(e,t,n){const r={};for(const i in e)i==="values"&&typeof e.values=="object"||(AP(i)||n===!0&&Hg(i)||!t&&!Hg(i)||e.draggable&&i.startsWith("onDrag"))&&(r[i]=e[i]);return r}function M3({children:e,isValidProp:t,...n}){t&&RP(t),n={...S.useContext(eh),...n},n.isStatic=gh(()=>n.isStatic);const r=S.useMemo(()=>n,[JSON.stringify(n.transition),n.transformPagePoint,n.reducedMotion]);return D.jsx(eh.Provider,{value:r,children:e})}const bv=S.createContext({});function xv(e){return e!==null&&typeof e=="object"&&typeof e.start=="function"}function th(e){return typeof e=="string"||Array.isArray(e)}const Nx=["animate","whileInView","whileFocus","whileHover","whileTap","whileDrag","exit"],Fx=["initial",...Nx];function wv(e){return xv(e.animate)||Fx.some(t=>th(e[t]))}function LP(e){return!!(wv(e)||e.variants)}function D3(e,t){if(wv(e)){const{initial:n,animate:r}=e;return{initial:n===!1||th(n)?n:void 0,animate:th(r)?r:void 0}}return e.inherit!==!1?t:{}}function N3(e){const{initial:t,animate:n}=D3(e,S.useContext(bv));return S.useMemo(()=>({initial:t,animate:n}),[G1(t),G1(n)])}function G1(e){return Array.isArray(e)?e.join(" "):e}const nh={};function F3(e){for(const t in e)nh[t]=e[t],wx(t)&&(nh[t].isCSSVariable=!0)}function MP(e,{layout:t,layoutId:n}){return Au.has(e)||e.startsWith("origin")||(t||n!==void 0)&&(!!nh[e]||e==="opacity")}const O3={x:"translateX",y:"translateY",z:"translateZ",transformPerspective:"perspective"},z3=Of.length;function j3(e,t,n){let r="",i=!0;for(let s=0;s({style:{},transform:{},transformOrigin:{},vars:{}});function DP(e,t,n){for(const r in t)!wr(t[r])&&!MP(r,n)&&(e[r]=t[r])}function B3({transformTemplate:e},t){return S.useMemo(()=>{const n=zx();return Ox(n,t,e),Object.assign({},n.vars,n.style)},[t])}function V3(e,t){const n=e.style||{},r={};return DP(r,n,e),Object.assign(r,B3(e,t)),r}function U3(e,t){const n={},r=V3(e,t);return e.drag&&e.dragListener!==!1&&(n.draggable=!1,r.userSelect=r.WebkitUserSelect=r.WebkitTouchCallout="none",r.touchAction=e.drag===!0?"none":`pan-${e.drag==="x"?"y":"x"}`),e.tabIndex===void 0&&(e.onTap||e.onTapStart||e.whileTap)&&(n.tabIndex=0),n.style=r,n}const K3={offset:"stroke-dashoffset",array:"stroke-dasharray"},W3={offset:"strokeDashoffset",array:"strokeDasharray"};function H3(e,t,n=1,r=0,i=!0){e.pathLength=1;const s=i?K3:W3;e[s.offset]=tt.transform(-r);const l=tt.transform(t),c=tt.transform(n);e[s.array]=`${l} ${c}`}function NP(e,{attrX:t,attrY:n,attrScale:r,pathLength:i,pathSpacing:s=1,pathOffset:l=0,...c},d,h,m){if(Ox(e,c,h),d){e.style.viewBox&&(e.attrs.viewBox=e.style.viewBox);return}e.attrs=e.style,e.style={};const{attrs:g,style:b}=e;g.transform&&(b.transform=g.transform,delete g.transform),(b.transform||g.transformOrigin)&&(b.transformOrigin=g.transformOrigin??"50% 50%",delete g.transformOrigin),b.transform&&(b.transformBox=m?.transformBox??"fill-box",delete g.transformBox),t!==void 0&&(g.x=t),n!==void 0&&(g.y=n),r!==void 0&&(g.scale=r),i!==void 0&&H3(g,i,s,l,!1)}const FP=()=>({...zx(),attrs:{}}),OP=e=>typeof e=="string"&&e.toLowerCase()==="svg";function G3(e,t,n,r){const i=S.useMemo(()=>{const s=FP();return NP(s,t,OP(r),e.transformTemplate,e.style),{...s.attrs,style:{...s.style}}},[t]);if(e.style){const s={};DP(s,e.style,e),i.style={...s,...i.style}}return i}const q3=["animate","circle","defs","desc","ellipse","g","image","line","filter","marker","mask","metadata","path","pattern","polygon","polyline","rect","stop","switch","symbol","svg","text","tspan","use","view"];function jx(e){return typeof e!="string"||e.includes("-")?!1:!!(q3.indexOf(e)>-1||/[A-Z]/u.test(e))}function Y3(e,t,n,{latestValues:r},i,s=!1){const c=(jx(e)?G3:U3)(t,r,i,e),d=L3(t,typeof e=="string",s),h=e!==S.Fragment?{...d,...c,ref:n}:{},{children:m}=t,g=S.useMemo(()=>wr(m)?m.get():m,[m]);return S.createElement(e,{...h,children:g})}function q1(e){const t=[{},{}];return e?.values.forEach((n,r)=>{t[0][r]=n.get(),t[1][r]=n.getVelocity()}),t}function Bx(e,t,n,r){if(typeof t=="function"){const[i,s]=q1(r);t=t(n!==void 0?n:e.custom,i,s)}if(typeof t=="string"&&(t=e.variants&&e.variants[t]),typeof t=="function"){const[i,s]=q1(r);t=t(n!==void 0?n:e.custom,i,s)}return t}function Ag(e){return wr(e)?e.get():e}function X3({scrapeMotionValuesFromProps:e,createRenderState:t},n,r,i){return{latestValues:Q3(n,r,i,e),renderState:t()}}function Q3(e,t,n,r){const i={},s=r(e,{});for(const b in s)i[b]=Ag(s[b]);let{initial:l,animate:c}=e;const d=wv(e),h=LP(e);t&&h&&!d&&e.inherit!==!1&&(l===void 0&&(l=t.initial),c===void 0&&(c=t.animate));let m=n?n.initial===!1:!1;m=m||l===!1;const g=m?c:l;if(g&&typeof g!="boolean"&&!xv(g)){const b=Array.isArray(g)?g:[g];for(let x=0;x(t,n)=>{const r=S.useContext(bv),i=S.useContext(yv),s=()=>X3(e,t,r,i);return n?s():gh(s)};function Vx(e,t,n){const{style:r}=e,i={};for(const s in r)(wr(r[s])||t.style&&wr(t.style[s])||MP(s,e)||n?.getValue(s)?.liveStyle!==void 0)&&(i[s]=r[s]);return i}const J3=zP({scrapeMotionValuesFromProps:Vx,createRenderState:zx});function jP(e,t,n){const r=Vx(e,t,n);for(const i in e)if(wr(e[i])||wr(t[i])){const s=Of.indexOf(i)!==-1?"attr"+i.charAt(0).toUpperCase()+i.substring(1):i;r[s]=e[i]}return r}const Z3=zP({scrapeMotionValuesFromProps:jP,createRenderState:FP}),e4=Symbol.for("motionComponentSymbol");function hf(e){return e&&typeof e=="object"&&Object.prototype.hasOwnProperty.call(e,"current")}function t4(e,t,n){return S.useCallback(r=>{r&&e.onMount&&e.onMount(r),t&&(r?t.mount(r):t.unmount()),n&&(typeof n=="function"?n(r):hf(n)&&(n.current=r))},[t])}const Ux=e=>e.replace(/([a-z])([A-Z])/gu,"$1-$2").toLowerCase(),n4="framerAppearId",BP="data-"+Ux(n4),VP=S.createContext({});function r4(e,t,n,r,i){const{visualElement:s}=S.useContext(bv),l=S.useContext(Dx),c=S.useContext(yv),d=S.useContext(eh).reducedMotion,h=S.useRef(null);r=r||l.renderer,!h.current&&r&&(h.current=r(e,{visualState:t,parent:s,props:n,presenceContext:c,blockInitialAnimation:c?c.initial===!1:!1,reducedMotionConfig:d}));const m=h.current,g=S.useContext(VP);m&&!m.projection&&i&&(m.type==="html"||m.type==="svg")&&i4(h.current,n,i,g);const b=S.useRef(!1);S.useInsertionEffect(()=>{m&&b.current&&m.update(n,c)});const x=n[BP],k=S.useRef(!!x&&!window.MotionHandoffIsComplete?.(x)&&window.MotionHasOptimisedAnimation?.(x));return px(()=>{m&&(b.current=!0,window.MotionIsMounted=!0,m.updateFeatures(),m.scheduleRenderMicrotask(),k.current&&m.animationState&&m.animationState.animateChanges())}),S.useEffect(()=>{m&&(!k.current&&m.animationState&&m.animationState.animateChanges(),k.current&&(queueMicrotask(()=>{window.MotionHandoffMarkAsComplete?.(x)}),k.current=!1))}),m}function i4(e,t,n,r){const{layoutId:i,layout:s,drag:l,dragConstraints:c,layoutScroll:d,layoutRoot:h,layoutCrossfade:m}=t;e.projection=new n(e.latestValues,t["data-framer-portal-id"]?void 0:UP(e.parent)),e.projection.setOptions({layoutId:i,layout:s,alwaysMeasureLayout:!!l||c&&hf(c),visualElement:e,animationType:typeof s=="string"?s:"both",initialPromotionConfig:r,crossfade:m,layoutScroll:d,layoutRoot:h})}function UP(e){if(e)return e.options.allowProjection!==!1?e.projection:UP(e.parent)}function e0(e,{forwardMotionProps:t=!1}={},n,r){n&&sb(n);const i=jx(e)?Z3:J3;function s(c,d){let h;const m={...S.useContext(eh),...c,layoutId:o4(c)},{isStatic:g}=m,b=N3(c),x=i(c,g);if(!g&&dx){s4();const k=l4(m);h=k.MeasureLayout,b.visualElement=r4(e,x,m,r,k.ProjectionNode)}return D.jsxs(bv.Provider,{value:b,children:[h&&b.visualElement?D.jsx(h,{visualElement:b.visualElement,...m}):null,Y3(e,c,t4(x,b.visualElement,d),x,g,t)]})}s.displayName=`motion.${typeof e=="string"?e:`create(${e.displayName??e.name??""})`}`;const l=S.forwardRef(s);return l[e4]=e,l}function o4({layoutId:e}){const t=S.useContext(Xp).id;return t&&e!==void 0?t+"-"+e:e}function s4(e,t){S.useContext(Dx).strict}function l4(e){const{drag:t,layout:n}=If;if(!t&&!n)return{};const r={...t,...n};return{MeasureLayout:t?.isEnabled(e)||n?.isEnabled(e)?r.MeasureLayout:void 0,ProjectionNode:r.ProjectionNode}}function KP(e,t){if(typeof Proxy>"u")return e0;const n=new Map,r=(s,l)=>e0(s,l,e,t),i=(s,l)=>r(s,l);return new Proxy(i,{get:(s,l)=>l==="create"?r:(n.has(l)||n.set(l,e0(l,void 0,e,t)),n.get(l))})}const Af=KP();function WP({top:e,left:t,right:n,bottom:r}){return{x:{min:t,max:n},y:{min:e,max:r}}}function a4({x:e,y:t}){return{top:t.min,right:e.max,bottom:t.max,left:e.min}}function u4(e,t){if(!t)return e;const n=t({x:e.left,y:e.top}),r=t({x:e.right,y:e.bottom});return{top:n.y,left:n.x,bottom:r.y,right:r.x}}function t0(e){return e===void 0||e===1}function lb({scale:e,scaleX:t,scaleY:n}){return!t0(e)||!t0(t)||!t0(n)}function fu(e){return lb(e)||HP(e)||e.z||e.rotate||e.rotateX||e.rotateY||e.skewX||e.skewY}function HP(e){return Y1(e.x)||Y1(e.y)}function Y1(e){return e&&e!=="0%"}function Gg(e,t,n){const r=e-n,i=t*r;return n+i}function X1(e,t,n,r,i){return i!==void 0&&(e=Gg(e,i,r)),Gg(e,n,r)+t}function ab(e,t=0,n=1,r,i){e.min=X1(e.min,t,n,r,i),e.max=X1(e.max,t,n,r,i)}function GP(e,{x:t,y:n}){ab(e.x,t.translate,t.scale,t.originPoint),ab(e.y,n.translate,n.scale,n.originPoint)}const Q1=.999999999999,J1=1.0000000000001;function c4(e,t,n,r=!1){const i=n.length;if(!i)return;t.x=t.y=1;let s,l;for(let c=0;cQ1&&(t.x=1),t.yQ1&&(t.y=1)}function mf(e,t){e.min=e.min+t,e.max=e.max+t}function Z1(e,t,n,r,i=.5){const s=dn(e.min,e.max,i);ab(e,t,n,s,r)}function gf(e,t){Z1(e.x,t.x,t.scaleX,t.scale,t.originX),Z1(e.y,t.y,t.scaleY,t.scale,t.originY)}function qP(e,t){return WP(u4(e.getBoundingClientRect(),t))}function f4(e,t,n){const r=qP(e,n),{scroll:i}=t;return i&&(mf(r.x,i.offset.x),mf(r.y,i.offset.y)),r}const eS=()=>({translate:0,scale:1,origin:0,originPoint:0}),vf=()=>({x:eS(),y:eS()}),tS=()=>({min:0,max:0}),Cn=()=>({x:tS(),y:tS()}),ub={current:null},YP={current:!1};function d4(){if(YP.current=!0,!!dx)if(window.matchMedia){const e=window.matchMedia("(prefers-reduced-motion)"),t=()=>ub.current=e.matches;e.addEventListener("change",t),t()}else ub.current=!1}const p4=new WeakMap;function h4(e,t,n){for(const r in t){const i=t[r],s=n[r];if(wr(i))e.addValue(r,i);else if(wr(s))e.addValue(r,_f(i,{owner:e}));else if(s!==i)if(e.hasValue(r)){const l=e.getValue(r);l.liveStyle===!0?l.jump(i):l.hasAnimated||l.set(i)}else{const l=e.getStaticValue(r);e.addValue(r,_f(l!==void 0?l:i,{owner:e}))}}for(const r in n)t[r]===void 0&&e.removeValue(r);return t}const nS=["AnimationStart","AnimationComplete","Update","BeforeLayoutMeasure","LayoutMeasure","LayoutAnimationStart","LayoutAnimationComplete"];class m4{scrapeMotionValuesFromProps(t,n,r){return{}}constructor({parent:t,props:n,presenceContext:r,reducedMotionConfig:i,blockInitialAnimation:s,visualState:l},c={}){this.current=null,this.children=new Set,this.isVariantNode=!1,this.isControllingVariants=!1,this.shouldReduceMotion=null,this.values=new Map,this.KeyframeResolver=$x,this.features={},this.valueSubscriptions=new Map,this.prevMotionValues={},this.events={},this.propEventSubscriptions={},this.notifyUpdate=()=>this.notify("Update",this.latestValues),this.render=()=>{this.current&&(this.triggerBuild(),this.renderInstance(this.current,this.renderState,this.props.style,this.projection))},this.renderScheduledAt=0,this.scheduleRender=()=>{const b=si.now();this.renderScheduledAtthis.bindToMotionValue(r,n)),YP.current||d4(),this.shouldReduceMotion=this.reducedMotionConfig==="never"?!1:this.reducedMotionConfig==="always"?!0:ub.current,this.parent&&this.parent.children.add(this),this.update(this.props,this.presenceContext)}unmount(){this.projection&&this.projection.unmount(),ea(this.notifyUpdate),ea(this.render),this.valueSubscriptions.forEach(t=>t()),this.valueSubscriptions.clear(),this.removeFromVariantTree&&this.removeFromVariantTree(),this.parent&&this.parent.children.delete(this);for(const t in this.events)this.events[t].clear();for(const t in this.features){const n=this.features[t];n&&(n.unmount(),n.isMounted=!1)}this.current=null}bindToMotionValue(t,n){this.valueSubscriptions.has(t)&&this.valueSubscriptions.get(t)();const r=Au.has(t);r&&this.onBindTransform&&this.onBindTransform();const i=n.on("change",c=>{this.latestValues[t]=c,this.props.onUpdate&&nn.preRender(this.notifyUpdate),r&&this.projection&&(this.projection.isTransformDirty=!0)}),s=n.on("renderRequest",this.scheduleRender);let l;window.MotionCheckAppearSync&&(l=window.MotionCheckAppearSync(this,t,n)),this.valueSubscriptions.set(t,()=>{i(),s(),l&&l(),n.owner&&n.stop()})}sortNodePosition(t){return!this.current||!this.sortInstanceNodePosition||this.type!==t.type?0:this.sortInstanceNodePosition(this.current,t.current)}updateFeatures(){let t="animation";for(t in If){const n=If[t];if(!n)continue;const{isEnabled:r,Feature:i}=n;if(!this.features[t]&&i&&r(this.props)&&(this.features[t]=new i(this)),this.features[t]){const s=this.features[t];s.isMounted?s.update():(s.mount(),s.isMounted=!0)}}}triggerBuild(){this.build(this.renderState,this.latestValues,this.props)}measureViewportBox(){return this.current?this.measureInstanceViewportBox(this.current,this.props):Cn()}getStaticValue(t){return this.latestValues[t]}setStaticValue(t,n){this.latestValues[t]=n}update(t,n){(t.transformTemplate||this.props.transformTemplate)&&this.scheduleRender(),this.prevProps=this.props,this.props=t,this.prevPresenceContext=this.presenceContext,this.presenceContext=n;for(let r=0;rn.variantChildren.delete(t)}addValue(t,n){const r=this.values.get(t);n!==r&&(r&&this.removeValue(t),this.bindToMotionValue(t,n),this.values.set(t,n),this.latestValues[t]=n.get())}removeValue(t){this.values.delete(t);const n=this.valueSubscriptions.get(t);n&&(n(),this.valueSubscriptions.delete(t)),delete this.latestValues[t],this.removeValueFromRenderState(t,this.renderState)}hasValue(t){return this.values.has(t)}getValue(t,n){if(this.props.values&&this.props.values[t])return this.props.values[t];let r=this.values.get(t);return r===void 0&&n!==void 0&&(r=_f(n===null?void 0:n,{owner:this}),this.addValue(t,r)),r}readValue(t,n){let r=this.latestValues[t]!==void 0||!this.current?this.latestValues[t]:this.getBaseTargetFromProps(this.props,t)??this.readValueFromInstance(this.current,t,this.options);return r!=null&&(typeof r=="string"&&(OE(r)||jE(r))?r=parseFloat(r):!w3(r)&&ta.test(n)&&(r=wP(t,n)),this.setBaseTarget(t,wr(r)?r.get():r)),wr(r)?r.get():r}setBaseTarget(t,n){this.baseTarget[t]=n}getBaseTarget(t){const{initial:n}=this.props;let r;if(typeof n=="string"||typeof n=="object"){const s=Bx(this.props,n,this.presenceContext?.custom);s&&(r=s[t])}if(n&&r!==void 0)return r;const i=this.getBaseTargetFromProps(this.props,t);return i!==void 0&&!wr(i)?i:this.initialValues[t]!==void 0&&r===void 0?void 0:this.baseTarget[t]}on(t,n){return this.events[t]||(this.events[t]=new yx),this.events[t].add(n)}notify(t,...n){this.events[t]&&this.events[t].notify(...n)}scheduleRenderMicrotask(){Lx.render(this.render)}}class XP extends m4{constructor(){super(...arguments),this.KeyframeResolver=u3}sortInstanceNodePosition(t,n){return t.compareDocumentPosition(n)&2?1:-1}getBaseTargetFromProps(t,n){return t.style?t.style[n]:void 0}removeValueFromRenderState(t,{vars:n,style:r}){delete n[t],delete r[t]}handleChildMotionValue(){this.childSubscription&&(this.childSubscription(),delete this.childSubscription);const{children:t}=this.props;wr(t)&&(this.childSubscription=t.on("change",n=>{this.current&&(this.current.textContent=`${n}`)}))}}function QP(e,{style:t,vars:n},r,i){const s=e.style;let l;for(l in t)s[l]=t[l];i?.applyProjectionStyles(s,r);for(l in n)s.setProperty(l,n[l])}function g4(e){return window.getComputedStyle(e)}class v4 extends XP{constructor(){super(...arguments),this.type="html",this.renderInstance=QP}readValueFromInstance(t,n){if(Au.has(n))return this.projection?.isProjecting?eb(n):_D(t,n);{const r=g4(t),i=(wx(n)?r.getPropertyValue(n):r[n])||0;return typeof i=="string"?i.trim():i}}measureInstanceViewportBox(t,{transformPagePoint:n}){return qP(t,n)}build(t,n,r){Ox(t,n,r.transformTemplate)}scrapeMotionValuesFromProps(t,n,r){return Vx(t,n,r)}}const JP=new Set(["baseFrequency","diffuseConstant","kernelMatrix","kernelUnitLength","keySplines","keyTimes","limitingConeAngle","markerHeight","markerWidth","numOctaves","targetX","targetY","surfaceScale","specularConstant","specularExponent","stdDeviation","tableValues","viewBox","gradientTransform","pathLength","startOffset","textLength","lengthAdjust"]);function y4(e,t,n,r){QP(e,t,void 0,r);for(const i in t.attrs)e.setAttribute(JP.has(i)?i:Ux(i),t.attrs[i])}class b4 extends XP{constructor(){super(...arguments),this.type="svg",this.isSVGTag=!1,this.measureInstanceViewportBox=Cn}getBaseTargetFromProps(t,n){return t[n]}readValueFromInstance(t,n){if(Au.has(n)){const r=xP(n);return r&&r.default||0}return n=JP.has(n)?n:Ux(n),t.getAttribute(n)}scrapeMotionValuesFromProps(t,n,r){return jP(t,n,r)}build(t,n,r){NP(t,n,this.isSVGTag,r.transformTemplate,r.style)}renderInstance(t,n,r,i){y4(t,n,r,i)}mount(t){this.isSVGTag=OP(t.tagName),super.mount(t)}}const x4=(e,t)=>jx(e)?new b4(t):new v4(t,{allowProjection:e!==S.Fragment});function rh(e,t,n){const r=e.getProps();return Bx(r,t,n!==void 0?n:r.custom,e)}const cb=e=>Array.isArray(e);function w4(e,t,n){e.hasValue(t)?e.getValue(t).set(n):e.addValue(t,_f(n))}function S4(e){return cb(e)?e[e.length-1]||0:e}function k4(e,t){const n=rh(e,t);let{transitionEnd:r={},transition:i={},...s}=n||{};s={...s,...r};for(const l in s){const c=S4(s[l]);w4(e,l,c)}}function C4(e){return!!(wr(e)&&e.add)}function fb(e,t){const n=e.getValue("willChange");if(C4(n))return n.add(t);if(!n&&ds.WillChange){const r=new ds.WillChange("auto");e.addValue("willChange",r),r.add(t)}}function ZP(e){return e.props[BP]}const E4=e=>e!==null;function P4(e,{repeat:t,repeatType:n="loop"},r){const i=e.filter(E4),s=t&&n!=="loop"&&t%2===1?0:i.length-1;return i[s]}const T4={type:"spring",stiffness:500,damping:25,restSpeed:10},_4=e=>({type:"spring",stiffness:550,damping:e===0?2*Math.sqrt(550):30,restSpeed:10}),I4={type:"keyframes",duration:.8},$4={type:"keyframes",ease:[.25,.1,.35,1],duration:.3},A4=(e,{keyframes:t})=>t.length>2?I4:Au.has(e)?e.startsWith("scale")?_4(t[1]):T4:$4;function R4({when:e,delay:t,delayChildren:n,staggerChildren:r,staggerDirection:i,repeat:s,repeatType:l,repeatDelay:c,from:d,elapsed:h,...m}){return!!Object.keys(m).length}const Kx=(e,t,n,r={},i,s)=>l=>{const c=Ax(r,e)||{},d=c.delay||r.delay||0;let{elapsed:h=0}=r;h=h-us(d);const m={keyframes:Array.isArray(n)?n:[null,n],ease:"easeOut",velocity:t.getVelocity(),...c,delay:-h,onUpdate:b=>{t.set(b),c.onUpdate&&c.onUpdate(b)},onComplete:()=>{l(),c.onComplete&&c.onComplete()},name:e,motionValue:t,element:s?void 0:i};R4(c)||Object.assign(m,A4(e,m)),m.duration&&(m.duration=us(m.duration)),m.repeatDelay&&(m.repeatDelay=us(m.repeatDelay)),m.from!==void 0&&(m.keyframes[0]=m.from);let g=!1;if((m.type===!1||m.duration===0&&!m.repeatDelay)&&(m.duration=0,m.delay===0&&(g=!0)),(ds.instantAnimations||ds.skipAnimations)&&(g=!0,m.duration=0,m.delay=0),m.allowFlatten=!c.type&&!c.ease,g&&!s&&t.get()!==void 0){const b=P4(m.keyframes,c);if(b!==void 0){nn.update(()=>{m.onUpdate(b),m.onComplete()});return}}return c.isSync?new Ix(m):new QD(m)};function L4({protectedKeys:e,needsAnimating:t},n){const r=e.hasOwnProperty(n)&&t[n]!==!0;return t[n]=!1,r}function eT(e,t,{delay:n=0,transitionOverride:r,type:i}={}){let{transition:s=e.getDefaultTransition(),transitionEnd:l,...c}=t;r&&(s=r);const d=[],h=i&&e.animationState&&e.animationState.getState()[i];for(const m in c){const g=e.getValue(m,e.latestValues[m]??null),b=c[m];if(b===void 0||h&&L4(h,m))continue;const x={delay:n,...Ax(s||{},m)},k=g.get();if(k!==void 0&&!g.isAnimating&&!Array.isArray(b)&&b===k&&!x.velocity)continue;let P=!1;if(window.MotionHandoffAnimation){const T=ZP(e);if(T){const $=window.MotionHandoffAnimation(T,m,nn);$!==null&&(x.startTime=$,P=!0)}}fb(e,m),g.start(Kx(m,g,b,e.shouldReduceMotion&&vP.has(m)?{type:!1}:x,e,P));const _=g.animation;_&&d.push(_)}return l&&Promise.all(d).then(()=>{nn.update(()=>{l&&k4(e,l)})}),d}function db(e,t,n={}){const r=rh(e,t,n.type==="exit"?e.presenceContext?.custom:void 0);let{transition:i=e.getDefaultTransition()||{}}=r||{};n.transitionOverride&&(i=n.transitionOverride);const s=r?()=>Promise.all(eT(e,r,n)):()=>Promise.resolve(),l=e.variantChildren&&e.variantChildren.size?(d=0)=>{const{delayChildren:h=0,staggerChildren:m,staggerDirection:g}=i;return M4(e,t,d,h,m,g,n)}:()=>Promise.resolve(),{when:c}=i;if(c){const[d,h]=c==="beforeChildren"?[s,l]:[l,s];return d().then(()=>h())}else return Promise.all([s(),l(n.delay)])}function M4(e,t,n=0,r=0,i=0,s=1,l){const c=[],d=e.variantChildren.size,h=(d-1)*i,m=typeof r=="function",g=m?b=>r(b,d):s===1?(b=0)=>b*i:(b=0)=>h-b*i;return Array.from(e.variantChildren).sort(D4).forEach((b,x)=>{b.notify("AnimationStart",t),c.push(db(b,t,{...l,delay:n+(m?0:r)+g(x)}).then(()=>b.notify("AnimationComplete",t)))}),Promise.all(c)}function D4(e,t){return e.sortNodePosition(t)}function N4(e,t,n={}){e.notify("AnimationStart",t);let r;if(Array.isArray(t)){const i=t.map(s=>db(e,s,n));r=Promise.all(i)}else if(typeof t=="string")r=db(e,t,n);else{const i=typeof t=="function"?rh(e,t,n.custom):t;r=Promise.all(eT(e,i,n))}return r.then(()=>{e.notify("AnimationComplete",t)})}function tT(e,t){if(!Array.isArray(t))return!1;const n=t.length;if(n!==e.length)return!1;for(let r=0;rPromise.all(t.map(({animation:n,options:r})=>N4(e,n,r)))}function B4(e){let t=j4(e),n=rS(),r=!0;const i=d=>(h,m)=>{const g=rh(e,m,d==="exit"?e.presenceContext?.custom:void 0);if(g){const{transition:b,transitionEnd:x,...k}=g;h={...h,...k,...x}}return h};function s(d){t=d(e)}function l(d){const{props:h}=e,m=nT(e.parent)||{},g=[],b=new Set;let x={},k=1/0;for(let _=0;_k&&z,ae=!1;const j=Array.isArray(L)?L:[L];let B=j.reduce(i(T),{});K===!1&&(B={});const{prevResolvedValues:Y={}}=$,te={...Y,...B},G=q=>{re=!0,b.has(q)&&(ae=!0,b.delete(q)),$.needsAnimating[q]=!0;const V=e.getValue(q);V&&(V.liveStyle=!1)};for(const q in te){const V=B[q],se=Y[q];if(x.hasOwnProperty(q))continue;let R=!1;cb(V)&&cb(se)?R=!tT(V,se):R=V!==se,R?V!=null?G(q):b.add(q):V!==void 0&&b.has(q)?G(q):$.protectedKeys[q]=!0}$.prevProp=L,$.prevResolvedValues=B,$.isActive&&(x={...x,...B}),r&&e.blockInitialAnimation&&(re=!1),re&&(!(M&&J)||ae)&&g.push(...j.map(q=>({animation:q,options:{type:T}})))}if(b.size){const _={};if(typeof h.initial!="boolean"){const T=rh(e,Array.isArray(h.initial)?h.initial[0]:h.initial);T&&T.transition&&(_.transition=T.transition)}b.forEach(T=>{const $=e.getBaseTarget(T),L=e.getValue(T);L&&(L.liveStyle=!0),_[T]=$??null}),g.push({animation:_})}let P=!!g.length;return r&&(h.initial===!1||h.initial===h.animate)&&!e.manuallyAnimateOnMount&&(P=!1),r=!1,P?t(g):Promise.resolve()}function c(d,h){if(n[d].isActive===h)return Promise.resolve();e.variantChildren?.forEach(g=>g.animationState?.setActive(d,h)),n[d].isActive=h;const m=l(d);for(const g in n)n[g].protectedKeys={};return m}return{animateChanges:l,setActive:c,setAnimateFunction:s,getState:()=>n,reset:()=>{n=rS(),r=!0}}}function V4(e,t){return typeof t=="string"?t!==e:Array.isArray(t)?!tT(t,e):!1}function iu(e=!1){return{isActive:e,protectedKeys:{},needsAnimating:{},prevResolvedValues:{}}}function rS(){return{animate:iu(!0),whileInView:iu(),whileHover:iu(),whileTap:iu(),whileDrag:iu(),whileFocus:iu(),exit:iu()}}class na{constructor(t){this.isMounted=!1,this.node=t}update(){}}class U4 extends na{constructor(t){super(t),t.animationState||(t.animationState=B4(t))}updateAnimationControlsSubscription(){const{animate:t}=this.node.getProps();xv(t)&&(this.unmountControls=t.subscribe(this.node))}mount(){this.updateAnimationControlsSubscription()}update(){const{animate:t}=this.node.getProps(),{animate:n}=this.node.prevProps||{};t!==n&&this.updateAnimationControlsSubscription()}unmount(){this.node.animationState.reset(),this.unmountControls?.()}}let K4=0;class W4 extends na{constructor(){super(...arguments),this.id=K4++}update(){if(!this.node.presenceContext)return;const{isPresent:t,onExitComplete:n}=this.node.presenceContext,{isPresent:r}=this.node.prevPresenceContext||{};if(!this.node.animationState||t===r)return;const i=this.node.animationState.setActive("exit",!t);n&&!t&&i.then(()=>{n(this.id)})}mount(){const{register:t,onExitComplete:n}=this.node.presenceContext||{};n&&n(this.id),t&&(this.unmount=t(this.id))}unmount(){}}const H4={animation:{Feature:U4},exit:{Feature:W4}};function ih(e,t,n,r={passive:!0}){return e.addEventListener(t,n,r),()=>e.removeEventListener(t,n)}function xh(e){return{point:{x:e.pageX,y:e.pageY}}}const G4=e=>t=>Mx(t)&&e(t,xh(t));function Op(e,t,n,r){return ih(e,t,G4(n),r)}const rT=1e-4,q4=1-rT,Y4=1+rT,iT=.01,X4=0-iT,Q4=0+iT;function Fr(e){return e.max-e.min}function J4(e,t,n){return Math.abs(e-t)<=n}function iS(e,t,n,r=.5){e.origin=r,e.originPoint=dn(t.min,t.max,e.origin),e.scale=Fr(n)/Fr(t),e.translate=dn(n.min,n.max,e.origin)-e.originPoint,(e.scale>=q4&&e.scale<=Y4||isNaN(e.scale))&&(e.scale=1),(e.translate>=X4&&e.translate<=Q4||isNaN(e.translate))&&(e.translate=0)}function zp(e,t,n,r){iS(e.x,t.x,n.x,r?r.originX:void 0),iS(e.y,t.y,n.y,r?r.originY:void 0)}function oS(e,t,n){e.min=n.min+t.min,e.max=e.min+Fr(t)}function Z4(e,t,n){oS(e.x,t.x,n.x),oS(e.y,t.y,n.y)}function sS(e,t,n){e.min=t.min-n.min,e.max=e.min+Fr(t)}function jp(e,t,n){sS(e.x,t.x,n.x),sS(e.y,t.y,n.y)}function Yi(e){return[e("x"),e("y")]}const oT=({current:e})=>e?e.ownerDocument.defaultView:null,lS=(e,t)=>Math.abs(e-t);function eN(e,t){const n=lS(e.x,t.x),r=lS(e.y,t.y);return Math.sqrt(n**2+r**2)}class sT{constructor(t,n,{transformPagePoint:r,contextWindow:i=window,dragSnapToOrigin:s=!1,distanceThreshold:l=3}={}){if(this.startEvent=null,this.lastMoveEvent=null,this.lastMoveEventInfo=null,this.handlers={},this.contextWindow=window,this.updatePoint=()=>{if(!(this.lastMoveEvent&&this.lastMoveEventInfo))return;const b=r0(this.lastMoveEventInfo,this.history),x=this.startEvent!==null,k=eN(b.offset,{x:0,y:0})>=this.distanceThreshold;if(!x&&!k)return;const{point:P}=b,{timestamp:_}=cr;this.history.push({...P,timestamp:_});const{onStart:T,onMove:$}=this.handlers;x||(T&&T(this.lastMoveEvent,b),this.startEvent=this.lastMoveEvent),$&&$(this.lastMoveEvent,b)},this.handlePointerMove=(b,x)=>{this.lastMoveEvent=b,this.lastMoveEventInfo=n0(x,this.transformPagePoint),nn.update(this.updatePoint,!0)},this.handlePointerUp=(b,x)=>{this.end();const{onEnd:k,onSessionEnd:P,resumeAnimation:_}=this.handlers;if(this.dragSnapToOrigin&&_&&_(),!(this.lastMoveEvent&&this.lastMoveEventInfo))return;const T=r0(b.type==="pointercancel"?this.lastMoveEventInfo:n0(x,this.transformPagePoint),this.history);this.startEvent&&k&&k(b,T),P&&P(b,T)},!Mx(t))return;this.dragSnapToOrigin=s,this.handlers=n,this.transformPagePoint=r,this.distanceThreshold=l,this.contextWindow=i||window;const c=xh(t),d=n0(c,this.transformPagePoint),{point:h}=d,{timestamp:m}=cr;this.history=[{...h,timestamp:m}];const{onSessionStart:g}=n;g&&g(t,r0(d,this.history)),this.removeListeners=vh(Op(this.contextWindow,"pointermove",this.handlePointerMove),Op(this.contextWindow,"pointerup",this.handlePointerUp),Op(this.contextWindow,"pointercancel",this.handlePointerUp))}updateHandlers(t){this.handlers=t}end(){this.removeListeners&&this.removeListeners(),ea(this.updatePoint)}}function n0(e,t){return t?{point:t(e.point)}:e}function aS(e,t){return{x:e.x-t.x,y:e.y-t.y}}function r0({point:e},t){return{point:e,delta:aS(e,lT(t)),offset:aS(e,tN(t)),velocity:nN(t,.1)}}function tN(e){return e[0]}function lT(e){return e[e.length-1]}function nN(e,t){if(e.length<2)return{x:0,y:0};let n=e.length-1,r=null;const i=lT(e);for(;n>=0&&(r=e[n],!(i.timestamp-r.timestamp>us(t)));)n--;if(!r)return{x:0,y:0};const s=cs(i.timestamp-r.timestamp);if(s===0)return{x:0,y:0};const l={x:(i.x-r.x)/s,y:(i.y-r.y)/s};return l.x===1/0&&(l.x=0),l.y===1/0&&(l.y=0),l}function rN(e,{min:t,max:n},r){return t!==void 0&&en&&(e=r?dn(n,e,r.max):Math.min(e,n)),e}function uS(e,t,n){return{min:t!==void 0?e.min+t:void 0,max:n!==void 0?e.max+n-(e.max-e.min):void 0}}function iN(e,{top:t,left:n,bottom:r,right:i}){return{x:uS(e.x,n,i),y:uS(e.y,t,r)}}function cS(e,t){let n=t.min-e.min,r=t.max-e.max;return t.max-t.minr?n=Qp(t.min,t.max-r,e.min):r>i&&(n=Qp(e.min,e.max-i,t.min)),Zs(0,1,n)}function lN(e,t){const n={};return t.min!==void 0&&(n.min=t.min-e.min),t.max!==void 0&&(n.max=t.max-e.min),n}const pb=.35;function aN(e=pb){return e===!1?e=0:e===!0&&(e=pb),{x:fS(e,"left","right"),y:fS(e,"top","bottom")}}function fS(e,t,n){return{min:dS(e,t),max:dS(e,n)}}function dS(e,t){return typeof e=="number"?e:e[t]||0}const uN=new WeakMap;class cN{constructor(t){this.openDragLock=null,this.isDragging=!1,this.currentDirection=null,this.originPoint={x:0,y:0},this.constraints=!1,this.hasMutatedConstraints=!1,this.elastic=Cn(),this.latestPointerEvent=null,this.latestPanInfo=null,this.visualElement=t}start(t,{snapToCursor:n=!1,distanceThreshold:r}={}){const{presenceContext:i}=this.visualElement;if(i&&i.isPresent===!1)return;const s=g=>{const{dragSnapToOrigin:b}=this.getProps();b?this.pauseAnimation():this.stopAnimation(),n&&this.snapToCursor(xh(g).point)},l=(g,b)=>{const{drag:x,dragPropagation:k,onDragStart:P}=this.getProps();if(x&&!k&&(this.openDragLock&&this.openDragLock(),this.openDragLock=p3(x),!this.openDragLock))return;this.latestPointerEvent=g,this.latestPanInfo=b,this.isDragging=!0,this.currentDirection=null,this.resolveConstraints(),this.visualElement.projection&&(this.visualElement.projection.isAnimationBlocked=!0,this.visualElement.projection.target=void 0),Yi(T=>{let $=this.getAxisMotionValue(T).get()||0;if(fs.test($)){const{projection:L}=this.visualElement;if(L&&L.layout){const z=L.layout.layoutBox[T];z&&($=Fr(z)*(parseFloat($)/100))}}this.originPoint[T]=$}),P&&nn.postRender(()=>P(g,b)),fb(this.visualElement,"transform");const{animationState:_}=this.visualElement;_&&_.setActive("whileDrag",!0)},c=(g,b)=>{this.latestPointerEvent=g,this.latestPanInfo=b;const{dragPropagation:x,dragDirectionLock:k,onDirectionLock:P,onDrag:_}=this.getProps();if(!x&&!this.openDragLock)return;const{offset:T}=b;if(k&&this.currentDirection===null){this.currentDirection=fN(T),this.currentDirection!==null&&P&&P(this.currentDirection);return}this.updateAxis("x",b.point,T),this.updateAxis("y",b.point,T),this.visualElement.render(),_&&_(g,b)},d=(g,b)=>{this.latestPointerEvent=g,this.latestPanInfo=b,this.stop(g,b),this.latestPointerEvent=null,this.latestPanInfo=null},h=()=>Yi(g=>this.getAnimationState(g)==="paused"&&this.getAxisMotionValue(g).animation?.play()),{dragSnapToOrigin:m}=this.getProps();this.panSession=new sT(t,{onSessionStart:s,onStart:l,onMove:c,onSessionEnd:d,resumeAnimation:h},{transformPagePoint:this.visualElement.getTransformPagePoint(),dragSnapToOrigin:m,distanceThreshold:r,contextWindow:oT(this.visualElement)})}stop(t,n){const r=t||this.latestPointerEvent,i=n||this.latestPanInfo,s=this.isDragging;if(this.cancel(),!s||!i||!r)return;const{velocity:l}=i;this.startAnimation(l);const{onDragEnd:c}=this.getProps();c&&nn.postRender(()=>c(r,i))}cancel(){this.isDragging=!1;const{projection:t,animationState:n}=this.visualElement;t&&(t.isAnimationBlocked=!1),this.panSession&&this.panSession.end(),this.panSession=void 0;const{dragPropagation:r}=this.getProps();!r&&this.openDragLock&&(this.openDragLock(),this.openDragLock=null),n&&n.setActive("whileDrag",!1)}updateAxis(t,n,r){const{drag:i}=this.getProps();if(!r||!pg(t,i,this.currentDirection))return;const s=this.getAxisMotionValue(t);let l=this.originPoint[t]+r[t];this.constraints&&this.constraints[t]&&(l=rN(l,this.constraints[t],this.elastic[t])),s.set(l)}resolveConstraints(){const{dragConstraints:t,dragElastic:n}=this.getProps(),r=this.visualElement.projection&&!this.visualElement.projection.layout?this.visualElement.projection.measure(!1):this.visualElement.projection?.layout,i=this.constraints;t&&hf(t)?this.constraints||(this.constraints=this.resolveRefConstraints()):t&&r?this.constraints=iN(r.layoutBox,t):this.constraints=!1,this.elastic=aN(n),i!==this.constraints&&r&&this.constraints&&!this.hasMutatedConstraints&&Yi(s=>{this.constraints!==!1&&this.getAxisMotionValue(s)&&(this.constraints[s]=lN(r.layoutBox[s],this.constraints[s]))})}resolveRefConstraints(){const{dragConstraints:t,onMeasureDragConstraints:n}=this.getProps();if(!t||!hf(t))return!1;const r=t.current,{projection:i}=this.visualElement;if(!i||!i.layout)return!1;const s=f4(r,i.root,this.visualElement.getTransformPagePoint());let l=oN(i.layout.layoutBox,s);if(n){const c=n(a4(l));this.hasMutatedConstraints=!!c,c&&(l=WP(c))}return l}startAnimation(t){const{drag:n,dragMomentum:r,dragElastic:i,dragTransition:s,dragSnapToOrigin:l,onDragTransitionEnd:c}=this.getProps(),d=this.constraints||{},h=Yi(m=>{if(!pg(m,n,this.currentDirection))return;let g=d&&d[m]||{};l&&(g={min:0,max:0});const b=i?200:1e6,x=i?40:1e7,k={type:"inertia",velocity:r?t[m]:0,bounceStiffness:b,bounceDamping:x,timeConstant:750,restDelta:1,restSpeed:10,...s,...g};return this.startAxisValueAnimation(m,k)});return Promise.all(h).then(c)}startAxisValueAnimation(t,n){const r=this.getAxisMotionValue(t);return fb(this.visualElement,t),r.start(Kx(t,r,0,n,this.visualElement,!1))}stopAnimation(){Yi(t=>this.getAxisMotionValue(t).stop())}pauseAnimation(){Yi(t=>this.getAxisMotionValue(t).animation?.pause())}getAnimationState(t){return this.getAxisMotionValue(t).animation?.state}getAxisMotionValue(t){const n=`_drag${t.toUpperCase()}`,r=this.visualElement.getProps(),i=r[n];return i||this.visualElement.getValue(t,(r.initial?r.initial[t]:void 0)||0)}snapToCursor(t){Yi(n=>{const{drag:r}=this.getProps();if(!pg(n,r,this.currentDirection))return;const{projection:i}=this.visualElement,s=this.getAxisMotionValue(n);if(i&&i.layout){const{min:l,max:c}=i.layout.layoutBox[n];s.set(t[n]-dn(l,c,.5))}})}scalePositionWithinConstraints(){if(!this.visualElement.current)return;const{drag:t,dragConstraints:n}=this.getProps(),{projection:r}=this.visualElement;if(!hf(n)||!r||!this.constraints)return;this.stopAnimation();const i={x:0,y:0};Yi(l=>{const c=this.getAxisMotionValue(l);if(c&&this.constraints!==!1){const d=c.get();i[l]=sN({min:d,max:d},this.constraints[l])}});const{transformTemplate:s}=this.visualElement.getProps();this.visualElement.current.style.transform=s?s({},""):"none",r.root&&r.root.updateScroll(),r.updateLayout(),this.resolveConstraints(),Yi(l=>{if(!pg(l,t,null))return;const c=this.getAxisMotionValue(l),{min:d,max:h}=this.constraints[l];c.set(dn(d,h,i[l]))})}addListeners(){if(!this.visualElement.current)return;uN.set(this.visualElement,this);const t=this.visualElement.current,n=Op(t,"pointerdown",d=>{const{drag:h,dragListener:m=!0}=this.getProps();h&&m&&this.start(d)}),r=()=>{const{dragConstraints:d}=this.getProps();hf(d)&&d.current&&(this.constraints=this.resolveRefConstraints())},{projection:i}=this.visualElement,s=i.addEventListener("measure",r);i&&!i.layout&&(i.root&&i.root.updateScroll(),i.updateLayout()),nn.read(r);const l=ih(window,"resize",()=>this.scalePositionWithinConstraints()),c=i.addEventListener("didUpdate",({delta:d,hasLayoutChanged:h})=>{this.isDragging&&h&&(Yi(m=>{const g=this.getAxisMotionValue(m);g&&(this.originPoint[m]+=d[m].translate,g.set(g.get()+d[m].translate))}),this.visualElement.render())});return()=>{l(),n(),s(),c&&c()}}getProps(){const t=this.visualElement.getProps(),{drag:n=!1,dragDirectionLock:r=!1,dragPropagation:i=!1,dragConstraints:s=!1,dragElastic:l=pb,dragMomentum:c=!0}=t;return{...t,drag:n,dragDirectionLock:r,dragPropagation:i,dragConstraints:s,dragElastic:l,dragMomentum:c}}}function pg(e,t,n){return(t===!0||t===e)&&(n===null||n===e)}function fN(e,t=10){let n=null;return Math.abs(e.y)>t?n="y":Math.abs(e.x)>t&&(n="x"),n}class dN extends na{constructor(t){super(t),this.removeGroupControls=eo,this.removeListeners=eo,this.controls=new cN(t)}mount(){const{dragControls:t}=this.node.getProps();t&&(this.removeGroupControls=t.subscribe(this.controls)),this.removeListeners=this.controls.addListeners()||eo}unmount(){this.removeGroupControls(),this.removeListeners()}}const pS=e=>(t,n)=>{e&&nn.postRender(()=>e(t,n))};class pN extends na{constructor(){super(...arguments),this.removePointerDownListener=eo}onPointerDown(t){this.session=new sT(t,this.createPanHandlers(),{transformPagePoint:this.node.getTransformPagePoint(),contextWindow:oT(this.node)})}createPanHandlers(){const{onPanSessionStart:t,onPanStart:n,onPan:r,onPanEnd:i}=this.node.getProps();return{onSessionStart:pS(t),onStart:pS(n),onMove:r,onEnd:(s,l)=>{delete this.session,i&&nn.postRender(()=>i(s,l))}}}mount(){this.removePointerDownListener=Op(this.node.current,"pointerdown",t=>this.onPointerDown(t))}update(){this.session&&this.session.updateHandlers(this.createPanHandlers())}unmount(){this.removePointerDownListener(),this.session&&this.session.end()}}const Rg={hasAnimatedSinceResize:!0,hasEverUpdated:!1};function hS(e,t){return t.max===t.min?0:e/(t.max-t.min)*100}const gp={correct:(e,t)=>{if(!t.target)return e;if(typeof e=="string")if(tt.test(e))e=parseFloat(e);else return e;const n=hS(e,t.target.x),r=hS(e,t.target.y);return`${n}% ${r}%`}},hN={correct:(e,{treeScale:t,projectionDelta:n})=>{const r=e,i=ta.parse(e);if(i.length>5)return r;const s=ta.createTransformer(e),l=typeof i[0]!="number"?1:0,c=n.x.scale*t.x,d=n.y.scale*t.y;i[0+l]/=c,i[1+l]/=d;const h=dn(c,d,.5);return typeof i[2+l]=="number"&&(i[2+l]/=h),typeof i[3+l]=="number"&&(i[3+l]/=h),s(i)}};let mS=!1;class mN extends S.Component{componentDidMount(){const{visualElement:t,layoutGroup:n,switchLayoutGroup:r,layoutId:i}=this.props,{projection:s}=t;F3(gN),s&&(n.group&&n.group.add(s),r&&r.register&&i&&r.register(s),mS&&s.root.didUpdate(),s.addEventListener("animationComplete",()=>{this.safeToRemove()}),s.setOptions({...s.options,onExitComplete:()=>this.safeToRemove()})),Rg.hasEverUpdated=!0}getSnapshotBeforeUpdate(t){const{layoutDependency:n,visualElement:r,drag:i,isPresent:s}=this.props,{projection:l}=r;return l&&(l.isPresent=s,mS=!0,i||t.layoutDependency!==n||n===void 0||t.isPresent!==s?l.willUpdate():this.safeToRemove(),t.isPresent!==s&&(s?l.promote():l.relegate()||nn.postRender(()=>{const c=l.getStack();(!c||!c.members.length)&&this.safeToRemove()}))),null}componentDidUpdate(){const{projection:t}=this.props.visualElement;t&&(t.root.didUpdate(),Lx.postRender(()=>{!t.currentAnimation&&t.isLead()&&this.safeToRemove()}))}componentWillUnmount(){const{visualElement:t,layoutGroup:n,switchLayoutGroup:r}=this.props,{projection:i}=t;i&&(i.scheduleCheckAfterUnmount(),n&&n.group&&n.group.remove(i),r&&r.deregister&&r.deregister(i))}safeToRemove(){const{safeToRemove:t}=this.props;t&&t()}render(){return null}}function aT(e){const[t,n]=IP(),r=S.useContext(Xp);return D.jsx(mN,{...e,layoutGroup:r,switchLayoutGroup:S.useContext(VP),isPresent:t,safeToRemove:n})}const gN={borderRadius:{...gp,applyTo:["borderTopLeftRadius","borderTopRightRadius","borderBottomLeftRadius","borderBottomRightRadius"]},borderTopLeftRadius:gp,borderTopRightRadius:gp,borderBottomLeftRadius:gp,borderBottomRightRadius:gp,boxShadow:hN};function vN(e,t,n){const r=wr(e)?e:_f(e);return r.start(Kx("",r,t,n)),r.animation}const yN=(e,t)=>e.depth-t.depth;class bN{constructor(){this.children=[],this.isDirty=!1}add(t){hx(this.children,t),this.isDirty=!0}remove(t){mx(this.children,t),this.isDirty=!0}forEach(t){this.isDirty&&this.children.sort(yN),this.isDirty=!1,this.children.forEach(t)}}function xN(e,t){const n=si.now(),r=({timestamp:i})=>{const s=i-n;s>=t&&(ea(r),e(s-t))};return nn.setup(r,!0),()=>ea(r)}const uT=["TopLeft","TopRight","BottomLeft","BottomRight"],wN=uT.length,gS=e=>typeof e=="string"?parseFloat(e):e,vS=e=>typeof e=="number"||tt.test(e);function SN(e,t,n,r,i,s){i?(e.opacity=dn(0,n.opacity??1,kN(r)),e.opacityExit=dn(t.opacity??1,0,CN(r))):s&&(e.opacity=dn(t.opacity??1,n.opacity??1,r));for(let l=0;lrt?1:n(Qp(e,t,r))}function bS(e,t){e.min=t.min,e.max=t.max}function Gi(e,t){bS(e.x,t.x),bS(e.y,t.y)}function xS(e,t){e.translate=t.translate,e.scale=t.scale,e.originPoint=t.originPoint,e.origin=t.origin}function wS(e,t,n,r,i){return e-=t,e=Gg(e,1/n,r),i!==void 0&&(e=Gg(e,1/i,r)),e}function EN(e,t=0,n=1,r=.5,i,s=e,l=e){if(fs.test(t)&&(t=parseFloat(t),t=dn(l.min,l.max,t/100)-l.min),typeof t!="number")return;let c=dn(s.min,s.max,r);e===s&&(c-=t),e.min=wS(e.min,t,n,c,i),e.max=wS(e.max,t,n,c,i)}function SS(e,t,[n,r,i],s,l){EN(e,t[n],t[r],t[i],t.scale,s,l)}const PN=["x","scaleX","originX"],TN=["y","scaleY","originY"];function kS(e,t,n,r){SS(e.x,t,PN,n?n.x:void 0,r?r.x:void 0),SS(e.y,t,TN,n?n.y:void 0,r?r.y:void 0)}function CS(e){return e.translate===0&&e.scale===1}function fT(e){return CS(e.x)&&CS(e.y)}function ES(e,t){return e.min===t.min&&e.max===t.max}function _N(e,t){return ES(e.x,t.x)&&ES(e.y,t.y)}function PS(e,t){return Math.round(e.min)===Math.round(t.min)&&Math.round(e.max)===Math.round(t.max)}function dT(e,t){return PS(e.x,t.x)&&PS(e.y,t.y)}function TS(e){return Fr(e.x)/Fr(e.y)}function _S(e,t){return e.translate===t.translate&&e.scale===t.scale&&e.originPoint===t.originPoint}class IN{constructor(){this.members=[]}add(t){hx(this.members,t),t.scheduleRender()}remove(t){if(mx(this.members,t),t===this.prevLead&&(this.prevLead=void 0),t===this.lead){const n=this.members[this.members.length-1];n&&this.promote(n)}}relegate(t){const n=this.members.findIndex(i=>t===i);if(n===0)return!1;let r;for(let i=n;i>=0;i--){const s=this.members[i];if(s.isPresent!==!1){r=s;break}}return r?(this.promote(r),!0):!1}promote(t,n){const r=this.lead;if(t!==r&&(this.prevLead=r,this.lead=t,t.show(),r)){r.instance&&r.scheduleRender(),t.scheduleRender(),t.resumeFrom=r,n&&(t.resumeFrom.preserveOpacity=!0),r.snapshot&&(t.snapshot=r.snapshot,t.snapshot.latestValues=r.animationValues||r.latestValues),t.root&&t.root.isUpdating&&(t.isLayoutDirty=!0);const{crossfade:i}=t.options;i===!1&&r.hide()}}exitAnimationComplete(){this.members.forEach(t=>{const{options:n,resumingFrom:r}=t;n.onExitComplete&&n.onExitComplete(),r&&r.options.onExitComplete&&r.options.onExitComplete()})}scheduleRender(){this.members.forEach(t=>{t.instance&&t.scheduleRender(!1)})}removeLeadSnapshot(){this.lead&&this.lead.snapshot&&(this.lead.snapshot=void 0)}}function $N(e,t,n){let r="";const i=e.x.translate/t.x,s=e.y.translate/t.y,l=n?.z||0;if((i||s||l)&&(r=`translate3d(${i}px, ${s}px, ${l}px) `),(t.x!==1||t.y!==1)&&(r+=`scale(${1/t.x}, ${1/t.y}) `),n){const{transformPerspective:h,rotate:m,rotateX:g,rotateY:b,skewX:x,skewY:k}=n;h&&(r=`perspective(${h}px) ${r}`),m&&(r+=`rotate(${m}deg) `),g&&(r+=`rotateX(${g}deg) `),b&&(r+=`rotateY(${b}deg) `),x&&(r+=`skewX(${x}deg) `),k&&(r+=`skewY(${k}deg) `)}const c=e.x.scale*t.x,d=e.y.scale*t.y;return(c!==1||d!==1)&&(r+=`scale(${c}, ${d})`),r||"none"}const i0=["","X","Y","Z"],AN=1e3;let RN=0;function o0(e,t,n,r){const{latestValues:i}=t;i[e]&&(n[e]=i[e],t.setStaticValue(e,0),r&&(r[e]=0))}function pT(e){if(e.hasCheckedOptimisedAppear=!0,e.root===e)return;const{visualElement:t}=e.options;if(!t)return;const n=ZP(t);if(window.MotionHasOptimisedAnimation(n,"transform")){const{layout:i,layoutId:s}=e.options;window.MotionCancelOptimisedAnimation(n,"transform",nn,!(i||s))}const{parent:r}=e;r&&!r.hasCheckedOptimisedAppear&&pT(r)}function hT({attachResizeListener:e,defaultParent:t,measureScroll:n,checkIsScrollRoot:r,resetTransform:i}){return class{constructor(l={},c=t?.()){this.id=RN++,this.animationId=0,this.animationCommitId=0,this.children=new Set,this.options={},this.isTreeAnimating=!1,this.isAnimationBlocked=!1,this.isLayoutDirty=!1,this.isProjectionDirty=!1,this.isSharedProjectionDirty=!1,this.isTransformDirty=!1,this.updateManuallyBlocked=!1,this.updateBlockedByResize=!1,this.isUpdating=!1,this.isSVG=!1,this.needsReset=!1,this.shouldResetTransform=!1,this.hasCheckedOptimisedAppear=!1,this.treeScale={x:1,y:1},this.eventHandlers=new Map,this.hasTreeAnimated=!1,this.updateScheduled=!1,this.scheduleUpdate=()=>this.update(),this.projectionUpdateScheduled=!1,this.checkUpdateFailed=()=>{this.isUpdating&&(this.isUpdating=!1,this.clearAllSnapshots())},this.updateProjection=()=>{this.projectionUpdateScheduled=!1,this.nodes.forEach(DN),this.nodes.forEach(zN),this.nodes.forEach(jN),this.nodes.forEach(NN)},this.resolvedRelativeTargetAt=0,this.hasProjected=!1,this.isVisible=!0,this.animationProgress=0,this.sharedNodes=new Map,this.latestValues=l,this.root=c?c.root||c:this,this.path=c?[...c.path,c]:[],this.parent=c,this.depth=c?c.depth+1:0;for(let d=0;dthis.root.updateBlockedByResize=!1;nn.read(()=>{g=window.innerWidth}),e(l,()=>{const x=window.innerWidth;x!==g&&(g=x,this.root.updateBlockedByResize=!0,m&&m(),m=xN(b,250),Rg.hasAnimatedSinceResize&&(Rg.hasAnimatedSinceResize=!1,this.nodes.forEach(AS)))})}c&&this.root.registerSharedNode(c,this),this.options.animate!==!1&&h&&(c||d)&&this.addEventListener("didUpdate",({delta:m,hasLayoutChanged:g,hasRelativeLayoutChanged:b,layout:x})=>{if(this.isTreeAnimationBlocked()){this.target=void 0,this.relativeTarget=void 0;return}const k=this.options.transition||h.getDefaultTransition()||WN,{onLayoutAnimationStart:P,onLayoutAnimationComplete:_}=h.getProps(),T=!this.targetLayout||!dT(this.targetLayout,x),$=!g&&b;if(this.options.layoutRoot||this.resumeFrom||$||g&&(T||!this.currentAnimation)){this.resumeFrom&&(this.resumingFrom=this.resumeFrom,this.resumingFrom.resumingFrom=void 0);const L={...Ax(k,"layout"),onPlay:P,onComplete:_};(h.shouldReduceMotion||this.options.layoutRoot)&&(L.delay=0,L.type=!1),this.startAnimation(L),this.setAnimationOrigin(m,$)}else g||AS(this),this.isLead()&&this.options.onExitComplete&&this.options.onExitComplete();this.targetLayout=x})}unmount(){this.options.layoutId&&this.willUpdate(),this.root.nodes.remove(this);const l=this.getStack();l&&l.remove(this),this.parent&&this.parent.children.delete(this),this.instance=void 0,this.eventHandlers.clear(),ea(this.updateProjection)}blockUpdate(){this.updateManuallyBlocked=!0}unblockUpdate(){this.updateManuallyBlocked=!1}isUpdateBlocked(){return this.updateManuallyBlocked||this.updateBlockedByResize}isTreeAnimationBlocked(){return this.isAnimationBlocked||this.parent&&this.parent.isTreeAnimationBlocked()||!1}startUpdate(){this.isUpdateBlocked()||(this.isUpdating=!0,this.nodes&&this.nodes.forEach(BN),this.animationId++)}getTransformTemplate(){const{visualElement:l}=this.options;return l&&l.getProps().transformTemplate}willUpdate(l=!0){if(this.root.hasTreeAnimated=!0,this.root.isUpdateBlocked()){this.options.onExitComplete&&this.options.onExitComplete();return}if(window.MotionCancelOptimisedAnimation&&!this.hasCheckedOptimisedAppear&&pT(this),!this.root.isUpdating&&this.root.startUpdate(),this.isLayoutDirty)return;this.isLayoutDirty=!0;for(let m=0;m{this.isLayoutDirty?this.root.didUpdate():this.root.checkUpdateFailed()})}updateSnapshot(){this.snapshot||!this.instance||(this.snapshot=this.measure(),this.snapshot&&!Fr(this.snapshot.measuredBox.x)&&!Fr(this.snapshot.measuredBox.y)&&(this.snapshot=void 0))}updateLayout(){if(!this.instance||(this.updateScroll(),!(this.options.alwaysMeasureLayout&&this.isLead())&&!this.isLayoutDirty))return;if(this.resumeFrom&&!this.resumeFrom.instance)for(let d=0;d{const K=z/1e3;RS(g.x,l.x,K),RS(g.y,l.y,K),this.setTargetDelta(g),this.relativeTarget&&this.relativeTargetOrigin&&this.layout&&this.relativeParent&&this.relativeParent.layout&&(jp(b,this.layout.layoutBox,this.relativeParent.layout.layoutBox),UN(this.relativeTarget,this.relativeTargetOrigin,b,K),L&&_N(this.relativeTarget,L)&&(this.isProjectionDirty=!1),L||(L=Cn()),Gi(L,this.relativeTarget)),P&&(this.animationValues=m,SN(m,h,this.latestValues,K,$,T)),this.root.scheduleUpdateProjection(),this.scheduleRender(),this.animationProgress=K},this.mixTargetDelta(this.options.layoutRoot?1e3:0)}startAnimation(l){this.notifyListeners("animationStart"),this.currentAnimation?.stop(),this.resumingFrom?.currentAnimation?.stop(),this.pendingAnimation&&(ea(this.pendingAnimation),this.pendingAnimation=void 0),this.pendingAnimation=nn.update(()=>{Rg.hasAnimatedSinceResize=!0,this.motionValue||(this.motionValue=_f(0)),this.currentAnimation=vN(this.motionValue,[0,1e3],{...l,velocity:0,isSync:!0,onUpdate:c=>{this.mixTargetDelta(c),l.onUpdate&&l.onUpdate(c)},onStop:()=>{},onComplete:()=>{l.onComplete&&l.onComplete(),this.completeAnimation()}}),this.resumingFrom&&(this.resumingFrom.currentAnimation=this.currentAnimation),this.pendingAnimation=void 0})}completeAnimation(){this.resumingFrom&&(this.resumingFrom.currentAnimation=void 0,this.resumingFrom.preserveOpacity=void 0);const l=this.getStack();l&&l.exitAnimationComplete(),this.resumingFrom=this.currentAnimation=this.animationValues=void 0,this.notifyListeners("animationComplete")}finishAnimation(){this.currentAnimation&&(this.mixTargetDelta&&this.mixTargetDelta(AN),this.currentAnimation.stop()),this.completeAnimation()}applyTransformsToTarget(){const l=this.getLead();let{targetWithTransforms:c,target:d,layout:h,latestValues:m}=l;if(!(!c||!d||!h)){if(this!==l&&this.layout&&h&&mT(this.options.animationType,this.layout.layoutBox,h.layoutBox)){d=this.target||Cn();const g=Fr(this.layout.layoutBox.x);d.x.min=l.target.x.min,d.x.max=d.x.min+g;const b=Fr(this.layout.layoutBox.y);d.y.min=l.target.y.min,d.y.max=d.y.min+b}Gi(c,d),gf(c,m),zp(this.projectionDeltaWithTransform,this.layoutCorrected,c,m)}}registerSharedNode(l,c){this.sharedNodes.has(l)||this.sharedNodes.set(l,new IN),this.sharedNodes.get(l).add(c);const h=c.options.initialPromotionConfig;c.promote({transition:h?h.transition:void 0,preserveFollowOpacity:h&&h.shouldPreserveFollowOpacity?h.shouldPreserveFollowOpacity(c):void 0})}isLead(){const l=this.getStack();return l?l.lead===this:!0}getLead(){const{layoutId:l}=this.options;return l?this.getStack()?.lead||this:this}getPrevLead(){const{layoutId:l}=this.options;return l?this.getStack()?.prevLead:void 0}getStack(){const{layoutId:l}=this.options;if(l)return this.root.sharedNodes.get(l)}promote({needsReset:l,transition:c,preserveFollowOpacity:d}={}){const h=this.getStack();h&&h.promote(this,d),l&&(this.projectionDelta=void 0,this.needsReset=!0),c&&this.setOptions({transition:c})}relegate(){const l=this.getStack();return l?l.relegate(this):!1}resetSkewAndRotation(){const{visualElement:l}=this.options;if(!l)return;let c=!1;const{latestValues:d}=l;if((d.z||d.rotate||d.rotateX||d.rotateY||d.rotateZ||d.skewX||d.skewY)&&(c=!0),!c)return;const h={};d.z&&o0("z",l,h,this.animationValues);for(let m=0;ml.currentAnimation?.stop()),this.root.nodes.forEach(IS),this.root.sharedNodes.clear()}}}function LN(e){e.updateLayout()}function MN(e){const t=e.resumeFrom?.snapshot||e.snapshot;if(e.isLead()&&e.layout&&t&&e.hasListeners("didUpdate")){const{layoutBox:n,measuredBox:r}=e.layout,{animationType:i}=e.options,s=t.source!==e.layout.source;i==="size"?Yi(m=>{const g=s?t.measuredBox[m]:t.layoutBox[m],b=Fr(g);g.min=n[m].min,g.max=g.min+b}):mT(i,t.layoutBox,n)&&Yi(m=>{const g=s?t.measuredBox[m]:t.layoutBox[m],b=Fr(n[m]);g.max=g.min+b,e.relativeTarget&&!e.currentAnimation&&(e.isProjectionDirty=!0,e.relativeTarget[m].max=e.relativeTarget[m].min+b)});const l=vf();zp(l,n,t.layoutBox);const c=vf();s?zp(c,e.applyTransform(r,!0),t.measuredBox):zp(c,n,t.layoutBox);const d=!fT(l);let h=!1;if(!e.resumeFrom){const m=e.getClosestProjectingParent();if(m&&!m.resumeFrom){const{snapshot:g,layout:b}=m;if(g&&b){const x=Cn();jp(x,t.layoutBox,g.layoutBox);const k=Cn();jp(k,n,b.layoutBox),dT(x,k)||(h=!0),m.options.layoutRoot&&(e.relativeTarget=k,e.relativeTargetOrigin=x,e.relativeParent=m)}}}e.notifyListeners("didUpdate",{layout:n,snapshot:t,delta:c,layoutDelta:l,hasLayoutChanged:d,hasRelativeLayoutChanged:h})}else if(e.isLead()){const{onExitComplete:n}=e.options;n&&n()}e.options.transition=void 0}function DN(e){e.parent&&(e.isProjecting()||(e.isProjectionDirty=e.parent.isProjectionDirty),e.isSharedProjectionDirty||(e.isSharedProjectionDirty=!!(e.isProjectionDirty||e.parent.isProjectionDirty||e.parent.isSharedProjectionDirty)),e.isTransformDirty||(e.isTransformDirty=e.parent.isTransformDirty))}function NN(e){e.isProjectionDirty=e.isSharedProjectionDirty=e.isTransformDirty=!1}function FN(e){e.clearSnapshot()}function IS(e){e.clearMeasurements()}function $S(e){e.isLayoutDirty=!1}function ON(e){const{visualElement:t}=e.options;t&&t.getProps().onBeforeLayoutMeasure&&t.notify("BeforeLayoutMeasure"),e.resetTransform()}function AS(e){e.finishAnimation(),e.targetDelta=e.relativeTarget=e.target=void 0,e.isProjectionDirty=!0}function zN(e){e.resolveTargetDelta()}function jN(e){e.calcProjection()}function BN(e){e.resetSkewAndRotation()}function VN(e){e.removeLeadSnapshot()}function RS(e,t,n){e.translate=dn(t.translate,0,n),e.scale=dn(t.scale,1,n),e.origin=t.origin,e.originPoint=t.originPoint}function LS(e,t,n,r){e.min=dn(t.min,n.min,r),e.max=dn(t.max,n.max,r)}function UN(e,t,n,r){LS(e.x,t.x,n.x,r),LS(e.y,t.y,n.y,r)}function KN(e){return e.animationValues&&e.animationValues.opacityExit!==void 0}const WN={duration:.45,ease:[.4,0,.1,1]},MS=e=>typeof navigator<"u"&&navigator.userAgent&&navigator.userAgent.toLowerCase().includes(e),DS=MS("applewebkit/")&&!MS("chrome/")?Math.round:eo;function NS(e){e.min=DS(e.min),e.max=DS(e.max)}function HN(e){NS(e.x),NS(e.y)}function mT(e,t,n){return e==="position"||e==="preserve-aspect"&&!J4(TS(t),TS(n),.2)}function GN(e){return e!==e.root&&e.scroll?.wasRoot}const qN=hT({attachResizeListener:(e,t)=>ih(e,"resize",t),measureScroll:()=>({x:document.documentElement.scrollLeft||document.body.scrollLeft,y:document.documentElement.scrollTop||document.body.scrollTop}),checkIsScrollRoot:()=>!0}),s0={current:void 0},gT=hT({measureScroll:e=>({x:e.scrollLeft,y:e.scrollTop}),defaultParent:()=>{if(!s0.current){const e=new qN({});e.mount(window),e.setOptions({layoutScroll:!0}),s0.current=e}return s0.current},resetTransform:(e,t)=>{e.style.transform=t!==void 0?t:"none"},checkIsScrollRoot:e=>window.getComputedStyle(e).position==="fixed"}),YN={pan:{Feature:pN},drag:{Feature:dN,ProjectionNode:gT,MeasureLayout:aT}};function FS(e,t,n){const{props:r}=e;e.animationState&&r.whileHover&&e.animationState.setActive("whileHover",n==="Start");const i="onHover"+n,s=r[i];s&&nn.postRender(()=>s(t,xh(t)))}class XN extends na{mount(){const{current:t}=this.node;t&&(this.unmount=h3(t,(n,r)=>(FS(this.node,r,"Start"),i=>FS(this.node,i,"End"))))}unmount(){}}class QN extends na{constructor(){super(...arguments),this.isActive=!1}onFocus(){let t=!1;try{t=this.node.current.matches(":focus-visible")}catch{t=!0}!t||!this.node.animationState||(this.node.animationState.setActive("whileFocus",!0),this.isActive=!0)}onBlur(){!this.isActive||!this.node.animationState||(this.node.animationState.setActive("whileFocus",!1),this.isActive=!1)}mount(){this.unmount=vh(ih(this.node.current,"focus",()=>this.onFocus()),ih(this.node.current,"blur",()=>this.onBlur()))}unmount(){}}function OS(e,t,n){const{props:r}=e;if(e.current instanceof HTMLButtonElement&&e.current.disabled)return;e.animationState&&r.whileTap&&e.animationState.setActive("whileTap",n==="Start");const i="onTap"+(n==="End"?"":n),s=r[i];s&&nn.postRender(()=>s(t,xh(t)))}class JN extends na{mount(){const{current:t}=this.node;t&&(this.unmount=y3(t,(n,r)=>(OS(this.node,r,"Start"),(i,{success:s})=>OS(this.node,i,s?"End":"Cancel")),{useGlobalTarget:this.node.props.globalTapTarget}))}unmount(){}}const hb=new WeakMap,l0=new WeakMap,ZN=e=>{const t=hb.get(e.target);t&&t(e)},e5=e=>{e.forEach(ZN)};function t5({root:e,...t}){const n=e||document;l0.has(n)||l0.set(n,{});const r=l0.get(n),i=JSON.stringify(t);return r[i]||(r[i]=new IntersectionObserver(e5,{root:e,...t})),r[i]}function n5(e,t,n){const r=t5(t);return hb.set(e,n),r.observe(e),()=>{hb.delete(e),r.unobserve(e)}}const r5={some:0,all:1};class i5 extends na{constructor(){super(...arguments),this.hasEnteredView=!1,this.isInView=!1}startObserver(){this.unmount();const{viewport:t={}}=this.node.getProps(),{root:n,margin:r,amount:i="some",once:s}=t,l={root:n?n.current:void 0,rootMargin:r,threshold:typeof i=="number"?i:r5[i]},c=d=>{const{isIntersecting:h}=d;if(this.isInView===h||(this.isInView=h,s&&!h&&this.hasEnteredView))return;h&&(this.hasEnteredView=!0),this.node.animationState&&this.node.animationState.setActive("whileInView",h);const{onViewportEnter:m,onViewportLeave:g}=this.node.getProps(),b=h?m:g;b&&b(d)};return n5(this.node.current,l,c)}mount(){this.startObserver()}update(){if(typeof IntersectionObserver>"u")return;const{props:t,prevProps:n}=this.node;["amount","margin","root"].some(o5(t,n))&&this.startObserver()}unmount(){}}function o5({viewport:e={}},{viewport:t={}}={}){return n=>e[n]!==t[n]}const s5={inView:{Feature:i5},tap:{Feature:JN},focus:{Feature:QN},hover:{Feature:XN}},l5={layout:{ProjectionNode:gT,MeasureLayout:aT}},a5={...H4,...s5,...YN,...l5},bu=KP(a5,x4);class u5 extends CP{constructor(){super(...arguments),this.isEnabled=!1}add(t){(Au.has(t)||c3.has(t))&&(this.isEnabled=!0,this.update())}update(){this.set(this.isEnabled?"transform":"auto")}}function c5(){return gh(()=>new u5("auto"))}const as={top:"top",bottom:"top",left:"left",right:"left"},qg={top:"bottom",bottom:"top",left:"right",right:"left"},f5={top:"left",left:"top"},mb={top:"height",left:"width"},vT={width:"totalWidth",height:"totalHeight"},hg={};let Qn=typeof document<"u"?window.visualViewport:null;function zS(e){let t=0,n=0,r=0,i=0,s=0,l=0,c={};var d;let h=((d=Qn?.scale)!==null&&d!==void 0?d:1)>1;if(e.tagName==="BODY"){let k=document.documentElement;r=k.clientWidth,i=k.clientHeight;var m;t=(m=Qn?.width)!==null&&m!==void 0?m:r;var g;n=(g=Qn?.height)!==null&&g!==void 0?g:i,c.top=k.scrollTop||e.scrollTop,c.left=k.scrollLeft||e.scrollLeft,Qn&&(s=Qn.offsetTop,l=Qn.offsetLeft)}else({width:t,height:n,top:s,left:l}=xf(e)),c.top=e.scrollTop,c.left=e.scrollLeft,r=t,i=n;if(kE()&&(e.tagName==="BODY"||e.tagName==="HTML")&&h){c.top=0,c.left=0;var b;s=(b=Qn?.pageTop)!==null&&b!==void 0?b:0;var x;l=(x=Qn?.pageLeft)!==null&&x!==void 0?x:0}return{width:t,height:n,totalWidth:r,totalHeight:i,scroll:c,top:s,left:l}}function d5(e){return{top:e.scrollTop,left:e.scrollLeft,width:e.scrollWidth,height:e.scrollHeight}}function jS(e,t,n,r,i,s,l){var c;let d=(c=i.scroll[e])!==null&&c!==void 0?c:0,h=r[mb[e]],m=r.scroll[as[e]]+s,g=h+r.scroll[as[e]]-s,b=t-d+l[e]-r[as[e]],x=t-d+n+l[e]-r[as[e]];return bg?Math.max(g-x,m-b):0}function p5(e){let t=window.getComputedStyle(e);return{top:parseInt(t.marginTop,10)||0,bottom:parseInt(t.marginBottom,10)||0,left:parseInt(t.marginLeft,10)||0,right:parseInt(t.marginRight,10)||0}}function BS(e){if(hg[e])return hg[e];let[t,n]=e.split(" "),r=as[t]||"right",i=f5[r];as[n]||(n="center");let s=mb[r],l=mb[i];return hg[e]={placement:t,crossPlacement:n,axis:r,crossAxis:i,size:s,crossSize:l},hg[e]}function a0(e,t,n,r,i,s,l,c,d,h){let{placement:m,crossPlacement:g,axis:b,crossAxis:x,size:k,crossSize:P}=r,_={};var T;_[x]=(T=e[x])!==null&&T!==void 0?T:0;var $,L,z,K;g==="center"?_[x]+=((($=e[P])!==null&&$!==void 0?$:0)-((L=n[P])!==null&&L!==void 0?L:0))/2:g!==x&&(_[x]+=((z=e[P])!==null&&z!==void 0?z:0)-((K=n[P])!==null&&K!==void 0?K:0)),_[x]+=s;const M=e[x]-n[P]+d+h,J=e[x]+e[P]-d-h;if(_[x]=Bg(_[x],M,J),m===b){const re=c?l[k]:t[vT[k]];_[qg[b]]=Math.floor(re-e[b]+i)}else _[b]=Math.floor(e[b]+e[k]+i);return _}function h5(e,t,n,r,i,s,l,c){const d=r?n.height:t[vT.height];var h;let m=e.top!=null?n.top+e.top:n.top+(d-((h=e.bottom)!==null&&h!==void 0?h:0)-l);var g,b,x,k,P,_;let T=c!=="top"?Math.max(0,t.height+t.top+((g=t.scroll.top)!==null&&g!==void 0?g:0)-m-(((b=i.top)!==null&&b!==void 0?b:0)+((x=i.bottom)!==null&&x!==void 0?x:0)+s)):Math.max(0,m+l-(t.top+((k=t.scroll.top)!==null&&k!==void 0?k:0))-(((P=i.top)!==null&&P!==void 0?P:0)+((_=i.bottom)!==null&&_!==void 0?_:0)+s));return Math.min(t.height-s*2,T)}function VS(e,t,n,r,i,s){let{placement:l,axis:c,size:d}=s;var h,m;if(l===c)return Math.max(0,n[c]-e[c]-((h=e.scroll[c])!==null&&h!==void 0?h:0)+t[c]-((m=r[c])!==null&&m!==void 0?m:0)-r[qg[c]]-i);var g;return Math.max(0,e[d]+e[c]+e.scroll[c]-t[c]-n[c]-n[d]-((g=r[c])!==null&&g!==void 0?g:0)-r[qg[c]]-i)}function m5(e,t,n,r,i,s,l,c,d,h,m,g,b,x,k,P){let _=BS(e),{size:T,crossAxis:$,crossSize:L,placement:z,crossPlacement:K}=_,M=a0(t,c,n,_,m,g,h,b,k,P),J=m,re=VS(c,h,t,i,s+m,_);if(l&&r[T]>re){let me=BS(`${qg[z]} ${K}`),Ce=a0(t,c,n,me,m,g,h,b,k,P);VS(c,h,t,i,s+m,me)>re&&(_=me,M=Ce,J=m)}let ae="bottom";_.axis==="top"?_.placement==="top"?ae="top":_.placement==="bottom"&&(ae="bottom"):_.crossAxis==="top"&&(_.crossPlacement==="top"?ae="bottom":_.crossPlacement==="bottom"&&(ae="top"));let j=jS($,M[$],n[L],c,d,s,h);M[$]+=j;let B=h5(M,c,h,b,i,s,n.height,ae);x&&x{if(!n||r===null)return;let i=s=>{let l=s.target;if(!t.current||l instanceof Node&&!l.contains(t.current)||s.target instanceof HTMLInputElement||s.target instanceof HTMLTextAreaElement)return;let c=r||y5.get(t.current);c&&c()};return window.addEventListener("scroll",i,!0),()=>{window.removeEventListener("scroll",i,!0)}},[n,r,t])}let kn=typeof document<"u"?window.visualViewport:null;function x5(e){let{direction:t}=mh(),{arrowSize:n=0,targetRef:r,overlayRef:i,scrollRef:s=i,placement:l="bottom",containerPadding:c=12,shouldFlip:d=!0,boundaryElement:h=typeof document<"u"?document.body:null,offset:m=0,crossOffset:g=0,shouldUpdatePosition:b=!0,isOpen:x=!0,onClose:k,maxHeight:P,arrowBoundaryOffset:_=0}=e,[T,$]=S.useState(null),L=[b,l,i.current,r.current,s.current,c,d,h,m,g,x,t,P,_,n],z=S.useRef(kn?.scale);S.useEffect(()=>{x&&(z.current=kn?.scale)},[x]);let K=S.useCallback(()=>{if(b===!1||!x||!i.current||!r.current||!h||kn?.scale!==z.current)return;let j=null;if(s.current&&s.current.contains(document.activeElement)){var B;let V=(B=document.activeElement)===null||B===void 0?void 0:B.getBoundingClientRect(),se=s.current.getBoundingClientRect();var Y;if(j={type:"top",offset:((Y=V?.top)!==null&&Y!==void 0?Y:0)-se.top},j.offset>se.height/2){j.type="bottom";var te;j.offset=((te=V?.bottom)!==null&&te!==void 0?te:0)-se.bottom}}let G=i.current;if(!P&&i.current){var ce;G.style.top="0px",G.style.bottom="";var Z;G.style.maxHeight=((Z=(ce=window.visualViewport)===null||ce===void 0?void 0:ce.height)!==null&&Z!==void 0?Z:window.innerHeight)+"px"}let q=g5({placement:S5(l,t),overlayNode:i.current,targetNode:r.current,scrollNode:s.current||i.current,padding:c,shouldFlip:d,boundaryElement:h,offset:m,crossOffset:g,maxHeight:P,arrowSize:n,arrowBoundaryOffset:_});if(q.position){if(G.style.top="",G.style.bottom="",G.style.left="",G.style.right="",Object.keys(q.position).forEach(V=>G.style[V]=q.position[V]+"px"),G.style.maxHeight=q.maxHeight!=null?q.maxHeight+"px":"",j&&document.activeElement&&s.current){let V=document.activeElement.getBoundingClientRect(),se=s.current.getBoundingClientRect(),R=V[j.type]-se[j.type];s.current.scrollTop+=R-j.offset}$(q)}},L);sn(K,L),w5(K),S1({ref:i,onResize:K}),S1({ref:r,onResize:K});let M=S.useRef(!1);sn(()=>{let j,B=()=>{M.current=!0,clearTimeout(j),j=setTimeout(()=>{M.current=!1},500),K()},Y=()=>{M.current&&B()};return kn?.addEventListener("resize",B),kn?.addEventListener("scroll",Y),()=>{kn?.removeEventListener("resize",B),kn?.removeEventListener("scroll",Y)}},[K]);let J=S.useCallback(()=>{M.current||k?.()},[k,M]);b5({triggerRef:r,isOpen:x,onClose:k&&J});var re,ae;return{overlayProps:{style:{position:"absolute",zIndex:1e5,...T?.position,maxHeight:(re=T?.maxHeight)!==null&&re!==void 0?re:"100vh"}},placement:(ae=T?.placement)!==null&&ae!==void 0?ae:null,arrowProps:{"aria-hidden":"true",role:"presentation",style:{left:T?.arrowOffsetLeft,top:T?.arrowOffsetTop}},updatePosition:K}}function w5(e){sn(()=>(window.addEventListener("resize",e,!1),()=>{window.removeEventListener("resize",e,!1)}),[e])}function S5(e,t){return t==="rtl"?e.replace("start","right").replace("end","left"):e.replace("start","left").replace("end","right")}function k5(e){const t=Zi(e);if(!(e instanceof t.HTMLElement)&&!(e instanceof t.SVGElement))return!1;let{display:n,visibility:r}=e.style,i=n!=="none"&&r!=="hidden"&&r!=="collapse";if(i){const{getComputedStyle:s}=e.ownerDocument.defaultView;let{display:l,visibility:c}=s(e);i=l!=="none"&&c!=="hidden"&&c!=="collapse"}return i}function C5(e,t){return!e.hasAttribute("hidden")&&!e.hasAttribute("data-react-aria-prevent-focus")&&(e.nodeName==="DETAILS"&&t&&t.nodeName!=="SUMMARY"?e.hasAttribute("open"):!0)}function yT(e,t){return e.nodeName!=="#comment"&&k5(e)&&C5(e,t)&&(!e.parentElement||yT(e.parentElement,e))}function Wx(e){let t=e;return t.nativeEvent=e,t.isDefaultPrevented=()=>t.defaultPrevented,t.isPropagationStopped=()=>t.cancelBubble,t.persist=()=>{},t}function bT(e,t){Object.defineProperty(e,"target",{value:t}),Object.defineProperty(e,"currentTarget",{value:t})}function xT(e){let t=S.useRef({isFocused:!1,observer:null});sn(()=>{const r=t.current;return()=>{r.observer&&(r.observer.disconnect(),r.observer=null)}},[]);let n=jn(r=>{e?.(r)});return S.useCallback(r=>{if(r.target instanceof HTMLButtonElement||r.target instanceof HTMLInputElement||r.target instanceof HTMLTextAreaElement||r.target instanceof HTMLSelectElement){t.current.isFocused=!0;let i=r.target,s=l=>{if(t.current.isFocused=!1,i.disabled){let c=Wx(l);n(c)}t.current.observer&&(t.current.observer.disconnect(),t.current.observer=null)};i.addEventListener("focusout",s,{once:!0}),t.current.observer=new MutationObserver(()=>{if(t.current.isFocused&&i.disabled){var l;(l=t.current.observer)===null||l===void 0||l.disconnect();let c=i===document.activeElement?null:document.activeElement;i.dispatchEvent(new FocusEvent("blur",{relatedTarget:c})),i.dispatchEvent(new FocusEvent("focusout",{bubbles:!0,relatedTarget:c}))}}),t.current.observer.observe(i,{attributes:!0,attributeFilter:["disabled"]})}},[n])}let Yg=!1;function E5(e){for(;e&&!NE(e);)e=e.parentElement;let t=Zi(e),n=t.document.activeElement;if(!n||n===e)return;Yg=!0;let r=!1,i=m=>{(m.target===n||r)&&m.stopImmediatePropagation()},s=m=>{(m.target===n||r)&&(m.stopImmediatePropagation(),!e&&!r&&(r=!0,Zl(n),d()))},l=m=>{(m.target===e||r)&&m.stopImmediatePropagation()},c=m=>{(m.target===e||r)&&(m.stopImmediatePropagation(),r||(r=!0,Zl(n),d()))};t.addEventListener("blur",i,!0),t.addEventListener("focusout",s,!0),t.addEventListener("focusin",c,!0),t.addEventListener("focus",l,!0);let d=()=>{cancelAnimationFrame(h),t.removeEventListener("blur",i,!0),t.removeEventListener("focusout",s,!0),t.removeEventListener("focusin",c,!0),t.removeEventListener("focus",l,!0),Yg=!1,r=!1},h=requestAnimationFrame(d);return d}let yf="default",gb="",Lg=new WeakMap;function P5(e){if(vv()){if(yf==="default"){const t=Dt(e);gb=t.documentElement.style.webkitUserSelect,t.documentElement.style.webkitUserSelect="none"}yf="disabled"}else if(e instanceof HTMLElement||e instanceof SVGElement){let t="userSelect"in e.style?"userSelect":"webkitUserSelect";Lg.set(e,e.style[t]),e.style[t]="none"}}function WS(e){if(vv()){if(yf!=="disabled")return;yf="restoring",setTimeout(()=>{TE(()=>{if(yf==="restoring"){const t=Dt(e);t.documentElement.style.webkitUserSelect==="none"&&(t.documentElement.style.webkitUserSelect=gb||""),gb="",yf="default"}})},300)}else if((e instanceof HTMLElement||e instanceof SVGElement)&&e&&Lg.has(e)){let t=Lg.get(e),n="userSelect"in e.style?"userSelect":"webkitUserSelect";e.style[n]==="none"&&(e.style[n]=t),e.getAttribute("style")===""&&e.removeAttribute("style"),Lg.delete(e)}}const Hx=We.createContext({register:()=>{}});Hx.displayName="PressResponderContext";function T5(e,t){return t.get?t.get.call(e):t.value}function wT(e,t,n){if(!t.has(e))throw new TypeError("attempted to "+n+" private field on non-instance");return t.get(e)}function _5(e,t){var n=wT(e,t,"get");return T5(e,n)}function I5(e,t,n){if(t.set)t.set.call(e,n);else{if(!t.writable)throw new TypeError("attempted to set read only private field");t.value=n}}function HS(e,t,n){var r=wT(e,t,"set");return I5(e,r,n),n}function $5(e){let t=S.useContext(Hx);if(t){let{register:n,...r}=t;e=Pn(r,e),n()}return IE(t,e.ref),e}var mg=new WeakMap;class gg{continuePropagation(){HS(this,mg,!1)}get shouldStopPropagation(){return _5(this,mg)}constructor(t,n,r,i){VL(this,mg,{writable:!0,value:void 0}),HS(this,mg,!0);var s;let l=(s=i?.target)!==null&&s!==void 0?s:r.currentTarget;const c=l?.getBoundingClientRect();let d,h=0,m,g=null;r.clientX!=null&&r.clientY!=null&&(m=r.clientX,g=r.clientY),c&&(m!=null&&g!=null?(d=m-c.left,h=g-c.top):(d=c.width/2,h=c.height/2)),this.type=t,this.pointerType=n,this.target=r.currentTarget,this.shiftKey=r.shiftKey,this.metaKey=r.metaKey,this.ctrlKey=r.ctrlKey,this.altKey=r.altKey,this.x=d,this.y=h}}const GS=Symbol("linkClicked"),qS="react-aria-pressable-style",YS="data-react-aria-pressable";function Su(e){let{onPress:t,onPressChange:n,onPressStart:r,onPressEnd:i,onPressUp:s,onClick:l,isDisabled:c,isPressed:d,preventFocusOnPress:h,shouldCancelOnPointerExit:m,allowTextSelectionOnPress:g,ref:b,...x}=$5(e),[k,P]=S.useState(!1),_=S.useRef({isPressed:!1,ignoreEmulatedMouseEvents:!1,didFirePressStart:!1,isTriggeringEvent:!1,activePointerId:null,target:null,isOverTarget:!1,pointerType:null,disposables:[]}),{addGlobalListener:T,removeAllGlobalListeners:$}=cx(),L=jn((B,Y)=>{let te=_.current;if(c||te.didFirePressStart)return!1;let G=!0;if(te.isTriggeringEvent=!0,r){let ce=new gg("pressstart",Y,B);r(ce),G=ce.shouldStopPropagation}return n&&n(!0),te.isTriggeringEvent=!1,te.didFirePressStart=!0,P(!0),G}),z=jn((B,Y,te=!0)=>{let G=_.current;if(!G.didFirePressStart)return!1;G.didFirePressStart=!1,G.isTriggeringEvent=!0;let ce=!0;if(i){let Z=new gg("pressend",Y,B);i(Z),ce=Z.shouldStopPropagation}if(n&&n(!1),P(!1),t&&te&&!c){let Z=new gg("press",Y,B);t(Z),ce&&(ce=Z.shouldStopPropagation)}return G.isTriggeringEvent=!1,ce}),K=jn((B,Y)=>{let te=_.current;if(c)return!1;if(s){te.isTriggeringEvent=!0;let G=new gg("pressup",Y,B);return s(G),te.isTriggeringEvent=!1,G.shouldStopPropagation}return!0}),M=jn(B=>{let Y=_.current;if(Y.isPressed&&Y.target){Y.didFirePressStart&&Y.pointerType!=null&&z(ou(Y.target,B),Y.pointerType,!1),Y.isPressed=!1,Y.isOverTarget=!1,Y.activePointerId=null,Y.pointerType=null,$(),g||WS(Y.target);for(let te of Y.disposables)te();Y.disposables=[]}}),J=jn(B=>{m&&M(B)}),re=jn(B=>{l?.(B)}),ae=jn((B,Y)=>{if(l){let te=new MouseEvent("click",B);bT(te,Y),l(Wx(te))}}),j=S.useMemo(()=>{let B=_.current,Y={onKeyDown(G){if(u0(G.nativeEvent,G.currentTarget)&&oi(G.currentTarget,En(G.nativeEvent))){var ce;XS(En(G.nativeEvent),G.key)&&G.preventDefault();let Z=!0;if(!B.isPressed&&!G.repeat){B.target=G.currentTarget,B.isPressed=!0,B.pointerType="keyboard",Z=L(G,"keyboard");let q=G.currentTarget,V=se=>{u0(se,q)&&!se.repeat&&oi(q,En(se))&&B.target&&K(ou(B.target,se),"keyboard")};T(Dt(G.currentTarget),"keyup",Tf(V,te),!0)}Z&&G.stopPropagation(),G.metaKey&&xu()&&((ce=B.metaKeyEvents)===null||ce===void 0||ce.set(G.key,G.nativeEvent))}else G.key==="Meta"&&(B.metaKeyEvents=new Map)},onClick(G){if(!(G&&!oi(G.currentTarget,En(G.nativeEvent)))&&G&&G.button===0&&!B.isTriggeringEvent&&!wu.isOpening){let ce=!0;if(c&&G.preventDefault(),!B.ignoreEmulatedMouseEvents&&!B.isPressed&&(B.pointerType==="virtual"||RE(G.nativeEvent))){let Z=L(G,"virtual"),q=K(G,"virtual"),V=z(G,"virtual");re(G),ce=Z&&q&&V}else if(B.isPressed&&B.pointerType!=="keyboard"){let Z=B.pointerType||G.nativeEvent.pointerType||"virtual",q=K(ou(G.currentTarget,G),Z),V=z(ou(G.currentTarget,G),Z,!0);ce=q&&V,B.isOverTarget=!1,re(G),M(G)}B.ignoreEmulatedMouseEvents=!1,ce&&G.stopPropagation()}}},te=G=>{var ce;if(B.isPressed&&B.target&&u0(G,B.target)){var Z;XS(En(G),G.key)&&G.preventDefault();let V=En(G),se=oi(B.target,En(G));z(ou(B.target,G),"keyboard",se),se&&ae(G,B.target),$(),G.key!=="Enter"&&Gx(B.target)&&oi(B.target,V)&&!G[GS]&&(G[GS]=!0,wu(B.target,G,!1)),B.isPressed=!1,(Z=B.metaKeyEvents)===null||Z===void 0||Z.delete(G.key)}else if(G.key==="Meta"&&(!((ce=B.metaKeyEvents)===null||ce===void 0)&&ce.size)){var q;let V=B.metaKeyEvents;B.metaKeyEvents=void 0;for(let se of V.values())(q=B.target)===null||q===void 0||q.dispatchEvent(new KeyboardEvent("keyup",se))}};if(typeof PointerEvent<"u"){Y.onPointerDown=Z=>{if(Z.button!==0||!oi(Z.currentTarget,En(Z.nativeEvent)))return;if(mM(Z.nativeEvent)){B.pointerType="virtual";return}B.pointerType=Z.pointerType;let q=!0;if(!B.isPressed){B.isPressed=!0,B.isOverTarget=!0,B.activePointerId=Z.pointerId,B.target=Z.currentTarget,g||P5(B.target),q=L(Z,B.pointerType);let V=En(Z.nativeEvent);"releasePointerCapture"in V&&V.releasePointerCapture(Z.pointerId),T(Dt(Z.currentTarget),"pointerup",G,!1),T(Dt(Z.currentTarget),"pointercancel",ce,!1)}q&&Z.stopPropagation()},Y.onMouseDown=Z=>{if(oi(Z.currentTarget,En(Z.nativeEvent))&&Z.button===0){if(h){let q=E5(Z.target);q&&B.disposables.push(q)}Z.stopPropagation()}},Y.onPointerUp=Z=>{!oi(Z.currentTarget,En(Z.nativeEvent))||B.pointerType==="virtual"||Z.button===0&&!B.isPressed&&K(Z,B.pointerType||Z.pointerType)},Y.onPointerEnter=Z=>{Z.pointerId===B.activePointerId&&B.target&&!B.isOverTarget&&B.pointerType!=null&&(B.isOverTarget=!0,L(ou(B.target,Z),B.pointerType))},Y.onPointerLeave=Z=>{Z.pointerId===B.activePointerId&&B.target&&B.isOverTarget&&B.pointerType!=null&&(B.isOverTarget=!1,z(ou(B.target,Z),B.pointerType,!1),J(Z))};let G=Z=>{if(Z.pointerId===B.activePointerId&&B.isPressed&&Z.button===0&&B.target){if(oi(B.target,En(Z))&&B.pointerType!=null){let q=!1,V=setTimeout(()=>{B.isPressed&&B.target instanceof HTMLElement&&(q?M(Z):(Zl(B.target),B.target.click()))},80);T(Z.currentTarget,"click",()=>q=!0,!0),B.disposables.push(()=>clearTimeout(V))}else M(Z);B.isOverTarget=!1}},ce=Z=>{M(Z)};Y.onDragStart=Z=>{oi(Z.currentTarget,En(Z.nativeEvent))&&M(Z)}}return Y},[T,c,h,$,g,M,J,z,L,K,re,ae]);return S.useEffect(()=>{if(!b)return;const B=Dt(b.current);if(!B||!B.head||B.getElementById(qS))return;const Y=B.createElement("style");Y.id=qS,Y.textContent=` +@layer { + [${YS}] { + touch-action: pan-x pan-y pinch-zoom; + } +} + `.trim(),B.head.prepend(Y)},[b]),S.useEffect(()=>{let B=_.current;return()=>{var Y;g||WS((Y=B.target)!==null&&Y!==void 0?Y:void 0);for(let te of B.disposables)te();B.disposables=[]}},[g]),{isPressed:d||k,pressProps:Pn(x,j,{[YS]:!0})}}function Gx(e){return e.tagName==="A"&&e.hasAttribute("href")}function u0(e,t){const{key:n,code:r}=e,i=t,s=i.getAttribute("role");return(n==="Enter"||n===" "||n==="Spacebar"||r==="Space")&&!(i instanceof Zi(i).HTMLInputElement&&!ST(i,n)||i instanceof Zi(i).HTMLTextAreaElement||i.isContentEditable)&&!((s==="link"||!s&&Gx(i))&&n!=="Enter")}function ou(e,t){let n=t.clientX,r=t.clientY;return{currentTarget:e,shiftKey:t.shiftKey,ctrlKey:t.ctrlKey,metaKey:t.metaKey,altKey:t.altKey,clientX:n,clientY:r}}function A5(e){return e instanceof HTMLInputElement?!1:e instanceof HTMLButtonElement?e.type!=="submit"&&e.type!=="reset":!Gx(e)}function XS(e,t){return e instanceof HTMLInputElement?!ST(e,t):A5(e)}const R5=new Set(["checkbox","radio","range","color","file","image","button","submit","reset"]);function ST(e,t){return e.type==="checkbox"||e.type==="radio"?t===" ":R5.has(e.type)}let el=null,oh=new Set,Bp=new Map,ku=!1,vb=!1;const L5={Tab:!0,Escape:!0};function Sv(e,t){for(let n of oh)n(e,t)}function M5(e){return!(e.metaKey||!xu()&&e.altKey||e.ctrlKey||e.key==="Control"||e.key==="Shift"||e.key==="Meta")}function Xg(e){ku=!0,M5(e)&&(el="keyboard",Sv("keyboard",e))}function wf(e){el="pointer",(e.type==="mousedown"||e.type==="pointerdown")&&(ku=!0,Sv("pointer",e))}function kT(e){RE(e)&&(ku=!0,el="virtual")}function CT(e){e.target===window||e.target===document||Yg||!e.isTrusted||(!ku&&!vb&&(el="virtual",Sv("virtual",e)),ku=!1,vb=!1)}function ET(){Yg||(ku=!1,vb=!0)}function Qg(e){if(typeof window>"u"||typeof document>"u"||Bp.get(Zi(e)))return;const t=Zi(e),n=Dt(e);let r=t.HTMLElement.prototype.focus;t.HTMLElement.prototype.focus=function(){ku=!0,r.apply(this,arguments)},n.addEventListener("keydown",Xg,!0),n.addEventListener("keyup",Xg,!0),n.addEventListener("click",kT,!0),t.addEventListener("focus",CT,!0),t.addEventListener("blur",ET,!1),typeof PointerEvent<"u"&&(n.addEventListener("pointerdown",wf,!0),n.addEventListener("pointermove",wf,!0),n.addEventListener("pointerup",wf,!0)),t.addEventListener("beforeunload",()=>{PT(e)},{once:!0}),Bp.set(t,{focus:r})}const PT=(e,t)=>{const n=Zi(e),r=Dt(e);t&&r.removeEventListener("DOMContentLoaded",t),Bp.has(n)&&(n.HTMLElement.prototype.focus=Bp.get(n).focus,r.removeEventListener("keydown",Xg,!0),r.removeEventListener("keyup",Xg,!0),r.removeEventListener("click",kT,!0),n.removeEventListener("focus",CT,!0),n.removeEventListener("blur",ET,!1),typeof PointerEvent<"u"&&(r.removeEventListener("pointerdown",wf,!0),r.removeEventListener("pointermove",wf,!0),r.removeEventListener("pointerup",wf,!0)),Bp.delete(n))};function D5(e){const t=Dt(e);let n;return t.readyState!=="loading"?Qg(e):(n=()=>{Qg(e)},t.addEventListener("DOMContentLoaded",n)),()=>PT(e,n)}typeof document<"u"&&D5();function qx(){return el!=="pointer"}function sh(){return el}function N5(e){el=e,Sv(e,null)}function FG(){Qg();let[e,t]=S.useState(el);return S.useEffect(()=>{let n=()=>{t(el)};return oh.add(n),()=>{oh.delete(n)}},[]),hh()?null:e}const F5=new Set(["checkbox","radio","range","color","file","image","button","submit","reset"]);function O5(e,t,n){let r=Dt(n?.target);const i=typeof window<"u"?Zi(n?.target).HTMLInputElement:HTMLInputElement,s=typeof window<"u"?Zi(n?.target).HTMLTextAreaElement:HTMLTextAreaElement,l=typeof window<"u"?Zi(n?.target).HTMLElement:HTMLElement,c=typeof window<"u"?Zi(n?.target).KeyboardEvent:KeyboardEvent;return e=e||r.activeElement instanceof i&&!F5.has(r.activeElement.type)||r.activeElement instanceof s||r.activeElement instanceof l&&r.activeElement.isContentEditable,!(e&&t==="keyboard"&&n instanceof c&&!L5[n.key])}function z5(e,t,n){Qg(),S.useEffect(()=>{let r=(i,s)=>{O5(!!n?.isTextInput,i,s)&&e(qx())};return oh.add(r),()=>{oh.delete(r)}},t)}function Cu(e){const t=Dt(e),n=Or(t);if(sh()==="virtual"){let r=n;TE(()=>{Or(t)===r&&e.isConnected&&Zl(e)})}else Zl(e)}function TT(e){let{isDisabled:t,onFocus:n,onBlur:r,onFocusChange:i}=e;const s=S.useCallback(d=>{if(d.target===d.currentTarget)return r&&r(d),i&&i(!1),!0},[r,i]),l=xT(s),c=S.useCallback(d=>{const h=Dt(d.target),m=h?Or(h):Or();d.target===d.currentTarget&&m===En(d.nativeEvent)&&(n&&n(d),i&&i(!0),l(d))},[i,n,l]);return{focusProps:{onFocus:!t&&(n||i||r)?c:void 0,onBlur:!t&&(r||i)?s:void 0}}}function QS(e){if(!e)return;let t=!0;return n=>{let r={...n,preventDefault(){n.preventDefault()},isDefaultPrevented(){return n.isDefaultPrevented()},stopPropagation(){t=!0},continuePropagation(){t=!1},isPropagationStopped(){return t}};e(r),t&&n.stopPropagation()}}function j5(e){return{keyboardProps:e.isDisabled?{}:{onKeyDown:QS(e.onKeyDown),onKeyUp:QS(e.onKeyUp)}}}let B5=We.createContext(null);function V5(e){let t=S.useContext(B5)||{};IE(t,e);let{ref:n,...r}=t;return r}function wh(e,t){let{focusProps:n}=TT(e),{keyboardProps:r}=j5(e),i=Pn(n,r),s=V5(t),l=e.isDisabled?{}:s,c=S.useRef(e.autoFocus);S.useEffect(()=>{c.current&&t.current&&Cu(t.current),c.current=!1},[t]);let d=e.excludeFromTabOrder?-1:0;return e.isDisabled&&(d=void 0),{focusableProps:Pn({...i,tabIndex:d},l)}}function U5({children:e}){let t=S.useMemo(()=>({register:()=>{}}),[]);return We.createElement(Hx.Provider,{value:t},e)}function kv(e){let{isDisabled:t,onBlurWithin:n,onFocusWithin:r,onFocusWithinChange:i}=e,s=S.useRef({isFocusWithin:!1}),{addGlobalListener:l,removeAllGlobalListeners:c}=cx(),d=S.useCallback(g=>{g.currentTarget.contains(g.target)&&s.current.isFocusWithin&&!g.currentTarget.contains(g.relatedTarget)&&(s.current.isFocusWithin=!1,c(),n&&n(g),i&&i(!1))},[n,i,s,c]),h=xT(d),m=S.useCallback(g=>{if(!g.currentTarget.contains(g.target))return;const b=Dt(g.target),x=Or(b);if(!s.current.isFocusWithin&&x===En(g.nativeEvent)){r&&r(g),i&&i(!0),s.current.isFocusWithin=!0,h(g);let k=g.currentTarget;l(b,"focus",P=>{if(s.current.isFocusWithin&&!oi(k,P.target)){let _=new b.defaultView.FocusEvent("blur",{relatedTarget:P.target});bT(_,k);let T=Wx(_);d(T)}},{capture:!0})}},[r,i,h,l,d]);return t?{focusWithinProps:{onFocus:void 0,onBlur:void 0}}:{focusWithinProps:{onFocus:m,onBlur:d}}}let yb=!1,c0=0;function K5(){yb=!0,setTimeout(()=>{yb=!1},50)}function JS(e){e.pointerType==="touch"&&K5()}function W5(){if(!(typeof document>"u"))return typeof PointerEvent<"u"&&document.addEventListener("pointerup",JS),c0++,()=>{c0--,!(c0>0)&&typeof PointerEvent<"u"&&document.removeEventListener("pointerup",JS)}}function Eu(e){let{onHoverStart:t,onHoverChange:n,onHoverEnd:r,isDisabled:i}=e,[s,l]=S.useState(!1),c=S.useRef({isHovered:!1,ignoreEmulatedMouseEvents:!1,pointerType:"",target:null}).current;S.useEffect(W5,[]);let{addGlobalListener:d,removeAllGlobalListeners:h}=cx(),{hoverProps:m,triggerHoverEnd:g}=S.useMemo(()=>{let b=(P,_)=>{if(c.pointerType=_,i||_==="touch"||c.isHovered||!P.currentTarget.contains(P.target))return;c.isHovered=!0;let T=P.currentTarget;c.target=T,d(Dt(P.target),"pointerover",$=>{c.isHovered&&c.target&&!oi(c.target,$.target)&&x($,$.pointerType)},{capture:!0}),t&&t({type:"hoverstart",target:T,pointerType:_}),n&&n(!0),l(!0)},x=(P,_)=>{let T=c.target;c.pointerType="",c.target=null,!(_==="touch"||!c.isHovered||!T)&&(c.isHovered=!1,h(),r&&r({type:"hoverend",target:T,pointerType:_}),n&&n(!1),l(!1))},k={};return typeof PointerEvent<"u"&&(k.onPointerEnter=P=>{yb&&P.pointerType==="mouse"||b(P,P.pointerType)},k.onPointerLeave=P=>{!i&&P.currentTarget.contains(P.target)&&x(P,P.pointerType)}),{hoverProps:k,triggerHoverEnd:x}},[t,n,r,i,c,d,h]);return S.useEffect(()=>{i&&g({currentTarget:c.target},c.pointerType)},[i]),{hoverProps:m,isHovered:s}}function H5(e){let{ref:t,onInteractOutside:n,isDisabled:r,onInteractOutsideStart:i}=e,s=S.useRef({isPointerDown:!1,ignoreEmulatedMouseEvents:!1}),l=jn(d=>{n&&ZS(d,t)&&(i&&i(d),s.current.isPointerDown=!0)}),c=jn(d=>{n&&n(d)});S.useEffect(()=>{let d=s.current;if(r)return;const h=t.current,m=Dt(h);if(typeof PointerEvent<"u"){let g=b=>{d.isPointerDown&&ZS(b,t)&&c(b),d.isPointerDown=!1};return m.addEventListener("pointerdown",l,!0),m.addEventListener("click",g,!0),()=>{m.removeEventListener("pointerdown",l,!0),m.removeEventListener("click",g,!0)}}},[t,r,l,c])}function ZS(e,t){if(e.button>0)return!1;if(e.target){const n=e.target.ownerDocument;if(!n||!n.documentElement.contains(e.target)||e.target.closest("[data-react-aria-top-layer]"))return!1}return t.current?!e.composedPath().includes(t.current):!1}const ek=We.createContext(null),bb="react-aria-focus-scope-restore";let Xt=null;function G5(e){let{children:t,contain:n,restoreFocus:r,autoFocus:i}=e,s=S.useRef(null),l=S.useRef(null),c=S.useRef([]),{parentNode:d}=S.useContext(ek)||{},h=S.useMemo(()=>new wb({scopeRef:c}),[c]);sn(()=>{let b=d||Ln.root;if(Ln.getTreeNode(b.scopeRef)&&Xt&&!Jg(Xt,b.scopeRef)){let x=Ln.getTreeNode(Xt);x&&(b=x)}b.addChild(h),Ln.addNode(h)},[h,d]),sn(()=>{let b=Ln.getTreeNode(c);b&&(b.contain=!!n)},[n]),sn(()=>{var b;let x=(b=s.current)===null||b===void 0?void 0:b.nextSibling,k=[],P=_=>_.stopPropagation();for(;x&&x!==l.current;)k.push(x),x.addEventListener(bb,P),x=x.nextSibling;return c.current=k,()=>{for(let _ of k)_.removeEventListener(bb,P)}},[t]),J5(c,r,n),Y5(c,n),Z5(c,r,n),Q5(c,i),S.useEffect(()=>{const b=Or(Dt(c.current?c.current[0]:void 0));let x=null;if(to(b,c.current)){for(let k of Ln.traverse())k.scopeRef&&to(b,k.scopeRef.current)&&(x=k);x===Ln.getTreeNode(c)&&(Xt=x.scopeRef)}},[c]),sn(()=>()=>{var b,x,k;let P=(k=(x=Ln.getTreeNode(c))===null||x===void 0||(b=x.parent)===null||b===void 0?void 0:b.scopeRef)!==null&&k!==void 0?k:null;(c===Xt||Jg(c,Xt))&&(!P||Ln.getTreeNode(P))&&(Xt=P),Ln.removeTreeNode(c)},[c]);let m=S.useMemo(()=>q5(c),[]),g=S.useMemo(()=>({focusManager:m,parentNode:h}),[h,m]);return We.createElement(ek.Provider,{value:g},We.createElement("span",{"data-focus-scope-start":!0,hidden:!0,ref:s}),t,We.createElement("span",{"data-focus-scope-end":!0,hidden:!0,ref:l}))}function q5(e){return{focusNext(t={}){let n=e.current,{from:r,tabbable:i,wrap:s,accept:l}=t;var c;let d=r||Or(Dt((c=n[0])!==null&&c!==void 0?c:void 0)),h=n[0].previousElementSibling,m=mu(n),g=Qs(m,{tabbable:i,accept:l},n);g.currentNode=to(d,n)?d:h;let b=g.nextNode();return!b&&s&&(g.currentNode=h,b=g.nextNode()),b&&Xs(b,!0),b},focusPrevious(t={}){let n=e.current,{from:r,tabbable:i,wrap:s,accept:l}=t;var c;let d=r||Or(Dt((c=n[0])!==null&&c!==void 0?c:void 0)),h=n[n.length-1].nextElementSibling,m=mu(n),g=Qs(m,{tabbable:i,accept:l},n);g.currentNode=to(d,n)?d:h;let b=g.previousNode();return!b&&s&&(g.currentNode=h,b=g.previousNode()),b&&Xs(b,!0),b},focusFirst(t={}){let n=e.current,{tabbable:r,accept:i}=t,s=mu(n),l=Qs(s,{tabbable:r,accept:i},n);l.currentNode=n[0].previousElementSibling;let c=l.nextNode();return c&&Xs(c,!0),c},focusLast(t={}){let n=e.current,{tabbable:r,accept:i}=t,s=mu(n),l=Qs(s,{tabbable:r,accept:i},n);l.currentNode=n[n.length-1].nextElementSibling;let c=l.previousNode();return c&&Xs(c,!0),c}}}function mu(e){return e[0].parentElement}function Rp(e){let t=Ln.getTreeNode(Xt);for(;t&&t.scopeRef!==e;){if(t.contain)return!1;t=t.parent}return!0}function Y5(e,t){let n=S.useRef(void 0),r=S.useRef(void 0);sn(()=>{let i=e.current;if(!t){r.current&&(cancelAnimationFrame(r.current),r.current=void 0);return}const s=Dt(i?i[0]:void 0);let l=h=>{if(h.key!=="Tab"||h.altKey||h.ctrlKey||h.metaKey||!Rp(e)||h.isComposing)return;let m=Or(s),g=e.current;if(!g||!to(m,g))return;let b=mu(g),x=Qs(b,{tabbable:!0},g);if(!m)return;x.currentNode=m;let k=h.shiftKey?x.previousNode():x.nextNode();k||(x.currentNode=h.shiftKey?g[g.length-1].nextElementSibling:g[0].previousElementSibling,k=h.shiftKey?x.previousNode():x.nextNode()),h.preventDefault(),k&&Xs(k,!0)},c=h=>{(!Xt||Jg(Xt,e))&&to(En(h),e.current)?(Xt=e,n.current=En(h)):Rp(e)&&!Yl(En(h),e)?n.current?n.current.focus():Xt&&Xt.current&&xb(Xt.current):Rp(e)&&(n.current=En(h))},d=h=>{r.current&&cancelAnimationFrame(r.current),r.current=requestAnimationFrame(()=>{let m=sh(),g=(m==="virtual"||m===null)&&ax()&&CE(),b=Or(s);if(!g&&b&&Rp(e)&&!Yl(b,e)){Xt=e;let k=En(h);if(k&&k.isConnected){var x;n.current=k,(x=n.current)===null||x===void 0||x.focus()}else Xt.current&&xb(Xt.current)}})};return s.addEventListener("keydown",l,!1),s.addEventListener("focusin",c,!1),i?.forEach(h=>h.addEventListener("focusin",c,!1)),i?.forEach(h=>h.addEventListener("focusout",d,!1)),()=>{s.removeEventListener("keydown",l,!1),s.removeEventListener("focusin",c,!1),i?.forEach(h=>h.removeEventListener("focusin",c,!1)),i?.forEach(h=>h.removeEventListener("focusout",d,!1))}},[e,t]),sn(()=>()=>{r.current&&cancelAnimationFrame(r.current)},[r])}function _T(e){return Yl(e)}function to(e,t){return!e||!t?!1:t.some(n=>n.contains(e))}function Yl(e,t=null){if(e instanceof Element&&e.closest("[data-react-aria-top-layer]"))return!0;for(let{scopeRef:n}of Ln.traverse(Ln.getTreeNode(t)))if(n&&to(e,n.current))return!0;return!1}function X5(e){return Yl(e,Xt)}function Jg(e,t){var n;let r=(n=Ln.getTreeNode(t))===null||n===void 0?void 0:n.parent;for(;r;){if(r.scopeRef===e)return!0;r=r.parent}return!1}function Xs(e,t=!1){if(e!=null&&!t)try{Cu(e)}catch{}else if(e!=null)try{e.focus()}catch{}}function IT(e,t=!0){let n=e[0].previousElementSibling,r=mu(e),i=Qs(r,{tabbable:t},e);i.currentNode=n;let s=i.nextNode();return t&&!s&&(r=mu(e),i=Qs(r,{tabbable:!1},e),i.currentNode=n,s=i.nextNode()),s}function xb(e,t=!0){Xs(IT(e,t))}function Q5(e,t){const n=We.useRef(t);S.useEffect(()=>{if(n.current){Xt=e;const r=Dt(e.current?e.current[0]:void 0);!to(Or(r),Xt.current)&&e.current&&xb(e.current)}n.current=!1},[e])}function J5(e,t,n){sn(()=>{if(t||n)return;let r=e.current;const i=Dt(r?r[0]:void 0);let s=l=>{let c=En(l);to(c,e.current)?Xt=e:_T(c)||(Xt=null)};return i.addEventListener("focusin",s,!1),r?.forEach(l=>l.addEventListener("focusin",s,!1)),()=>{i.removeEventListener("focusin",s,!1),r?.forEach(l=>l.removeEventListener("focusin",s,!1))}},[e,t,n])}function tk(e){let t=Ln.getTreeNode(Xt);for(;t&&t.scopeRef!==e;){if(t.nodeToRestore)return!1;t=t.parent}return t?.scopeRef===e}function Z5(e,t,n){const r=S.useRef(typeof document<"u"?Or(Dt(e.current?e.current[0]:void 0)):null);sn(()=>{let i=e.current;const s=Dt(i?i[0]:void 0);if(!t||n)return;let l=()=>{(!Xt||Jg(Xt,e))&&to(Or(s),e.current)&&(Xt=e)};return s.addEventListener("focusin",l,!1),i?.forEach(c=>c.addEventListener("focusin",l,!1)),()=>{s.removeEventListener("focusin",l,!1),i?.forEach(c=>c.removeEventListener("focusin",l,!1))}},[e,n]),sn(()=>{const i=Dt(e.current?e.current[0]:void 0);if(!t)return;let s=l=>{if(l.key!=="Tab"||l.altKey||l.ctrlKey||l.metaKey||!Rp(e)||l.isComposing)return;let c=i.activeElement;if(!Yl(c,e)||!tk(e))return;let d=Ln.getTreeNode(e);if(!d)return;let h=d.nodeToRestore,m=Qs(i.body,{tabbable:!0});m.currentNode=c;let g=l.shiftKey?m.previousNode():m.nextNode();if((!h||!h.isConnected||h===i.body)&&(h=void 0,d.nodeToRestore=void 0),(!g||!Yl(g,e))&&h){m.currentNode=h;do g=l.shiftKey?m.previousNode():m.nextNode();while(Yl(g,e));l.preventDefault(),l.stopPropagation(),g?Xs(g,!0):_T(h)?Xs(h,!0):c.blur()}};return n||i.addEventListener("keydown",s,!0),()=>{n||i.removeEventListener("keydown",s,!0)}},[e,t,n]),sn(()=>{const i=Dt(e.current?e.current[0]:void 0);if(!t)return;let s=Ln.getTreeNode(e);if(s){var l;return s.nodeToRestore=(l=r.current)!==null&&l!==void 0?l:void 0,()=>{let c=Ln.getTreeNode(e);if(!c)return;let d=c.nodeToRestore,h=Or(i);if(t&&d&&(h&&Yl(h,e)||h===i.body&&tk(e))){let m=Ln.clone();requestAnimationFrame(()=>{if(i.activeElement===i.body){let g=m.getTreeNode(e);for(;g;){if(g.nodeToRestore&&g.nodeToRestore.isConnected){nk(g.nodeToRestore);return}g=g.parent}for(g=m.getTreeNode(e);g;){if(g.scopeRef&&g.scopeRef.current&&Ln.getTreeNode(g.scopeRef)){let b=IT(g.scopeRef.current,!0);nk(b);return}g=g.parent}}})}}}},[e,t])}function nk(e){e.dispatchEvent(new CustomEvent(bb,{bubbles:!0,cancelable:!0}))&&Xs(e)}function Qs(e,t,n){let r=t?.tabbable?xM:NE,i=e?.nodeType===Node.ELEMENT_NODE?e:null,s=Dt(i),l=QL(s,e||s,NodeFilter.SHOW_ELEMENT,{acceptNode(c){var d;return!(t==null||(d=t.from)===null||d===void 0)&&d.contains(c)?NodeFilter.FILTER_REJECT:r(c)&&yT(c)&&(!n||to(c,n))&&(!t?.accept||t.accept(c))?NodeFilter.FILTER_ACCEPT:NodeFilter.FILTER_SKIP}});return t?.from&&(l.currentNode=t.from),l}class Yx{get size(){return this.fastMap.size}getTreeNode(t){return this.fastMap.get(t)}addTreeNode(t,n,r){let i=this.fastMap.get(n??null);if(!i)return;let s=new wb({scopeRef:t});i.addChild(s),s.parent=i,this.fastMap.set(t,s),r&&(s.nodeToRestore=r)}addNode(t){this.fastMap.set(t.scopeRef,t)}removeTreeNode(t){if(t===null)return;let n=this.fastMap.get(t);if(!n)return;let r=n.parent;for(let s of this.traverse())s!==n&&n.nodeToRestore&&s.nodeToRestore&&n.scopeRef&&n.scopeRef.current&&to(s.nodeToRestore,n.scopeRef.current)&&(s.nodeToRestore=n.nodeToRestore);let i=n.children;r&&(r.removeChild(n),i.size>0&&i.forEach(s=>r&&r.addChild(s))),this.fastMap.delete(n.scopeRef)}*traverse(t=this.root){if(t.scopeRef!=null&&(yield t),t.children.size>0)for(let n of t.children)yield*this.traverse(n)}clone(){var t;let n=new Yx;var r;for(let i of this.traverse())n.addTreeNode(i.scopeRef,(r=(t=i.parent)===null||t===void 0?void 0:t.scopeRef)!==null&&r!==void 0?r:null,i.nodeToRestore);return n}constructor(){this.fastMap=new Map,this.root=new wb({scopeRef:null}),this.fastMap.set(null,this.root)}}class wb{addChild(t){this.children.add(t),t.parent=this}removeChild(t){this.children.delete(t),t.parent=void 0}constructor(t){this.children=new Set,this.contain=!1,this.scopeRef=t.scopeRef}}let Ln=new Yx;function Rf(e={}){let{autoFocus:t=!1,isTextInput:n,within:r}=e,i=S.useRef({isFocused:!1,isFocusVisible:t||qx()}),[s,l]=S.useState(!1),[c,d]=S.useState(()=>i.current.isFocused&&i.current.isFocusVisible),h=S.useCallback(()=>d(i.current.isFocused&&i.current.isFocusVisible),[]),m=S.useCallback(x=>{i.current.isFocused=x,l(x),h()},[h]);z5(x=>{i.current.isFocusVisible=x,h()},[],{isTextInput:n});let{focusProps:g}=TT({isDisabled:r,onFocusChange:m}),{focusWithinProps:b}=kv({isDisabled:!r,onFocusWithinChange:m});return{isFocused:s,isFocusVisible:c,focusProps:r?b:g}}function eF(e){let t=rF(Dt(e));t!==e&&(t&&tF(t,e),e&&nF(e,t))}function tF(e,t){e.dispatchEvent(new FocusEvent("blur",{relatedTarget:t})),e.dispatchEvent(new FocusEvent("focusout",{bubbles:!0,relatedTarget:t}))}function nF(e,t){e.dispatchEvent(new FocusEvent("focus",{relatedTarget:t})),e.dispatchEvent(new FocusEvent("focusin",{bubbles:!0,relatedTarget:t}))}function rF(e){let t=Or(e),n=t?.getAttribute("aria-activedescendant");return n&&e.getElementById(n)||t}const f0=typeof document<"u"&&window.visualViewport,iF=new Set(["checkbox","radio","range","color","file","image","button","submit","reset"]);let vg=0,d0;function oF(e={}){let{isDisabled:t}=e;sn(()=>{if(!t)return vg++,vg===1&&(vv()?d0=lF():d0=sF()),()=>{vg--,vg===0&&d0()}},[t])}function sF(){let e=window.innerWidth-document.documentElement.clientWidth;return Tf(e>0&&("scrollbarGutter"in document.documentElement.style?gu(document.documentElement,"scrollbarGutter","stable"):gu(document.documentElement,"paddingRight",`${e}px`)),gu(document.documentElement,"overflow","hidden"))}function lF(){let e,t,n=h=>{e=$E(h.target,!0),!(e===document.documentElement&&e===document.body)&&e instanceof HTMLElement&&window.getComputedStyle(e).overscrollBehavior==="auto"&&(t=gu(e,"overscrollBehavior","contain"))},r=h=>{if(!e||e===document.documentElement||e===document.body){h.preventDefault();return}e.scrollHeight===e.clientHeight&&e.scrollWidth===e.clientWidth&&h.preventDefault()},i=()=>{t&&t()},s=h=>{let m=h.target;aF(m)&&(c(),m.style.transform="translateY(-2000px)",requestAnimationFrame(()=>{m.style.transform="",f0&&(f0.height{rk(m)}):f0.addEventListener("resize",()=>rk(m),{once:!0}))}))},l=null,c=()=>{if(l)return;let h=()=>{window.scrollTo(0,0)},m=window.pageXOffset,g=window.pageYOffset;l=Tf(vp(window,"scroll",h),gu(document.documentElement,"paddingRight",`${window.innerWidth-document.documentElement.clientWidth}px`),gu(document.documentElement,"overflow","hidden"),gu(document.body,"marginTop",`-${g}px`),()=>{window.scrollTo(m,g)}),window.scrollTo(0,0)},d=Tf(vp(document,"touchstart",n,{passive:!1,capture:!0}),vp(document,"touchmove",r,{passive:!1,capture:!0}),vp(document,"touchend",i,{passive:!1,capture:!0}),vp(document,"focus",s,!0));return()=>{t?.(),l?.(),d()}}function gu(e,t,n){let r=e.style[t];return e.style[t]=n,()=>{e.style[t]=r}}function vp(e,t,n,r){return e.addEventListener(t,n,r),()=>{e.removeEventListener(t,n,r)}}function rk(e){let t=document.scrollingElement||document.documentElement,n=e;for(;n&&n!==t;){let r=$E(n);if(r!==document.documentElement&&r!==document.body&&r!==n){let i=r.getBoundingClientRect().top,s=n.getBoundingClientRect().top;s>i+n.clientHeight&&(r.scrollTop+=s-i)}n=r.parentElement}}function aF(e){return e instanceof HTMLInputElement&&!iF.has(e.type)||e instanceof HTMLTextAreaElement||e instanceof HTMLElement&&e.isContentEditable}const uF=S.createContext({});function $T(){var e;return(e=S.useContext(uF))!==null&&e!==void 0?e:{}}const Sb=We.createContext(null);function cF(e){let{children:t}=e,n=S.useContext(Sb),[r,i]=S.useState(0),s=S.useMemo(()=>({parent:n,modalCount:r,addModal(){i(l=>l+1),n&&n.addModal()},removeModal(){i(l=>l-1),n&&n.removeModal()}}),[n,r]);return We.createElement(Sb.Provider,{value:s},t)}function fF(){let e=S.useContext(Sb);return{modalProviderProps:{"aria-hidden":e&&e.modalCount>0?!0:void 0}}}function dF(e){let{modalProviderProps:t}=fF();return We.createElement("div",{"data-overlay-container":!0,...e,...t})}function AT(e){return We.createElement(cF,null,We.createElement(dF,e))}function ik(e){let t=hh(),{portalContainer:n=t?null:document.body,...r}=e,{getContainer:i}=$T();if(!e.portalContainer&&i&&(n=i()),We.useEffect(()=>{if(n?.closest("[data-overlay-container]"))throw new Error("An OverlayContainer must not be inside another container. Please change the portalContainer prop.")},[n]),!n)return null;let s=We.createElement(AT,r);return DE.createPortal(s,n)}var RT={};RT={dismiss:"تجاهل"};var LT={};LT={dismiss:"Отхвърляне"};var MT={};MT={dismiss:"Odstranit"};var DT={};DT={dismiss:"Luk"};var NT={};NT={dismiss:"Schließen"};var FT={};FT={dismiss:"Απόρριψη"};var OT={};OT={dismiss:"Dismiss"};var zT={};zT={dismiss:"Descartar"};var jT={};jT={dismiss:"Lõpeta"};var BT={};BT={dismiss:"Hylkää"};var VT={};VT={dismiss:"Rejeter"};var UT={};UT={dismiss:"התעלם"};var KT={};KT={dismiss:"Odbaci"};var WT={};WT={dismiss:"Elutasítás"};var HT={};HT={dismiss:"Ignora"};var GT={};GT={dismiss:"閉じる"};var qT={};qT={dismiss:"무시"};var YT={};YT={dismiss:"Atmesti"};var XT={};XT={dismiss:"Nerādīt"};var QT={};QT={dismiss:"Lukk"};var JT={};JT={dismiss:"Negeren"};var ZT={};ZT={dismiss:"Zignoruj"};var e_={};e_={dismiss:"Descartar"};var t_={};t_={dismiss:"Dispensar"};var n_={};n_={dismiss:"Revocare"};var r_={};r_={dismiss:"Пропустить"};var i_={};i_={dismiss:"Zrušiť"};var o_={};o_={dismiss:"Opusti"};var s_={};s_={dismiss:"Odbaci"};var l_={};l_={dismiss:"Avvisa"};var a_={};a_={dismiss:"Kapat"};var u_={};u_={dismiss:"Скасувати"};var c_={};c_={dismiss:"取消"};var f_={};f_={dismiss:"關閉"};var d_={};d_={"ar-AE":RT,"bg-BG":LT,"cs-CZ":MT,"da-DK":DT,"de-DE":NT,"el-GR":FT,"en-US":OT,"es-ES":zT,"et-EE":jT,"fi-FI":BT,"fr-FR":VT,"he-IL":UT,"hr-HR":KT,"hu-HU":WT,"it-IT":HT,"ja-JP":GT,"ko-KR":qT,"lt-LT":YT,"lv-LV":XT,"nb-NO":QT,"nl-NL":JT,"pl-PL":ZT,"pt-BR":e_,"pt-PT":t_,"ro-RO":n_,"ru-RU":r_,"sk-SK":i_,"sl-SI":o_,"sr-SP":s_,"sv-SE":l_,"tr-TR":a_,"uk-UA":u_,"zh-CN":c_,"zh-TW":f_};const ok={border:0,clip:"rect(0 0 0 0)",clipPath:"inset(50%)",height:"1px",margin:"-1px",overflow:"hidden",padding:0,position:"absolute",width:"1px",whiteSpace:"nowrap"};function pF(e={}){let{style:t,isFocusable:n}=e,[r,i]=S.useState(!1),{focusWithinProps:s}=kv({isDisabled:!n,onFocusWithinChange:c=>i(c)}),l=S.useMemo(()=>r?t:t?{...ok,...t}:ok,[r]);return{visuallyHiddenProps:{...s,style:l}}}function hF(e){let{children:t,elementType:n="div",isFocusable:r,style:i,...s}=e,{visuallyHiddenProps:l}=pF(e);return We.createElement(n,Pn(s,l),t)}function mF(e){return e&&e.__esModule?e.default:e}function sk(e){let{onDismiss:t,...n}=e,r=jL(mF(d_),"@react-aria/overlays"),i=_E(n,r.format("dismiss")),s=()=>{t&&t()};return We.createElement(hF,null,We.createElement("button",{...i,tabIndex:-1,onClick:s,style:{width:1,height:1}}))}let yp=new WeakMap,qi=[];function gF(e,t=document.body){let n=new Set(e),r=new Set,i=d=>{for(let b of d.querySelectorAll("[data-live-announcer], [data-react-aria-top-layer]"))n.add(b);let h=b=>{if(n.has(b)||b.parentElement&&r.has(b.parentElement)&&b.parentElement.getAttribute("role")!=="row")return NodeFilter.FILTER_REJECT;for(let x of n)if(b.contains(x))return NodeFilter.FILTER_SKIP;return NodeFilter.FILTER_ACCEPT},m=document.createTreeWalker(d,NodeFilter.SHOW_ELEMENT,{acceptNode:h}),g=h(d);if(g===NodeFilter.FILTER_ACCEPT&&s(d),g!==NodeFilter.FILTER_REJECT){let b=m.nextNode();for(;b!=null;)s(b),b=m.nextNode()}},s=d=>{var h;let m=(h=yp.get(d))!==null&&h!==void 0?h:0;d.getAttribute("aria-hidden")==="true"&&m===0||(m===0&&d.setAttribute("aria-hidden","true"),r.add(d),yp.set(d,m+1))};qi.length&&qi[qi.length-1].disconnect(),i(t);let l=new MutationObserver(d=>{for(let h of d)if(!(h.type!=="childList"||h.addedNodes.length===0)&&![...n,...r].some(m=>m.contains(h.target))){for(let m of h.removedNodes)m instanceof Element&&(n.delete(m),r.delete(m));for(let m of h.addedNodes)(m instanceof HTMLElement||m instanceof SVGElement)&&(m.dataset.liveAnnouncer==="true"||m.dataset.reactAriaTopLayer==="true")?n.add(m):m instanceof Element&&i(m)}});l.observe(t,{childList:!0,subtree:!0});let c={visibleNodes:n,hiddenNodes:r,observe(){l.observe(t,{childList:!0,subtree:!0})},disconnect(){l.disconnect()}};return qi.push(c),()=>{l.disconnect();for(let d of r){let h=yp.get(d);h!=null&&(h===1?(d.removeAttribute("aria-hidden"),yp.delete(d)):yp.set(d,h-1))}c===qi[qi.length-1]?(qi.pop(),qi.length&&qi[qi.length-1].observe()):qi.splice(qi.indexOf(c),1)}}const p_=We.createContext(null);function vF(e){let t=hh(),{portalContainer:n=t?null:document.body,isExiting:r}=e,[i,s]=S.useState(!1),l=S.useMemo(()=>({contain:i,setContain:s}),[i,s]),{getContainer:c}=$T();if(!e.portalContainer&&c&&(n=c()),!n)return null;let d=e.children;return e.disableFocusManagement||(d=We.createElement(G5,{restoreFocus:!0,contain:(e.shouldContainFocus||i)&&!r},d)),d=We.createElement(p_.Provider,{value:l},We.createElement(U5,null,d)),DE.createPortal(d,n)}function h_(){let e=S.useContext(p_),t=e?.setContain;sn(()=>{t?.(!0)},[t])}var yF=({children:e,navigate:t,disableAnimation:n,useHref:r,disableRipple:i=!1,skipFramerMotionAnimations:s=n,reducedMotion:l="never",validationBehavior:c,locale:d="en-US",labelPlacement:h,defaultDates:m,createCalendar:g,spinnerVariant:b,...x})=>{let k=e;t&&(k=D.jsx(uM,{navigate:t,useHref:r,children:k}));const P=S.useMemo(()=>(n&&s&&(ds.skipAnimations=!0),{createCalendar:g,defaultDates:m,disableAnimation:n,disableRipple:i,validationBehavior:c,labelPlacement:h,spinnerVariant:b}),[g,m?.maxDate,m?.minDate,n,i,c,h,b]);return D.jsx(xL,{value:P,children:D.jsx(RL,{locale:d,children:D.jsx(M3,{reducedMotion:l,children:D.jsx(AT,{...x,children:k})})})})};function OG(e){const t=li(),n=t?.labelPlacement;return S.useMemo(()=>{var r,i;const s=(i=(r=e.labelPlacement)!=null?r:n)!=null?i:"inside";return s==="inside"&&!e.label?"outside":s},[e.labelPlacement,n,e.label])}function bF(e){const t=li(),n=t?.labelPlacement;return S.useMemo(()=>{var r,i;const s=(i=(r=e.labelPlacement)!=null?r:n)!=null?i:"inside";return s==="inside"&&!e.label?"outside":s},[e.labelPlacement,n,e.label])}function ai(e){return S.forwardRef(e)}var ra=(e,t,n=!0)=>{if(!t)return[e,{}];const r=t.reduce((i,s)=>s in e?{...i,[s]:e[s]}:i,{});return n?[Object.keys(e).filter(s=>!t.includes(s)).reduce((s,l)=>({...s,[l]:e[l]}),{}),r]:[e,r]},xF={default:"bg-default text-default-foreground",primary:"bg-primary text-primary-foreground",secondary:"bg-secondary text-secondary-foreground",success:"bg-success text-success-foreground",warning:"bg-warning text-warning-foreground",danger:"bg-danger text-danger-foreground",foreground:"bg-foreground text-background"},wF={default:"shadow-lg shadow-default/50 bg-default text-default-foreground",primary:"shadow-lg shadow-primary/40 bg-primary text-primary-foreground",secondary:"shadow-lg shadow-secondary/40 bg-secondary text-secondary-foreground",success:"shadow-lg shadow-success/40 bg-success text-success-foreground",warning:"shadow-lg shadow-warning/40 bg-warning text-warning-foreground",danger:"shadow-lg shadow-danger/40 bg-danger text-danger-foreground"},SF={default:"bg-transparent border-default text-foreground",primary:"bg-transparent border-primary text-primary",secondary:"bg-transparent border-secondary text-secondary",success:"bg-transparent border-success text-success",warning:"bg-transparent border-warning text-warning",danger:"bg-transparent border-danger text-danger"},kF={default:"bg-default/40 text-default-700",primary:"bg-primary/20 text-primary-600",secondary:"bg-secondary/20 text-secondary-600",success:"bg-success/20 text-success-700 dark:text-success",warning:"bg-warning/20 text-warning-700 dark:text-warning",danger:"bg-danger/20 text-danger-600 dark:text-danger-500"},CF={default:"border-default bg-default-100 text-default-foreground",primary:"border-default bg-default-100 text-primary",secondary:"border-default bg-default-100 text-secondary",success:"border-default bg-default-100 text-success",warning:"border-default bg-default-100 text-warning",danger:"border-default bg-default-100 text-danger"},EF={default:"bg-transparent text-default-foreground",primary:"bg-transparent text-primary",secondary:"bg-transparent text-secondary",success:"bg-transparent text-success",warning:"bg-transparent text-warning",danger:"bg-transparent text-danger"},PF={default:"border-default text-default-foreground",primary:"border-primary text-primary",secondary:"border-secondary text-secondary",success:"border-success text-success",warning:"border-warning text-warning",danger:"border-danger text-danger"},et={solid:xF,shadow:wF,bordered:SF,flat:kF,faded:CF,light:EF,ghost:PF},TF={".spinner-bar-animation":{"animation-delay":"calc(-1.2s + (0.1s * var(--bar-index)))",transform:"rotate(calc(30deg * var(--bar-index)))translate(140%)"},".spinner-dot-animation":{"animation-delay":"calc(250ms * var(--dot-index))"},".spinner-dot-blink-animation":{"animation-delay":"calc(200ms * var(--dot-index))"}},_F={".leading-inherit":{"line-height":"inherit"},".bg-img-inherit":{"background-image":"inherit"},".bg-clip-inherit":{"background-clip":"inherit"},".text-fill-inherit":{"-webkit-text-fill-color":"inherit"},".tap-highlight-transparent":{"-webkit-tap-highlight-color":"transparent"},".input-search-cancel-button-none":{"&::-webkit-search-cancel-button":{"-webkit-appearance":"none"}}},IF={".scrollbar-hide":{"-ms-overflow-style":"none","scrollbar-width":"none","&::-webkit-scrollbar":{display:"none"}},".scrollbar-default":{"-ms-overflow-style":"auto","scrollbar-width":"auto","&::-webkit-scrollbar":{display:"block"}}},$F={".text-tiny":{"font-size":"var(--heroui-font-size-tiny)","line-height":"var(--heroui-line-height-tiny)"},".text-small":{"font-size":"var(--heroui-font-size-small)","line-height":"var(--heroui-line-height-small)"},".text-medium":{"font-size":"var(--heroui-font-size-medium)","line-height":"var(--heroui-line-height-medium)"},".text-large":{"font-size":"var(--heroui-font-size-large)","line-height":"var(--heroui-line-height-large)"}},is="250ms",AF={".transition-background":{"transition-property":"background","transition-timing-function":"ease","transition-duration":is},".transition-colors-opacity":{"transition-property":"color, background-color, border-color, text-decoration-color, fill, stroke, opacity","transition-timing-function":"ease","transition-duration":is},".transition-width":{"transition-property":"width","transition-timing-function":"ease","transition-duration":is},".transition-height":{"transition-property":"height","transition-timing-function":"ease","transition-duration":is},".transition-size":{"transition-property":"width, height","transition-timing-function":"ease","transition-duration":is},".transition-left":{"transition-property":"left","transition-timing-function":"ease","transition-duration":is},".transition-transform-opacity":{"transition-property":"transform, scale, opacity rotate","transition-timing-function":"ease","transition-duration":is},".transition-transform-background":{"transition-property":"transform, scale, background","transition-timing-function":"ease","transition-duration":is},".transition-transform-colors":{"transition-property":"transform, scale, color, background, background-color, border-color, text-decoration-color, fill, stroke","transition-timing-function":"ease","transition-duration":is},".transition-transform-colors-opacity":{"transition-property":"transform, scale, color, background, background-color, border-color, text-decoration-color, fill, stroke, opacity","transition-timing-function":"ease","transition-duration":is}},RF={..._F,...AF,...IF,...$F,...TF},yg=["small","medium","large"],kb={theme:{spacing:["divider"],radius:yg},classGroups:{shadow:[{shadow:yg}],opacity:[{opacity:["disabled"]}],"font-size":[{text:["tiny",...yg]}],"border-w":[{border:yg}],"bg-image":["bg-stripe-gradient-default","bg-stripe-gradient-primary","bg-stripe-gradient-secondary","bg-stripe-gradient-success","bg-stripe-gradient-warning","bg-stripe-gradient-danger"],transition:Object.keys(RF).filter(e=>e.includes(".transition")).map(e=>e.replace(".",""))}},lk=e=>typeof e=="boolean"?`${e}`:e===0?"0":e,ri=e=>!e||typeof e!="object"||Object.keys(e).length===0,LF=(e,t)=>JSON.stringify(e)===JSON.stringify(t);function m_(e,t){e.forEach(function(n){Array.isArray(n)?m_(n,t):t.push(n)})}function g_(e){let t=[];return m_(e,t),t}var v_=(...e)=>g_(e).filter(Boolean),y_=(e,t)=>{let n={},r=Object.keys(e),i=Object.keys(t);for(let s of r)if(i.includes(s)){let l=e[s],c=t[s];Array.isArray(l)||Array.isArray(c)?n[s]=v_(c,l):typeof l=="object"&&typeof c=="object"?n[s]=y_(l,c):n[s]=c+" "+l}else n[s]=e[s];for(let s of i)r.includes(s)||(n[s]=t[s]);return n},ak=e=>!e||typeof e!="string"?e:e.replace(/\s+/g," ").trim();const Xx="-",MF=e=>{const t=NF(e),{conflictingClassGroups:n,conflictingClassGroupModifiers:r}=e;return{getClassGroupId:l=>{const c=l.split(Xx);return c[0]===""&&c.length!==1&&c.shift(),b_(c,t)||DF(l)},getConflictingClassGroupIds:(l,c)=>{const d=n[l]||[];return c&&r[l]?[...d,...r[l]]:d}}},b_=(e,t)=>{if(e.length===0)return t.classGroupId;const n=e[0],r=t.nextPart.get(n),i=r?b_(e.slice(1),r):void 0;if(i)return i;if(t.validators.length===0)return;const s=e.join(Xx);return t.validators.find(({validator:l})=>l(s))?.classGroupId},uk=/^\[(.+)\]$/,DF=e=>{if(uk.test(e)){const t=uk.exec(e)[1],n=t?.substring(0,t.indexOf(":"));if(n)return"arbitrary.."+n}},NF=e=>{const{theme:t,classGroups:n}=e,r={nextPart:new Map,validators:[]};for(const i in n)Cb(n[i],r,i,t);return r},Cb=(e,t,n,r)=>{e.forEach(i=>{if(typeof i=="string"){const s=i===""?t:ck(t,i);s.classGroupId=n;return}if(typeof i=="function"){if(FF(i)){Cb(i(r),t,n,r);return}t.validators.push({validator:i,classGroupId:n});return}Object.entries(i).forEach(([s,l])=>{Cb(l,ck(t,s),n,r)})})},ck=(e,t)=>{let n=e;return t.split(Xx).forEach(r=>{n.nextPart.has(r)||n.nextPart.set(r,{nextPart:new Map,validators:[]}),n=n.nextPart.get(r)}),n},FF=e=>e.isThemeGetter,OF=e=>{if(e<1)return{get:()=>{},set:()=>{}};let t=0,n=new Map,r=new Map;const i=(s,l)=>{n.set(s,l),t++,t>e&&(t=0,r=n,n=new Map)};return{get(s){let l=n.get(s);if(l!==void 0)return l;if((l=r.get(s))!==void 0)return i(s,l),l},set(s,l){n.has(s)?n.set(s,l):i(s,l)}}},Eb="!",Pb=":",zF=Pb.length,jF=e=>{const{prefix:t,experimentalParseClassName:n}=e;let r=i=>{const s=[];let l=0,c=0,d=0,h;for(let k=0;kd?h-d:void 0;return{modifiers:s,hasImportantModifier:b,baseClassName:g,maybePostfixModifierPosition:x}};if(t){const i=t+Pb,s=r;r=l=>l.startsWith(i)?s(l.substring(i.length)):{isExternal:!0,modifiers:[],hasImportantModifier:!1,baseClassName:l,maybePostfixModifierPosition:void 0}}if(n){const i=r;r=s=>n({className:s,parseClassName:i})}return r},BF=e=>e.endsWith(Eb)?e.substring(0,e.length-1):e.startsWith(Eb)?e.substring(1):e,VF=e=>{const t=Object.fromEntries(e.orderSensitiveModifiers.map(r=>[r,!0]));return r=>{if(r.length<=1)return r;const i=[];let s=[];return r.forEach(l=>{l[0]==="["||t[l]?(i.push(...s.sort(),l),s=[]):s.push(l)}),i.push(...s.sort()),i}},UF=e=>({cache:OF(e.cacheSize),parseClassName:jF(e),sortModifiers:VF(e),...MF(e)}),KF=/\s+/,WF=(e,t)=>{const{parseClassName:n,getClassGroupId:r,getConflictingClassGroupIds:i,sortModifiers:s}=t,l=[],c=e.trim().split(KF);let d="";for(let h=c.length-1;h>=0;h-=1){const m=c[h],{isExternal:g,modifiers:b,hasImportantModifier:x,baseClassName:k,maybePostfixModifierPosition:P}=n(m);if(g){d=m+(d.length>0?" "+d:d);continue}let _=!!P,T=r(_?k.substring(0,P):k);if(!T){if(!_){d=m+(d.length>0?" "+d:d);continue}if(T=r(k),!T){d=m+(d.length>0?" "+d:d);continue}_=!1}const $=s(b).join(":"),L=x?$+Eb:$,z=L+T;if(l.includes(z))continue;l.push(z);const K=i(T,_);for(let M=0;M0?" "+d:d)}return d};function HF(){let e=0,t,n,r="";for(;e{if(typeof e=="string")return e;let t,n="";for(let r=0;rg(m),e());return n=UF(h),r=n.cache.get,i=n.cache.set,s=c,c(d)}function c(d){const h=r(d);if(h)return h;const m=WF(d,n);return i(d,m),m}return function(){return s(HF.apply(null,arguments))}}const Jn=e=>{const t=n=>n[e]||[];return t.isThemeGetter=!0,t},w_=/^\[(?:(\w[\w-]*):)?(.+)\]$/i,S_=/^\((?:(\w[\w-]*):)?(.+)\)$/i,GF=/^\d+\/\d+$/,qF=/^(\d+(\.\d+)?)?(xs|sm|md|lg|xl)$/,YF=/\d+(%|px|r?em|[sdl]?v([hwib]|min|max)|pt|pc|in|cm|mm|cap|ch|ex|r?lh|cq(w|h|i|b|min|max))|\b(calc|min|max|clamp)\(.+\)|^0$/,XF=/^(rgba?|hsla?|hwb|(ok)?(lab|lch))\(.+\)$/,QF=/^(inset_)?-?((\d+)?\.?(\d+)[a-z]+|0)_-?((\d+)?\.?(\d+)[a-z]+|0)/,JF=/^(url|image|image-set|cross-fade|element|(repeating-)?(linear|radial|conic)-gradient)\(.+\)$/,sf=e=>GF.test(e),yt=e=>!!e&&!Number.isNaN(Number(e)),su=e=>!!e&&Number.isInteger(Number(e)),fk=e=>e.endsWith("%")&&yt(e.slice(0,-1)),Wl=e=>qF.test(e),ZF=()=>!0,eO=e=>YF.test(e)&&!XF.test(e),Qx=()=>!1,tO=e=>QF.test(e),nO=e=>JF.test(e),rO=e=>!ze(e)&&!je(e),iO=e=>zf(e,E_,Qx),ze=e=>w_.test(e),lu=e=>zf(e,P_,eO),p0=e=>zf(e,mO,yt),oO=e=>zf(e,k_,Qx),sO=e=>zf(e,C_,nO),lO=e=>zf(e,Qx,tO),je=e=>S_.test(e),bg=e=>jf(e,P_),aO=e=>jf(e,gO),uO=e=>jf(e,k_),cO=e=>jf(e,E_),fO=e=>jf(e,C_),dO=e=>jf(e,vO,!0),zf=(e,t,n)=>{const r=w_.exec(e);return r?r[1]?t(r[1]):n(r[2]):!1},jf=(e,t,n=!1)=>{const r=S_.exec(e);return r?r[1]?t(r[1]):n:!1},k_=e=>e==="position",pO=new Set(["image","url"]),C_=e=>pO.has(e),hO=new Set(["length","size","percentage"]),E_=e=>hO.has(e),P_=e=>e==="length",mO=e=>e==="number",gO=e=>e==="family-name",vO=e=>e==="shadow",_b=()=>{const e=Jn("color"),t=Jn("font"),n=Jn("text"),r=Jn("font-weight"),i=Jn("tracking"),s=Jn("leading"),l=Jn("breakpoint"),c=Jn("container"),d=Jn("spacing"),h=Jn("radius"),m=Jn("shadow"),g=Jn("inset-shadow"),b=Jn("drop-shadow"),x=Jn("blur"),k=Jn("perspective"),P=Jn("aspect"),_=Jn("ease"),T=Jn("animate"),$=()=>["auto","avoid","all","avoid-page","page","left","right","column"],L=()=>["bottom","center","left","left-bottom","left-top","right","right-bottom","right-top","top"],z=()=>["auto","hidden","clip","visible","scroll"],K=()=>["auto","contain","none"],M=()=>[je,ze,d],J=()=>[sf,"full","auto",...M()],re=()=>[su,"none","subgrid",je,ze],ae=()=>["auto",{span:["full",su,je,ze]},je,ze],j=()=>[su,"auto",je,ze],B=()=>["auto","min","max","fr",je,ze],Y=()=>["start","end","center","between","around","evenly","stretch","baseline"],te=()=>["start","end","center","stretch"],G=()=>["auto",...M()],ce=()=>[sf,"auto","full","dvw","dvh","lvw","lvh","svw","svh","min","max","fit",...M()],Z=()=>[e,je,ze],q=()=>[fk,lu],V=()=>["","none","full",h,je,ze],se=()=>["",yt,bg,lu],R=()=>["solid","dashed","dotted","double"],U=()=>["normal","multiply","screen","overlay","darken","lighten","color-dodge","color-burn","hard-light","soft-light","difference","exclusion","hue","saturation","color","luminosity"],ie=()=>["","none",x,je,ze],O=()=>["center","top","top-right","right","bottom-right","bottom","bottom-left","left","top-left",je,ze],me=()=>["none",yt,je,ze],Ce=()=>["none",yt,je,ze],ye=()=>[yt,je,ze],Fe=()=>[sf,"full",...M()];return{cacheSize:500,theme:{animate:["spin","ping","pulse","bounce"],aspect:["video"],blur:[Wl],breakpoint:[Wl],color:[ZF],container:[Wl],"drop-shadow":[Wl],ease:["in","out","in-out"],font:[rO],"font-weight":["thin","extralight","light","normal","medium","semibold","bold","extrabold","black"],"inset-shadow":[Wl],leading:["none","tight","snug","normal","relaxed","loose"],perspective:["dramatic","near","normal","midrange","distant","none"],radius:[Wl],shadow:[Wl],spacing:["px",yt],text:[Wl],tracking:["tighter","tight","normal","wide","wider","widest"]},classGroups:{aspect:[{aspect:["auto","square",sf,ze,je,P]}],container:["container"],columns:[{columns:[yt,ze,je,c]}],"break-after":[{"break-after":$()}],"break-before":[{"break-before":$()}],"break-inside":[{"break-inside":["auto","avoid","avoid-page","avoid-column"]}],"box-decoration":[{"box-decoration":["slice","clone"]}],box:[{box:["border","content"]}],display:["block","inline-block","inline","flex","inline-flex","table","inline-table","table-caption","table-cell","table-column","table-column-group","table-footer-group","table-header-group","table-row-group","table-row","flow-root","grid","inline-grid","contents","list-item","hidden"],sr:["sr-only","not-sr-only"],float:[{float:["right","left","none","start","end"]}],clear:[{clear:["left","right","both","none","start","end"]}],isolation:["isolate","isolation-auto"],"object-fit":[{object:["contain","cover","fill","none","scale-down"]}],"object-position":[{object:[...L(),ze,je]}],overflow:[{overflow:z()}],"overflow-x":[{"overflow-x":z()}],"overflow-y":[{"overflow-y":z()}],overscroll:[{overscroll:K()}],"overscroll-x":[{"overscroll-x":K()}],"overscroll-y":[{"overscroll-y":K()}],position:["static","fixed","absolute","relative","sticky"],inset:[{inset:J()}],"inset-x":[{"inset-x":J()}],"inset-y":[{"inset-y":J()}],start:[{start:J()}],end:[{end:J()}],top:[{top:J()}],right:[{right:J()}],bottom:[{bottom:J()}],left:[{left:J()}],visibility:["visible","invisible","collapse"],z:[{z:[su,"auto",je,ze]}],basis:[{basis:[sf,"full","auto",c,...M()]}],"flex-direction":[{flex:["row","row-reverse","col","col-reverse"]}],"flex-wrap":[{flex:["nowrap","wrap","wrap-reverse"]}],flex:[{flex:[yt,sf,"auto","initial","none",ze]}],grow:[{grow:["",yt,je,ze]}],shrink:[{shrink:["",yt,je,ze]}],order:[{order:[su,"first","last","none",je,ze]}],"grid-cols":[{"grid-cols":re()}],"col-start-end":[{col:ae()}],"col-start":[{"col-start":j()}],"col-end":[{"col-end":j()}],"grid-rows":[{"grid-rows":re()}],"row-start-end":[{row:ae()}],"row-start":[{"row-start":j()}],"row-end":[{"row-end":j()}],"grid-flow":[{"grid-flow":["row","col","dense","row-dense","col-dense"]}],"auto-cols":[{"auto-cols":B()}],"auto-rows":[{"auto-rows":B()}],gap:[{gap:M()}],"gap-x":[{"gap-x":M()}],"gap-y":[{"gap-y":M()}],"justify-content":[{justify:[...Y(),"normal"]}],"justify-items":[{"justify-items":[...te(),"normal"]}],"justify-self":[{"justify-self":["auto",...te()]}],"align-content":[{content:["normal",...Y()]}],"align-items":[{items:[...te(),"baseline"]}],"align-self":[{self:["auto",...te(),"baseline"]}],"place-content":[{"place-content":Y()}],"place-items":[{"place-items":[...te(),"baseline"]}],"place-self":[{"place-self":["auto",...te()]}],p:[{p:M()}],px:[{px:M()}],py:[{py:M()}],ps:[{ps:M()}],pe:[{pe:M()}],pt:[{pt:M()}],pr:[{pr:M()}],pb:[{pb:M()}],pl:[{pl:M()}],m:[{m:G()}],mx:[{mx:G()}],my:[{my:G()}],ms:[{ms:G()}],me:[{me:G()}],mt:[{mt:G()}],mr:[{mr:G()}],mb:[{mb:G()}],ml:[{ml:G()}],"space-x":[{"space-x":M()}],"space-x-reverse":["space-x-reverse"],"space-y":[{"space-y":M()}],"space-y-reverse":["space-y-reverse"],size:[{size:ce()}],w:[{w:[c,"screen",...ce()]}],"min-w":[{"min-w":[c,"screen","none",...ce()]}],"max-w":[{"max-w":[c,"screen","none","prose",{screen:[l]},...ce()]}],h:[{h:["screen",...ce()]}],"min-h":[{"min-h":["screen","none",...ce()]}],"max-h":[{"max-h":["screen",...ce()]}],"font-size":[{text:["base",n,bg,lu]}],"font-smoothing":["antialiased","subpixel-antialiased"],"font-style":["italic","not-italic"],"font-weight":[{font:[r,je,p0]}],"font-stretch":[{"font-stretch":["ultra-condensed","extra-condensed","condensed","semi-condensed","normal","semi-expanded","expanded","extra-expanded","ultra-expanded",fk,ze]}],"font-family":[{font:[aO,ze,t]}],"fvn-normal":["normal-nums"],"fvn-ordinal":["ordinal"],"fvn-slashed-zero":["slashed-zero"],"fvn-figure":["lining-nums","oldstyle-nums"],"fvn-spacing":["proportional-nums","tabular-nums"],"fvn-fraction":["diagonal-fractions","stacked-fractions"],tracking:[{tracking:[i,je,ze]}],"line-clamp":[{"line-clamp":[yt,"none",je,p0]}],leading:[{leading:[s,...M()]}],"list-image":[{"list-image":["none",je,ze]}],"list-style-position":[{list:["inside","outside"]}],"list-style-type":[{list:["disc","decimal","none",je,ze]}],"text-alignment":[{text:["left","center","right","justify","start","end"]}],"placeholder-color":[{placeholder:Z()}],"text-color":[{text:Z()}],"text-decoration":["underline","overline","line-through","no-underline"],"text-decoration-style":[{decoration:[...R(),"wavy"]}],"text-decoration-thickness":[{decoration:[yt,"from-font","auto",je,lu]}],"text-decoration-color":[{decoration:Z()}],"underline-offset":[{"underline-offset":[yt,"auto",je,ze]}],"text-transform":["uppercase","lowercase","capitalize","normal-case"],"text-overflow":["truncate","text-ellipsis","text-clip"],"text-wrap":[{text:["wrap","nowrap","balance","pretty"]}],indent:[{indent:M()}],"vertical-align":[{align:["baseline","top","middle","bottom","text-top","text-bottom","sub","super",je,ze]}],whitespace:[{whitespace:["normal","nowrap","pre","pre-line","pre-wrap","break-spaces"]}],break:[{break:["normal","words","all","keep"]}],hyphens:[{hyphens:["none","manual","auto"]}],content:[{content:["none",je,ze]}],"bg-attachment":[{bg:["fixed","local","scroll"]}],"bg-clip":[{"bg-clip":["border","padding","content","text"]}],"bg-origin":[{"bg-origin":["border","padding","content"]}],"bg-position":[{bg:[...L(),uO,oO]}],"bg-repeat":[{bg:["no-repeat",{repeat:["","x","y","space","round"]}]}],"bg-size":[{bg:["auto","cover","contain",cO,iO]}],"bg-image":[{bg:["none",{linear:[{to:["t","tr","r","br","b","bl","l","tl"]},su,je,ze],radial:["",je,ze],conic:[su,je,ze]},fO,sO]}],"bg-color":[{bg:Z()}],"gradient-from-pos":[{from:q()}],"gradient-via-pos":[{via:q()}],"gradient-to-pos":[{to:q()}],"gradient-from":[{from:Z()}],"gradient-via":[{via:Z()}],"gradient-to":[{to:Z()}],rounded:[{rounded:V()}],"rounded-s":[{"rounded-s":V()}],"rounded-e":[{"rounded-e":V()}],"rounded-t":[{"rounded-t":V()}],"rounded-r":[{"rounded-r":V()}],"rounded-b":[{"rounded-b":V()}],"rounded-l":[{"rounded-l":V()}],"rounded-ss":[{"rounded-ss":V()}],"rounded-se":[{"rounded-se":V()}],"rounded-ee":[{"rounded-ee":V()}],"rounded-es":[{"rounded-es":V()}],"rounded-tl":[{"rounded-tl":V()}],"rounded-tr":[{"rounded-tr":V()}],"rounded-br":[{"rounded-br":V()}],"rounded-bl":[{"rounded-bl":V()}],"border-w":[{border:se()}],"border-w-x":[{"border-x":se()}],"border-w-y":[{"border-y":se()}],"border-w-s":[{"border-s":se()}],"border-w-e":[{"border-e":se()}],"border-w-t":[{"border-t":se()}],"border-w-r":[{"border-r":se()}],"border-w-b":[{"border-b":se()}],"border-w-l":[{"border-l":se()}],"divide-x":[{"divide-x":se()}],"divide-x-reverse":["divide-x-reverse"],"divide-y":[{"divide-y":se()}],"divide-y-reverse":["divide-y-reverse"],"border-style":[{border:[...R(),"hidden","none"]}],"divide-style":[{divide:[...R(),"hidden","none"]}],"border-color":[{border:Z()}],"border-color-x":[{"border-x":Z()}],"border-color-y":[{"border-y":Z()}],"border-color-s":[{"border-s":Z()}],"border-color-e":[{"border-e":Z()}],"border-color-t":[{"border-t":Z()}],"border-color-r":[{"border-r":Z()}],"border-color-b":[{"border-b":Z()}],"border-color-l":[{"border-l":Z()}],"divide-color":[{divide:Z()}],"outline-style":[{outline:[...R(),"none","hidden"]}],"outline-offset":[{"outline-offset":[yt,je,ze]}],"outline-w":[{outline:["",yt,bg,lu]}],"outline-color":[{outline:[e]}],shadow:[{shadow:["","none",m,dO,lO]}],"shadow-color":[{shadow:Z()}],"inset-shadow":[{"inset-shadow":["none",je,ze,g]}],"inset-shadow-color":[{"inset-shadow":Z()}],"ring-w":[{ring:se()}],"ring-w-inset":["ring-inset"],"ring-color":[{ring:Z()}],"ring-offset-w":[{"ring-offset":[yt,lu]}],"ring-offset-color":[{"ring-offset":Z()}],"inset-ring-w":[{"inset-ring":se()}],"inset-ring-color":[{"inset-ring":Z()}],opacity:[{opacity:[yt,je,ze]}],"mix-blend":[{"mix-blend":[...U(),"plus-darker","plus-lighter"]}],"bg-blend":[{"bg-blend":U()}],filter:[{filter:["","none",je,ze]}],blur:[{blur:ie()}],brightness:[{brightness:[yt,je,ze]}],contrast:[{contrast:[yt,je,ze]}],"drop-shadow":[{"drop-shadow":["","none",b,je,ze]}],grayscale:[{grayscale:["",yt,je,ze]}],"hue-rotate":[{"hue-rotate":[yt,je,ze]}],invert:[{invert:["",yt,je,ze]}],saturate:[{saturate:[yt,je,ze]}],sepia:[{sepia:["",yt,je,ze]}],"backdrop-filter":[{"backdrop-filter":["","none",je,ze]}],"backdrop-blur":[{"backdrop-blur":ie()}],"backdrop-brightness":[{"backdrop-brightness":[yt,je,ze]}],"backdrop-contrast":[{"backdrop-contrast":[yt,je,ze]}],"backdrop-grayscale":[{"backdrop-grayscale":["",yt,je,ze]}],"backdrop-hue-rotate":[{"backdrop-hue-rotate":[yt,je,ze]}],"backdrop-invert":[{"backdrop-invert":["",yt,je,ze]}],"backdrop-opacity":[{"backdrop-opacity":[yt,je,ze]}],"backdrop-saturate":[{"backdrop-saturate":[yt,je,ze]}],"backdrop-sepia":[{"backdrop-sepia":["",yt,je,ze]}],"border-collapse":[{border:["collapse","separate"]}],"border-spacing":[{"border-spacing":M()}],"border-spacing-x":[{"border-spacing-x":M()}],"border-spacing-y":[{"border-spacing-y":M()}],"table-layout":[{table:["auto","fixed"]}],caption:[{caption:["top","bottom"]}],transition:[{transition:["","all","colors","opacity","shadow","transform","none",je,ze]}],"transition-behavior":[{transition:["normal","discrete"]}],duration:[{duration:[yt,"initial",je,ze]}],ease:[{ease:["linear","initial",_,je,ze]}],delay:[{delay:[yt,je,ze]}],animate:[{animate:["none",T,je,ze]}],backface:[{backface:["hidden","visible"]}],perspective:[{perspective:[k,je,ze]}],"perspective-origin":[{"perspective-origin":O()}],rotate:[{rotate:me()}],"rotate-x":[{"rotate-x":me()}],"rotate-y":[{"rotate-y":me()}],"rotate-z":[{"rotate-z":me()}],scale:[{scale:Ce()}],"scale-x":[{"scale-x":Ce()}],"scale-y":[{"scale-y":Ce()}],"scale-z":[{"scale-z":Ce()}],"scale-3d":["scale-3d"],skew:[{skew:ye()}],"skew-x":[{"skew-x":ye()}],"skew-y":[{"skew-y":ye()}],transform:[{transform:[je,ze,"","none","gpu","cpu"]}],"transform-origin":[{origin:O()}],"transform-style":[{transform:["3d","flat"]}],translate:[{translate:Fe()}],"translate-x":[{"translate-x":Fe()}],"translate-y":[{"translate-y":Fe()}],"translate-z":[{"translate-z":Fe()}],"translate-none":["translate-none"],accent:[{accent:Z()}],appearance:[{appearance:["none","auto"]}],"caret-color":[{caret:Z()}],"color-scheme":[{scheme:["normal","dark","light","light-dark","only-dark","only-light"]}],cursor:[{cursor:["auto","default","pointer","wait","text","move","help","not-allowed","none","context-menu","progress","cell","crosshair","vertical-text","alias","copy","no-drop","grab","grabbing","all-scroll","col-resize","row-resize","n-resize","e-resize","s-resize","w-resize","ne-resize","nw-resize","se-resize","sw-resize","ew-resize","ns-resize","nesw-resize","nwse-resize","zoom-in","zoom-out",je,ze]}],"field-sizing":[{"field-sizing":["fixed","content"]}],"pointer-events":[{"pointer-events":["auto","none"]}],resize:[{resize:["none","","y","x"]}],"scroll-behavior":[{scroll:["auto","smooth"]}],"scroll-m":[{"scroll-m":M()}],"scroll-mx":[{"scroll-mx":M()}],"scroll-my":[{"scroll-my":M()}],"scroll-ms":[{"scroll-ms":M()}],"scroll-me":[{"scroll-me":M()}],"scroll-mt":[{"scroll-mt":M()}],"scroll-mr":[{"scroll-mr":M()}],"scroll-mb":[{"scroll-mb":M()}],"scroll-ml":[{"scroll-ml":M()}],"scroll-p":[{"scroll-p":M()}],"scroll-px":[{"scroll-px":M()}],"scroll-py":[{"scroll-py":M()}],"scroll-ps":[{"scroll-ps":M()}],"scroll-pe":[{"scroll-pe":M()}],"scroll-pt":[{"scroll-pt":M()}],"scroll-pr":[{"scroll-pr":M()}],"scroll-pb":[{"scroll-pb":M()}],"scroll-pl":[{"scroll-pl":M()}],"snap-align":[{snap:["start","end","center","align-none"]}],"snap-stop":[{snap:["normal","always"]}],"snap-type":[{snap:["none","x","y","both"]}],"snap-strictness":[{snap:["mandatory","proximity"]}],touch:[{touch:["auto","none","manipulation"]}],"touch-x":[{"touch-pan":["x","left","right"]}],"touch-y":[{"touch-pan":["y","up","down"]}],"touch-pz":["touch-pinch-zoom"],select:[{select:["none","text","all","auto"]}],"will-change":[{"will-change":["auto","scroll","contents","transform",je,ze]}],fill:[{fill:["none",...Z()]}],"stroke-w":[{stroke:[yt,bg,lu,p0]}],stroke:[{stroke:["none",...Z()]}],"forced-color-adjust":[{"forced-color-adjust":["auto","none"]}]},conflictingClassGroups:{overflow:["overflow-x","overflow-y"],overscroll:["overscroll-x","overscroll-y"],inset:["inset-x","inset-y","start","end","top","right","bottom","left"],"inset-x":["right","left"],"inset-y":["top","bottom"],flex:["basis","grow","shrink"],gap:["gap-x","gap-y"],p:["px","py","ps","pe","pt","pr","pb","pl"],px:["pr","pl"],py:["pt","pb"],m:["mx","my","ms","me","mt","mr","mb","ml"],mx:["mr","ml"],my:["mt","mb"],size:["w","h"],"font-size":["leading"],"fvn-normal":["fvn-ordinal","fvn-slashed-zero","fvn-figure","fvn-spacing","fvn-fraction"],"fvn-ordinal":["fvn-normal"],"fvn-slashed-zero":["fvn-normal"],"fvn-figure":["fvn-normal"],"fvn-spacing":["fvn-normal"],"fvn-fraction":["fvn-normal"],"line-clamp":["display","overflow"],rounded:["rounded-s","rounded-e","rounded-t","rounded-r","rounded-b","rounded-l","rounded-ss","rounded-se","rounded-ee","rounded-es","rounded-tl","rounded-tr","rounded-br","rounded-bl"],"rounded-s":["rounded-ss","rounded-es"],"rounded-e":["rounded-se","rounded-ee"],"rounded-t":["rounded-tl","rounded-tr"],"rounded-r":["rounded-tr","rounded-br"],"rounded-b":["rounded-br","rounded-bl"],"rounded-l":["rounded-tl","rounded-bl"],"border-spacing":["border-spacing-x","border-spacing-y"],"border-w":["border-w-s","border-w-e","border-w-t","border-w-r","border-w-b","border-w-l"],"border-w-x":["border-w-r","border-w-l"],"border-w-y":["border-w-t","border-w-b"],"border-color":["border-color-s","border-color-e","border-color-t","border-color-r","border-color-b","border-color-l"],"border-color-x":["border-color-r","border-color-l"],"border-color-y":["border-color-t","border-color-b"],translate:["translate-x","translate-y","translate-none"],"translate-none":["translate","translate-x","translate-y","translate-z"],"scroll-m":["scroll-mx","scroll-my","scroll-ms","scroll-me","scroll-mt","scroll-mr","scroll-mb","scroll-ml"],"scroll-mx":["scroll-mr","scroll-ml"],"scroll-my":["scroll-mt","scroll-mb"],"scroll-p":["scroll-px","scroll-py","scroll-ps","scroll-pe","scroll-pt","scroll-pr","scroll-pb","scroll-pl"],"scroll-px":["scroll-pr","scroll-pl"],"scroll-py":["scroll-pt","scroll-pb"],touch:["touch-x","touch-y","touch-pz"],"touch-x":["touch"],"touch-y":["touch"],"touch-pz":["touch"]},conflictingClassGroupModifiers:{"font-size":["leading"]},orderSensitiveModifiers:["before","after","placeholder","file","marker","selection","first-line","first-letter","backdrop","*","**"]}},yO=(e,{cacheSize:t,prefix:n,experimentalParseClassName:r,extend:i={},override:s={}})=>(Lp(e,"cacheSize",t),Lp(e,"prefix",n),Lp(e,"experimentalParseClassName",r),xg(e.theme,s.theme),xg(e.classGroups,s.classGroups),xg(e.conflictingClassGroups,s.conflictingClassGroups),xg(e.conflictingClassGroupModifiers,s.conflictingClassGroupModifiers),Lp(e,"orderSensitiveModifiers",s.orderSensitiveModifiers),wg(e.theme,i.theme),wg(e.classGroups,i.classGroups),wg(e.conflictingClassGroups,i.conflictingClassGroups),wg(e.conflictingClassGroupModifiers,i.conflictingClassGroupModifiers),T_(e,i,"orderSensitiveModifiers"),e),Lp=(e,t,n)=>{n!==void 0&&(e[t]=n)},xg=(e,t)=>{if(t)for(const n in t)Lp(e,n,t[n])},wg=(e,t)=>{if(t)for(const n in t)T_(e,t,n)},T_=(e,t,n)=>{const r=t[n];r!==void 0&&(e[n]=e[n]?e[n].concat(r):r)},__=(e,...t)=>typeof e=="function"?Tb(_b,e,...t):Tb(()=>yO(_b(),e),...t),bO=Tb(_b);var xO={twMerge:!0,twMergeConfig:{},responsiveVariants:!1},I_=e=>e||void 0,lh=(...e)=>I_(g_(e).filter(Boolean).join(" ")),h0=null,Ys={},Ib=!1,bp=(...e)=>t=>t.twMerge?((!h0||Ib)&&(Ib=!1,h0=ri(Ys)?bO:__({...Ys,extend:{theme:Ys.theme,classGroups:Ys.classGroups,conflictingClassGroupModifiers:Ys.conflictingClassGroupModifiers,conflictingClassGroups:Ys.conflictingClassGroups,...Ys.extend}})),I_(h0(lh(e)))):lh(e),dk=(e,t)=>{for(let n in t)e.hasOwnProperty(n)?e[n]=lh(e[n],t[n]):e[n]=t[n];return e},wO=(e,t)=>{let{extend:n=null,slots:r={},variants:i={},compoundVariants:s=[],compoundSlots:l=[],defaultVariants:c={}}=e,d={...xO,...t},h=n!=null&&n.base?lh(n.base,e?.base):e?.base,m=n!=null&&n.variants&&!ri(n.variants)?y_(i,n.variants):i,g=n!=null&&n.defaultVariants&&!ri(n.defaultVariants)?{...n.defaultVariants,...c}:c;!ri(d.twMergeConfig)&&!LF(d.twMergeConfig,Ys)&&(Ib=!0,Ys=d.twMergeConfig);let b=ri(n?.slots),x=ri(r)?{}:{base:lh(e?.base,b&&n?.base),...r},k=b?x:dk({...n?.slots},ri(x)?{base:e?.base}:x),P=ri(n?.compoundVariants)?s:v_(n?.compoundVariants,s),_=$=>{if(ri(m)&&ri(r)&&b)return bp(h,$?.class,$?.className)(d);if(P&&!Array.isArray(P))throw new TypeError(`The "compoundVariants" prop must be an array. Received: ${typeof P}`);if(l&&!Array.isArray(l))throw new TypeError(`The "compoundSlots" prop must be an array. Received: ${typeof l}`);let L=(Y,te,G=[],ce)=>{let Z=G;if(typeof te=="string")Z=Z.concat(ak(te).split(" ").map(q=>`${Y}:${q}`));else if(Array.isArray(te))Z=Z.concat(te.reduce((q,V)=>q.concat(`${Y}:${V}`),[]));else if(typeof te=="object"&&typeof ce=="string"){for(let q in te)if(te.hasOwnProperty(q)&&q===ce){let V=te[q];if(V&&typeof V=="string"){let se=ak(V);Z[ce]?Z[ce]=Z[ce].concat(se.split(" ").map(R=>`${Y}:${R}`)):Z[ce]=se.split(" ").map(R=>`${Y}:${R}`)}else Array.isArray(V)&&V.length>0&&(Z[ce]=V.reduce((se,R)=>se.concat(`${Y}:${R}`),[]))}}return Z},z=(Y,te=m,G=null,ce=null)=>{var Z;let q=te[Y];if(!q||ri(q))return null;let V=(Z=ce?.[Y])!=null?Z:$?.[Y];if(V===null)return null;let se=lk(V),R=Array.isArray(d.responsiveVariants)&&d.responsiveVariants.length>0||d.responsiveVariants===!0,U=g?.[Y],ie=[];if(typeof se=="object"&&R)for(let[Ce,ye]of Object.entries(se)){let Fe=q[ye];if(Ce==="initial"){U=ye;continue}Array.isArray(d.responsiveVariants)&&!d.responsiveVariants.includes(Ce)||(ie=L(Ce,Fe,ie,G))}let O=se!=null&&typeof se!="object"?se:lk(U),me=q[O||"false"];return typeof ie=="object"&&typeof G=="string"&&ie[G]?dk(ie,me):ie.length>0?(ie.push(me),G==="base"?ie.join(" "):ie):me},K=()=>m?Object.keys(m).map(Y=>z(Y,m)):null,M=(Y,te)=>{if(!m||typeof m!="object")return null;let G=new Array;for(let ce in m){let Z=z(ce,m,Y,te),q=Y==="base"&&typeof Z=="string"?Z:Z&&Z[Y];q&&(G[G.length]=q)}return G},J={};for(let Y in $)$[Y]!==void 0&&(J[Y]=$[Y]);let re=(Y,te)=>{var G;let ce=typeof $?.[Y]=="object"?{[Y]:(G=$[Y])==null?void 0:G.initial}:{};return{...g,...J,...ce,...te}},ae=(Y=[],te)=>{let G=[];for(let{class:ce,className:Z,...q}of Y){let V=!0;for(let[se,R]of Object.entries(q)){let U=re(se,te)[se];if(Array.isArray(R)){if(!R.includes(U)){V=!1;break}}else{let ie=O=>O==null||O===!1;if(ie(R)&&ie(U))continue;if(U!==R){V=!1;break}}}V&&(ce&&G.push(ce),Z&&G.push(Z))}return G},j=Y=>{let te=ae(P,Y);if(!Array.isArray(te))return te;let G={};for(let ce of te)if(typeof ce=="string"&&(G.base=bp(G.base,ce)(d)),typeof ce=="object")for(let[Z,q]of Object.entries(ce))G[Z]=bp(G[Z],q)(d);return G},B=Y=>{if(l.length<1)return null;let te={};for(let{slots:G=[],class:ce,className:Z,...q}of l){if(!ri(q)){let V=!0;for(let se of Object.keys(q)){let R=re(se,Y)[se];if(R===void 0||(Array.isArray(q[se])?!q[se].includes(R):q[se]!==R)){V=!1;break}}if(!V)continue}for(let V of G)te[V]=te[V]||[],te[V].push([ce,Z])}return te};if(!ri(r)||!b){let Y={};if(typeof k=="object"&&!ri(k))for(let te of Object.keys(k))Y[te]=G=>{var ce,Z;return bp(k[te],M(te,G),((ce=j(G))!=null?ce:[])[te],((Z=B(G))!=null?Z:[])[te],G?.class,G?.className)(d)};return Y}return bp(h,K(),ae(P),$?.class,$?.className)(d)},T=()=>{if(!(!m||typeof m!="object"))return Object.keys(m)};return _.variantKeys=T(),_.extend=n,_.base=h,_.slots=k,_.variants=m,_.defaultVariants=g,_.compoundSlots=l,_.compoundVariants=P,_},fr=(e,t)=>{var n,r,i;return wO(e,{...t,twMerge:(n=t?.twMerge)!=null?n:!0,twMergeConfig:{...t?.twMergeConfig,theme:{...(r=t?.twMergeConfig)==null?void 0:r.theme,...kb.theme},classGroups:{...(i=t?.twMergeConfig)==null?void 0:i.classGroups,...kb.classGroups}}})},pk=fr({slots:{base:"relative inline-flex flex-col gap-2 items-center justify-center",wrapper:"relative flex",label:"text-foreground dark:text-foreground-dark font-regular",circle1:"absolute w-full h-full rounded-full",circle2:"absolute w-full h-full rounded-full",dots:"relative rounded-full mx-auto",spinnerBars:["absolute","animate-fade-out","rounded-full","w-[25%]","h-[8%]","left-[calc(37.5%)]","top-[calc(46%)]","spinner-bar-animation"]},variants:{size:{sm:{wrapper:"w-5 h-5",circle1:"border-2",circle2:"border-2",dots:"size-1",label:"text-small"},md:{wrapper:"w-8 h-8",circle1:"border-3",circle2:"border-3",dots:"size-1.5",label:"text-medium"},lg:{wrapper:"w-10 h-10",circle1:"border-3",circle2:"border-3",dots:"size-2",label:"text-large"}},color:{current:{circle1:"border-b-current",circle2:"border-b-current",dots:"bg-current",spinnerBars:"bg-current"},white:{circle1:"border-b-white",circle2:"border-b-white",dots:"bg-white",spinnerBars:"bg-white"},default:{circle1:"border-b-default",circle2:"border-b-default",dots:"bg-default",spinnerBars:"bg-default"},primary:{circle1:"border-b-primary",circle2:"border-b-primary",dots:"bg-primary",spinnerBars:"bg-primary"},secondary:{circle1:"border-b-secondary",circle2:"border-b-secondary",dots:"bg-secondary",spinnerBars:"bg-secondary"},success:{circle1:"border-b-success",circle2:"border-b-success",dots:"bg-success",spinnerBars:"bg-success"},warning:{circle1:"border-b-warning",circle2:"border-b-warning",dots:"bg-warning",spinnerBars:"bg-warning"},danger:{circle1:"border-b-danger",circle2:"border-b-danger",dots:"bg-danger",spinnerBars:"bg-danger"}},labelColor:{foreground:{label:"text-foreground"},primary:{label:"text-primary"},secondary:{label:"text-secondary"},success:{label:"text-success"},warning:{label:"text-warning"},danger:{label:"text-danger"}},variant:{default:{circle1:["animate-spinner-ease-spin","border-solid","border-t-transparent","border-l-transparent","border-r-transparent"],circle2:["opacity-75","animate-spinner-linear-spin","border-dotted","border-t-transparent","border-l-transparent","border-r-transparent"]},gradient:{circle1:["border-0","bg-gradient-to-b","from-transparent","via-transparent","to-primary","animate-spinner-linear-spin","[animation-duration:1s]","[-webkit-mask:radial-gradient(closest-side,rgba(0,0,0,0.0)calc(100%-3px),rgba(0,0,0,1)calc(100%-3px))]"],circle2:["hidden"]},wave:{wrapper:"translate-y-3/4",dots:["animate-sway","spinner-dot-animation"]},dots:{wrapper:"translate-y-2/4",dots:["animate-blink","spinner-dot-blink-animation"]},spinner:{},simple:{wrapper:"text-foreground h-5 w-5 animate-spin",circle1:"opacity-25",circle2:"opacity-75"}}},defaultVariants:{size:"md",color:"primary",labelColor:"foreground",variant:"default"},compoundVariants:[{variant:"gradient",color:"current",class:{circle1:"to-current"}},{variant:"gradient",color:"white",class:{circle1:"to-white"}},{variant:"gradient",color:"default",class:{circle1:"to-default"}},{variant:"gradient",color:"primary",class:{circle1:"to-primary"}},{variant:"gradient",color:"secondary",class:{circle1:"to-secondary"}},{variant:"gradient",color:"success",class:{circle1:"to-success"}},{variant:"gradient",color:"warning",class:{circle1:"to-warning"}},{variant:"gradient",color:"danger",class:{circle1:"to-danger"}},{variant:"wave",size:"sm",class:{wrapper:"w-5 h-5"}},{variant:"wave",size:"md",class:{wrapper:"w-8 h-8"}},{variant:"wave",size:"lg",class:{wrapper:"w-12 h-12"}},{variant:"dots",size:"sm",class:{wrapper:"w-5 h-5"}},{variant:"dots",size:"md",class:{wrapper:"w-8 h-8"}},{variant:"dots",size:"lg",class:{wrapper:"w-12 h-12"}},{variant:"simple",size:"sm",class:{wrapper:"w-5 h-5"}},{variant:"simple",size:"md",class:{wrapper:"w-8 h-8"}},{variant:"simple",size:"lg",class:{wrapper:"w-12 h-12"}},{variant:"simple",color:"current",class:{wrapper:"text-current"}},{variant:"simple",color:"white",class:{wrapper:"text-white"}},{variant:"simple",color:"default",class:{wrapper:"text-default"}},{variant:"simple",color:"primary",class:{wrapper:"text-primary"}},{variant:"simple",color:"secondary",class:{wrapper:"text-secondary"}},{variant:"simple",color:"success",class:{wrapper:"text-success"}},{variant:"simple",color:"warning",class:{wrapper:"text-warning"}},{variant:"simple",color:"danger",class:{wrapper:"text-danger"}}]}),Sh=["outline-hidden","data-[focus-visible=true]:z-10","data-[focus-visible=true]:outline-2","data-[focus-visible=true]:outline-focus","data-[focus-visible=true]:outline-offset-2"],$_=["outline-hidden","group-data-[focus-visible=true]:z-10","group-data-[focus-visible=true]:ring-2","group-data-[focus-visible=true]:ring-focus","group-data-[focus-visible=true]:ring-offset-2","group-data-[focus-visible=true]:ring-offset-background"],lf={default:["[&+.border-medium.border-default]:ms-[calc(var(--heroui-border-width-medium)*-1)]"],primary:["[&+.border-medium.border-primary]:ms-[calc(var(--heroui-border-width-medium)*-1)]"],secondary:["[&+.border-medium.border-secondary]:ms-[calc(var(--heroui-border-width-medium)*-1)]"],success:["[&+.border-medium.border-success]:ms-[calc(var(--heroui-border-width-medium)*-1)]"],warning:["[&+.border-medium.border-warning]:ms-[calc(var(--heroui-border-width-medium)*-1)]"],danger:["[&+.border-medium.border-danger]:ms-[calc(var(--heroui-border-width-medium)*-1)]"]},SO=["font-inherit","text-[100%]","leading-[1.15]","m-0","p-0","overflow-visible","box-border","absolute","top-0","w-full","h-full","opacity-[0.0001]","z-[1]","cursor-pointer","disabled:cursor-default"],hk=fr({slots:{base:["z-0","relative","bg-transparent","before:content-['']","before:hidden","before:z-[-1]","before:absolute","before:rotate-45","before:w-2.5","before:h-2.5","before:rounded-sm","data-[arrow=true]:before:block","data-[placement=top]:before:-bottom-[calc(theme(spacing.5)/4_-_1.5px)]","data-[placement=top]:before:left-1/2","data-[placement=top]:before:-translate-x-1/2","data-[placement=top-start]:before:-bottom-[calc(theme(spacing.5)/4_-_1.5px)]","data-[placement=top-start]:before:left-3","data-[placement=top-end]:before:-bottom-[calc(theme(spacing.5)/4_-_1.5px)]","data-[placement=top-end]:before:right-3","data-[placement=bottom]:before:-top-[calc(theme(spacing.5)/4_-_1.5px)]","data-[placement=bottom]:before:left-1/2","data-[placement=bottom]:before:-translate-x-1/2","data-[placement=bottom-start]:before:-top-[calc(theme(spacing.5)/4_-_1.5px)]","data-[placement=bottom-start]:before:left-3","data-[placement=bottom-end]:before:-top-[calc(theme(spacing.5)/4_-_1.5px)]","data-[placement=bottom-end]:before:right-3","data-[placement=left]:before:-right-[calc(theme(spacing.5)/4_-_2px)]","data-[placement=left]:before:top-1/2","data-[placement=left]:before:-translate-y-1/2","data-[placement=left-start]:before:-right-[calc(theme(spacing.5)/4_-_3px)]","data-[placement=left-start]:before:top-1/4","data-[placement=left-end]:before:-right-[calc(theme(spacing.5)/4_-_3px)]","data-[placement=left-end]:before:bottom-1/4","data-[placement=right]:before:-left-[calc(theme(spacing.5)/4_-_2px)]","data-[placement=right]:before:top-1/2","data-[placement=right]:before:-translate-y-1/2","data-[placement=right-start]:before:-left-[calc(theme(spacing.5)/4_-_3px)]","data-[placement=right-start]:before:top-1/4","data-[placement=right-end]:before:-left-[calc(theme(spacing.5)/4_-_3px)]","data-[placement=right-end]:before:bottom-1/4",...Sh],content:["z-10","px-2.5","py-1","w-full","inline-flex","flex-col","items-center","justify-center","box-border","subpixel-antialiased","outline-hidden","box-border"],trigger:["z-10"],backdrop:["hidden"],arrow:[]},variants:{size:{sm:{content:"text-tiny"},md:{content:"text-small"},lg:{content:"text-medium"}},color:{default:{base:"before:bg-content1 before:shadow-small",content:"bg-content1"},foreground:{base:"before:bg-foreground",content:et.solid.foreground},primary:{base:"before:bg-primary",content:et.solid.primary},secondary:{base:"before:bg-secondary",content:et.solid.secondary},success:{base:"before:bg-success",content:et.solid.success},warning:{base:"before:bg-warning",content:et.solid.warning},danger:{base:"before:bg-danger",content:et.solid.danger}},radius:{none:{content:"rounded-none"},sm:{content:"rounded-small"},md:{content:"rounded-medium"},lg:{content:"rounded-large"},full:{content:"rounded-full"}},shadow:{none:{content:"shadow-none"},sm:{content:"shadow-small"},md:{content:"shadow-medium"},lg:{content:"shadow-large"}},backdrop:{transparent:{},opaque:{backdrop:"bg-overlay/50 backdrop-opacity-disabled"},blur:{backdrop:"backdrop-blur-sm backdrop-saturate-150 bg-overlay/30"}},triggerScaleOnOpen:{true:{trigger:["aria-expanded:scale-[0.97]","aria-expanded:opacity-70","subpixel-antialiased"]},false:{}},disableAnimation:{true:{base:"animate-none"}},isTriggerDisabled:{true:{trigger:"opacity-disabled pointer-events-none"},false:{}}},defaultVariants:{color:"default",radius:"lg",size:"md",shadow:"md",backdrop:"transparent",triggerScaleOnOpen:!0},compoundVariants:[{backdrop:["opaque","blur"],class:{backdrop:"block w-full h-full fixed inset-0 -z-30"}}]});fr({slots:{base:"flex flex-col gap-2 w-full",label:"",labelWrapper:"flex justify-between",value:"",track:"z-0 relative bg-default-300/50 overflow-hidden rtl:rotate-180",indicator:"h-full"},variants:{color:{default:{indicator:"bg-default-400"},primary:{indicator:"bg-primary"},secondary:{indicator:"bg-secondary"},success:{indicator:"bg-success"},warning:{indicator:"bg-warning"},danger:{indicator:"bg-danger"}},size:{sm:{label:"text-small",value:"text-small",track:"h-1"},md:{label:"text-medium",value:"text-medium",track:"h-3"},lg:{label:"text-large",value:"text-large",track:"h-5"}},radius:{none:{track:"rounded-none",indicator:"rounded-none"},sm:{track:"rounded-small",indicator:"rounded-small"},md:{track:"rounded-medium",indicator:"rounded-medium"},lg:{track:"rounded-large",indicator:"rounded-large"},full:{track:"rounded-full",indicator:"rounded-full"}},isStriped:{true:{indicator:"bg-stripe-gradient-default bg-stripe-size"}},isIndeterminate:{true:{indicator:["absolute","w-full","origin-left","animate-indeterminate-bar"]}},isDisabled:{true:{base:"opacity-disabled cursor-not-allowed"}},disableAnimation:{true:{},false:{indicator:"transition-transform !duration-500"}}},defaultVariants:{color:"primary",size:"md",radius:"full",isStriped:!1,isIndeterminate:!1,isDisabled:!1},compoundVariants:[{disableAnimation:!0,isIndeterminate:!1,class:{indicator:"!transition-none motion-reduce:transition-none"}},{color:"primary",isStriped:!0,class:{indicator:"bg-stripe-gradient-primary bg-stripe-size"}},{color:"secondary",isStriped:!0,class:{indicator:"bg-stripe-gradient-secondary bg-stripe-size"}},{color:"success",isStriped:!0,class:{indicator:"bg-stripe-gradient-success bg-stripe-size"}},{color:"warning",isStriped:!0,class:{indicator:"bg-stripe-gradient-warning bg-stripe-size"}},{color:"danger",isStriped:!0,class:{indicator:"bg-stripe-gradient-danger bg-stripe-size"}}]},{twMerge:!0});var mk=fr({slots:{base:"flex flex-col justify-center gap-1 max-w-fit items-center",label:"",svgWrapper:"relative block",svg:"z-0 relative overflow-hidden",track:"h-full stroke-default-300/50",indicator:"h-full stroke-current",value:"absolute font-normal inset-0 flex items-center justify-center"},variants:{color:{default:{svg:"text-default-400"},primary:{svg:"text-primary"},secondary:{svg:"text-secondary"},success:{svg:"text-success"},warning:{svg:"text-warning"},danger:{svg:"text-danger"}},size:{sm:{svg:"w-8 h-8",label:"text-small",value:"text-[0.5rem]"},md:{svg:"w-10 h-10",label:"text-small",value:"text-[0.55rem]"},lg:{svg:"w-12 h-12",label:"text-medium",value:"text-[0.6rem]"}},isIndeterminate:{true:{svg:"animate-spinner-ease-spin"}},isDisabled:{true:{base:"opacity-disabled cursor-not-allowed"}},disableAnimation:{true:{},false:{indicator:"transition-all !duration-500"}}},defaultVariants:{color:"primary",size:"md",isDisabled:!1},compoundVariants:[{disableAnimation:!0,isIndeterminate:!1,class:{svg:"!transition-none motion-reduce:transition-none"}}]}),kO=["data-[top-scroll=true]:[mask-image:linear-gradient(0deg,#000_calc(100%_-_var(--scroll-shadow-size)),transparent)]","data-[bottom-scroll=true]:[mask-image:linear-gradient(180deg,#000_calc(100%_-_var(--scroll-shadow-size)),transparent)]","data-[top-bottom-scroll=true]:[mask-image:linear-gradient(#000,#000,transparent_0,#000_var(--scroll-shadow-size),#000_calc(100%_-_var(--scroll-shadow-size)),transparent)]"],CO=["data-[left-scroll=true]:[mask-image:linear-gradient(270deg,#000_calc(100%_-_var(--scroll-shadow-size)),transparent)]","data-[right-scroll=true]:[mask-image:linear-gradient(90deg,#000_calc(100%_-_var(--scroll-shadow-size)),transparent)]","data-[left-right-scroll=true]:[mask-image:linear-gradient(to_right,#000,#000,transparent_0,#000_var(--scroll-shadow-size),#000_calc(100%_-_var(--scroll-shadow-size)),transparent)]"],gk=fr({base:[],variants:{orientation:{vertical:["overflow-y-auto",...kO],horizontal:["overflow-x-auto",...CO]},hideScrollBar:{true:"scrollbar-hide",false:""}},defaultVariants:{orientation:"vertical",hideScrollBar:!1}}),vk=fr({slots:{base:["group","relative","overflow-hidden","bg-content3 dark:bg-content2","pointer-events-none","before:opacity-100","before:absolute","before:inset-0","before:-translate-x-full","before:animate-shimmer","before:border-t","before:border-content4/30","before:bg-gradient-to-r","before:from-transparent","before:via-content4","dark:before:via-default-700/10","before:to-transparent","after:opacity-100","after:absolute","after:inset-0","after:-z-10","after:bg-content3","dark:after:bg-content2","data-[loaded=true]:pointer-events-auto","data-[loaded=true]:overflow-visible","data-[loaded=true]:!bg-transparent","data-[loaded=true]:before:opacity-0 data-[loaded=true]:before:-z-10 data-[loaded=true]:before:animate-none","data-[loaded=true]:after:opacity-0"],content:["opacity-0","group-data-[loaded=true]:opacity-100"]},variants:{disableAnimation:{true:{base:"before:animate-none before:transition-none after:transition-none",content:"transition-none"},false:{base:"transition-background !duration-300",content:"transition-opacity motion-reduce:transition-none !duration-300"}}},defaultVariants:{}}),yk=fr({slots:{base:"group flex flex-col data-[hidden=true]:hidden",label:["absolute","z-10","pointer-events-none","origin-top-left","shrink-0","rtl:origin-top-right","subpixel-antialiased","block","text-small","text-foreground-500"],mainWrapper:"h-full",inputWrapper:"relative w-full inline-flex tap-highlight-transparent flex-row items-center shadow-xs px-3 gap-3",innerWrapper:"inline-flex w-full items-center h-full box-border",input:["w-full font-normal bg-transparent !outline-hidden placeholder:text-foreground-500 focus-visible:outline-hidden","data-[has-start-content=true]:ps-1.5","data-[has-end-content=true]:pe-1.5","data-[type=color]:rounded-none","file:cursor-pointer file:bg-transparent file:border-0","autofill:bg-transparent bg-clip-text"],clearButton:["p-2","-m-2","z-10","absolute","end-3","start-auto","pointer-events-none","appearance-none","outline-hidden","select-none","opacity-0","cursor-pointer","active:!opacity-70","rounded-full",...Sh],helperWrapper:"hidden group-data-[has-helper=true]:flex p-1 relative flex-col gap-1.5",description:"text-tiny text-foreground-400",errorMessage:"text-tiny text-danger"},variants:{variant:{flat:{inputWrapper:["bg-default-100","data-[hover=true]:bg-default-200","group-data-[focus=true]:bg-default-100"]},faded:{inputWrapper:["bg-default-100","border-medium","border-default-200","data-[hover=true]:border-default-400 focus-within:border-default-400"],value:"group-data-[has-value=true]:text-default-foreground"},bordered:{inputWrapper:["border-medium","border-default-200","data-[hover=true]:border-default-400","group-data-[focus=true]:border-default-foreground"]},underlined:{inputWrapper:["!px-1","!pb-0","!gap-0","relative","box-border","border-b-medium","shadow-[0_1px_0px_0_rgba(0,0,0,0.05)]","border-default-200","!rounded-none","hover:border-default-300","after:content-['']","after:w-0","after:origin-center","after:bg-default-foreground","after:absolute","after:left-1/2","after:-translate-x-1/2","after:-bottom-[2px]","after:h-[2px]","group-data-[focus=true]:after:w-full"],innerWrapper:"pb-1",label:"group-data-[filled-within=true]:text-foreground"}},color:{default:{},primary:{},secondary:{},success:{},warning:{},danger:{}},size:{sm:{label:"text-tiny",inputWrapper:"h-8 min-h-8 px-2 rounded-small",input:"text-small",clearButton:"text-medium"},md:{inputWrapper:"h-10 min-h-10 rounded-medium",input:"text-small",clearButton:"text-large hover:!opacity-100"},lg:{label:"text-medium",inputWrapper:"h-12 min-h-12 rounded-large",input:"text-medium",clearButton:"text-large hover:!opacity-100"}},radius:{none:{inputWrapper:"rounded-none"},sm:{inputWrapper:"rounded-small"},md:{inputWrapper:"rounded-medium"},lg:{inputWrapper:"rounded-large"},full:{inputWrapper:"rounded-full"}},labelPlacement:{outside:{mainWrapper:"flex flex-col"},"outside-left":{base:"flex-row items-center flex-nowrap data-[has-helper=true]:items-start",inputWrapper:"flex-1",mainWrapper:"flex flex-col",label:"relative text-foreground pe-2 ps-2 pointer-events-auto"},"outside-top":{mainWrapper:"flex flex-col",label:"relative text-foreground pb-2 pointer-events-auto"},inside:{label:"cursor-text",inputWrapper:"flex-col items-start justify-center gap-0",innerWrapper:"group-data-[has-label=true]:items-end"}},fullWidth:{true:{base:"w-full"},false:{}},isClearable:{true:{input:"peer pe-6 input-search-cancel-button-none",clearButton:["peer-data-[filled=true]:pointer-events-auto","peer-data-[filled=true]:opacity-70 peer-data-[filled=true]:block","peer-data-[filled=true]:scale-100"]}},isDisabled:{true:{base:"opacity-disabled pointer-events-none",inputWrapper:"pointer-events-none",label:"pointer-events-none"}},isInvalid:{true:{label:"!text-danger",input:"!placeholder:text-danger !text-danger"}},isRequired:{true:{label:"after:content-['*'] after:text-danger after:ms-0.5"}},isMultiline:{true:{label:"relative",inputWrapper:"!h-auto",innerWrapper:"items-start group-data-[has-label=true]:items-start",input:"resize-none data-[hide-scroll=true]:scrollbar-hide",clearButton:"absolute top-2 right-2 rtl:right-auto rtl:left-2 z-10"}},disableAnimation:{true:{input:"transition-none",inputWrapper:"transition-none",label:"transition-none"},false:{inputWrapper:"transition-background motion-reduce:transition-none !duration-150",label:["will-change-auto","!duration-200","!ease-out","motion-reduce:transition-none","transition-[transform,color,left,opacity,translate,scale]"],clearButton:["scale-90","ease-out","duration-150","transition-[opacity,transform]","motion-reduce:transition-none","motion-reduce:scale-100"]}}},defaultVariants:{variant:"flat",color:"default",size:"md",fullWidth:!0,isDisabled:!1,isMultiline:!1},compoundVariants:[{variant:"flat",color:"default",class:{input:"group-data-[has-value=true]:text-default-foreground"}},{variant:"flat",color:"primary",class:{inputWrapper:["bg-primary-100","data-[hover=true]:bg-primary-50","text-primary","group-data-[focus=true]:bg-primary-50","placeholder:text-primary"],input:"placeholder:text-primary",label:"text-primary"}},{variant:"flat",color:"secondary",class:{inputWrapper:["bg-secondary-100","text-secondary","data-[hover=true]:bg-secondary-50","group-data-[focus=true]:bg-secondary-50","placeholder:text-secondary"],input:"placeholder:text-secondary",label:"text-secondary"}},{variant:"flat",color:"success",class:{inputWrapper:["bg-success-100","text-success-600","dark:text-success","placeholder:text-success-600","dark:placeholder:text-success","data-[hover=true]:bg-success-50","group-data-[focus=true]:bg-success-50"],input:"placeholder:text-success-600 dark:placeholder:text-success",label:"text-success-600 dark:text-success"}},{variant:"flat",color:"warning",class:{inputWrapper:["bg-warning-100","text-warning-600","dark:text-warning","placeholder:text-warning-600","dark:placeholder:text-warning","data-[hover=true]:bg-warning-50","group-data-[focus=true]:bg-warning-50"],input:"placeholder:text-warning-600 dark:placeholder:text-warning",label:"text-warning-600 dark:text-warning"}},{variant:"flat",color:"danger",class:{inputWrapper:["bg-danger-100","text-danger","dark:text-danger-500","placeholder:text-danger","dark:placeholder:text-danger-500","data-[hover=true]:bg-danger-50","group-data-[focus=true]:bg-danger-50"],input:"placeholder:text-danger dark:placeholder:text-danger-500",label:"text-danger dark:text-danger-500"}},{variant:"faded",color:"primary",class:{label:"text-primary",inputWrapper:"data-[hover=true]:border-primary focus-within:border-primary"}},{variant:"faded",color:"secondary",class:{label:"text-secondary",inputWrapper:"data-[hover=true]:border-secondary focus-within:border-secondary"}},{variant:"faded",color:"success",class:{label:"text-success",inputWrapper:"data-[hover=true]:border-success focus-within:border-success"}},{variant:"faded",color:"warning",class:{label:"text-warning",inputWrapper:"data-[hover=true]:border-warning focus-within:border-warning"}},{variant:"faded",color:"danger",class:{label:"text-danger",inputWrapper:"data-[hover=true]:border-danger focus-within:border-danger"}},{variant:"underlined",color:"default",class:{input:"group-data-[has-value=true]:text-foreground"}},{variant:"underlined",color:"primary",class:{inputWrapper:"after:bg-primary",label:"text-primary"}},{variant:"underlined",color:"secondary",class:{inputWrapper:"after:bg-secondary",label:"text-secondary"}},{variant:"underlined",color:"success",class:{inputWrapper:"after:bg-success",label:"text-success"}},{variant:"underlined",color:"warning",class:{inputWrapper:"after:bg-warning",label:"text-warning"}},{variant:"underlined",color:"danger",class:{inputWrapper:"after:bg-danger",label:"text-danger"}},{variant:"bordered",color:"primary",class:{inputWrapper:"group-data-[focus=true]:border-primary",label:"text-primary"}},{variant:"bordered",color:"secondary",class:{inputWrapper:"group-data-[focus=true]:border-secondary",label:"text-secondary"}},{variant:"bordered",color:"success",class:{inputWrapper:"group-data-[focus=true]:border-success",label:"text-success"}},{variant:"bordered",color:"warning",class:{inputWrapper:"group-data-[focus=true]:border-warning",label:"text-warning"}},{variant:"bordered",color:"danger",class:{inputWrapper:"group-data-[focus=true]:border-danger",label:"text-danger"}},{labelPlacement:"inside",color:"default",class:{label:"group-data-[filled-within=true]:text-default-600"}},{labelPlacement:"outside",color:"default",class:{label:"group-data-[filled-within=true]:text-foreground"}},{radius:"full",size:["sm"],class:{inputWrapper:"px-3"}},{radius:"full",size:"md",class:{inputWrapper:"px-4"}},{radius:"full",size:"lg",class:{inputWrapper:"px-5"}},{disableAnimation:!1,variant:["faded","bordered"],class:{inputWrapper:"transition-colors motion-reduce:transition-none"}},{disableAnimation:!1,variant:"underlined",class:{inputWrapper:"after:transition-width motion-reduce:after:transition-none"}},{variant:["flat","faded"],class:{inputWrapper:[...$_]}},{isInvalid:!0,variant:"flat",class:{inputWrapper:["!bg-danger-50","data-[hover=true]:!bg-danger-100","group-data-[focus=true]:!bg-danger-50"]}},{isInvalid:!0,variant:"bordered",class:{inputWrapper:"!border-danger group-data-[focus=true]:!border-danger"}},{isInvalid:!0,variant:"underlined",class:{inputWrapper:"after:!bg-danger"}},{labelPlacement:"inside",size:"sm",class:{inputWrapper:"h-12 py-1.5 px-3"}},{labelPlacement:"inside",size:"md",class:{inputWrapper:"h-14 py-2"}},{labelPlacement:"inside",size:"lg",class:{inputWrapper:"h-16 py-2.5 gap-0"}},{labelPlacement:"inside",size:"sm",variant:["bordered","faded"],class:{inputWrapper:"py-1"}},{labelPlacement:["inside","outside"],class:{label:["group-data-[filled-within=true]:pointer-events-auto"]}},{labelPlacement:"outside",isMultiline:!1,class:{base:"relative justify-end",label:["pb-0","z-20","top-1/2","-translate-y-1/2","group-data-[filled-within=true]:start-0"]}},{labelPlacement:["inside"],class:{label:["group-data-[filled-within=true]:scale-85"]}},{labelPlacement:["inside"],variant:"flat",class:{innerWrapper:"pb-0.5"}},{variant:"underlined",size:"sm",class:{innerWrapper:"pb-1"}},{variant:"underlined",size:["md","lg"],class:{innerWrapper:"pb-1.5"}},{labelPlacement:"inside",size:["sm","md"],class:{label:"text-small"}},{labelPlacement:"inside",isMultiline:!1,size:"sm",class:{label:["group-data-[filled-within=true]:-translate-y-[calc(50%_+_var(--heroui-font-size-tiny)/2_-_8px)]"]}},{labelPlacement:"inside",isMultiline:!1,size:"md",class:{label:["group-data-[filled-within=true]:-translate-y-[calc(50%_+_var(--heroui-font-size-small)/2_-_6px)]"]}},{labelPlacement:"inside",isMultiline:!1,size:"lg",class:{label:["text-medium","group-data-[filled-within=true]:-translate-y-[calc(50%_+_var(--heroui-font-size-small)/2_-_8px)]"]}},{labelPlacement:"inside",variant:["faded","bordered"],isMultiline:!1,size:"sm",class:{label:["group-data-[filled-within=true]:-translate-y-[calc(50%_+_var(--heroui-font-size-tiny)/2_-_8px_-_var(--heroui-border-width-medium))]"]}},{labelPlacement:"inside",variant:["faded","bordered"],isMultiline:!1,size:"md",class:{label:["group-data-[filled-within=true]:-translate-y-[calc(50%_+_var(--heroui-font-size-small)/2_-_6px_-_var(--heroui-border-width-medium))]"]}},{labelPlacement:"inside",variant:["faded","bordered"],isMultiline:!1,size:"lg",class:{label:["text-medium","group-data-[filled-within=true]:-translate-y-[calc(50%_+_var(--heroui-font-size-small)/2_-_8px_-_var(--heroui-border-width-medium))]"]}},{labelPlacement:"inside",variant:"underlined",isMultiline:!1,size:"sm",class:{label:["group-data-[filled-within=true]:-translate-y-[calc(50%_+_var(--heroui-font-size-tiny)/2_-_5px)]"]}},{labelPlacement:"inside",variant:"underlined",isMultiline:!1,size:"md",class:{label:["group-data-[filled-within=true]:-translate-y-[calc(50%_+_var(--heroui-font-size-small)/2_-_3.5px)]"]}},{labelPlacement:"inside",variant:"underlined",size:"lg",isMultiline:!1,class:{label:["text-medium","group-data-[filled-within=true]:-translate-y-[calc(50%_+_var(--heroui-font-size-small)/2_-_4px)]"]}},{labelPlacement:"outside",size:"sm",isMultiline:!1,class:{label:["start-2","text-tiny","group-data-[filled-within=true]:-translate-y-[calc(100%_+_var(--heroui-font-size-tiny)/2_+_16px)]"],base:"data-[has-label=true]:mt-[calc(var(--heroui-font-size-small)_+_8px)]"}},{labelPlacement:"outside",size:"md",isMultiline:!1,class:{label:["start-3","end-auto","text-small","group-data-[filled-within=true]:-translate-y-[calc(100%_+_var(--heroui-font-size-small)/2_+_20px)]"],base:"data-[has-label=true]:mt-[calc(var(--heroui-font-size-small)_+_10px)]"}},{labelPlacement:"outside",size:"lg",isMultiline:!1,class:{label:["start-3","end-auto","text-medium","group-data-[filled-within=true]:-translate-y-[calc(100%_+_var(--heroui-font-size-small)/2_+_24px)]"],base:"data-[has-label=true]:mt-[calc(var(--heroui-font-size-small)_+_12px)]"}},{labelPlacement:"outside-left",size:"sm",class:{label:"group-data-[has-helper=true]:pt-2"}},{labelPlacement:"outside-left",size:"md",class:{label:"group-data-[has-helper=true]:pt-3"}},{labelPlacement:"outside-left",size:"lg",class:{label:"group-data-[has-helper=true]:pt-4"}},{labelPlacement:["outside","outside-left"],isMultiline:!0,class:{inputWrapper:"py-2"}},{labelPlacement:"outside",isMultiline:!0,class:{label:"pb-1.5"}},{labelPlacement:"inside",isMultiline:!0,class:{label:"pb-0.5",input:"pt-0"}},{isMultiline:!0,disableAnimation:!1,class:{input:"transition-height !duration-100 motion-reduce:transition-none"}},{labelPlacement:["inside","outside"],class:{label:["pe-2","max-w-full","text-ellipsis","overflow-hidden"]}},{isMultiline:!0,radius:"full",class:{inputWrapper:"data-[has-multiple-rows=true]:rounded-large"}},{isClearable:!0,isMultiline:!0,class:{clearButton:["group-data-[has-value=true]:opacity-70 group-data-[has-value=true]:block","group-data-[has-value=true]:scale-100","group-data-[has-value=true]:pointer-events-auto"]}}]}),bk=fr({slots:{wrapper:["flex","w-screen","h-[100dvh]","fixed","inset-0","z-50","overflow-x-auto","justify-center","h-[--visual-viewport-height]"],base:["flex","flex-col","relative","bg-white","z-50","w-full","box-border","bg-content1","outline-hidden","mx-1","my-1","sm:mx-6","sm:my-16"],backdrop:"z-50",header:"flex py-4 px-6 flex-initial text-large font-semibold",body:"flex flex-1 flex-col gap-3 px-6 py-2",footer:"flex flex-row gap-2 px-6 py-4 justify-end",closeButton:["absolute","appearance-none","outline-hidden","select-none","top-1","end-1","p-2","text-foreground-500","rounded-full","hover:bg-default-100","active:bg-default-200","tap-highlight-transparent",...Sh]},variants:{size:{xs:{base:"max-w-xs"},sm:{base:"max-w-sm"},md:{base:"max-w-md"},lg:{base:"max-w-lg"},xl:{base:"max-w-xl"},"2xl":{base:"max-w-2xl"},"3xl":{base:"max-w-3xl"},"4xl":{base:"max-w-4xl"},"5xl":{base:"max-w-5xl"},full:{base:"my-0 mx-0 sm:mx-0 sm:my-0 max-w-full h-[100dvh] min-h-[100dvh] !rounded-none"}},radius:{none:{base:"rounded-none"},sm:{base:"rounded-small"},md:{base:"rounded-medium"},lg:{base:"rounded-large"}},placement:{auto:{wrapper:"items-end sm:items-center"},center:{wrapper:"items-center sm:items-center"},top:{wrapper:"items-start sm:items-start"},"top-center":{wrapper:"items-start sm:items-center"},bottom:{wrapper:"items-end sm:items-end"},"bottom-center":{wrapper:"items-end sm:items-center"}},shadow:{none:{base:"shadow-none"},sm:{base:"shadow-small"},md:{base:"shadow-medium"},lg:{base:"shadow-large"}},backdrop:{transparent:{backdrop:"hidden"},opaque:{backdrop:"bg-overlay/50 backdrop-opacity-disabled"},blur:{backdrop:"backdrop-blur-md backdrop-saturate-150 bg-overlay/30"}},scrollBehavior:{normal:{base:"overflow-y-hidden"},inside:{base:"max-h-[calc(100%_-_8rem)]",body:"overflow-y-auto"},outside:{wrapper:"items-start sm:items-start overflow-y-auto",base:"my-16"}},disableAnimation:{false:{wrapper:["[--scale-enter:100%]","[--scale-exit:100%]","[--slide-enter:0px]","[--slide-exit:80px]","sm:[--scale-enter:100%]","sm:[--scale-exit:103%]","sm:[--slide-enter:0px]","sm:[--slide-exit:0px]"]}}},defaultVariants:{size:"md",radius:"lg",shadow:"sm",placement:"auto",backdrop:"opaque",scrollBehavior:"normal"},compoundVariants:[{backdrop:["opaque","blur"],class:{backdrop:"w-screen h-screen fixed inset-0"}}]}),EO=fr({base:"shrink-0 bg-divider border-none",variants:{orientation:{horizontal:"w-full h-divider",vertical:"h-full w-divider"}},defaultVariants:{orientation:"horizontal"}}),PO=fr({base:"flex flex-col gap-2 items-start"}),xk=fr({slots:{wrapper:"relative shadow-black/5",zoomedWrapper:"relative overflow-hidden rounded-inherit",img:"relative z-10 opacity-0 shadow-black/5 data-[loaded=true]:opacity-100",blurredImg:["absolute","z-0","inset-0","w-full","h-full","object-cover","filter","blur-lg","scale-105","saturate-150","opacity-30","translate-y-1"]},variants:{radius:{none:{},sm:{},md:{},lg:{},full:{}},shadow:{none:{wrapper:"shadow-none",img:"shadow-none"},sm:{wrapper:"shadow-small",img:"shadow-small"},md:{wrapper:"shadow-medium",img:"shadow-medium"},lg:{wrapper:"shadow-large",img:"shadow-large"}},isZoomed:{true:{img:["object-cover","transform","hover:scale-125"]}},showSkeleton:{true:{wrapper:["group","relative","overflow-hidden","bg-content3 dark:bg-content2"],img:"opacity-0"}},disableAnimation:{true:{img:"transition-none"},false:{img:"transition-transform-opacity motion-reduce:transition-none !duration-300"}}},defaultVariants:{radius:"lg",shadow:"none",isZoomed:!1,isBlurred:!1,showSkeleton:!1},compoundVariants:[{showSkeleton:!0,disableAnimation:!1,class:{wrapper:["before:opacity-100","before:absolute","before:inset-0","before:-translate-x-full","before:animate-shimmer","before:border-t","before:border-content4/30","before:bg-gradient-to-r","before:from-transparent","before:via-content4","dark:before:via-default-700/10","before:to-transparent","after:opacity-100","after:absolute","after:inset-0","after:-z-10","after:bg-content3","dark:after:bg-content2"]}}],compoundSlots:[{slots:["wrapper","img","blurredImg","zoomedWrapper"],radius:"none",class:"rounded-none"},{slots:["wrapper","img","blurredImg","zoomedWrapper"],radius:"full",class:"rounded-full"},{slots:["wrapper","img","blurredImg","zoomedWrapper"],radius:"sm",class:"rounded-small"},{slots:["wrapper","img","blurredImg","zoomedWrapper"],radius:"md",class:"rounded-md"},{slots:["wrapper","img","blurredImg","zoomedWrapper"],radius:"lg",class:"rounded-large"}]}),TO=fr({base:["z-0","group","relative","inline-flex","items-center","justify-center","box-border","appearance-none","outline-hidden","select-none","whitespace-nowrap","min-w-max","font-normal","subpixel-antialiased","overflow-hidden","tap-highlight-transparent","transform-gpu data-[pressed=true]:scale-[0.97]","cursor-pointer",...Sh],variants:{variant:{solid:"",bordered:"border-medium bg-transparent",light:"bg-transparent",flat:"",faded:"border-medium",shadow:"",ghost:"border-medium bg-transparent"},size:{sm:"px-3 min-w-16 h-8 text-tiny gap-2 rounded-small",md:"px-4 min-w-20 h-10 text-small gap-2 rounded-medium",lg:"px-6 min-w-24 h-12 text-medium gap-3 rounded-large"},color:{default:"",primary:"",secondary:"",success:"",warning:"",danger:""},radius:{none:"rounded-none",sm:"rounded-small",md:"rounded-medium",lg:"rounded-large",full:"rounded-full"},fullWidth:{true:"w-full"},isDisabled:{true:"opacity-disabled pointer-events-none"},isInGroup:{true:"[&:not(:first-child):not(:last-child)]:rounded-none"},isIconOnly:{true:"px-0 !gap-0",false:"[&>svg]:max-w-[theme(spacing.8)]"},disableAnimation:{true:"!transition-none data-[pressed=true]:scale-100",false:"transition-transform-colors-opacity motion-reduce:transition-none"}},defaultVariants:{size:"md",variant:"solid",color:"default",fullWidth:!1,isDisabled:!1,isInGroup:!1},compoundVariants:[{variant:"solid",color:"default",class:et.solid.default},{variant:"solid",color:"primary",class:et.solid.primary},{variant:"solid",color:"secondary",class:et.solid.secondary},{variant:"solid",color:"success",class:et.solid.success},{variant:"solid",color:"warning",class:et.solid.warning},{variant:"solid",color:"danger",class:et.solid.danger},{variant:"shadow",color:"default",class:et.shadow.default},{variant:"shadow",color:"primary",class:et.shadow.primary},{variant:"shadow",color:"secondary",class:et.shadow.secondary},{variant:"shadow",color:"success",class:et.shadow.success},{variant:"shadow",color:"warning",class:et.shadow.warning},{variant:"shadow",color:"danger",class:et.shadow.danger},{variant:"bordered",color:"default",class:et.bordered.default},{variant:"bordered",color:"primary",class:et.bordered.primary},{variant:"bordered",color:"secondary",class:et.bordered.secondary},{variant:"bordered",color:"success",class:et.bordered.success},{variant:"bordered",color:"warning",class:et.bordered.warning},{variant:"bordered",color:"danger",class:et.bordered.danger},{variant:"flat",color:"default",class:et.flat.default},{variant:"flat",color:"primary",class:et.flat.primary},{variant:"flat",color:"secondary",class:et.flat.secondary},{variant:"flat",color:"success",class:et.flat.success},{variant:"flat",color:"warning",class:et.flat.warning},{variant:"flat",color:"danger",class:et.flat.danger},{variant:"faded",color:"default",class:et.faded.default},{variant:"faded",color:"primary",class:et.faded.primary},{variant:"faded",color:"secondary",class:et.faded.secondary},{variant:"faded",color:"success",class:et.faded.success},{variant:"faded",color:"warning",class:et.faded.warning},{variant:"faded",color:"danger",class:et.faded.danger},{variant:"light",color:"default",class:[et.light.default,"data-[hover=true]:bg-default/40"]},{variant:"light",color:"primary",class:[et.light.primary,"data-[hover=true]:bg-primary/20"]},{variant:"light",color:"secondary",class:[et.light.secondary,"data-[hover=true]:bg-secondary/20"]},{variant:"light",color:"success",class:[et.light.success,"data-[hover=true]:bg-success/20"]},{variant:"light",color:"warning",class:[et.light.warning,"data-[hover=true]:bg-warning/20"]},{variant:"light",color:"danger",class:[et.light.danger,"data-[hover=true]:bg-danger/20"]},{variant:"ghost",color:"default",class:[et.ghost.default,"data-[hover=true]:!bg-default"]},{variant:"ghost",color:"primary",class:[et.ghost.primary,"data-[hover=true]:!bg-primary data-[hover=true]:!text-primary-foreground"]},{variant:"ghost",color:"secondary",class:[et.ghost.secondary,"data-[hover=true]:!bg-secondary data-[hover=true]:!text-secondary-foreground"]},{variant:"ghost",color:"success",class:[et.ghost.success,"data-[hover=true]:!bg-success data-[hover=true]:!text-success-foreground"]},{variant:"ghost",color:"warning",class:[et.ghost.warning,"data-[hover=true]:!bg-warning data-[hover=true]:!text-warning-foreground"]},{variant:"ghost",color:"danger",class:[et.ghost.danger,"data-[hover=true]:!bg-danger data-[hover=true]:!text-danger-foreground"]},{isInGroup:!0,class:"rounded-none first:rounded-s-medium last:rounded-e-medium"},{isInGroup:!0,size:"sm",class:"rounded-none first:rounded-s-small last:rounded-e-small"},{isInGroup:!0,size:"md",class:"rounded-none first:rounded-s-medium last:rounded-e-medium"},{isInGroup:!0,size:"lg",class:"rounded-none first:rounded-s-large last:rounded-e-large"},{isInGroup:!0,isRounded:!0,class:"rounded-none first:rounded-s-full last:rounded-e-full"},{isInGroup:!0,radius:"none",class:"rounded-none first:rounded-s-none last:rounded-e-none"},{isInGroup:!0,radius:"sm",class:"rounded-none first:rounded-s-small last:rounded-e-small"},{isInGroup:!0,radius:"md",class:"rounded-none first:rounded-s-medium last:rounded-e-medium"},{isInGroup:!0,radius:"lg",class:"rounded-none first:rounded-s-large last:rounded-e-large"},{isInGroup:!0,radius:"full",class:"rounded-none first:rounded-s-full last:rounded-e-full"},{isInGroup:!0,variant:["ghost","bordered"],color:"default",className:lf.default},{isInGroup:!0,variant:["ghost","bordered"],color:"primary",className:lf.primary},{isInGroup:!0,variant:["ghost","bordered"],color:"secondary",className:lf.secondary},{isInGroup:!0,variant:["ghost","bordered"],color:"success",className:lf.success},{isInGroup:!0,variant:["ghost","bordered"],color:"warning",className:lf.warning},{isInGroup:!0,variant:["ghost","bordered"],color:"danger",className:lf.danger},{isIconOnly:!0,size:"sm",class:"min-w-8 w-8 h-8"},{isIconOnly:!0,size:"md",class:"min-w-10 w-10 h-10"},{isIconOnly:!0,size:"lg",class:"min-w-12 w-12 h-12"},{variant:["solid","faded","flat","bordered","shadow"],class:"data-[hover=true]:opacity-hover"}]});fr({base:"inline-flex items-center justify-center h-auto",variants:{fullWidth:{true:"w-full"}},defaultVariants:{fullWidth:!1}});var _O=fr({slots:{base:"group relative max-w-fit inline-flex items-center justify-start cursor-pointer tap-highlight-transparent p-2 -m-2 select-none",wrapper:["relative","inline-flex","items-center","justify-center","shrink-0","overflow-hidden","before:content-['']","before:absolute","before:inset-0","before:border-solid","before:border-2","before:box-border","before:border-default","after:content-['']","after:absolute","after:inset-0","after:scale-50","after:opacity-0","after:origin-center","group-data-[selected=true]:after:scale-100","group-data-[selected=true]:after:opacity-100","group-data-[hover=true]:before:bg-default-100",...$_],hiddenInput:SO,icon:"z-10 w-4 h-3 opacity-0 group-data-[selected=true]:opacity-100 pointer-events-none",label:"relative text-foreground select-none"},variants:{color:{default:{wrapper:"after:bg-default after:text-default-foreground text-default-foreground"},primary:{wrapper:"after:bg-primary after:text-primary-foreground text-primary-foreground"},secondary:{wrapper:"after:bg-secondary after:text-secondary-foreground text-secondary-foreground"},success:{wrapper:"after:bg-success after:text-success-foreground text-success-foreground"},warning:{wrapper:"after:bg-warning after:text-warning-foreground text-warning-foreground"},danger:{wrapper:"after:bg-danger after:text-danger-foreground text-danger-foreground"}},size:{sm:{wrapper:["w-4 h-4 me-2","rounded-[calc(var(--heroui-radius-medium)*0.5)]","before:rounded-[calc(var(--heroui-radius-medium)*0.5)]","after:rounded-[calc(var(--heroui-radius-medium)*0.5)]"],label:"text-small",icon:"w-3 h-2"},md:{wrapper:["w-5 h-5 me-2","rounded-[calc(var(--heroui-radius-medium)*0.6)]","before:rounded-[calc(var(--heroui-radius-medium)*0.6)]","after:rounded-[calc(var(--heroui-radius-medium)*0.6)]"],label:"text-medium",icon:"w-4 h-3"},lg:{wrapper:["w-6 h-6 me-2","rounded-[calc(var(--heroui-radius-medium)*0.7)]","before:rounded-[calc(var(--heroui-radius-medium)*0.7)]","after:rounded-[calc(var(--heroui-radius-medium)*0.7)]"],label:"text-large",icon:"w-5 h-4"}},radius:{none:{wrapper:"rounded-none before:rounded-none after:rounded-none"},sm:{wrapper:["rounded-[calc(var(--heroui-radius-medium)*0.5)]","before:rounded-[calc(var(--heroui-radius-medium)*0.5)]","after:rounded-[calc(var(--heroui-radius-medium)*0.5)]"]},md:{wrapper:["rounded-[calc(var(--heroui-radius-medium)*0.6)]","before:rounded-[calc(var(--heroui-radius-medium)*0.6)]","after:rounded-[calc(var(--heroui-radius-medium)*0.6)]"]},lg:{wrapper:["rounded-[calc(var(--heroui-radius-medium)*0.7)]","before:rounded-[calc(var(--heroui-radius-medium)*0.7)]","after:rounded-[calc(var(--heroui-radius-medium)*0.7)]"]},full:{wrapper:"rounded-full before:rounded-full after:rounded-full"}},lineThrough:{true:{label:["inline-flex","items-center","justify-center","before:content-['']","before:absolute","before:bg-foreground","before:w-0","before:h-0.5","group-data-[selected=true]:opacity-60","group-data-[selected=true]:before:w-full"]}},isDisabled:{true:{base:"opacity-disabled pointer-events-none"}},isInvalid:{true:{wrapper:"before:border-danger",label:"text-danger"}},disableAnimation:{true:{wrapper:"transition-none",icon:"transition-none",label:"transition-none"},false:{wrapper:["before:transition-colors","group-data-[pressed=true]:scale-95","transition-transform","after:transition-transform-opacity","after:!ease-linear","after:!duration-200","motion-reduce:transition-none"],icon:"transition-opacity motion-reduce:transition-none",label:"transition-colors-opacity before:transition-width motion-reduce:transition-none"}}},defaultVariants:{color:"primary",size:"md",isDisabled:!1,lineThrough:!1}});fr({slots:{base:"relative flex flex-col gap-2",label:"relative text-medium text-foreground-500",wrapper:"flex flex-col flex-wrap gap-2 data-[orientation=horizontal]:flex-row",description:"text-small text-foreground-400",errorMessage:"text-small text-danger"},variants:{isRequired:{true:{label:"after:content-['*'] after:text-danger after:ml-0.5"}},isInvalid:{true:{description:"text-danger"}},disableAnimation:{true:{},false:{description:"transition-colors !duration-150 motion-reduce:transition-none"}}},defaultVariants:{isInvalid:!1,isRequired:!1}});var IO=fr({base:"px-2",variants:{variant:{light:"",shadow:"px-4 shadow-medium rounded-medium bg-content1",bordered:"px-4 border-medium border-divider rounded-medium",splitted:"flex flex-col gap-2"},fullWidth:{true:"w-full"}},defaultVariants:{variant:"light",fullWidth:!0}}),$O=fr({slots:{base:"",heading:"",trigger:["flex py-4 w-full h-full gap-3 outline-hidden items-center tap-highlight-transparent",...Sh],startContent:"shrink-0",indicator:"text-default-400",titleWrapper:"flex-1 flex flex-col text-start",title:"text-foreground text-medium",subtitle:"text-small text-foreground-500 font-normal",content:"py-2"},variants:{variant:{splitted:{base:"px-4 bg-content1 shadow-medium rounded-medium"}},isCompact:{true:{trigger:"py-2",title:"text-medium",subtitle:"text-small",indicator:"text-medium",content:"py-1"}},isDisabled:{true:{base:"opacity-disabled pointer-events-none"}},hideIndicator:{true:{indicator:"hidden"}},disableAnimation:{true:{content:"hidden data-[open=true]:block"},false:{indicator:"transition-transform",trigger:"transition-opacity"}},disableIndicatorAnimation:{true:{indicator:"transition-none"},false:{indicator:"rotate-0 data-[open=true]:-rotate-90 rtl:-rotate-180 rtl:data-[open=true]:-rotate-90"}}},defaultVariants:{size:"md",radius:"lg",isDisabled:!1,hideIndicator:!1,disableIndicatorAnimation:!1}});function A_(e){var t,n,r="";if(typeof e=="string"||typeof e=="number")r+=e;else if(typeof e=="object")if(Array.isArray(e))for(t=0;t0){let d=function(h){return Promise.all(h.map(m=>Promise.resolve(m).then(g=>({status:"fulfilled",value:g}),g=>({status:"rejected",reason:g}))))};document.getElementsByTagName("link");const l=document.querySelector("meta[property=csp-nonce]"),c=l?.nonce||l?.getAttribute("nonce");i=d(n.map(h=>{if(h=MO(h),h in wk)return;wk[h]=!0;const m=h.endsWith(".css"),g=m?'[rel="stylesheet"]':"";if(document.querySelector(`link[href="${h}"]${g}`))return;const b=document.createElement("link");if(b.rel=m?"stylesheet":LO,m||(b.as="script"),b.crossOrigin="",b.href=h,c&&b.setAttribute("nonce",c),document.head.appendChild(b),m)return new Promise((x,k)=>{b.addEventListener("load",x),b.addEventListener("error",()=>k(new Error(`Unable to preload CSS for ${h}`)))})}))}function s(l){const c=new Event("vite:preloadError",{cancelable:!0});if(c.payload=l,window.dispatchEvent(c),!c.defaultPrevented)throw l}return i.then(l=>{for(const c of l||[])c.status==="rejected"&&s(c.reason);return t().catch(s)})};function DO(e,t){let{elementType:n="button",isDisabled:r,onPress:i,onPressStart:s,onPressEnd:l,onPressUp:c,onPressChange:d,preventFocusOnPress:h,allowFocusWhenDisabled:m,onClick:g,href:b,target:x,rel:k,type:P="button"}=e,_;n==="button"?_={type:P,disabled:r}:_={role:"button",href:n==="a"&&!r?b:void 0,target:n==="a"?x:void 0,type:n==="input"?P:void 0,disabled:n==="input"?r:void 0,"aria-disabled":!r||n==="input"?void 0:r,rel:n==="a"?k:void 0};let{pressProps:T,isPressed:$}=Su({onPressStart:s,onPressEnd:l,onPressChange:d,onPress:i,onPressUp:c,onClick:g,isDisabled:r,preventFocusOnPress:h,ref:t}),{focusableProps:L}=wh(e,t);m&&(L.tabIndex=r?-1:L.tabIndex);let z=Pn(L,T,Iu(e,{labelable:!0}));return{isPressed:$,buttonProps:Pn(_,z,{"aria-haspopup":e["aria-haspopup"],"aria-expanded":e["aria-expanded"],"aria-controls":e["aria-controls"],"aria-pressed":e["aria-pressed"],"aria-current":e["aria-current"]})}}function NO(e,t,n){let{item:r,isDisabled:i}=e,s=r.key,l=t.selectionManager,c=S.useId(),d=S.useId(),h=t.disabledKeys.has(r.key)||i;S.useEffect(()=>{s===t.focusedKey&&document.activeElement!==n.current&&n.current&&Cu(n.current)},[n,s,t.focusedKey]);let m=S.useCallback(P=>{l.canSelectItem(s)&&(l.select(s,P),t.toggleKey(s))},[s,l]);const g=S.useCallback(P=>{l.selectionBehavior==="replace"&&l.extendSelection(P),l.setFocusedKey(P)},[l]),b=S.useCallback(P=>{const T={ArrowDown:()=>{const $=t.collection.getKeyAfter(s);if($&&t.disabledKeys.has($)){const L=t.collection.getKeyAfter($);L&&g(L)}else $&&g($)},ArrowUp:()=>{const $=t.collection.getKeyBefore(s);if($&&t.disabledKeys.has($)){const L=t.collection.getKeyBefore($);L&&g(L)}else $&&g($)},Home:()=>{const $=t.collection.getFirstKey();$&&g($)},End:()=>{const $=t.collection.getLastKey();$&&g($)}}[P.key];T&&(P.preventDefault(),l.canSelectItem(s)&&T(P))},[s,l]);let{buttonProps:x}=DO({id:c,elementType:"button",isDisabled:h,onKeyDown:b,onPress:m},n),k=t.selectionManager.isSelected(r.key);return{buttonProps:{...x,"aria-expanded":k,"aria-controls":k?d:void 0},regionProps:{id:d,role:"region","aria-labelledby":c}}}function Sk(e){return lM()?e.altKey:e.ctrlKey}function Mg(e,t){var n,r;let i=`[data-key="${CSS.escape(String(t))}"]`,s=(n=e.current)===null||n===void 0?void 0:n.dataset.collection;return s&&(i=`[data-collection="${CSS.escape(s)}"]${i}`),(r=e.current)===null||r===void 0?void 0:r.querySelector(i)}const R_=new WeakMap;function FO(e){let t=Pf();return R_.set(e,t),t}function zG(e){return R_.get(e)}const OO=1e3;function zO(e){let{keyboardDelegate:t,selectionManager:n,onTypeSelect:r}=e,i=S.useRef({search:"",timeout:void 0}).current,s=l=>{let c=jO(l.key);if(!(!c||l.ctrlKey||l.metaKey||!l.currentTarget.contains(l.target))){if(c===" "&&i.search.trim().length>0&&(l.preventDefault(),"continuePropagation"in l||l.stopPropagation()),i.search+=c,t.getKeyForSearch!=null){let d=t.getKeyForSearch(i.search,n.focusedKey);d==null&&(d=t.getKeyForSearch(i.search)),d!=null&&(n.setFocusedKey(d),r&&r(d))}clearTimeout(i.timeout),i.timeout=setTimeout(()=>{i.search=""},OO)}};return{typeSelectProps:{onKeyDownCapture:t.getKeyForSearch?s:void 0}}}function jO(e){return e.length===1||!/^[A-Z]/i.test(e)?e:""}function BO(e){let{selectionManager:t,keyboardDelegate:n,ref:r,autoFocus:i=!1,shouldFocusWrap:s=!1,disallowEmptySelection:l=!1,disallowSelectAll:c=!1,escapeKeyBehavior:d="clearSelection",selectOnFocus:h=t.selectionBehavior==="replace",disallowTypeAhead:m=!1,shouldUseVirtualFocus:g,allowsTabNavigation:b=!1,isVirtualized:x,scrollRef:k=r,linkBehavior:P="action"}=e,{direction:_}=mh(),T=ux(),$=q=>{var V;if(q.altKey&&q.key==="Tab"&&q.preventDefault(),!(!((V=r.current)===null||V===void 0)&&V.contains(q.target)))return;const se=(_e,mt)=>{if(_e!=null){if(t.isLink(_e)&&P==="selection"&&h&&!Sk(q)){ME.flushSync(()=>{t.setFocusedKey(_e,mt)});let pt=Mg(r,_e),Vt=t.getItemProps(_e);pt&&T.open(pt,q,Vt.href,Vt.routerOptions);return}if(t.setFocusedKey(_e,mt),t.isLink(_e)&&P==="override")return;q.shiftKey&&t.selectionMode==="multiple"?t.extendSelection(_e):h&&!Sk(q)&&t.replaceSelection(_e)}};switch(q.key){case"ArrowDown":if(n.getKeyBelow){var R,U,ie;let _e=t.focusedKey!=null?(R=n.getKeyBelow)===null||R===void 0?void 0:R.call(n,t.focusedKey):(U=n.getFirstKey)===null||U===void 0?void 0:U.call(n);_e==null&&s&&(_e=(ie=n.getFirstKey)===null||ie===void 0?void 0:ie.call(n,t.focusedKey)),_e!=null&&(q.preventDefault(),se(_e))}break;case"ArrowUp":if(n.getKeyAbove){var O,me,Ce;let _e=t.focusedKey!=null?(O=n.getKeyAbove)===null||O===void 0?void 0:O.call(n,t.focusedKey):(me=n.getLastKey)===null||me===void 0?void 0:me.call(n);_e==null&&s&&(_e=(Ce=n.getLastKey)===null||Ce===void 0?void 0:Ce.call(n,t.focusedKey)),_e!=null&&(q.preventDefault(),se(_e))}break;case"ArrowLeft":if(n.getKeyLeftOf){var ye,Fe,De;let _e=t.focusedKey!=null?(ye=n.getKeyLeftOf)===null||ye===void 0?void 0:ye.call(n,t.focusedKey):null;_e==null&&s&&(_e=_==="rtl"?(Fe=n.getFirstKey)===null||Fe===void 0?void 0:Fe.call(n,t.focusedKey):(De=n.getLastKey)===null||De===void 0?void 0:De.call(n,t.focusedKey)),_e!=null&&(q.preventDefault(),se(_e,_==="rtl"?"first":"last"))}break;case"ArrowRight":if(n.getKeyRightOf){var Te,Xe,lt;let _e=t.focusedKey!=null?(Te=n.getKeyRightOf)===null||Te===void 0?void 0:Te.call(n,t.focusedKey):null;_e==null&&s&&(_e=_==="rtl"?(Xe=n.getLastKey)===null||Xe===void 0?void 0:Xe.call(n,t.focusedKey):(lt=n.getFirstKey)===null||lt===void 0?void 0:lt.call(n,t.focusedKey)),_e!=null&&(q.preventDefault(),se(_e,_==="rtl"?"last":"first"))}break;case"Home":if(n.getFirstKey){if(t.focusedKey===null&&q.shiftKey)return;q.preventDefault();let _e=n.getFirstKey(t.focusedKey,mp(q));t.setFocusedKey(_e),_e!=null&&(mp(q)&&q.shiftKey&&t.selectionMode==="multiple"?t.extendSelection(_e):h&&t.replaceSelection(_e))}break;case"End":if(n.getLastKey){if(t.focusedKey===null&&q.shiftKey)return;q.preventDefault();let _e=n.getLastKey(t.focusedKey,mp(q));t.setFocusedKey(_e),_e!=null&&(mp(q)&&q.shiftKey&&t.selectionMode==="multiple"?t.extendSelection(_e):h&&t.replaceSelection(_e))}break;case"PageDown":if(n.getKeyPageBelow&&t.focusedKey!=null){let _e=n.getKeyPageBelow(t.focusedKey);_e!=null&&(q.preventDefault(),se(_e))}break;case"PageUp":if(n.getKeyPageAbove&&t.focusedKey!=null){let _e=n.getKeyPageAbove(t.focusedKey);_e!=null&&(q.preventDefault(),se(_e))}break;case"a":mp(q)&&t.selectionMode==="multiple"&&c!==!0&&(q.preventDefault(),t.selectAll());break;case"Escape":d==="clearSelection"&&!l&&t.selectedKeys.size!==0&&(q.stopPropagation(),q.preventDefault(),t.clearSelection());break;case"Tab":if(!b){if(q.shiftKey)r.current.focus();else{let _e=Qs(r.current,{tabbable:!0}),mt,pt;do pt=_e.lastChild(),pt&&(mt=pt);while(pt);mt&&!mt.contains(document.activeElement)&&Zl(mt)}break}}},L=S.useRef({top:0,left:0});ug(k,"scroll",x?void 0:()=>{var q,V,se,R;L.current={top:(se=(q=k.current)===null||q===void 0?void 0:q.scrollTop)!==null&&se!==void 0?se:0,left:(R=(V=k.current)===null||V===void 0?void 0:V.scrollLeft)!==null&&R!==void 0?R:0}});let z=q=>{if(t.isFocused){q.currentTarget.contains(q.target)||t.setFocused(!1);return}if(q.currentTarget.contains(q.target)){if(t.setFocused(!0),t.focusedKey==null){var V,se;let ie=me=>{me!=null&&(t.setFocusedKey(me),h&&!t.isSelected(me)&&t.replaceSelection(me))},O=q.relatedTarget;var R,U;O&&q.currentTarget.compareDocumentPosition(O)&Node.DOCUMENT_POSITION_FOLLOWING?ie((R=t.lastSelectedKey)!==null&&R!==void 0?R:(V=n.getLastKey)===null||V===void 0?void 0:V.call(n)):ie((U=t.firstSelectedKey)!==null&&U!==void 0?U:(se=n.getFirstKey)===null||se===void 0?void 0:se.call(n))}else!x&&k.current&&(k.current.scrollTop=L.current.top,k.current.scrollLeft=L.current.left);if(t.focusedKey!=null&&k.current){let ie=Mg(r,t.focusedKey);ie instanceof HTMLElement&&(!ie.contains(document.activeElement)&&!g&&Zl(ie),sh()==="keyboard"&&C1(ie,{containingElement:r.current}))}}},K=q=>{q.currentTarget.contains(q.relatedTarget)||t.setFocused(!1)},M=S.useRef(!1);ug(r,vM,g?q=>{let{detail:V}=q;q.stopPropagation(),t.setFocused(!0),V?.focusStrategy==="first"&&(M.current=!0)}:void 0);let J=jn(()=>{var q,V;let se=(V=(q=n.getFirstKey)===null||q===void 0?void 0:q.call(n))!==null&&V!==void 0?V:null;se==null?(eF(r.current),t.collection.size>0&&(M.current=!1)):(t.setFocusedKey(se),M.current=!1)});w1(()=>{M.current&&J()},[t.collection,J]);let re=jn(()=>{t.collection.size>0&&(M.current=!1)});w1(()=>{re()},[t.focusedKey,re]),ug(r,gM,g?q=>{var V;q.stopPropagation(),t.setFocused(!1),!((V=q.detail)===null||V===void 0)&&V.clearFocusKey&&t.setFocusedKey(null)}:void 0);const ae=S.useRef(i),j=S.useRef(!1);S.useEffect(()=>{if(ae.current){var q,V;let U=null;var se;i==="first"&&(U=(se=(q=n.getFirstKey)===null||q===void 0?void 0:q.call(n))!==null&&se!==void 0?se:null);var R;i==="last"&&(U=(R=(V=n.getLastKey)===null||V===void 0?void 0:V.call(n))!==null&&R!==void 0?R:null);let ie=t.selectedKeys;if(ie.size){for(let O of ie)if(t.canSelectItem(O)){U=O;break}}t.setFocused(!0),t.setFocusedKey(U),U==null&&!g&&r.current&&Cu(r.current),t.collection.size>0&&(ae.current=!1,j.current=!0)}});let B=S.useRef(t.focusedKey),Y=S.useRef(null);S.useEffect(()=>{if(t.isFocused&&t.focusedKey!=null&&(t.focusedKey!==B.current||j.current)&&k.current&&r.current){let q=sh(),V=Mg(r,t.focusedKey);if(!(V instanceof HTMLElement))return;(q==="keyboard"||j.current)&&(Y.current&&cancelAnimationFrame(Y.current),Y.current=requestAnimationFrame(()=>{k.current&&(AE(k.current,V),q!=="virtual"&&C1(V,{containingElement:r.current}))}))}!g&&t.isFocused&&t.focusedKey==null&&B.current!=null&&r.current&&Cu(r.current),B.current=t.focusedKey,j.current=!1}),S.useEffect(()=>()=>{Y.current&&cancelAnimationFrame(Y.current)},[]),ug(r,"react-aria-focus-scope-restore",q=>{q.preventDefault(),t.setFocused(!0)});let te={onKeyDown:$,onFocus:z,onBlur:K,onMouseDown(q){k.current===q.target&&q.preventDefault()}},{typeSelectProps:G}=zO({keyboardDelegate:n,selectionManager:t});m||(te=Pn(G,te));let ce;g||(ce=t.focusedKey==null?0:-1);let Z=FO(t.collection);return{collectionProps:Pn(te,{tabIndex:ce,"data-collection":Z})}}class kk{getItemRect(t){let n=this.ref.current;if(!n)return null;let r=t!=null?Mg(this.ref,t):null;if(!r)return null;let i=n.getBoundingClientRect(),s=r.getBoundingClientRect();return{x:s.left-i.left+n.scrollLeft,y:s.top-i.top+n.scrollTop,width:s.width,height:s.height}}getContentSize(){let t=this.ref.current;var n,r;return{width:(n=t?.scrollWidth)!==null&&n!==void 0?n:0,height:(r=t?.scrollHeight)!==null&&r!==void 0?r:0}}getVisibleRect(){let t=this.ref.current;var n,r,i,s;return{x:(n=t?.scrollLeft)!==null&&n!==void 0?n:0,y:(r=t?.scrollTop)!==null&&r!==void 0?r:0,width:(i=t?.offsetWidth)!==null&&i!==void 0?i:0,height:(s=t?.offsetHeight)!==null&&s!==void 0?s:0}}constructor(t){this.ref=t}}class VO{isDisabled(t){var n;return this.disabledBehavior==="all"&&(((n=t.props)===null||n===void 0?void 0:n.isDisabled)||this.disabledKeys.has(t.key))}findNextNonDisabled(t,n){let r=t;for(;r!=null;){let i=this.collection.getItem(r);if(i?.type==="item"&&!this.isDisabled(i))return r;r=n(r)}return null}getNextKey(t){let n=t;return n=this.collection.getKeyAfter(n),this.findNextNonDisabled(n,r=>this.collection.getKeyAfter(r))}getPreviousKey(t){let n=t;return n=this.collection.getKeyBefore(n),this.findNextNonDisabled(n,r=>this.collection.getKeyBefore(r))}findKey(t,n,r){let i=t,s=this.layoutDelegate.getItemRect(i);if(!s||i==null)return null;let l=s;do{if(i=n(i),i==null)break;s=this.layoutDelegate.getItemRect(i)}while(s&&r(l,s)&&i!=null);return i}isSameRow(t,n){return t.y===n.y||t.x!==n.x}isSameColumn(t,n){return t.x===n.x||t.y!==n.y}getKeyBelow(t){return this.layout==="grid"&&this.orientation==="vertical"?this.findKey(t,n=>this.getNextKey(n),this.isSameRow):this.getNextKey(t)}getKeyAbove(t){return this.layout==="grid"&&this.orientation==="vertical"?this.findKey(t,n=>this.getPreviousKey(n),this.isSameRow):this.getPreviousKey(t)}getNextColumn(t,n){return n?this.getPreviousKey(t):this.getNextKey(t)}getKeyRightOf(t){let n=this.direction==="ltr"?"getKeyRightOf":"getKeyLeftOf";return this.layoutDelegate[n]?(t=this.layoutDelegate[n](t),this.findNextNonDisabled(t,r=>this.layoutDelegate[n](r))):this.layout==="grid"?this.orientation==="vertical"?this.getNextColumn(t,this.direction==="rtl"):this.findKey(t,r=>this.getNextColumn(r,this.direction==="rtl"),this.isSameColumn):this.orientation==="horizontal"?this.getNextColumn(t,this.direction==="rtl"):null}getKeyLeftOf(t){let n=this.direction==="ltr"?"getKeyLeftOf":"getKeyRightOf";return this.layoutDelegate[n]?(t=this.layoutDelegate[n](t),this.findNextNonDisabled(t,r=>this.layoutDelegate[n](r))):this.layout==="grid"?this.orientation==="vertical"?this.getNextColumn(t,this.direction==="ltr"):this.findKey(t,r=>this.getNextColumn(r,this.direction==="ltr"),this.isSameColumn):this.orientation==="horizontal"?this.getNextColumn(t,this.direction==="ltr"):null}getFirstKey(){let t=this.collection.getFirstKey();return this.findNextNonDisabled(t,n=>this.collection.getKeyAfter(n))}getLastKey(){let t=this.collection.getLastKey();return this.findNextNonDisabled(t,n=>this.collection.getKeyBefore(n))}getKeyPageAbove(t){let n=this.ref.current,r=this.layoutDelegate.getItemRect(t);if(!r)return null;if(n&&!Yp(n))return this.getFirstKey();let i=t;if(this.orientation==="horizontal"){let s=Math.max(0,r.x+r.width-this.layoutDelegate.getVisibleRect().width);for(;r&&r.x>s&&i!=null;)i=this.getKeyAbove(i),r=i==null?null:this.layoutDelegate.getItemRect(i)}else{let s=Math.max(0,r.y+r.height-this.layoutDelegate.getVisibleRect().height);for(;r&&r.y>s&&i!=null;)i=this.getKeyAbove(i),r=i==null?null:this.layoutDelegate.getItemRect(i)}return i??this.getFirstKey()}getKeyPageBelow(t){let n=this.ref.current,r=this.layoutDelegate.getItemRect(t);if(!r)return null;if(n&&!Yp(n))return this.getLastKey();let i=t;if(this.orientation==="horizontal"){let s=Math.min(this.layoutDelegate.getContentSize().width,r.y-r.width+this.layoutDelegate.getVisibleRect().width);for(;r&&r.xs||new VO({collection:n,disabledKeys:r,disabledBehavior:d,ref:i,collator:c,layoutDelegate:l}),[s,l,n,r,i,c,d]),{collectionProps:m}=BO({...e,ref:i,selectionManager:t,keyboardDelegate:h});return{listProps:m}}function KO(e,t,n){let{listProps:r}=UO({...e,...t,allowsTabNavigation:!0,disallowSelectAll:!0,ref:n});return delete r.onKeyDownCapture,{accordionProps:{...r,tabIndex:void 0}}}function WO(e){var t,n;const r=li(),{ref:i,as:s,item:l,onFocusChange:c}=e,{state:d,className:h,indicator:m,children:g,title:b,subtitle:x,startContent:k,motionProps:P,focusedKey:_,variant:T,isCompact:$=!1,classNames:L={},isDisabled:z=!1,hideIndicator:K=!1,disableAnimation:M=(t=r?.disableAnimation)!=null?t:!1,keepContentMounted:J=!1,disableIndicatorAnimation:re=!1,HeadingComponent:ae=s||"h2",onPress:j,onPressStart:B,onPressEnd:Y,onPressChange:te,onPressUp:G,onClick:ce,...Z}=e,q=s||"div",V=typeof q=="string",se=Ji(i),R=d.disabledKeys.has(l.key)||z,U=d.selectionManager.isSelected(l.key),{buttonProps:ie,regionProps:O}=NO({item:l,isDisabled:R},{...d,focusedKey:_},se),{onFocus:me,onBlur:Ce,...ye}=ie,{isFocused:Fe,isFocusVisible:De,focusProps:Te}=Rf({autoFocus:(n=l.props)==null?void 0:n.autoFocus}),{isHovered:Xe,hoverProps:lt}=Eu({isDisabled:R}),{pressProps:_e,isPressed:mt}=Su({ref:se,isDisabled:R,onPress:j,onPressStart:B,onPressEnd:Y,onPressChange:te,onPressUp:G}),pt=S.useCallback(()=>{c?.(!0,l.key)},[]),Vt=S.useCallback(()=>{c?.(!1,l.key)},[]),Ve=S.useMemo(()=>({...L}),[nl(L)]),it=S.useMemo(()=>$O({isCompact:$,isDisabled:R,hideIndicator:K,disableAnimation:M,disableIndicatorAnimation:re,variant:T}),[$,R,K,M,re,T]),Ut=tn(Ve?.base,h),Zn=S.useCallback((pe={})=>({"data-open":$e(U),"data-disabled":$e(R),"data-slot":"base",className:it.base({class:Ut}),...on(Ef(Z,{enabled:V}),pe)}),[Ut,V,Z,it,l.props,U,R]),ln=(pe={})=>{var Se,Oe;return{ref:se,"data-open":$e(U),"data-focus":$e(Fe),"data-focus-visible":$e(De),"data-disabled":$e(R),"data-hover":$e(Xe),"data-pressed":$e(mt),"data-slot":"trigger",className:it.trigger({class:Ve?.trigger}),onFocus:f1(pt,me,Te.onFocus,Z.onFocus,(Se=l.props)==null?void 0:Se.onFocus),onBlur:f1(Vt,Ce,Te.onBlur,Z.onBlur,(Oe=l.props)==null?void 0:Oe.onBlur),...on(ye,lt,_e,pe,{onClick:Jl(_e.onClick,ce)})}},_t=S.useCallback((pe={})=>({"data-open":$e(U),"data-disabled":$e(R),"data-slot":"content",className:it.content({class:Ve?.content}),...on(O,pe)}),[it,Ve,O,U,R,Ve?.content]),Rt=S.useCallback((pe={})=>({"aria-hidden":$e(!0),"data-open":$e(U),"data-disabled":$e(R),"data-slot":"indicator",className:it.indicator({class:Ve?.indicator}),...pe}),[it,Ve?.indicator,U,R,Ve?.indicator]),Tn=S.useCallback((pe={})=>({"data-open":$e(U),"data-disabled":$e(R),"data-slot":"heading",className:it.heading({class:Ve?.heading}),...pe}),[it,Ve?.heading,U,R,Ve?.heading]),Cr=S.useCallback((pe={})=>({"data-open":$e(U),"data-disabled":$e(R),"data-slot":"title",className:it.title({class:Ve?.title}),...pe}),[it,Ve?.title,U,R,Ve?.title]),Nt=S.useCallback((pe={})=>({"data-open":$e(U),"data-disabled":$e(R),"data-slot":"subtitle",className:it.subtitle({class:Ve?.subtitle}),...pe}),[it,Ve,U,R,Ve?.subtitle]);return{Component:q,HeadingComponent:ae,item:l,slots:it,classNames:Ve,domRef:se,indicator:m,children:g,title:b,subtitle:x,startContent:k,isOpen:U,isDisabled:R,hideIndicator:K,keepContentMounted:J,disableAnimation:M,motionProps:P,getBaseProps:Zn,getHeadingProps:Tn,getButtonProps:ln,getContentProps:_t,getIndicatorProps:Rt,getTitleProps:Cr,getSubtitleProps:Nt}}var Ck=e=>D.jsx("svg",{"aria-hidden":"true",fill:"none",focusable:"false",height:"1em",role:"presentation",viewBox:"0 0 24 24",width:"1em",...e,children:D.jsx("path",{d:"M15.5 19l-7-7 7-7",stroke:"currentColor",strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:"1.5"})}),HO=e=>D.jsx("svg",{"aria-hidden":"true",focusable:"false",height:"1em",role:"presentation",viewBox:"0 0 24 24",width:"1em",...e,children:D.jsx("path",{d:"M12 2a10 10 0 1010 10A10.016 10.016 0 0012 2zm3.36 12.3a.754.754 0 010 1.06.748.748 0 01-1.06 0l-2.3-2.3-2.3 2.3a.748.748 0 01-1.06 0 .754.754 0 010-1.06l2.3-2.3-2.3-2.3A.75.75 0 019.7 8.64l2.3 2.3 2.3-2.3a.75.75 0 011.06 1.06l-2.3 2.3z",fill:"currentColor"})}),GO=e=>{const{isSelected:t,isIndeterminate:n,disableAnimation:r,...i}=e;return D.jsx("svg",{"aria-hidden":"true",className:"fill-current",fill:"none",focusable:"false",height:"1em",role:"presentation",stroke:"currentColor",strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:2,viewBox:"0 0 24 24",width:"1em",...i,children:D.jsx("path",{d:"M18 6L6 18M6 6l12 12"})})},Vp={ease:[.36,.66,.4,1]},Zg={scaleSpring:{enter:{transform:"scale(1)",opacity:1,transition:{type:"spring",bounce:0,duration:.2}},exit:{transform:"scale(0.85)",opacity:0,transition:{type:"easeOut",duration:.15}}},scaleSpringOpacity:{initial:{opacity:0,transform:"scale(0.8)"},enter:{opacity:1,transform:"scale(1)",transition:{type:"spring",bounce:0,duration:.3}},exit:{opacity:0,transform:"scale(0.96)",transition:{type:"easeOut",bounce:0,duration:.15}}},fade:{enter:{opacity:1,transition:{duration:.4,ease:Vp.ease}},exit:{opacity:0,transition:{duration:.3,ease:Vp.ease}}},collapse:{enter:{opacity:1,height:"auto",transition:{height:{type:"spring",bounce:0,duration:.3},opacity:{easings:"ease",duration:.4}}},exit:{opacity:0,height:0,transition:{easings:"ease",duration:.3}}}},Ek=()=>no(()=>import("./index-CYQIHhg3.js"),[]).then(e=>e.default),L_=ai((e,t)=>{const{Component:n,HeadingComponent:r,classNames:i,slots:s,indicator:l,children:c,title:d,subtitle:h,startContent:m,isOpen:g,isDisabled:b,hideIndicator:x,keepContentMounted:k,disableAnimation:P,motionProps:_,getBaseProps:T,getHeadingProps:$,getButtonProps:L,getTitleProps:z,getSubtitleProps:K,getContentProps:M,getIndicatorProps:J}=WO({...e,ref:t}),re=c5(),j=S.useMemo(()=>typeof l=="function"?l({indicator:D.jsx(Ck,{}),isOpen:g,isDisabled:b}):l||null,[l,g,b])||D.jsx(Ck,{}),B=S.useMemo(()=>{if(P)return k?D.jsx("div",{...M(),children:c}):g&&D.jsx("div",{...M(),children:c});const Y={exit:{...Zg.collapse.exit,overflowY:"hidden"},enter:{...Zg.collapse.enter,overflowY:"unset"}};return k?D.jsx($f,{features:Ek,children:D.jsx(Af.section,{animate:g?"enter":"exit",exit:"exit",initial:"exit",style:{willChange:re},variants:Y,onKeyDown:te=>{te.stopPropagation()},..._,children:D.jsx("div",{...M(),children:c})},"accordion-content")}):D.jsx(Ru,{initial:!1,children:g&&D.jsx($f,{features:Ek,children:D.jsx(Af.section,{animate:"enter",exit:"exit",initial:"exit",style:{willChange:re},variants:Y,onKeyDown:te=>{te.stopPropagation()},..._,children:D.jsx("div",{...M(),children:c})},"accordion-content")})})},[g,P,k,c,_]);return D.jsxs(n,{...T(),children:[D.jsx(r,{...$(),children:D.jsxs("button",{...L(),children:[m&&D.jsx("div",{className:s.startContent({class:i?.startContent}),children:m}),D.jsxs("div",{className:s.titleWrapper({class:i?.titleWrapper}),children:[d&&D.jsx("span",{...z(),children:d}),h&&D.jsx("span",{...K(),children:h})]}),!x&&j&&D.jsx("span",{...J(),children:j})]})}),B]})});L_.displayName="HeroUI.AccordionItem";var qO=L_;class YO{*[Symbol.iterator](){yield*this.iterable}get size(){return this.keyMap.size}getKeys(){return this.keyMap.keys()}getKeyBefore(t){let n=this.keyMap.get(t);var r;return n&&(r=n.prevKey)!==null&&r!==void 0?r:null}getKeyAfter(t){let n=this.keyMap.get(t);var r;return n&&(r=n.nextKey)!==null&&r!==void 0?r:null}getFirstKey(){return this.firstKey}getLastKey(){return this.lastKey}getItem(t){var n;return(n=this.keyMap.get(t))!==null&&n!==void 0?n:null}at(t){const n=[...this.getKeys()];return this.getItem(n[t])}constructor(t,{expandedKeys:n}={}){this.keyMap=new Map,this.firstKey=null,this.lastKey=null,this.iterable=t,n=n||new Set;let r=c=>{if(this.keyMap.set(c.key,c),c.childNodes&&(c.type==="section"||n.has(c.key)))for(let d of c.childNodes)r(d)};for(let c of t)r(c);let i=null,s=0;for(let[c,d]of this.keyMap)i?(i.nextKey=c,d.prevKey=i.key):(this.firstKey=c,d.prevKey=void 0),d.type==="item"&&(d.index=s++),i=d,i.nextKey=void 0;var l;this.lastKey=(l=i?.key)!==null&&l!==void 0?l:null}}class Eo extends Set{constructor(t,n,r){super(t),t instanceof Eo?(this.anchorKey=n??t.anchorKey,this.currentKey=r??t.currentKey):(this.anchorKey=n??null,this.currentKey=r??null)}}function XO(e,t){if(e.size!==t.size)return!1;for(let n of e)if(!t.has(n))return!1;return!0}function QO(e){let{selectionMode:t="none",disallowEmptySelection:n=!1,allowDuplicateSelectionEvents:r,selectionBehavior:i="toggle",disabledBehavior:s="all"}=e,l=S.useRef(!1),[,c]=S.useState(!1),d=S.useRef(null),h=S.useRef(null),[,m]=S.useState(null),g=S.useMemo(()=>Pk(e.selectedKeys),[e.selectedKeys]),b=S.useMemo(()=>Pk(e.defaultSelectedKeys,new Eo),[e.defaultSelectedKeys]),[x,k]=$u(g,b,e.onSelectionChange),P=S.useMemo(()=>e.disabledKeys?new Set(e.disabledKeys):new Set,[e.disabledKeys]),[_,T]=S.useState(i);i==="replace"&&_==="toggle"&&typeof x=="object"&&x.size===0&&T("replace");let $=S.useRef(i);return S.useEffect(()=>{i!==$.current&&(T(i),$.current=i)},[i]),{selectionMode:t,disallowEmptySelection:n,selectionBehavior:_,setSelectionBehavior:T,get isFocused(){return l.current},setFocused(L){l.current=L,c(L)},get focusedKey(){return d.current},get childFocusStrategy(){return h.current},setFocusedKey(L,z="first"){d.current=L,h.current=z,m(L)},selectedKeys:x,setSelectedKeys(L){(r||!XO(L,x))&&k(L)},disabledKeys:P,disabledBehavior:s}}function Pk(e,t){return e?e==="all"?"all":new Eo(e):t}function M_(e){return null}M_.getCollectionNode=function*(t,n){let{childItems:r,title:i,children:s}=t,l=t.title||t.children,c=t.textValue||(typeof l=="string"?l:"")||t["aria-label"]||"";!c&&n?.suppressTextValueWarning,yield{type:"item",props:t,rendered:l,textValue:c,"aria-label":t["aria-label"],hasChildNodes:JO(t),*childNodes(){if(r)for(let d of r)yield{type:"item",value:d};else if(i){let d=[];We.Children.forEach(s,h=>{d.push({type:"item",element:h})}),yield*d}}}};function JO(e){return e.hasChildItems!=null?e.hasChildItems:!!(e.childItems||e.title&&We.Children.count(e.children)>0)}let ZO=M_;class e6{build(t,n){return this.context=n,Tk(()=>this.iterateCollection(t))}*iterateCollection(t){let{children:n,items:r}=t;if(We.isValidElement(n)&&n.type===We.Fragment)yield*this.iterateCollection({children:n.props.children,items:r});else if(typeof n=="function"){if(!r)throw new Error("props.children was a function but props.items is missing");let i=0;for(let s of r)yield*this.getFullNode({value:s,index:i},{renderer:n}),i++}else{let i=[];We.Children.forEach(n,l=>{l&&i.push(l)});let s=0;for(let l of i){let c=this.getFullNode({element:l,index:s},{});for(let d of c)s++,yield d}}}getKey(t,n,r,i){if(t.key!=null)return t.key;if(n.type==="cell"&&n.key!=null)return`${i}${n.key}`;let s=n.value;if(s!=null){var l;let c=(l=s.key)!==null&&l!==void 0?l:s.id;if(c==null)throw new Error("No key found for item");return c}return i?`${i}.${n.index}`:`$.${n.index}`}getChildState(t,n){return{renderer:n.renderer||t.renderer}}*getFullNode(t,n,r,i){if(We.isValidElement(t.element)&&t.element.type===We.Fragment){let _=[];We.Children.forEach(t.element.props.children,$=>{_.push($)});var s;let T=(s=t.index)!==null&&s!==void 0?s:0;for(const $ of _)yield*this.getFullNode({element:$,index:T++},n,r,i);return}let l=t.element;if(!l&&t.value&&n&&n.renderer){let _=this.cache.get(t.value);if(_&&(!_.shouldInvalidate||!_.shouldInvalidate(this.context))){_.index=t.index,_.parentKey=i?i.key:null,yield _;return}l=n.renderer(t.value)}if(We.isValidElement(l)){let _=l.type;if(typeof _!="function"&&typeof _.getCollectionNode!="function"){let z=l.type;throw new Error(`Unknown element <${z}> in collection.`)}let T=_.getCollectionNode(l.props,this.context);var c;let $=(c=t.index)!==null&&c!==void 0?c:0,L=T.next();for(;!L.done&&L.value;){let z=L.value;t.index=$;var d;let K=(d=z.key)!==null&&d!==void 0?d:null;K==null&&(K=z.element?null:this.getKey(l,t,n,r));let J=[...this.getFullNode({...z,key:K,index:$,wrapper:t6(t.wrapper,z.wrapper)},this.getChildState(n,z),r?`${r}${l.key}`:l.key,i)];for(let re of J){var h,m;re.value=(m=(h=z.value)!==null&&h!==void 0?h:t.value)!==null&&m!==void 0?m:null,re.value&&this.cache.set(re.value,re);var g;if(t.type&&re.type!==t.type)throw new Error(`Unsupported type <${m0(re.type)}> in <${m0((g=i?.type)!==null&&g!==void 0?g:"unknown parent type")}>. Only <${m0(t.type)}> is supported.`);$++,yield re}L=T.next(J)}return}if(t.key==null||t.type==null)return;let b=this;var x,k;let P={type:t.type,props:t.props,key:t.key,parentKey:i?i.key:null,value:(x=t.value)!==null&&x!==void 0?x:null,level:i?i.level+1:0,index:t.index,rendered:t.rendered,textValue:(k=t.textValue)!==null&&k!==void 0?k:"","aria-label":t["aria-label"],wrapper:t.wrapper,shouldInvalidate:t.shouldInvalidate,hasChildNodes:t.hasChildNodes||!1,childNodes:Tk(function*(){if(!t.hasChildNodes||!t.childNodes)return;let _=0;for(let T of t.childNodes()){T.key!=null&&(T.key=`${P.key}${T.key}`);let $=b.getFullNode({...T,index:_},b.getChildState(n,T),P.key,P);for(let L of $)_++,yield L}})};yield P}constructor(){this.cache=new WeakMap}}function Tk(e){let t=[],n=null;return{*[Symbol.iterator](){for(let r of t)yield r;n||(n=e());for(let r of n)t.push(r),yield r}}}function t6(e,t){if(e&&t)return n=>e(t(n));if(e)return e;if(t)return t}function m0(e){return e[0].toUpperCase()+e.slice(1)}function n6(e,t,n){let r=S.useMemo(()=>new e6,[]),{children:i,items:s,collection:l}=e;return S.useMemo(()=>{if(l)return l;let d=r.build({children:i,items:s},n);return t(d)},[r,i,s,l,n,t])}function r6(e,t){return typeof t.getChildren=="function"?t.getChildren(e.key):e.childNodes}function i6(e){return o6(e,0)}function o6(e,t){if(t<0)return;let n=0;for(let r of e){if(n===t)return r;n++}}function jG(e){let t;for(let n of e)t=n;return t}function g0(e,t,n){if(t.parentKey===n.parentKey)return t.index-n.index;let r=[..._k(e,t),t],i=[..._k(e,n),n],s=r.slice(0,i.length).findIndex((l,c)=>l!==i[c]);return s!==-1?(t=r[s],n=i[s],t.index-n.index):r.findIndex(l=>l===n)>=0?1:(i.findIndex(l=>l===t)>=0,-1)}function _k(e,t){let n=[],r=t;for(;r?.parentKey!=null;)r=e.getItem(r.parentKey),r&&n.unshift(r);return n}class Jx{get selectionMode(){return this.state.selectionMode}get disallowEmptySelection(){return this.state.disallowEmptySelection}get selectionBehavior(){return this.state.selectionBehavior}setSelectionBehavior(t){this.state.setSelectionBehavior(t)}get isFocused(){return this.state.isFocused}setFocused(t){this.state.setFocused(t)}get focusedKey(){return this.state.focusedKey}get childFocusStrategy(){return this.state.childFocusStrategy}setFocusedKey(t,n){(t==null||this.collection.getItem(t))&&this.state.setFocusedKey(t,n)}get selectedKeys(){return this.state.selectedKeys==="all"?new Set(this.getSelectAllKeys()):this.state.selectedKeys}get rawSelection(){return this.state.selectedKeys}isSelected(t){if(this.state.selectionMode==="none")return!1;let n=this.getKey(t);return n==null?!1:this.state.selectedKeys==="all"?this.canSelectItem(n):this.state.selectedKeys.has(n)}get isEmpty(){return this.state.selectedKeys!=="all"&&this.state.selectedKeys.size===0}get isSelectAll(){if(this.isEmpty)return!1;if(this.state.selectedKeys==="all")return!0;if(this._isSelectAll!=null)return this._isSelectAll;let t=this.getSelectAllKeys(),n=this.state.selectedKeys;return this._isSelectAll=t.every(r=>n.has(r)),this._isSelectAll}get firstSelectedKey(){let t=null;for(let r of this.state.selectedKeys){let i=this.collection.getItem(r);(!t||i&&g0(this.collection,i,t)<0)&&(t=i)}var n;return(n=t?.key)!==null&&n!==void 0?n:null}get lastSelectedKey(){let t=null;for(let r of this.state.selectedKeys){let i=this.collection.getItem(r);(!t||i&&g0(this.collection,i,t)>0)&&(t=i)}var n;return(n=t?.key)!==null&&n!==void 0?n:null}get disabledKeys(){return this.state.disabledKeys}get disabledBehavior(){return this.state.disabledBehavior}extendSelection(t){if(this.selectionMode==="none")return;if(this.selectionMode==="single"){this.replaceSelection(t);return}let n=this.getKey(t);if(n==null)return;let r;if(this.state.selectedKeys==="all")r=new Eo([n],n,n);else{let l=this.state.selectedKeys;var i;let c=(i=l.anchorKey)!==null&&i!==void 0?i:n;r=new Eo(l,c,n);var s;for(let d of this.getKeyRange(c,(s=l.currentKey)!==null&&s!==void 0?s:n))r.delete(d);for(let d of this.getKeyRange(n,c))this.canSelectItem(d)&&r.add(d)}this.state.setSelectedKeys(r)}getKeyRange(t,n){let r=this.collection.getItem(t),i=this.collection.getItem(n);return r&&i?g0(this.collection,r,i)<=0?this.getKeyRangeInternal(t,n):this.getKeyRangeInternal(n,t):[]}getKeyRangeInternal(t,n){var r;if(!((r=this.layoutDelegate)===null||r===void 0)&&r.getKeyRange)return this.layoutDelegate.getKeyRange(t,n);let i=[],s=t;for(;s!=null;){let l=this.collection.getItem(s);if(l&&(l.type==="item"||l.type==="cell"&&this.allowsCellSelection)&&i.push(s),s===n)return i;s=this.collection.getKeyAfter(s)}return[]}getKey(t){let n=this.collection.getItem(t);if(!n||n.type==="cell"&&this.allowsCellSelection)return t;for(;n&&n.type!=="item"&&n.parentKey!=null;)n=this.collection.getItem(n.parentKey);return!n||n.type!=="item"?null:n.key}toggleSelection(t){if(this.selectionMode==="none")return;if(this.selectionMode==="single"&&!this.isSelected(t)){this.replaceSelection(t);return}let n=this.getKey(t);if(n==null)return;let r=new Eo(this.state.selectedKeys==="all"?this.getSelectAllKeys():this.state.selectedKeys);r.has(n)?r.delete(n):this.canSelectItem(n)&&(r.add(n),r.anchorKey=n,r.currentKey=n),!(this.disallowEmptySelection&&r.size===0)&&this.state.setSelectedKeys(r)}replaceSelection(t){if(this.selectionMode==="none")return;let n=this.getKey(t);if(n==null)return;let r=this.canSelectItem(n)?new Eo([n],n,n):new Eo;this.state.setSelectedKeys(r)}setSelectedKeys(t){if(this.selectionMode==="none")return;let n=new Eo;for(let r of t){let i=this.getKey(r);if(i!=null&&(n.add(i),this.selectionMode==="single"))break}this.state.setSelectedKeys(n)}getSelectAllKeys(){let t=[],n=r=>{for(;r!=null;){if(this.canSelectItem(r)){var i;let l=this.collection.getItem(r);l?.type==="item"&&t.push(r);var s;l?.hasChildNodes&&(this.allowsCellSelection||l.type!=="item")&&n((s=(i=i6(r6(l,this.collection)))===null||i===void 0?void 0:i.key)!==null&&s!==void 0?s:null)}r=this.collection.getKeyAfter(r)}};return n(this.collection.getFirstKey()),t}selectAll(){!this.isSelectAll&&this.selectionMode==="multiple"&&this.state.setSelectedKeys("all")}clearSelection(){!this.disallowEmptySelection&&(this.state.selectedKeys==="all"||this.state.selectedKeys.size>0)&&this.state.setSelectedKeys(new Eo)}toggleSelectAll(){this.isSelectAll?this.clearSelection():this.selectAll()}select(t,n){this.selectionMode!=="none"&&(this.selectionMode==="single"?this.isSelected(t)&&!this.disallowEmptySelection?this.toggleSelection(t):this.replaceSelection(t):this.selectionBehavior==="toggle"||n&&(n.pointerType==="touch"||n.pointerType==="virtual")?this.toggleSelection(t):this.replaceSelection(t))}isSelectionEqual(t){if(t===this.state.selectedKeys)return!0;let n=this.selectedKeys;if(t.size!==n.size)return!1;for(let r of t)if(!n.has(r))return!1;for(let r of n)if(!t.has(r))return!1;return!0}canSelectItem(t){var n;if(this.state.selectionMode==="none"||this.state.disabledKeys.has(t))return!1;let r=this.collection.getItem(t);return!(!r||!(r==null||(n=r.props)===null||n===void 0)&&n.isDisabled||r.type==="cell"&&!this.allowsCellSelection)}isDisabled(t){var n,r;return this.state.disabledBehavior==="all"&&(this.state.disabledKeys.has(t)||!!(!((r=this.collection.getItem(t))===null||r===void 0||(n=r.props)===null||n===void 0)&&n.isDisabled))}isLink(t){var n,r;return!!(!((r=this.collection.getItem(t))===null||r===void 0||(n=r.props)===null||n===void 0)&&n.href)}getItemProps(t){var n;return(n=this.collection.getItem(t))===null||n===void 0?void 0:n.props}withCollection(t){return new Jx(t,this.state,{allowsCellSelection:this.allowsCellSelection,layoutDelegate:this.layoutDelegate||void 0})}constructor(t,n,r){this.collection=t,this.state=n;var i;this.allowsCellSelection=(i=r?.allowsCellSelection)!==null&&i!==void 0?i:!1,this._isSelectAll=null,this.layoutDelegate=r?.layoutDelegate||null}}function s6(e){let{onExpandedChange:t}=e,[n,r]=$u(e.expandedKeys?new Set(e.expandedKeys):void 0,e.defaultExpandedKeys?new Set(e.defaultExpandedKeys):new Set,t),i=QO(e),s=S.useMemo(()=>e.disabledKeys?new Set(e.disabledKeys):new Set,[e.disabledKeys]),l=n6(e,S.useCallback(d=>new YO(d,{expandedKeys:n}),[n]),null);return S.useEffect(()=>{i.focusedKey!=null&&!l.getItem(i.focusedKey)&&i.setFocusedKey(null)},[l,i.focusedKey]),{collection:l,expandedKeys:n,disabledKeys:s,toggleKey:d=>{r(l6(n,d))},setExpandedKeys:r,selectionManager:new Jx(l,i)}}function l6(e,t){let n=new Set(e);return n.has(t)?n.delete(t):n.add(t),n}function a6(e){var t;const n=li(),{ref:r,as:i,className:s,items:l,variant:c,motionProps:d,expandedKeys:h,disabledKeys:m,selectedKeys:g,children:b,defaultExpandedKeys:x,selectionMode:k="single",selectionBehavior:P="toggle",keepContentMounted:_=!1,disallowEmptySelection:T,defaultSelectedKeys:$,onExpandedChange:L,onSelectionChange:z,dividerProps:K={},isCompact:M=!1,isDisabled:J=!1,showDivider:re=!0,hideIndicator:ae=!1,disableAnimation:j=(t=n?.disableAnimation)!=null?t:!1,disableIndicatorAnimation:B=!1,itemClasses:Y,...te}=e,[G,ce]=S.useState(null),Z=i||"div",q=typeof Z=="string",V=Ji(r),se=S.useMemo(()=>IO({variant:c,className:s}),[c,s]),U={children:S.useMemo(()=>{let Te=[];return We.Children.map(b,Xe=>{var lt;if(We.isValidElement(Xe)&&typeof((lt=Xe.props)==null?void 0:lt.children)!="string"){const _e=We.cloneElement(Xe,{hasChildItems:!1});Te.push(_e)}else Te.push(Xe)}),Te},[b]),items:l},ie={expandedKeys:h,defaultExpandedKeys:x,onExpandedChange:L},O={disabledKeys:m,selectedKeys:g,selectionMode:k,selectionBehavior:P,disallowEmptySelection:T,defaultSelectedKeys:$??x,onSelectionChange:z,...U,...ie},me=s6(O);me.selectionManager.setFocusedKey=Te=>{ce(Te)};const{accordionProps:Ce}=KO({...U,...ie},me,V),ye=S.useMemo(()=>({state:me,focusedKey:G,motionProps:d,isCompact:M,isDisabled:J,hideIndicator:ae,disableAnimation:j,keepContentMounted:_,disableIndicatorAnimation:B}),[G,M,J,ae,g,j,_,me?.expandedKeys.values,B,me.expandedKeys.size,me.disabledKeys.size,d]),Fe=S.useCallback((Te={})=>({ref:V,className:se,"data-orientation":"vertical",...on(Ce,Ef(te,{enabled:q}),Te)}),[]),De=S.useCallback((Te,Xe)=>{Te&&ce(Xe)},[]);return{Component:Z,values:ye,state:me,focusedKey:G,getBaseProps:Fe,isSplitted:c==="splitted",classNames:se,showDivider:re,dividerProps:K,disableAnimation:j,handleFocusChanged:De,itemClasses:Y}}function u6(e){let t=Ef(e,{enabled:typeof e.elementType=="string"}),n;return e.orientation==="vertical"&&(n="vertical"),e.elementType!=="hr"?{separatorProps:{...t,role:"separator","aria-orientation":n}}:{separatorProps:t}}function c6(e){const{as:t,className:n,orientation:r,...i}=e;let s=t||"hr";s==="hr"&&r==="vertical"&&(s="div");const{separatorProps:l}=u6({elementType:typeof s=="string"?s:"hr",orientation:r}),c=S.useMemo(()=>EO({orientation:r,className:n}),[r,n]),d=S.useCallback((h={})=>({className:c,role:"separator","data-orientation":r,...l,...i,...h}),[c,r,l,i]);return{Component:s,getDividerProps:d}}var D_=ai((e,t)=>{const{Component:n,getDividerProps:r}=c6({...e});return D.jsx(n,{ref:t,...r()})});D_.displayName="HeroUI.Divider";var f6=D_,N_=ai((e,t)=>{const{Component:n,values:r,state:i,isSplitted:s,showDivider:l,getBaseProps:c,disableAnimation:d,handleFocusChanged:h,itemClasses:m,dividerProps:g}=a6({...e,ref:t}),b=S.useCallback((k,P)=>h(k,P),[h]),x=S.useMemo(()=>[...i.collection].map((k,P)=>{const _={...m,...k.props.classNames||{}};return D.jsxs(S.Fragment,{children:[D.jsx(qO,{item:k,variant:e.variant,onFocusChange:b,...r,...k.props,classNames:_}),!k.props.hidden&&!s&&l&&P{const t={top:{originY:1},bottom:{originY:0},left:{originX:1},right:{originX:0},"top-start":{originX:0,originY:1},"top-end":{originX:1,originY:1},"bottom-start":{originX:0,originY:0},"bottom-end":{originX:1,originY:0},"right-start":{originX:0,originY:0},"right-end":{originX:0,originY:1},"left-start":{originX:1,originY:0},"left-end":{originX:1,originY:1}};return t?.[e]||{}},p6=e=>({top:"top",bottom:"bottom",left:"left",right:"right","top-start":"top start","top-end":"top end","bottom-start":"bottom start","bottom-end":"bottom end","left-start":"left top","left-end":"left bottom","right-start":"right top","right-end":"right bottom"})[e],BG=(e,t)=>{if(t.includes("-")){const[n]=t.split("-");if(n.includes(e))return!1}return!0},$k=(e,t)=>{if(t.includes("-")){const[,n]=t.split("-");return`${e}-${n}`}return e},h6=ZO,xp=h6,kh=globalThis?.document?S.useLayoutEffect:S.useEffect;function m6(e={}){const{onLoad:t,onError:n,ignoreFallback:r,src:i,crossOrigin:s,srcSet:l,sizes:c,loading:d,shouldBypassImageLoad:h=!1}=e,m=gL(),g=S.useRef(m?new Image:null),[b,x]=S.useState("pending");S.useEffect(()=>{g.current&&(g.current.onload=_=>{k(),x("loaded"),t?.(_)},g.current.onerror=_=>{k(),x("failed"),n?.(_)})},[g.current]);const k=()=>{g.current&&(g.current.onload=null,g.current.onerror=null,g.current=null)},P=S.useCallback(()=>{if(!i)return"pending";if(r||h)return"loaded";const _=new Image;return _.src=i,s&&(_.crossOrigin=s),l&&(_.srcset=l),c&&(_.sizes=c),d&&(_.loading=d),g.current=_,_.complete&&_.naturalWidth?"loaded":"loading"},[i,s,l,c,t,n,d,h]);return kh(()=>{m&&x(P())},[m,P]),r?"loaded":b}var[VG,g6]=pv({name:"ButtonGroupContext",strict:!1});function F_(e,t){let{elementType:n="button",isDisabled:r,onPress:i,onPressStart:s,onPressEnd:l,onPressUp:c,onPressChange:d,preventFocusOnPress:h,allowFocusWhenDisabled:m,onClick:g,href:b,target:x,rel:k,type:P="button",allowTextSelectionOnPress:_}=e,T;n==="button"?T={type:P,disabled:r}:T={role:"button",href:n==="a"&&!r?b:void 0,target:n==="a"?x:void 0,type:n==="input"?P:void 0,disabled:n==="input"?r:void 0,"aria-disabled":!r||n==="input"?void 0:r,rel:n==="a"?k:void 0};let{pressProps:$,isPressed:L}=Su({onClick:g,onPressStart:s,onPressEnd:l,onPressUp:c,onPressChange:d,onPress:i,isDisabled:r,preventFocusOnPress:h,allowTextSelectionOnPress:_,ref:t}),{focusableProps:z}=wh(e,t);m&&(z.tabIndex=r?-1:z.tabIndex);let K=Pn(z,$,Iu(e,{labelable:!0}));return{isPressed:L,buttonProps:Pn(T,K,{"aria-haspopup":e["aria-haspopup"],"aria-expanded":e["aria-expanded"],"aria-controls":e["aria-controls"],"aria-pressed":e["aria-pressed"],"aria-current":e["aria-current"]})}}var v6=()=>no(()=>import("./index-CYQIHhg3.js"),[]).then(e=>e.default),O_=e=>{const{ripples:t=[],motionProps:n,color:r="currentColor",style:i,onClear:s}=e;return D.jsx(D.Fragment,{children:t.map(l=>{const c=fL(.01*l.size,.2,l.size>100?.75:.5);return D.jsx($f,{features:v6,children:D.jsx(Ru,{mode:"popLayout",children:D.jsx(Af.span,{animate:{transform:"scale(2)",opacity:0},className:"heroui-ripple",exit:{opacity:0},initial:{transform:"scale(0)",opacity:.35},style:{position:"absolute",backgroundColor:r,borderRadius:"100%",transformOrigin:"center",pointerEvents:"none",overflow:"hidden",inset:0,zIndex:0,top:l.y,left:l.x,width:`${l.size}px`,height:`${l.size}px`,...i},transition:{duration:c},onAnimationComplete:()=>{s(l.key)},...n})})},l.key)})})};O_.displayName="HeroUI.Ripple";var y6=O_;function b6(e={}){const[t,n]=S.useState([]),r=S.useCallback(s=>{const l=s.target,c=Math.max(l.clientWidth,l.clientHeight);n(d=>[...d,{key:cL(d.length.toString()),size:c,x:s.x-c/2,y:s.y-c/2}])},[]),i=S.useCallback(s=>{n(l=>l.filter(c=>c.key!==s))},[]);return{ripples:t,onClear:i,onPress:r,...e}}function x6(e){var t,n,r,i,s,l,c,d,h;const m=g6(),g=li(),b=!!m,{ref:x,as:k,children:P,startContent:_,endContent:T,autoFocus:$,className:L,spinner:z,isLoading:K=!1,disableRipple:M=!1,fullWidth:J=(t=m?.fullWidth)!=null?t:!1,radius:re=m?.radius,size:ae=(n=m?.size)!=null?n:"md",color:j=(r=m?.color)!=null?r:"default",variant:B=(i=m?.variant)!=null?i:"solid",disableAnimation:Y=(l=(s=m?.disableAnimation)!=null?s:g?.disableAnimation)!=null?l:!1,isDisabled:te=(c=m?.isDisabled)!=null?c:!1,isIconOnly:G=(d=m?.isIconOnly)!=null?d:!1,spinnerPlacement:ce="start",onPress:Z,onClick:q,...V}=e,se=k||"button",R=typeof se=="string",U=Ji(x),ie=(h=M||g?.disableRipple)!=null?h:Y,{isFocusVisible:O,isFocused:me,focusProps:Ce}=Rf({autoFocus:$}),ye=te||K,Fe=S.useMemo(()=>TO({size:ae,color:j,variant:B,radius:re,fullWidth:J,isDisabled:ye,isInGroup:b,disableAnimation:Y,isIconOnly:G,className:L}),[ae,j,B,re,J,ye,b,G,Y,L]),{onPress:De,onClear:Te,ripples:Xe}=b6(),lt=S.useCallback(Rt=>{ie||ye||Y||U.current&&De(Rt)},[ie,ye,Y,U,De]),{buttonProps:_e,isPressed:mt}=F_({elementType:k,isDisabled:ye,onPress:Jl(Z,lt),onClick:q,...V},U),{isHovered:pt,hoverProps:Vt}=Eu({isDisabled:ye}),Ve=S.useCallback((Rt={})=>({"data-disabled":$e(ye),"data-focus":$e(me),"data-pressed":$e(mt),"data-focus-visible":$e(O),"data-hover":$e(pt),"data-loading":$e(K),...on(_e,Ce,Vt,Ef(V,{enabled:R}),Ef(Rt)),className:Fe}),[K,ye,me,mt,R,O,pt,_e,Ce,Vt,V,Fe]),it=Rt=>S.isValidElement(Rt)?S.cloneElement(Rt,{"aria-hidden":!0,focusable:!1}):null,Ut=it(_),Zn=it(T),ln=S.useMemo(()=>({sm:"sm",md:"sm",lg:"md"})[ae],[ae]),_t=S.useCallback(()=>({ripples:Xe,onClear:Te}),[Xe,Te]);return{Component:se,children:P,domRef:U,spinner:z,styles:Fe,startContent:Ut,endContent:Zn,isLoading:K,spinnerPlacement:ce,spinnerSize:ln,disableRipple:ie,getButtonProps:Ve,getRippleProps:_t,isIconOnly:G}}function w6(e){var t,n;const[r,i]=ra(e,pk.variantKeys),s=li(),l=(n=(t=e?.variant)!=null?t:s?.spinnerVariant)!=null?n:"default",{children:c,className:d,classNames:h,label:m,...g}=r,b=S.useMemo(()=>pk({...i}),[nl(i)]),x=tn(h?.base,d),k=m||c,P=S.useMemo(()=>k&&typeof k=="string"?k:g["aria-label"]?"":"Loading",[c,k,g["aria-label"]]),_=S.useCallback(()=>({"aria-label":P,className:b.base({class:x}),...g}),[P,b,x,g]);return{label:k,slots:b,classNames:h,variant:l,getSpinnerProps:_}}var z_=ai((e,t)=>{const{slots:n,classNames:r,label:i,variant:s,getSpinnerProps:l}=w6({...e});return s==="wave"||s==="dots"?D.jsxs("div",{ref:t,...l(),children:[D.jsx("div",{className:n.wrapper({class:r?.wrapper}),children:[...new Array(3)].map((c,d)=>D.jsx("i",{className:n.dots({class:r?.dots}),style:{"--dot-index":d}},`dot-${d}`))}),i&&D.jsx("span",{className:n.label({class:r?.label}),children:i})]}):s==="simple"?D.jsxs("div",{ref:t,...l(),children:[D.jsxs("svg",{className:n.wrapper({class:r?.wrapper}),fill:"none",viewBox:"0 0 24 24",children:[D.jsx("circle",{className:n.circle1({class:r?.circle1}),cx:"12",cy:"12",r:"10",stroke:"currentColor",strokeWidth:"4"}),D.jsx("path",{className:n.circle2({class:r?.circle2}),d:"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z",fill:"currentColor"})]}),i&&D.jsx("span",{className:n.label({class:r?.label}),children:i})]}):s==="spinner"?D.jsxs("div",{ref:t,...l(),children:[D.jsx("div",{className:n.wrapper({class:r?.wrapper}),children:[...new Array(12)].map((c,d)=>D.jsx("i",{className:n.spinnerBars({class:r?.spinnerBars}),style:{"--bar-index":d}},`star-${d}`))}),i&&D.jsx("span",{className:n.label({class:r?.label}),children:i})]}):D.jsxs("div",{ref:t,...l(),children:[D.jsxs("div",{className:n.wrapper({class:r?.wrapper}),children:[D.jsx("i",{className:n.circle1({class:r?.circle1})}),D.jsx("i",{className:n.circle2({class:r?.circle2})})]}),i&&D.jsx("span",{className:n.label({class:r?.label}),children:i})]})});z_.displayName="HeroUI.Spinner";var S6=z_,j_=ai((e,t)=>{const{Component:n,domRef:r,children:i,spinnerSize:s,spinner:l=D.jsx(S6,{color:"current",size:s}),spinnerPlacement:c,startContent:d,endContent:h,isLoading:m,disableRipple:g,getButtonProps:b,getRippleProps:x,isIconOnly:k}=x6({...e,ref:t});return D.jsxs(n,{ref:r,...b(),children:[d,m&&c==="start"&&l,m&&k?null:i,m&&c==="end"&&l,h,!g&&D.jsx(y6,{...x()})]})});j_.displayName="HeroUI.Button";var _o=j_;const B_={badInput:!1,customError:!1,patternMismatch:!1,rangeOverflow:!1,rangeUnderflow:!1,stepMismatch:!1,tooLong:!1,tooShort:!1,typeMismatch:!1,valueMissing:!1,valid:!0},V_={...B_,customError:!0,valid:!1},ff={isInvalid:!1,validationDetails:B_,validationErrors:[]},U_=S.createContext({}),ev="__formValidationState"+Date.now();function Zx(e){if(e[ev]){let{realtimeValidation:t,displayValidation:n,updateValidation:r,resetValidation:i,commitValidation:s}=e[ev];return{realtimeValidation:t,displayValidation:n,updateValidation:r,resetValidation:i,commitValidation:s}}return k6(e)}function k6(e){let{isInvalid:t,validationState:n,name:r,value:i,builtinValidation:s,validate:l,validationBehavior:c="aria"}=e;n&&(t||(t=n==="invalid"));let d=t!==void 0?{isInvalid:t,validationErrors:[],validationDetails:V_}:null,h=S.useMemo(()=>{if(!l||i==null)return null;let j=C6(l,i);return Ak(j)},[l,i]);s?.validationDetails.valid&&(s=void 0);let m=S.useContext(U_),g=S.useMemo(()=>r?Array.isArray(r)?r.flatMap(j=>$b(m[j])):$b(m[r]):[],[m,r]),[b,x]=S.useState(m),[k,P]=S.useState(!1);m!==b&&(x(m),P(!1));let _=S.useMemo(()=>Ak(k?[]:g),[k,g]),T=S.useRef(ff),[$,L]=S.useState(ff),z=S.useRef(ff),K=()=>{if(!M)return;J(!1);let j=h||s||T.current;v0(j,z.current)||(z.current=j,L(j))},[M,J]=S.useState(!1);return S.useEffect(K),{realtimeValidation:d||_||h||s||ff,displayValidation:c==="native"?d||_||$:d||_||h||s||$,updateValidation(j){c==="aria"&&!v0($,j)?L(j):T.current=j},resetValidation(){let j=ff;v0(j,z.current)||(z.current=j,L(j)),c==="native"&&J(!1),P(!0)},commitValidation(){c==="native"&&J(!0),P(!0)}}}function $b(e){return e?Array.isArray(e)?e:[e]:[]}function C6(e,t){if(typeof e=="function"){let n=e(t);if(n&&typeof n!="boolean")return $b(n)}return[]}function Ak(e){return e.length?{isInvalid:!0,validationErrors:e,validationDetails:V_}:null}function v0(e,t){return e===t?!0:!!e&&!!t&&e.isInvalid===t.isInvalid&&e.validationErrors.length===t.validationErrors.length&&e.validationErrors.every((n,r)=>n===t.validationErrors[r])&&Object.entries(e.validationDetails).every(([n,r])=>t.validationDetails[n]===r)}function K_(e,t,n){let{validationBehavior:r,focus:i}=e;sn(()=>{if(r==="native"&&n?.current&&!n.current.disabled){let d=t.realtimeValidation.isInvalid?t.realtimeValidation.validationErrors.join(" ")||"Invalid value.":"";n.current.setCustomValidity(d),n.current.hasAttribute("title")||(n.current.title=""),t.realtimeValidation.isInvalid||t.updateValidation(P6(n.current))}});let s=jn(()=>{t.resetValidation()}),l=jn(d=>{var h;t.displayValidation.isInvalid||t.commitValidation();let m=n==null||(h=n.current)===null||h===void 0?void 0:h.form;if(!d.defaultPrevented&&n&&m&&T6(m)===n.current){var g;i?i():(g=n.current)===null||g===void 0||g.focus(),N5("keyboard")}d.preventDefault()}),c=jn(()=>{t.commitValidation()});S.useEffect(()=>{let d=n?.current;if(!d)return;let h=d.form;return d.addEventListener("invalid",l),d.addEventListener("change",c),h?.addEventListener("reset",s),()=>{d.removeEventListener("invalid",l),d.removeEventListener("change",c),h?.removeEventListener("reset",s)}},[n,l,c,s,r])}function E6(e){let t=e.validity;return{badInput:t.badInput,customError:t.customError,patternMismatch:t.patternMismatch,rangeOverflow:t.rangeOverflow,rangeUnderflow:t.rangeUnderflow,stepMismatch:t.stepMismatch,tooLong:t.tooLong,tooShort:t.tooShort,typeMismatch:t.typeMismatch,valueMissing:t.valueMissing,valid:t.valid}}function P6(e){return{isInvalid:!e.validity.valid,validationDetails:E6(e),validationErrors:e.validationMessage?[e.validationMessage]:[]}}function T6(e){for(let t=0;t{z.stopPropagation(),t.setSelected(z.target.checked)},{pressProps:x,isPressed:k}=Su({isDisabled:r}),{pressProps:P,isPressed:_}=Su({onPress(){var z;t.toggle(),(z=n.current)===null||z===void 0||z.focus()},isDisabled:r||i}),{focusableProps:T}=wh(e,n),$=Pn(x,T),L=Iu(e,{labelable:!0});return LE(n,t.isSelected,t.setSelected),{labelProps:Pn(P,{onClick:z=>z.preventDefault()}),inputProps:Pn(L,{"aria-invalid":g||m==="invalid"||void 0,"aria-errormessage":e["aria-errormessage"],"aria-controls":e["aria-controls"],"aria-readonly":i||void 0,onChange:b,disabled:r,...s==null?{}:{value:s},name:l,type:"checkbox",...$}),isSelected:t.isSelected,isPressed:k||_,isDisabled:r,isReadOnly:i,isInvalid:g||m==="invalid"}}function W_(e,t,n){let r=Zx({...e,value:t.isSelected}),{isInvalid:i,validationErrors:s,validationDetails:l}=r.displayValidation,{labelProps:c,inputProps:d,isSelected:h,isPressed:m,isDisabled:g,isReadOnly:b}=_6({...e,isInvalid:i},t,n);K_(e,r,n);let{isIndeterminate:x,isRequired:k,validationBehavior:P="aria"}=e;S.useEffect(()=>{n.current&&(n.current.indeterminate=!!x)});let{pressProps:_}=Su({isDisabled:g||b,onPress(){let{[ev]:T}=e,{commitValidation:$}=T||r;$()}});return{labelProps:Pn(c,_),inputProps:{...d,checked:h,"aria-required":k&&P==="aria"||void 0,required:k&&P==="native"},isSelected:h,isPressed:m,isDisabled:g,isReadOnly:b,isInvalid:i,validationErrors:s,validationDetails:l}}const I6=new WeakMap;function H_(e){let{id:t,label:n,"aria-labelledby":r,"aria-label":i,labelElementType:s="label"}=e;t=Pf(t);let l=Pf(),c={};n&&(r=r?`${l} ${r}`:l,c={id:l,htmlFor:s==="label"?t:void 0});let d=_E({id:t,"aria-label":i,"aria-labelledby":r});return{labelProps:c,fieldProps:d}}function $6(e){let{description:t,errorMessage:n,isInvalid:r,validationState:i}=e,{labelProps:s,fieldProps:l}=H_(e),c=W0([!!t,!!n,r,i]),d=W0([!!t,!!n,r,i]);return l=Pn(l,{"aria-describedby":[c,d,e["aria-describedby"]].filter(Boolean).join(" ")||void 0}),{labelProps:s,fieldProps:l,descriptionProps:{id:c},errorMessageProps:{id:d}}}function G_(e={}){let{isReadOnly:t}=e,[n,r]=$u(e.isSelected,e.defaultSelected||!1,e.onChange);function i(l){t||r(l)}function s(){t||r(!n)}return{isSelected:n,setSelected:i,toggle:s}}function A6(e,t,n){const r=G_({isReadOnly:e.isReadOnly||t.isReadOnly,isSelected:t.isSelected(e.value),onChange(_){_?t.addValue(e.value):t.removeValue(e.value),e.onChange&&e.onChange(_)}});let{name:i,descriptionId:s,errorMessageId:l,validationBehavior:c}=I6.get(t);var d;c=(d=e.validationBehavior)!==null&&d!==void 0?d:c;let{realtimeValidation:h}=Zx({...e,value:r.isSelected,name:void 0,validationBehavior:"aria"}),m=S.useRef(ff),g=()=>{t.setInvalid(e.value,h.isInvalid?h:m.current)};S.useEffect(g);let b=t.realtimeValidation.isInvalid?t.realtimeValidation:h,x=c==="native"?t.displayValidation:b;var k;let P=W_({...e,isReadOnly:e.isReadOnly||t.isReadOnly,isDisabled:e.isDisabled||t.isDisabled,name:e.name||i,isRequired:(k=e.isRequired)!==null&&k!==void 0?k:t.isRequired,validationBehavior:c,[ev]:{realtimeValidation:b,displayValidation:x,resetValidation:t.resetValidation,commitValidation:t.commitValidation,updateValidation(_){m.current=_,g()}}},r,n);return{...P,inputProps:{...P.inputProps,"aria-describedby":[e["aria-describedby"],t.isInvalid?l:null,s].filter(Boolean).join(" ")||void 0}}}var Rk=Symbol("default");function R6(e){const t=S.useRef(null),n=S.useRef(void 0),r=S.useCallback(i=>{if(typeof e=="function"){const s=e,l=s(i);return()=>{typeof l=="function"?l():s(null)}}else if(e)return e.current=i,()=>{e.current=null}},[e]);return S.useMemo(()=>({get current(){return t.current},set current(i){t.current=i,n.current&&(n.current(),n.current=void 0),i!=null&&(n.current=r(i))}}),[r])}function ew(e,t){let n=S.useContext(e);if(t===null)return null;if(n&&typeof n=="object"&&"slots"in n&&n.slots){let r=new Intl.ListFormat().format(Object.keys(n.slots).map(s=>`"${s}"`));if(!t&&!n.slots[Rk])throw new Error(`A slot prop is required. Valid slot names are ${r}.`);let i=t||Rk;if(!n.slots[i])throw new Error(`Invalid slot "${t}". Valid slot names are ${r}.`);return n.slots[i]}return n}function L6(e,t,n){let r=ew(n,e.slot)||{},{ref:i,...s}=r,l=R6(S.useMemo(()=>pE(t,i),[t,i])),c=on(s,e);return"style"in s&&s.style&&"style"in e&&e.style&&(typeof s.style=="function"||typeof e.style=="function"?c.style=d=>{let h=typeof s.style=="function"?s.style(d):s.style,m={...d.defaultStyle,...h},g=typeof e.style=="function"?e.style({...d,defaultStyle:m}):e.style;return{...m,...g}}:c.style={...s.style,...e.style}),[c,l]}var tv=S.createContext(null),M6=S.forwardRef(function(t,n){[t,n]=L6(t,n,tv);let{validationErrors:r,validationBehavior:i="native",children:s,className:l,...c}=t;const d=S.useMemo(()=>PO({className:l}),[l]);return D.jsx("form",{noValidate:i!=="native",...c,ref:n,className:d,children:D.jsx(tv.Provider,{value:{...t,validationBehavior:i},children:D.jsx(U_.Provider,{value:r??{},children:s})})})}),D6=S.forwardRef(function(t,n){var r,i;const s=li(),l=(i=(r=t.validationBehavior)!=null?r:s?.validationBehavior)!=null?i:"native";return D.jsx(M6,{...t,ref:n,validationBehavior:l})}),[UG,N6]=pv({name:"CheckboxGroupContext",strict:!1});function F6(e){const{isSelected:t,disableAnimation:n,...r}=e;return D.jsx("svg",{"aria-hidden":"true",fill:"none",role:"presentation",stroke:"currentColor",strokeDasharray:22,strokeDashoffset:t?44:66,strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:2,style:!n&&t?{transition:"stroke-dashoffset 250ms linear 0.2s"}:{},viewBox:"0 0 17 18",...r,children:D.jsx("polyline",{points:"1 9 7 14 15 4"})})}function O6(e){const{isSelected:t,disableAnimation:n,...r}=e;return D.jsx("svg",{stroke:"currentColor",strokeWidth:3,viewBox:"0 0 24 24",...r,children:D.jsx("line",{x1:"21",x2:"3",y1:"12",y2:"12"})})}function z6(e){const{isIndeterminate:t,...n}=e,r=t?O6:F6;return D.jsx(r,{...n})}function Ab(e,t=[]){const n=S.useRef(e);return kh(()=>{n.current=e}),S.useCallback((...r)=>{var i;return(i=n.current)==null?void 0:i.call(n,...r)},t)}function j6(e={}){var t,n,r,i,s,l,c,d;const h=li(),m=N6(),{validationBehavior:g}=ew(tv)||{},b=!!m,{as:x,ref:k,value:P="",children:_,icon:T,name:$,isRequired:L,isReadOnly:z=!1,autoFocus:K=!1,isSelected:M,size:J=(t=m?.size)!=null?t:"md",color:re=(n=m?.color)!=null?n:"primary",radius:ae=m?.radius,lineThrough:j=(r=m?.lineThrough)!=null?r:!1,isDisabled:B=(i=m?.isDisabled)!=null?i:!1,disableAnimation:Y=(l=(s=m?.disableAnimation)!=null?s:h?.disableAnimation)!=null?l:!1,validationState:te,isInvalid:G=te?te==="invalid":(c=m?.isInvalid)!=null?c:!1,isIndeterminate:ce=!1,validationBehavior:Z=b?m.validationBehavior:(d=g??h?.validationBehavior)!=null?d:"native",defaultSelected:q,classNames:V,className:se,onValueChange:R,validate:U,...ie}=e,O=x||"label",me=S.useRef(null),Ce=S.useRef(null);let ye=e.onChange;b&&(ye=Jl(()=>{m.groupState.resetValidation()},ye));const Fe=S.useId(),De=S.useMemo(()=>({name:$,value:P,children:_,autoFocus:K,defaultSelected:q,isIndeterminate:ce,isRequired:L,isInvalid:G,isSelected:M,isDisabled:B,isReadOnly:z,"aria-label":dE(ie["aria-label"],_),"aria-labelledby":ie["aria-labelledby"]||Fe,onChange:R}),[$,P,_,K,q,ce,L,G,M,B,z,ie["aria-label"],ie["aria-labelledby"],Fe,R]),Te=G_(De),Xe={isInvalid:G,isRequired:L,validate:U,validationState:te,validationBehavior:Z},{inputProps:lt,isSelected:_e,isDisabled:mt,isReadOnly:pt,isPressed:Vt,isInvalid:Ve}=b?A6({...De,...Xe},m.groupState,Ce):W_({...De,...Xe},Te,Ce),it=mt||pt,Ut=te==="invalid"||G||Ve,Zn=it?!1:Vt,{hoverProps:ln,isHovered:_t}=Eu({isDisabled:lt.disabled}),{focusProps:Rt,isFocused:Tn,isFocusVisible:Cr}=Rf({autoFocus:lt.autoFocus}),Nt=S.useMemo(()=>_O({color:re,size:J,radius:ae,isInvalid:Ut,lineThrough:j,isDisabled:mt,disableAnimation:Y}),[re,J,ae,Ut,j,mt,Y]);kh(()=>{if(!Ce.current)return;const Pt=!!Ce.current.checked;Te.setSelected(Pt)},[Ce.current]);const pe=Ab(ye),Se=S.useCallback(Pt=>{if(pt||mt){Pt.preventDefault();return}pe?.(Pt)},[pt,mt,pe]),Oe=tn(V?.base,se),nt=S.useCallback(()=>({ref:me,className:Nt.base({class:Oe}),"data-disabled":$e(mt),"data-selected":$e(_e||ce),"data-invalid":$e(Ut),"data-hover":$e(_t),"data-focus":$e(Tn),"data-pressed":$e(Zn),"data-readonly":$e(lt.readOnly),"data-focus-visible":$e(Cr),"data-indeterminate":$e(ce),...on(ln,ie)}),[Nt,Oe,mt,_e,ce,Ut,_t,Tn,Zn,lt.readOnly,Cr,ln,ie]),at=S.useCallback((Pt={})=>({...Pt,"aria-hidden":!0,className:tn(Nt.wrapper({class:tn(V?.wrapper,Pt?.className)}))}),[Nt,V?.wrapper]),Kt=S.useCallback(()=>({ref:hE(Ce,k),...on(lt,Rt),className:Nt.hiddenInput({class:V?.hiddenInput}),onChange:Jl(lt.onChange,Se)}),[lt,Rt,Se,V?.hiddenInput]),Bn=S.useCallback(()=>({id:Fe,className:Nt.label({class:V?.label})}),[Nt,V?.label,mt,_e,Ut]),Qt=S.useCallback(()=>({isSelected:_e,isIndeterminate:ce,disableAnimation:Y,className:Nt.icon({class:V?.icon})}),[Nt,V?.icon,_e,ce,Y]);return{Component:O,icon:T,children:_,isSelected:_e,isDisabled:mt,isInvalid:Ut,isFocused:Tn,isHovered:_t,isFocusVisible:Cr,getBaseProps:nt,getWrapperProps:at,getInputProps:Kt,getLabelProps:Bn,getIconProps:Qt}}var q_=ai((e,t)=>{const{Component:n,children:r,icon:i=D.jsx(z6,{}),getBaseProps:s,getWrapperProps:l,getInputProps:c,getIconProps:d,getLabelProps:h}=j6({...e,ref:t}),m=typeof i=="function"?i(d()):S.cloneElement(i,d());return D.jsxs(n,{...s(),children:[D.jsx("input",{...c()}),D.jsx("span",{...l(),children:m}),r&&D.jsx("span",{...h(),children:r})]})});q_.displayName="HeroUI.Checkbox";var B6=q_;function Y_(e){let[t,n]=$u(e.isOpen,e.defaultOpen||!1,e.onOpenChange);const r=S.useCallback(()=>{n(!0)},[n]),i=S.useCallback(()=>{n(!1)},[n]),s=S.useCallback(()=>{n(!t)},[n,t]);return{isOpen:t,setOpen:n,open:r,close:i,toggle:s}}const V6=1500,Lk=500;let au={},U6=0,wp=!1,Gs=null,uu=null;function K6(e={}){let{delay:t=V6,closeDelay:n=Lk}=e,{isOpen:r,open:i,close:s}=Y_(e),l=S.useMemo(()=>`${++U6}`,[]),c=S.useRef(null),d=S.useRef(s),h=()=>{au[l]=b},m=()=>{for(let k in au)k!==l&&(au[k](!0),delete au[k])},g=()=>{c.current&&clearTimeout(c.current),c.current=null,m(),h(),wp=!0,i(),Gs&&(clearTimeout(Gs),Gs=null),uu&&(clearTimeout(uu),uu=null)},b=k=>{k||n<=0?(c.current&&clearTimeout(c.current),c.current=null,d.current()):c.current||(c.current=setTimeout(()=>{c.current=null,d.current()},n)),Gs&&(clearTimeout(Gs),Gs=null),wp&&(uu&&clearTimeout(uu),uu=setTimeout(()=>{delete au[l],uu=null,wp=!1},Math.max(Lk,n)))},x=()=>{m(),h(),!r&&!Gs&&!wp?Gs=setTimeout(()=>{Gs=null,wp=!0,g()},t):r||g()};return S.useEffect(()=>{d.current=s},[s]),S.useEffect(()=>()=>{c.current&&clearTimeout(c.current),au[l]&&delete au[l]},[l]),{isOpen:r,open:k=>{!k&&t>0&&!c.current?x():g()},close:b}}function W6(e,t){let n=Iu(e,{labelable:!0}),{hoverProps:r}=Eu({onHoverStart:()=>t?.open(!0),onHoverEnd:()=>t?.close()});return{tooltipProps:Pn(n,r,{role:"tooltip"})}}function H6(e,t,n){let{isDisabled:r,trigger:i}=e,s=Pf(),l=S.useRef(!1),c=S.useRef(!1),d=()=>{(l.current||c.current)&&t.open(c.current)},h=T=>{!l.current&&!c.current&&t.close(T)};S.useEffect(()=>{let T=$=>{n&&n.current&&$.key==="Escape"&&($.stopPropagation(),t.close(!0))};if(t.isOpen)return document.addEventListener("keydown",T,!0),()=>{document.removeEventListener("keydown",T,!0)}},[n,t]);let m=()=>{i!=="focus"&&(sh()==="pointer"?l.current=!0:l.current=!1,d())},g=()=>{i!=="focus"&&(c.current=!1,l.current=!1,h())},b=()=>{c.current=!1,l.current=!1,h(!0)},x=()=>{qx()&&(c.current=!0,d())},k=()=>{c.current=!1,l.current=!1,h(!0)},{hoverProps:P}=Eu({isDisabled:r,onHoverStart:m,onHoverEnd:g}),{focusableProps:_}=wh({isDisabled:r,onFocus:x,onBlur:k},n);return{triggerProps:{"aria-describedby":t.isOpen?s:void 0,...Pn(_,P,{onPointerDown:b,onKeyDown:b,tabIndex:void 0})},tooltipProps:{id:s}}}var qs=[];function X_(e,t){const{disableOutsideEvents:n=!0,isDismissable:r=!1,isKeyboardDismissDisabled:i=!1,isOpen:s,onClose:l,shouldCloseOnBlur:c,shouldCloseOnInteractOutside:d}=e;S.useEffect(()=>(s&&qs.push(t),()=>{const P=qs.indexOf(t);P>=0&&qs.splice(P,1)}),[s,t]);const h=()=>{qs[qs.length-1]===t&&l&&l()},m=P=>{(!d||d(P.target))&&(qs[qs.length-1]===t&&n&&(P.stopPropagation(),P.preventDefault()),P.pointerType!=="touch"&&h())},g=P=>{P.pointerType==="touch"&&(!d||d(P.target))&&(qs[qs.length-1]===t&&n&&(P.stopPropagation(),P.preventDefault()),h())},b=P=>{P.key==="Escape"&&!i&&!P.nativeEvent.isComposing&&(P.stopPropagation(),P.preventDefault(),h())};H5({isDisabled:!(r&&s),onInteractOutside:r&&s?g:void 0,onInteractOutsideStart:m,ref:t});const{focusWithinProps:x}=kv({isDisabled:!c,onBlurWithin:P=>{!P.relatedTarget||X5(P.relatedTarget)||(!d||d(P.relatedTarget))&&h()}}),k=P=>{P.target===P.currentTarget&&P.preventDefault()};return{overlayProps:{onKeyDown:b,...x},underlayProps:{onPointerDown:k}}}function G6(e){var t,n;const r=li(),[i,s]=ra(e,hk.variantKeys),{ref:l,as:c,isOpen:d,content:h,children:m,defaultOpen:g,onOpenChange:b,isDisabled:x,trigger:k,shouldFlip:P=!0,containerPadding:_=12,placement:T="top",delay:$=0,closeDelay:L=500,showArrow:z=!1,offset:K=7,crossOffset:M=0,isDismissable:J,shouldCloseOnBlur:re=!0,portalContainer:ae,isKeyboardDismissDisabled:j=!1,updatePositionDeps:B=[],shouldCloseOnInteractOutside:Y,className:te,onClose:G,motionProps:ce,classNames:Z,...q}=i,V=c||"div",se=(n=(t=e?.disableAnimation)!=null?t:r?.disableAnimation)!=null?n:!1,R=K6({delay:$,closeDelay:L,isDisabled:x,defaultOpen:g,isOpen:d,onOpenChange:Ve=>{b?.(Ve),Ve||G?.()}}),U=S.useRef(null),ie=S.useRef(null),O=S.useId(),me=R.isOpen&&!x;S.useImperativeHandle(l,()=>iL(ie));const{triggerProps:Ce,tooltipProps:ye}=H6({isDisabled:x,trigger:k},R,U),{tooltipProps:Fe}=W6({isOpen:me,...on(i,ye)},R),{overlayProps:De,placement:Te,updatePosition:Xe}=x5({isOpen:me,targetRef:U,placement:p6(T),overlayRef:ie,offset:z?K+3:K,crossOffset:M,shouldFlip:P,containerPadding:_});kh(()=>{B.length&&Xe()},B);const{overlayProps:lt}=X_({isOpen:me,onClose:R.close,isDismissable:J,shouldCloseOnBlur:re,isKeyboardDismissDisabled:j,shouldCloseOnInteractOutside:Y},ie),_e=S.useMemo(()=>{var Ve,it,Ut;return hk({...s,disableAnimation:se,radius:(Ve=e?.radius)!=null?Ve:"md",size:(it=e?.size)!=null?it:"md",shadow:(Ut=e?.shadow)!=null?Ut:"sm"})},[nl(s),se,e?.radius,e?.size,e?.shadow]),mt=S.useCallback((Ve={},it=null)=>({...on(Ce,Ve),ref:hE(it,U),"aria-describedby":me?O:void 0}),[Ce,me,O,R]),pt=S.useCallback(()=>({ref:ie,"data-slot":"base","data-open":$e(me),"data-arrow":$e(z),"data-disabled":$e(x),"data-placement":$k(Te||"top",T),...on(Fe,lt,q),style:on(De.style,q.style,i.style),className:_e.base({class:Z?.base}),id:O}),[_e,me,z,x,Te,T,Fe,lt,q,De,i,O]),Vt=S.useCallback(()=>({"data-slot":"content","data-open":$e(me),"data-arrow":$e(z),"data-disabled":$e(x),"data-placement":$k(Te||"top",T),className:_e.content({class:tn(Z?.content,te)})}),[_e,me,z,x,Te,T,Z]);return{Component:V,content:h,children:m,isOpen:me,triggerRef:U,showArrow:z,portalContainer:ae,placement:T,disableAnimation:se,isDisabled:x,motionProps:ce,getTooltipContentProps:Vt,getTriggerProps:mt,getTooltipProps:pt}}var q6=()=>no(()=>import("./index-CYQIHhg3.js"),[]).then(e=>e.default),Q_=ai((e,t)=>{var n;const{Component:r,children:i,content:s,isOpen:l,portalContainer:c,placement:d,disableAnimation:h,motionProps:m,getTriggerProps:g,getTooltipProps:b,getTooltipContentProps:x}=G6({...e,ref:t});let k;try{if(S.Children.count(i)!==1)throw new Error;if(!S.isValidElement(i))k=D.jsx("p",{...g(),children:i});else{const K=i,M=(n=K.props.ref)!=null?n:K.ref;k=S.cloneElement(K,g(K.props,M))}}catch{k=D.jsx("span",{}),pL("Tooltip must have only one child node. Please, check your code.")}const{ref:P,id:_,style:T,...$}=b(),L=D.jsx("div",{ref:P,id:_,style:T,children:D.jsx(Af.div,{animate:"enter",exit:"exit",initial:"exit",variants:Zg.scaleSpring,...on(m,$),style:{...d6(d)},children:D.jsx(r,{...x(),children:s})},`${_}-tooltip-inner`)},`${_}-tooltip-content`);return D.jsxs(D.Fragment,{children:[k,h?l&&D.jsx(ik,{portalContainer:c,children:D.jsx("div",{ref:P,id:_,style:T,...$,children:D.jsx(r,{...x(),children:s})})}):D.jsx($f,{features:q6,children:D.jsx(Ru,{children:l&&D.jsx(ik,{portalContainer:c,children:L})})})]})});Q_.displayName="HeroUI.Tooltip";var Y6=Q_;function X6(e={}){const{rerender:t=!1,delay:n=0}=e,r=S.useRef(!1),[i,s]=S.useState(!1);return S.useEffect(()=>{r.current=!0;let l=null;return t&&(n>0?l=setTimeout(()=>{s(!0)},n):s(!0)),()=>{r.current=!1,t&&s(!1),l&&clearTimeout(l)}},[t]),[S.useCallback(()=>r.current,[]),i]}function Q6(e){let{value:t=0,minValue:n=0,maxValue:r=100,valueLabel:i,isIndeterminate:s,formatOptions:l={style:"percent"}}=e,c=Iu(e,{labelable:!0}),{labelProps:d,fieldProps:h}=H_({...e,labelElementType:"span"});t=Bg(t,n,r);let m=(t-n)/(r-n),g=CM(l);if(!s&&!i){let b=l.style==="percent"?m:t;i=g.format(b)}return{progressBarProps:Pn(c,{...h,"aria-valuenow":s?void 0:t,"aria-valuemin":n,"aria-valuemax":r,"aria-valuetext":s?void 0:i,role:"progressbar"}),labelProps:d}}function J6(e){var t,n,r;const i=li(),[s,l]=ra(e,mk.variantKeys),{ref:c,as:d,id:h,className:m,classNames:g,label:b,valueLabel:x,value:k=void 0,minValue:P=0,maxValue:_=100,strokeWidth:T,showValueLabel:$=!1,formatOptions:L={style:"percent"},...z}=s,K=d||"div",M=Ji(c),J=tn(g?.base,m),[,re]=X6({rerender:!0,delay:100}),ae=((t=e.isIndeterminate)!=null?t:!0)&&k===void 0,j=(r=(n=e.disableAnimation)!=null?n:i?.disableAnimation)!=null?r:!1,{progressBarProps:B,labelProps:Y}=Q6({id:h,label:b,value:k,minValue:P,maxValue:_,valueLabel:x,formatOptions:L,isIndeterminate:ae,"aria-labelledby":e["aria-labelledby"],"aria-label":e["aria-label"]}),te=S.useMemo(()=>mk({...l,disableAnimation:j,isIndeterminate:ae}),[nl(l),j,ae]),G=j?!0:re,ce=16,Z=T||(e.size==="sm"?2:3),q=16-Z,V=2*q*Math.PI,se=S.useMemo(()=>G?ae?.25:k?dL((k-P)/(_-P),1):0:0,[G,k,P,_,ae]),R=V-se*V,U=S.useCallback((ye={})=>({ref:M,"data-indeterminate":$e(ae),"data-disabled":$e(e.isDisabled),className:te.base({class:J}),...on(B,z,ye)}),[M,te,ae,e.isDisabled,J,B,z]),ie=S.useCallback((ye={})=>({className:te.label({class:g?.label}),...on(Y,ye)}),[te,g,Y]),O=S.useCallback((ye={})=>({viewBox:"0 0 32 32",fill:"none",strokeWidth:Z,className:te.svg({class:g?.svg}),...ye}),[Z,te,g]),me=S.useCallback((ye={})=>({cx:ce,cy:ce,r:q,role:"presentation",strokeDasharray:`${V} ${V}`,strokeDashoffset:R,transform:"rotate(-90 16 16)",strokeLinecap:"round",className:te.indicator({class:g?.indicator}),...ye}),[te,g,R,V,q]),Ce=S.useCallback((ye={})=>({cx:ce,cy:ce,r:q,role:"presentation",strokeDasharray:`${V} ${V}`,strokeDashoffset:0,transform:"rotate(-90 16 16)",strokeLinecap:"round",className:te.track({class:g?.track}),...ye}),[te,g,V,q]);return{Component:K,domRef:M,slots:te,classNames:g,label:b,showValueLabel:$,getProgressBarProps:U,getLabelProps:ie,getSvgProps:O,getIndicatorProps:me,getTrackProps:Ce}}var J_=ai((e,t)=>{const{Component:n,slots:r,classNames:i,label:s,showValueLabel:l,getProgressBarProps:c,getLabelProps:d,getSvgProps:h,getIndicatorProps:m,getTrackProps:g}=J6({ref:t,...e}),b=c();return D.jsxs(n,{...b,children:[D.jsxs("div",{className:r.svgWrapper({class:i?.svgWrapper}),children:[D.jsxs("svg",{...h(),children:[D.jsx("circle",{...g()}),D.jsx("circle",{...m()})]}),l&&D.jsx("span",{className:r.value({class:i?.value}),children:b["aria-valuetext"]})]}),s&&D.jsx("span",{...d(),children:s})]})});J_.displayName="HeroUI.CircularProgress";var Z_=J_;function Z6(e,t){let{inputElementType:n="input",isDisabled:r=!1,isRequired:i=!1,isReadOnly:s=!1,type:l="text",validationBehavior:c="aria"}=e,[d,h]=$u(e.value,e.defaultValue||"",e.onChange),{focusableProps:m}=wh(e,t),g=Zx({...e,value:d}),{isInvalid:b,validationErrors:x,validationDetails:k}=g.displayValidation,{labelProps:P,fieldProps:_,descriptionProps:T,errorMessageProps:$}=$6({...e,isInvalid:b,errorMessage:e.errorMessage||x}),L=Iu(e,{labelable:!0});const z={type:l,pattern:e.pattern};return LE(t,d,h),K_(e,g,t),S.useEffect(()=>{if(t.current instanceof Zi(t.current).HTMLTextAreaElement){let K=t.current;Object.defineProperty(K,"defaultValue",{get:()=>K.value,set:()=>{},configurable:!0})}},[t]),{labelProps:P,inputProps:Pn(L,n==="input"?z:void 0,{disabled:r,readOnly:s,required:i&&c==="native","aria-required":i&&c==="aria"||void 0,"aria-invalid":b||void 0,"aria-errormessage":e["aria-errormessage"],"aria-activedescendant":e["aria-activedescendant"],"aria-autocomplete":e["aria-autocomplete"],"aria-haspopup":e["aria-haspopup"],"aria-controls":e["aria-controls"],value:d,onChange:K=>h(K.target.value),autoComplete:e.autoComplete,autoCapitalize:e.autoCapitalize,maxLength:e.maxLength,minLength:e.minLength,name:e.name,placeholder:e.placeholder,inputMode:e.inputMode,autoCorrect:e.autoCorrect,spellCheck:e.spellCheck,[parseInt(We.version,10)>=17?"enterKeyHint":"enterkeyhint"]:e.enterKeyHint,onCopy:e.onCopy,onCut:e.onCut,onPaste:e.onPaste,onCompositionEnd:e.onCompositionEnd,onCompositionStart:e.onCompositionStart,onCompositionUpdate:e.onCompositionUpdate,onSelect:e.onSelect,onBeforeInput:e.onBeforeInput,onInput:e.onInput,...m,..._}),descriptionProps:T,errorMessageProps:$,isInvalid:b,validationErrors:x,validationDetails:k}}function ez(e){var t,n,r,i,s,l,c;const d=li(),{validationBehavior:h}=ew(tv)||{},[m,g]=ra(e,yk.variantKeys),{ref:b,as:x,type:k,label:P,baseRef:_,wrapperRef:T,description:$,className:L,classNames:z,autoFocus:K,startContent:M,endContent:J,onClear:re,onChange:ae,validationState:j,validationBehavior:B=(t=h??d?.validationBehavior)!=null?t:"native",innerWrapperRef:Y,onValueChange:te=()=>{},...G}=m,ce=S.useCallback(Ye=>{te(Ye??"")},[te]),[Z,q]=S.useState(!1),V=x||"div",se=(r=(n=e.disableAnimation)!=null?n:d?.disableAnimation)!=null?r:!1,R=Ji(b),U=Ji(_),ie=Ji(T),O=Ji(Y),[me,Ce]=$u(m.value,(i=m.defaultValue)!=null?i:"",ce),ye=k==="file",Fe=((c=(l=(s=R?.current)==null?void 0:s.files)==null?void 0:l.length)!=null?c:0)>0,De=["date","time","month","week","range"].includes(k),Te=!lL(me)||De||Fe,Xe=Te||Z,lt=k==="hidden",_e=e.isMultiline,mt=tn(z?.base,L,Te?"is-filled":""),pt=S.useCallback(()=>{var Ye;ye?R.current.value="":Ce(""),re?.(),(Ye=R.current)==null||Ye.focus()},[Ce,re,ye]);kh(()=>{R.current&&Ce(R.current.value)},[R.current]);const{labelProps:Vt,inputProps:Ve,isInvalid:it,validationErrors:Ut,validationDetails:Zn,descriptionProps:ln,errorMessageProps:_t}=Z6({...e,validationBehavior:B,autoCapitalize:e.autoCapitalize,value:me,"aria-label":e.label?e["aria-label"]:dE(e["aria-label"],e.placeholder),inputElementType:_e?"textarea":"input",onChange:Ce},R);ye&&(delete Ve.value,delete Ve.onChange);const{isFocusVisible:Rt,isFocused:Tn,focusProps:Cr}=Rf({autoFocus:K,isTextInput:!0}),{isHovered:Nt,hoverProps:pe}=Eu({isDisabled:!!e?.isDisabled}),{isHovered:Se,hoverProps:Oe}=Eu({isDisabled:!!e?.isDisabled}),{focusProps:nt,isFocusVisible:at}=Rf(),{focusWithinProps:Kt}=kv({onFocusWithinChange:q}),{pressProps:Bn}=Su({isDisabled:!!e?.isDisabled||!!e?.isReadOnly,onPress:pt}),Qt=j==="invalid"||it,Pt=bF({labelPlacement:e.labelPlacement,label:P}),Er=typeof m.errorMessage=="function"?m.errorMessage({isInvalid:Qt,validationErrors:Ut,validationDetails:Zn}):m.errorMessage||Ut?.join(" "),Ft=!!re||e.isClearable,er=!!P||!!$||!!Er,an=!!m.placeholder,ol=!!P,hs=!!$||!!Er,ci=Pt==="outside-left",fi=Pt==="outside-top",la=Pt==="outside"||ci||fi,Mu=Pt==="inside",ms=R.current?(!R.current.value||R.current.value===""||!me||me==="")&&an:!1,jr=!!M,aa=la?ci||fi||an||Pt==="outside"&&jr:!1,ua=Pt==="outside"&&!an&&!jr,Jt=S.useMemo(()=>yk({...g,isInvalid:Qt,labelPlacement:Pt,isClearable:Ft,disableAnimation:se}),[nl(g),Qt,Pt,Ft,jr,se]),gs=S.useCallback((Ye={})=>({ref:U,className:Jt.base({class:mt}),"data-slot":"base","data-filled":$e(Te||an||jr||ms||ye),"data-filled-within":$e(Xe||an||jr||ms||ye),"data-focus-within":$e(Z),"data-focus-visible":$e(Rt),"data-readonly":$e(e.isReadOnly),"data-focus":$e(Tn),"data-hover":$e(Nt||Se),"data-required":$e(e.isRequired),"data-invalid":$e(Qt),"data-disabled":$e(e.isDisabled),"data-has-elements":$e(er),"data-has-helper":$e(hs),"data-has-label":$e(ol),"data-has-value":$e(!ms),"data-hidden":$e(lt),...Kt,...Ye}),[Jt,mt,Te,Tn,Nt,Se,Qt,hs,ol,er,ms,jr,Z,Rt,Xe,an,Kt,lt,e.isReadOnly,e.isRequired,e.isDisabled]),vs=S.useCallback((Ye={})=>({"data-slot":"label",className:Jt.label({class:z?.label}),...on(Vt,Oe,Ye)}),[Jt,Se,Vt,z?.label]),Ro=S.useCallback(Ye=>{Ye.key==="Escape"&&me&&(Ft||re)&&!e.isReadOnly&&(Ce(""),re?.())},[me,Ce,re,Ft,e.isReadOnly]),ca=S.useCallback((Ye={})=>({"data-slot":"input","data-filled":$e(Te),"data-filled-within":$e(Xe),"data-has-start-content":$e(jr),"data-has-end-content":$e(!!J),"data-type":k,className:Jt.input({class:tn(z?.input,Te?"is-filled":"",_e?"pe-0":"",k==="password"?"[&::-ms-reveal]:hidden":"")}),...on(Cr,Ve,Ef(G,{enabled:!0,labelable:!0,omitEventNames:new Set(Object.keys(Ve))}),Ye),"aria-readonly":$e(e.isReadOnly),onChange:Jl(Ve.onChange,ae),onKeyDown:Jl(Ve.onKeyDown,Ye.onKeyDown,Ro),ref:R}),[Jt,me,Cr,Ve,G,Te,Xe,jr,J,z?.input,e.isReadOnly,e.isRequired,ae,Ro]),ys=S.useCallback((Ye={})=>({ref:ie,"data-slot":"input-wrapper","data-hover":$e(Nt||Se),"data-focus-visible":$e(Rt),"data-focus":$e(Tn),className:Jt.inputWrapper({class:tn(z?.inputWrapper,Te?"is-filled":"")}),...on(Ye,pe),onClick:oo=>{R.current&&oo.currentTarget===oo.target&&R.current.focus()},style:{cursor:"text",...Ye.style}}),[Jt,Nt,Se,Rt,Tn,me,z?.inputWrapper]),sl=S.useCallback((Ye={})=>({...Ye,ref:O,"data-slot":"inner-wrapper",onClick:oo=>{R.current&&oo.currentTarget===oo.target&&R.current.focus()},className:Jt.innerWrapper({class:tn(z?.innerWrapper,Ye?.className)})}),[Jt,z?.innerWrapper]),ll=S.useCallback((Ye={})=>({...Ye,"data-slot":"main-wrapper",className:Jt.mainWrapper({class:tn(z?.mainWrapper,Ye?.className)})}),[Jt,z?.mainWrapper]),fa=S.useCallback((Ye={})=>({...Ye,"data-slot":"helper-wrapper",className:Jt.helperWrapper({class:tn(z?.helperWrapper,Ye?.className)})}),[Jt,z?.helperWrapper]),Wf=S.useCallback((Ye={})=>({...Ye,...ln,"data-slot":"description",className:Jt.description({class:tn(z?.description,Ye?.className)})}),[Jt,z?.description]),Hf=S.useCallback((Ye={})=>({...Ye,..._t,"data-slot":"error-message",className:Jt.errorMessage({class:tn(z?.errorMessage,Ye?.className)})}),[Jt,_t,z?.errorMessage]),Gf=S.useCallback((Ye={})=>({...Ye,type:"button",tabIndex:-1,disabled:e.isDisabled,"aria-label":"clear input","data-slot":"clear-button","data-focus-visible":$e(at),className:Jt.clearButton({class:tn(z?.clearButton,Ye?.className)}),...on(Bn,nt)}),[Jt,at,Bn,nt,z?.clearButton]);return{Component:V,classNames:z,domRef:R,label:P,description:$,startContent:M,endContent:J,labelPlacement:Pt,isClearable:Ft,hasHelper:hs,hasStartContent:jr,isLabelOutside:aa,isOutsideLeft:ci,isOutsideTop:fi,isLabelOutsideAsPlaceholder:ua,shouldLabelBeOutside:la,shouldLabelBeInside:Mu,hasPlaceholder:an,isInvalid:Qt,errorMessage:Er,getBaseProps:gs,getLabelProps:vs,getInputProps:ca,getMainWrapperProps:ll,getInputWrapperProps:ys,getInnerWrapperProps:sl,getHelperWrapperProps:fa,getDescriptionProps:Wf,getErrorMessageProps:Hf,getClearButtonProps:Gf}}function Rb(){return Rb=Object.assign?Object.assign.bind():function(e){for(var t=1;t{const{Component:d,label:h,description:m,startContent:g,endContent:b,hasHelper:x,shouldLabelBeOutside:k,shouldLabelBeInside:P,isInvalid:_,errorMessage:T,getBaseProps:$,getLabelProps:L,getInputProps:z,getInnerWrapperProps:K,getInputWrapperProps:M,getHelperWrapperProps:J,getDescriptionProps:re,getErrorMessageProps:ae,isClearable:j,getClearButtonProps:B}=ez({...l,ref:c,isMultiline:!0}),[Y,te]=S.useState(t>1),[G,ce]=S.useState(!1),Z=h?D.jsx("label",{...L(),children:h}):null,q=z(),V=(me,Ce)=>{if(t===1&&te(me>=Ce.rowHeight*2),n>t){const ye=me>=n*Ce.rowHeight;ce(ye)}s?.(me,Ce)},se=i?D.jsx("textarea",{...q,style:on(q.style,e??{})}):D.jsx(vz,{...q,cacheMeasurements:r,"data-hide-scroll":$e(!G),maxRows:n,minRows:t,style:on(q.style,e??{}),onHeightChange:V}),R=S.useMemo(()=>j?D.jsx("button",{...B(),children:D.jsx(HO,{})}):null,[j,B]),U=S.useMemo(()=>g||b?D.jsxs("div",{...K(),children:[g,se,b]}):D.jsx("div",{...K(),children:se}),[g,q,b,K]),ie=_&&T,O=ie||m;return D.jsxs(d,{...$(),children:[k?Z:null,D.jsxs("div",{...M(),"data-has-multiple-rows":$e(Y),children:[P?Z:null,U,R]}),x&&O?D.jsx("div",{...J(),children:ie?D.jsx("div",{...ae(),children:T}):D.jsx("div",{...re(),children:m})}):null]})});e2.displayName="HeroUI.Textarea";var yz=e2;function bz(e,t){let{role:n="dialog"}=e,r=W0();r=e["aria-label"]?void 0:r;let i=S.useRef(!1);return S.useEffect(()=>{if(t.current&&!t.current.contains(document.activeElement)){Cu(t.current);let s=setTimeout(()=>{document.activeElement===t.current&&(i.current=!0,t.current&&(t.current.blur(),Cu(t.current)),i.current=!1)},500);return()=>{clearTimeout(s)}}},[t]),h_(),{dialogProps:{...Iu(e,{labelable:!0}),role:n,tabIndex:-1,"aria-labelledby":e["aria-labelledby"]||r,onBlur:s=>{i.current&&s.stopPropagation()}},titleProps:{id:r}}}function xz(e){var t,n;const r=li(),[i,s]=ra(e,xk.variantKeys),{ref:l,as:c,src:d,className:h,classNames:m,loading:g,isBlurred:b,fallbackSrc:x,isLoading:k,disableSkeleton:P=!!x,removeWrapper:_=!1,onError:T,onLoad:$,srcSet:L,sizes:z,crossOrigin:K,...M}=i,J=m6({src:d,loading:g,onError:T,onLoad:$,ignoreFallback:!1,srcSet:L,sizes:z,crossOrigin:K,shouldBypassImageLoad:c!==void 0}),re=(n=(t=e.disableAnimation)!=null?t:r?.disableAnimation)!=null?n:!1,ae=J==="loaded"&&!k,j=J==="loading"||k,B=e.isZoomed,Y=c||"img",te=Ji(l),{w:G,h:ce}=S.useMemo(()=>({w:i.width?typeof i.width=="number"?`${i.width}px`:i.width:"fit-content",h:i.height?typeof i.height=="number"?`${i.height}px`:i.height:"auto"}),[i?.width,i?.height]),Z=(!d||!ae)&&!!x,q=j&&!P,V=S.useMemo(()=>xk({...s,disableAnimation:re,showSkeleton:q}),[nl(s),re,q]),se=tn(h,m?.img),R=(O={})=>{const me=tn(se,O?.className);return{src:d,ref:te,"data-loaded":$e(ae),className:V.img({class:me}),loading:g,srcSet:L,sizes:z,crossOrigin:K,...M,style:{...M?.height&&{height:ce},...O.style,...M.style}}},U=S.useCallback(()=>{const O=Z?{backgroundImage:`url(${x})`}:{};return{className:V.wrapper({class:m?.wrapper}),style:{...O,maxWidth:G}}},[V,Z,x,m?.wrapper,G]),ie=S.useCallback(()=>({src:d,"aria-hidden":$e(!0),className:V.blurredImg({class:m?.blurredImg})}),[V,d,m?.blurredImg]);return{Component:Y,domRef:te,slots:V,classNames:m,isBlurred:b,disableSkeleton:P,fallbackSrc:x,removeWrapper:_,isZoomed:B,isLoading:j,getImgProps:R,getWrapperProps:U,getBlurredImgProps:ie}}var t2=ai((e,t)=>{const{Component:n,domRef:r,slots:i,classNames:s,isBlurred:l,isZoomed:c,fallbackSrc:d,removeWrapper:h,disableSkeleton:m,getImgProps:g,getWrapperProps:b,getBlurredImgProps:x}=xz({...e,ref:t}),k=D.jsx(n,{ref:r,...g()});if(h)return k;const P=D.jsx("div",{className:i.zoomedWrapper({class:s?.zoomedWrapper}),children:k});return l?D.jsxs("div",{...b(),children:[c?P:k,S.cloneElement(k,x())]}):c||!m||d?D.jsxs("div",{...b(),children:[" ",c?P:k]}):k});t2.displayName="HeroUI.Image";var y0=t2,[wz,n2]=pv({name:"ModalContext",errorMessage:"useModalContext: `context` is undefined. Seems you forgot to wrap all popover components within ``"}),r2=ai((e,t)=>{const{as:n,children:r,className:i,...s}=e,{slots:l,classNames:c,bodyId:d,setBodyMounted:h}=n2(),m=Ji(t),g=n||"div";return S.useEffect(()=>(h(!0),()=>h(!1)),[h]),D.jsx(g,{ref:m,className:l.body({class:tn(c?.body,i)}),id:d,...s,children:r})});r2.displayName="HeroUI.ModalBody";var Sz=r2,kz={enter:{scale:"var(--scale-enter)",y:"var(--slide-enter)",opacity:1,willChange:"auto",transition:{scale:{duration:.4,ease:Vp.ease},opacity:{duration:.4,ease:Vp.ease},y:{type:"spring",bounce:0,duration:.6}}},exit:{scale:"var(--scale-exit)",y:"var(--slide-exit)",opacity:0,willChange:"transform",transition:{duration:.3,ease:Vp.ease}}},ls=typeof document<"u"&&window.visualViewport,Cz=We.createContext(!1);function Ez(){return!1}function Pz(){return!0}function Tz(e){return()=>{}}function _z(){return typeof We.useSyncExternalStore=="function"?We.useSyncExternalStore(Tz,Ez,Pz):S.useContext(Cz)}function Iz(){let e=_z(),[t,n]=S.useState(()=>e?{width:0,height:0}:zk());return S.useEffect(()=>{let r=()=>{n(i=>{let s=zk();return s.width===i.width&&s.height===i.height?i:s})};return ls?ls.addEventListener("resize",r):window.addEventListener("resize",r),()=>{ls?ls.removeEventListener("resize",r):window.removeEventListener("resize",r)}},[]),t}function zk(){return{width:ls&&ls?.width||window.innerWidth,height:ls&&ls?.height||window.innerHeight}}var jk=()=>no(()=>import("./index-CYQIHhg3.js"),[]).then(e=>e.default),i2=e=>{const{as:t,children:n,role:r="dialog",...i}=e,{Component:s,domRef:l,slots:c,classNames:d,motionProps:h,backdrop:m,closeButton:g,hideCloseButton:b,disableAnimation:x,getDialogProps:k,getBackdropProps:P,getCloseButtonProps:_,onClose:T}=n2(),$=t||s||"div",L=Iz(),{dialogProps:z}=bz({role:r},l),K=S.isValidElement(g)?S.cloneElement(g,_()):D.jsx("button",{..._(),children:D.jsx(GO,{})}),M=S.useCallback(Y=>{Y.key==="Tab"&&Y.nativeEvent.isComposing&&(Y.stopPropagation(),Y.preventDefault())},[]),J=k(on(z,i)),re=D.jsxs($,{...J,onKeyDown:Jl(J.onKeyDown,M),children:[D.jsx(sk,{onDismiss:T}),!b&&K,typeof n=="function"?n(T):n,D.jsx(sk,{onDismiss:T})]}),ae=S.useMemo(()=>m==="transparent"?null:x?D.jsx("div",{...P()}):D.jsx($f,{features:jk,children:D.jsx(Af.div,{animate:"enter",exit:"exit",initial:"exit",variants:Zg.fade,...P()})}),[m,x,P]),j={"--visual-viewport-height":L.height+"px"},B=x?D.jsx("div",{className:c.wrapper({class:d?.wrapper}),"data-slot":"wrapper",style:j,children:re}):D.jsx($f,{features:jk,children:D.jsx(Af.div,{animate:"enter",className:c.wrapper({class:d?.wrapper}),"data-slot":"wrapper",exit:"exit",initial:"exit",variants:kz,...h,style:j,children:re})});return D.jsxs("div",{tabIndex:-1,children:[ae,B]})};i2.displayName="HeroUI.ModalContent";var $z=i2;function Az(e={shouldBlockScroll:!0},t,n){let{overlayProps:r,underlayProps:i}=X_({...e,isOpen:t.isOpen,onClose:t.close},n);return oF({isDisabled:!t.isOpen||!e.shouldBlockScroll}),h_(),S.useEffect(()=>{if(t.isOpen&&n.current)return gF([n.current])},[t.isOpen,n]),{modalProps:Pn(r),underlayProps:i}}function Rz(e){var t,n,r;const i=li(),[s,l]=ra(e,bk.variantKeys),{ref:c,as:d,className:h,classNames:m,isOpen:g,defaultOpen:b,onOpenChange:x,motionProps:k,closeButton:P,isDismissable:_=!0,hideCloseButton:T=!1,shouldBlockScroll:$=!0,portalContainer:L,isKeyboardDismissDisabled:z=!1,onClose:K,...M}=s,J=d||"section",re=Ji(c),ae=S.useRef(null),[j,B]=S.useState(!1),[Y,te]=S.useState(!1),G=(n=(t=e.disableAnimation)!=null?t:i?.disableAnimation)!=null?n:!1,ce=S.useId(),Z=S.useId(),q=S.useId(),V=Y_({isOpen:g,defaultOpen:b,onOpenChange:Te=>{x?.(Te),Te||K?.()}}),{modalProps:se,underlayProps:R}=Az({isDismissable:_,shouldBlockScroll:$,isKeyboardDismissDisabled:z},V,re),{buttonProps:U}=F_({onPress:V.close},ae),{isFocusVisible:ie,focusProps:O}=Rf(),me=tn(m?.base,h),Ce=S.useMemo(()=>bk({...l,disableAnimation:G}),[nl(l),G]),ye=(Te={},Xe=null)=>{var lt;return{ref:pE(Xe,re),...on(se,M,Te),className:Ce.base({class:tn(me,Te.className)}),id:ce,"data-open":$e(V.isOpen),"data-dismissable":$e(_),"aria-modal":$e(!0),"data-placement":(lt=e?.placement)!=null?lt:"right","aria-labelledby":j?Z:void 0,"aria-describedby":Y?q:void 0}},Fe=S.useCallback((Te={})=>({className:Ce.backdrop({class:m?.backdrop}),...R,...Te}),[Ce,m,R]),De=()=>({role:"button",tabIndex:0,"aria-label":"Close","data-focus-visible":$e(ie),className:Ce.closeButton({class:m?.closeButton}),...on(U,O)});return{Component:J,slots:Ce,domRef:re,headerId:Z,bodyId:q,motionProps:k,classNames:m,isDismissable:_,closeButton:P,hideCloseButton:T,portalContainer:L,shouldBlockScroll:$,backdrop:(r=e.backdrop)!=null?r:"opaque",isOpen:V.isOpen,onClose:V.close,disableAnimation:G,setBodyMounted:te,setHeaderMounted:B,getDialogProps:ye,getBackdropProps:Fe,getCloseButtonProps:De}}var o2=ai((e,t)=>{const{children:n,...r}=e,i=Rz({...r,ref:t}),s=D.jsx(vF,{portalContainer:i.portalContainer,children:n});return D.jsx(wz,{value:i,children:i.disableAnimation&&i.isOpen?s:D.jsx(Ru,{children:i.isOpen?s:null})})});o2.displayName="HeroUI.Modal";var Lz=o2;function Mz(e={}){const{id:t,defaultOpen:n,isOpen:r,onClose:i,onOpen:s,onChange:l=()=>{}}=e,c=Ab(s),d=Ab(i),[h,m]=$u(r,n||!1,l),g=S.useId(),b=t||g,x=r!==void 0,k=S.useCallback(()=>{x||m(!1),d?.()},[x,d]),P=S.useCallback(()=>{x||m(!0),c?.()},[x,c]),_=S.useCallback(()=>{(h?k:P)()},[h,P,k]);return{isOpen:!!h,onOpen:P,onClose:k,onOpenChange:_,isControlled:x,getButtonProps:(T={})=>({...T,"aria-expanded":h,"aria-controls":b,onClick:Tf(T.onClick,_)}),getDisclosureProps:(T={})=>({...T,hidden:!h,id:b})}}function Dz(e){var t,n;const r=li(),[i,s]=ra(e,vk.variantKeys),{as:l,children:c,isLoaded:d=!1,className:h,classNames:m,...g}=i,b=l||"div",x=(n=(t=e.disableAnimation)!=null?t:r?.disableAnimation)!=null?n:!1,k=S.useMemo(()=>vk({...s,disableAnimation:x}),[nl(s),x,c]),P=tn(m?.base,h);return{Component:b,children:c,slots:k,classNames:m,getSkeletonProps:($={})=>({"data-loaded":$e(d),className:k.base({class:tn(P,$?.className)}),...g}),getContentProps:($={})=>({className:k.content({class:tn(m?.content,$?.className)})})}}var s2=ai((e,t)=>{const{Component:n,children:r,getSkeletonProps:i,getContentProps:s}=Dz({...e});return D.jsx(n,{ref:t,...i(),children:D.jsx("div",{...s(),children:r})})});s2.displayName="HeroUI.Skeleton";var Nz=s2;function Fz(e={}){const{domRef:t,isEnabled:n=!0,overflowCheck:r="vertical",visibility:i="auto",offset:s=0,onVisibilityChange:l,updateDeps:c=[]}=e,d=S.useRef(i);S.useEffect(()=>{const h=t?.current;if(!h||!n)return;const m=(x,k,P,_,T)=>{if(i==="auto"){const $=`${_}${uL(T)}Scroll`;k&&P?(h.dataset[$]="true",h.removeAttribute(`data-${_}-scroll`),h.removeAttribute(`data-${T}-scroll`)):(h.dataset[`${_}Scroll`]=k.toString(),h.dataset[`${T}Scroll`]=P.toString(),h.removeAttribute(`data-${_}-${T}-scroll`))}else{const $=k&&P?"both":k?_:P?T:"none";$!==d.current&&(l?.($),d.current=$)}},g=()=>{var x,k;const P=[{type:"vertical",prefix:"top",suffix:"bottom"},{type:"horizontal",prefix:"left",suffix:"right"}],_=h.querySelector('ul[data-slot="list"]'),T=+((x=_?.getAttribute("data-virtual-scroll-height"))!=null?x:h.scrollHeight),$=+((k=_?.getAttribute("data-virtual-scroll-top"))!=null?k:h.scrollTop);for(const{type:L,prefix:z,suffix:K}of P)if(r===L||r==="both"){const M=L==="vertical"?$>s:h.scrollLeft>s,J=L==="vertical"?$+h.clientHeight+s{["top","bottom","top-bottom","left","right","left-right"].forEach(x=>{h.removeAttribute(`data-${x}-scroll`)})};return g(),h.addEventListener("scroll",g,!0),i!=="auto"&&(b(),i==="both"?(h.dataset.topBottomScroll=String(r==="vertical"),h.dataset.leftRightScroll=String(r==="horizontal")):(h.dataset.topBottomScroll="false",h.dataset.leftRightScroll="false",["top","bottom","left","right"].forEach(x=>{h.dataset[`${x}Scroll`]=String(i===x)}))),()=>{h.removeEventListener("scroll",g,!0),b()}},[...c,n,i,r,l,t])}function Oz(e){var t;const[n,r]=ra(e,gk.variantKeys),{ref:i,as:s,children:l,className:c,style:d,size:h=40,offset:m=0,visibility:g="auto",isEnabled:b=!0,onVisibilityChange:x,...k}=n,P=s||"div",_=Ji(i);Fz({domRef:_,offset:m,visibility:g,isEnabled:b,onVisibilityChange:x,updateDeps:[l],overflowCheck:(t=e.orientation)!=null?t:"vertical"});const T=S.useMemo(()=>gk({...r,className:c}),[nl(r),c]);return{Component:P,styles:T,domRef:_,children:l,getBaseProps:(L={})=>{var z;return{ref:_,className:T,"data-orientation":(z=e.orientation)!=null?z:"vertical",style:{"--scroll-shadow-size":`${h}px`,...d,...L.style},...k,...L}}}}var l2=ai((e,t)=>{const{Component:n,children:r,getBaseProps:i}=Oz({...e,ref:t});return D.jsx(n,{...i(),children:r})});l2.displayName="HeroUI.ScrollShadow";var a2=l2,Po=(e=>(e.LIGHT="light",e.DARK="dark",e))(Po||{});const u2=S.createContext(null);function zz(){return window.matchMedia("(prefers-color-scheme: dark)").matches?Po.DARK:Po.LIGHT}function Bk(){const e=window.localStorage.getItem("theme");return e===Po.DARK||e===Po.LIGHT?e:zz()}function jz(e){return window.addEventListener("storage",e),()=>window.removeEventListener("storage",e)}const Bz=({children:e})=>{const t=S.useSyncExternalStore(jz,Bk,Bk);S.useEffect(()=>{document.documentElement.classList.toggle("dark",t===Po.DARK)},[t]);const n=S.useCallback(i=>{window.localStorage.setItem("theme",i),window.dispatchEvent(new Event("storage"))},[]),r=S.useMemo(()=>({theme:t,setTheme:n}),[t,n]);return D.jsx(u2.Provider,{value:r,children:e})},zr={Text:"text",Reference:"reference",StateUpdate:"state_update",MessageId:"message_id",ConversationId:"conversation_id",LiveUpdate:"live_update",FollowupMessages:"followup_messages",Image:"image",ChunkedContent:"chunked_content",ClearMessage:"clear_message",Usage:"usage",TodoItem:"todo_item"},KG={Like:"like",Dislike:"dislike"},Vz={Start:"START"},Sf={User:"user",Assistant:"assistant"},af={Pending:"pending",InProgress:"in_progress",Completed:"completed"};class Uz{constructor(t={}){if(this.chunkQueue=new Map,this.baseUrl=t.baseUrl??"",this.auth=t.auth,this.baseUrl.endsWith("/")&&(this.baseUrl=this.baseUrl.slice(0,-1)),!!this.baseUrl)try{new URL(this.baseUrl)}catch{throw new Error(`Invalid base URL: ${this.baseUrl}. Please provide a valid URL.`)}}getBaseUrl(){return this.baseUrl}_buildApiUrl(t){return`${this.baseUrl}${t}`}async _makeRequest(t,n={}){const i={...{"Content-Type":"application/json"},...this.normalizeHeaders(n.headers)};this.auth?.getToken&&(i.Authorization=`Bearer ${this.auth.getToken()}`);const s=await fetch(t,{...n,headers:i});if(s.status===401&&this.auth?.onUnauthorized?.(),!s.ok)throw new Error(`HTTP error! status: ${s.status}`);return s}async makeRequest(t,n){const{method:r="GET",body:i,headers:s={},...l}=n||{},c={method:r,headers:s,...l};return i&&r!=="GET"&&(c.body=typeof i=="string"?i:JSON.stringify(i)),(await this._makeRequest(this._buildApiUrl(t.toString()),c)).json()}makeStreamRequest(t,n,r,i,s){let l=!1;const c=async h=>{const m=h.body?.pipeThrough(new TextDecoderStream).getReader();if(!m)throw new Error("Response body is null");let g="";for(;!l&&!i?.aborted;)try{const{value:b,done:x}=await m.read();if(x){r.onClose?.();break}g+=b;const k=g.split(` +`);g=k.pop()??"";for(const P of k)if(P.startsWith("data: "))try{const _=P.replace("data: ","").trim(),T=JSON.parse(_);if(T.type===zr.ChunkedContent){this.handleChunkedContent(T,r);continue}await r.onMessage(T),await new Promise($=>setTimeout($,0))}catch(_){console.error("Error parsing JSON:",_),await r.onError(new Error("Error processing server response"))}}catch(b){if(i?.aborted)return;console.error("Stream error:",b),await r.onError(new Error("Error reading stream"));break}},d=async()=>{try{const m={...{"Content-Type":"application/json",Accept:"text/event-stream"},...s};this.auth?.getToken&&(m.Authorization=`Bearer ${this.auth.getToken()}`);const g=await fetch(this._buildApiUrl(t.toString()),{method:"POST",headers:m,body:JSON.stringify(n),signal:i});if(g.status===401&&this.auth?.onUnauthorized?.(),!g.ok)throw new Error(`HTTP error! status: ${g.status}`);await c(g)}catch(h){if(i?.aborted)return;console.error("Request error:",h);const m=h instanceof Error?h.message:"Error connecting to server";await r.onError(new Error(m))}};try{d()}catch(h){const m=h instanceof Error?h.message:"Failed to start stream";r.onError(new Error(m))}return()=>{l=!0}}normalizeHeaders(t){return t?t instanceof Headers?Object.fromEntries(t.entries()):Array.isArray(t)?Object.fromEntries(t):t:{}}async handleChunkedContent(t,n){const i=t.content,{content_type:s,id:l,chunk_index:c,total_chunks:d,mime_type:h,data:m}=i;this.chunkQueue.has(l)||this.chunkQueue.set(l,{chunks:new Map,totalChunks:d,mimeType:h});const g=this.chunkQueue.get(l);if(g.chunks.set(c,m),g.chunks.size!==d)return;const x=Array.from({length:d},(k,P)=>g.chunks.get(P)).join("");try{atob(x)}catch(k){this.chunkQueue.delete(l),console.error("❌ Invalid base64 data: ",k),await n.onError(new Error("Error reading stream"))}if(s===zr.Image){const k={type:zr.Image,content:{id:l,url:`${g.mimeType},${x}`}};await n.onMessage(k)}this.chunkQueue.delete(l)}}const c2=S.createContext(null);function Kz({children:e,...t}){const n=S.useMemo(()=>new Uz(t),[t]),r=S.useMemo(()=>({client:n}),[n]);return D.jsx(c2.Provider,{value:r,children:e})}function f2(){const e=S.useContext(c2);if(!e)throw new Error("useRagbitsContext must be used within a RagbitsProvider");return e}function Wz(e,t){const{client:n}=f2(),[r,i]=S.useState(null),[s,l]=S.useState(null),[c,d]=S.useState(!1),h=S.useRef(null),m=S.useCallback(()=>{if(!h.current)return null;h.current.abort(),h.current=null,d(!1)},[]),g=S.useCallback(async(x={})=>{h.current&&c&&h.current.abort();const k=new AbortController;h.current=k,d(!0),l(null);try{const _={...{...t,...x,headers:{...t?.headers,...x.headers}},signal:k.signal},T=await n.makeRequest(e,_);return k.signal.aborted||(i(T),h.current=null),T}catch(P){if(!k.signal.aborted){const _=P instanceof Error?P:new Error("API call failed");throw l(_),h.current=null,_}throw P}finally{k.signal.aborted||d(!1)}},[n,e,t,c]),b=S.useCallback(()=>{m(),i(null),l(null),d(!1)},[m]);return{data:r,error:s,isLoading:c,call:g,reset:b,abort:m}}const d2=Object.freeze({left:0,top:0,width:16,height:16}),nv=Object.freeze({rotate:0,vFlip:!1,hFlip:!1}),nw=Object.freeze({...d2,...nv}),Lb=Object.freeze({...nw,body:"",hidden:!1});function Hz(e,t){const n={};!e.hFlip!=!t.hFlip&&(n.hFlip=!0),!e.vFlip!=!t.vFlip&&(n.vFlip=!0);const r=((e.rotate||0)+(t.rotate||0))%4;return r&&(n.rotate=r),n}function Vk(e,t){const n=Hz(e,t);for(const r in Lb)r in nv?r in e&&!(r in n)&&(n[r]=nv[r]):r in t?n[r]=t[r]:r in e&&(n[r]=e[r]);return n}function Gz(e,t){const n=e.icons,r=e.aliases||Object.create(null),i=Object.create(null);function s(l){if(n[l])return i[l]=[];if(!(l in i)){i[l]=null;const c=r[l]&&r[l].parent,d=c&&s(c);d&&(i[l]=[c].concat(d))}return i[l]}return Object.keys(n).concat(Object.keys(r)).forEach(s),i}function qz(e,t,n){const r=e.icons,i=e.aliases||Object.create(null);let s={};function l(c){s=Vk(r[c]||i[c],s)}return l(t),n.forEach(l),Vk(e,s)}function p2(e,t){const n=[];if(typeof e!="object"||typeof e.icons!="object")return n;e.not_found instanceof Array&&e.not_found.forEach(i=>{t(i,null),n.push(i)});const r=Gz(e);for(const i in r){const s=r[i];s&&(t(i,qz(e,i,s)),n.push(i))}return n}const Yz={provider:"",aliases:{},not_found:{},...d2};function b0(e,t){for(const n in t)if(n in e&&typeof e[n]!=typeof t[n])return!1;return!0}function h2(e){if(typeof e!="object"||e===null)return null;const t=e;if(typeof t.prefix!="string"||!e.icons||typeof e.icons!="object"||!b0(e,Yz))return null;const n=t.icons;for(const i in n){const s=n[i];if(!i||typeof s.body!="string"||!b0(s,Lb))return null}const r=t.aliases||Object.create(null);for(const i in r){const s=r[i],l=s.parent;if(!i||typeof l!="string"||!n[l]&&!r[l]||!b0(s,Lb))return null}return t}const m2=/^[a-z0-9]+(-[a-z0-9]+)*$/,Cv=(e,t,n,r="")=>{const i=e.split(":");if(e.slice(0,1)==="@"){if(i.length<2||i.length>3)return null;r=i.shift().slice(1)}if(i.length>3||!i.length)return null;if(i.length>1){const c=i.pop(),d=i.pop(),h={provider:i.length>0?i[0]:r,prefix:d,name:c};return t&&!Dg(h)?null:h}const s=i[0],l=s.split("-");if(l.length>1){const c={provider:r,prefix:l.shift(),name:l.join("-")};return t&&!Dg(c)?null:c}if(n&&r===""){const c={provider:r,prefix:"",name:s};return t&&!Dg(c,n)?null:c}return null},Dg=(e,t)=>e?!!((t&&e.prefix===""||e.prefix)&&e.name):!1,Uk=Object.create(null);function Xz(e,t){return{provider:e,prefix:t,icons:Object.create(null),missing:new Set}}function Lf(e,t){const n=Uk[e]||(Uk[e]=Object.create(null));return n[t]||(n[t]=Xz(e,t))}function g2(e,t){return h2(t)?p2(t,(n,r)=>{r?e.icons[n]=r:e.missing.add(n)}):[]}function Qz(e,t,n){try{if(typeof n.body=="string")return e.icons[t]={...n},!0}catch{}return!1}let ah=!1;function v2(e){return typeof e=="boolean"&&(ah=e),ah}function Kk(e){const t=typeof e=="string"?Cv(e,!0,ah):e;if(t){const n=Lf(t.provider,t.prefix),r=t.name;return n.icons[r]||(n.missing.has(r)?null:void 0)}}function Jz(e,t){const n=Cv(e,!0,ah);if(!n)return!1;const r=Lf(n.provider,n.prefix);return t?Qz(r,n.name,t):(r.missing.add(n.name),!0)}function Zz(e,t){if(typeof e!="object")return!1;if(typeof t!="string"&&(t=e.provider||""),ah&&!t&&!e.prefix){let i=!1;return h2(e)&&(e.prefix="",p2(e,(s,l)=>{Jz(s,l)&&(i=!0)})),i}const n=e.prefix;if(!Dg({prefix:n,name:"a"}))return!1;const r=Lf(t,n);return!!g2(r,e)}const y2=Object.freeze({width:null,height:null}),b2=Object.freeze({...y2,...nv}),e8=/(-?[0-9.]*[0-9]+[0-9.]*)/g,t8=/^-?[0-9.]*[0-9]+[0-9.]*$/g;function Wk(e,t,n){if(t===1)return e;if(n=n||100,typeof e=="number")return Math.ceil(e*t*n)/n;if(typeof e!="string")return e;const r=e.split(e8);if(r===null||!r.length)return e;const i=[];let s=r.shift(),l=t8.test(s);for(;;){if(l){const c=parseFloat(s);isNaN(c)?i.push(s):i.push(Math.ceil(c*t*n)/n)}else i.push(s);if(s=r.shift(),s===void 0)return i.join("");l=!l}}function n8(e,t="defs"){let n="";const r=e.indexOf("<"+t);for(;r>=0;){const i=e.indexOf(">",r),s=e.indexOf("",s);if(l===-1)break;n+=e.slice(i+1,s).trim(),e=e.slice(0,r).trim()+e.slice(l+1)}return{defs:n,content:e}}function r8(e,t){return e?""+e+""+t:t}function i8(e,t,n){const r=n8(e);return r8(r.defs,t+r.content+n)}const o8=e=>e==="unset"||e==="undefined"||e==="none";function s8(e,t){const n={...nw,...e},r={...b2,...t},i={left:n.left,top:n.top,width:n.width,height:n.height};let s=n.body;[n,r].forEach(P=>{const _=[],T=P.hFlip,$=P.vFlip;let L=P.rotate;T?$?L+=2:(_.push("translate("+(i.width+i.left).toString()+" "+(0-i.top).toString()+")"),_.push("scale(-1 1)"),i.top=i.left=0):$&&(_.push("translate("+(0-i.left).toString()+" "+(i.height+i.top).toString()+")"),_.push("scale(1 -1)"),i.top=i.left=0);let z;switch(L<0&&(L-=Math.floor(L/4)*4),L=L%4,L){case 1:z=i.height/2+i.top,_.unshift("rotate(90 "+z.toString()+" "+z.toString()+")");break;case 2:_.unshift("rotate(180 "+(i.width/2+i.left).toString()+" "+(i.height/2+i.top).toString()+")");break;case 3:z=i.width/2+i.left,_.unshift("rotate(-90 "+z.toString()+" "+z.toString()+")");break}L%2===1&&(i.left!==i.top&&(z=i.left,i.left=i.top,i.top=z),i.width!==i.height&&(z=i.width,i.width=i.height,i.height=z)),_.length&&(s=i8(s,'',""))});const l=r.width,c=r.height,d=i.width,h=i.height;let m,g;l===null?(g=c===null?"1em":c==="auto"?h:c,m=Wk(g,d/h)):(m=l==="auto"?d:l,g=c===null?Wk(m,h/d):c==="auto"?h:c);const b={},x=(P,_)=>{o8(_)||(b[P]=_.toString())};x("width",m),x("height",g);const k=[i.left,i.top,d,h];return b.viewBox=k.join(" "),{attributes:b,viewBox:k,body:s}}const l8=/\sid="(\S+)"/g,a8="IconifyId"+Date.now().toString(16)+(Math.random()*16777216|0).toString(16);let u8=0;function c8(e,t=a8){const n=[];let r;for(;r=l8.exec(e);)n.push(r[1]);if(!n.length)return e;const i="suffix"+(Math.random()*16777216|Date.now()).toString(16);return n.forEach(s=>{const l=typeof t=="function"?t(s):t+(u8++).toString(),c=s.replace(/[.*+?^${}()|[\]\\]/g,"\\$&");e=e.replace(new RegExp('([#;"])('+c+')([")]|\\.[a-z])',"g"),"$1"+l+i+"$3")}),e=e.replace(new RegExp(i,"g"),""),e}const Mb=Object.create(null);function f8(e,t){Mb[e]=t}function Db(e){return Mb[e]||Mb[""]}function rw(e){let t;if(typeof e.resources=="string")t=[e.resources];else if(t=e.resources,!(t instanceof Array)||!t.length)return null;return{resources:t,path:e.path||"/",maxURL:e.maxURL||500,rotate:e.rotate||750,timeout:e.timeout||5e3,random:e.random===!0,index:e.index||0,dataAfterTimeout:e.dataAfterTimeout!==!1}}const iw=Object.create(null),Sp=["https://api.simplesvg.com","https://api.unisvg.com"],Ng=[];for(;Sp.length>0;)Sp.length===1||Math.random()>.5?Ng.push(Sp.shift()):Ng.push(Sp.pop());iw[""]=rw({resources:["https://api.iconify.design"].concat(Ng)});function d8(e,t){const n=rw(t);return n===null?!1:(iw[e]=n,!0)}function ow(e){return iw[e]}const p8=()=>{let e;try{if(e=fetch,typeof e=="function")return e}catch{}};let Hk=p8();function h8(e,t){const n=ow(e);if(!n)return 0;let r;if(!n.maxURL)r=0;else{let i=0;n.resources.forEach(l=>{i=Math.max(i,l.length)});const s=t+".json?icons=";r=n.maxURL-i-n.path.length-s.length}return r}function m8(e){return e===404}const g8=(e,t,n)=>{const r=[],i=h8(e,t),s="icons";let l={type:s,provider:e,prefix:t,icons:[]},c=0;return n.forEach((d,h)=>{c+=d.length+1,c>=i&&h>0&&(r.push(l),l={type:s,provider:e,prefix:t,icons:[]},c=d.length),l.icons.push(d)}),r.push(l),r};function v8(e){if(typeof e=="string"){const t=ow(e);if(t)return t.path}return"/"}const y8=(e,t,n)=>{if(!Hk){n("abort",424);return}let r=v8(t.provider);switch(t.type){case"icons":{const s=t.prefix,c=t.icons.join(","),d=new URLSearchParams({icons:c});r+=s+".json?"+d.toString();break}case"custom":{const s=t.uri;r+=s.slice(0,1)==="/"?s.slice(1):s;break}default:n("abort",400);return}let i=503;Hk(e+r).then(s=>{const l=s.status;if(l!==200){setTimeout(()=>{n(m8(l)?"abort":"next",l)});return}return i=501,s.json()}).then(s=>{if(typeof s!="object"||s===null){setTimeout(()=>{s===404?n("abort",s):n("next",i)});return}setTimeout(()=>{n("success",s)})}).catch(()=>{n("next",i)})},b8={prepare:g8,send:y8};function x8(e){const t={loaded:[],missing:[],pending:[]},n=Object.create(null);e.sort((i,s)=>i.provider!==s.provider?i.provider.localeCompare(s.provider):i.prefix!==s.prefix?i.prefix.localeCompare(s.prefix):i.name.localeCompare(s.name));let r={provider:"",prefix:"",name:""};return e.forEach(i=>{if(r.name===i.name&&r.prefix===i.prefix&&r.provider===i.provider)return;r=i;const s=i.provider,l=i.prefix,c=i.name,d=n[s]||(n[s]=Object.create(null)),h=d[l]||(d[l]=Lf(s,l));let m;c in h.icons?m=t.loaded:l===""||h.missing.has(c)?m=t.missing:m=t.pending;const g={provider:s,prefix:l,name:c};m.push(g)}),t}function x2(e,t){e.forEach(n=>{const r=n.loaderCallbacks;r&&(n.loaderCallbacks=r.filter(i=>i.id!==t))})}function w8(e){e.pendingCallbacksFlag||(e.pendingCallbacksFlag=!0,setTimeout(()=>{e.pendingCallbacksFlag=!1;const t=e.loaderCallbacks?e.loaderCallbacks.slice(0):[];if(!t.length)return;let n=!1;const r=e.provider,i=e.prefix;t.forEach(s=>{const l=s.icons,c=l.pending.length;l.pending=l.pending.filter(d=>{if(d.prefix!==i)return!0;const h=d.name;if(e.icons[h])l.loaded.push({provider:r,prefix:i,name:h});else if(e.missing.has(h))l.missing.push({provider:r,prefix:i,name:h});else return n=!0,!0;return!1}),l.pending.length!==c&&(n||x2([e],s.id),s.callback(l.loaded.slice(0),l.missing.slice(0),l.pending.slice(0),s.abort))})}))}let S8=0;function k8(e,t,n){const r=S8++,i=x2.bind(null,n,r);if(!t.pending.length)return i;const s={id:r,icons:t,callback:e,abort:i};return n.forEach(l=>{(l.loaderCallbacks||(l.loaderCallbacks=[])).push(s)}),i}function C8(e,t=!0,n=!1){const r=[];return e.forEach(i=>{const s=typeof i=="string"?Cv(i,t,n):i;s&&r.push(s)}),r}var E8={resources:[],index:0,timeout:2e3,rotate:750,random:!1,dataAfterTimeout:!1};function P8(e,t,n,r){const i=e.resources.length,s=e.random?Math.floor(Math.random()*i):e.index;let l;if(e.random){let M=e.resources.slice(0);for(l=[];M.length>1;){const J=Math.floor(Math.random()*M.length);l.push(M[J]),M=M.slice(0,J).concat(M.slice(J+1))}l=l.concat(M)}else l=e.resources.slice(s).concat(e.resources.slice(0,s));const c=Date.now();let d="pending",h=0,m,g=null,b=[],x=[];typeof r=="function"&&x.push(r);function k(){g&&(clearTimeout(g),g=null)}function P(){d==="pending"&&(d="aborted"),k(),b.forEach(M=>{M.status==="pending"&&(M.status="aborted")}),b=[]}function _(M,J){J&&(x=[]),typeof M=="function"&&x.push(M)}function T(){return{startTime:c,payload:t,status:d,queriesSent:h,queriesPending:b.length,subscribe:_,abort:P}}function $(){d="failed",x.forEach(M=>{M(void 0,m)})}function L(){b.forEach(M=>{M.status==="pending"&&(M.status="aborted")}),b=[]}function z(M,J,re){const ae=J!=="success";switch(b=b.filter(j=>j!==M),d){case"pending":break;case"failed":if(ae||!e.dataAfterTimeout)return;break;default:return}if(J==="abort"){m=re,$();return}if(ae){m=re,b.length||(l.length?K():$());return}if(k(),L(),!e.random){const j=e.resources.indexOf(M.resource);j!==-1&&j!==e.index&&(e.index=j)}d="completed",x.forEach(j=>{j(re)})}function K(){if(d!=="pending")return;k();const M=l.shift();if(M===void 0){if(b.length){g=setTimeout(()=>{k(),d==="pending"&&(L(),$())},e.timeout);return}$();return}const J={status:"pending",resource:M,callback:(re,ae)=>{z(J,re,ae)}};b.push(J),h++,g=setTimeout(K,e.rotate),n(M,t,J.callback)}return setTimeout(K),T}function w2(e){const t={...E8,...e};let n=[];function r(){n=n.filter(c=>c().status==="pending")}function i(c,d,h){const m=P8(t,c,d,(g,b)=>{r(),h&&h(g,b)});return n.push(m),m}function s(c){return n.find(d=>c(d))||null}return{query:i,find:s,setIndex:c=>{t.index=c},getIndex:()=>t.index,cleanup:r}}function Gk(){}const x0=Object.create(null);function T8(e){if(!x0[e]){const t=ow(e);if(!t)return;const n=w2(t),r={config:t,redundancy:n};x0[e]=r}return x0[e]}function _8(e,t,n){let r,i;if(typeof e=="string"){const s=Db(e);if(!s)return n(void 0,424),Gk;i=s.send;const l=T8(e);l&&(r=l.redundancy)}else{const s=rw(e);if(s){r=w2(s);const l=e.resources?e.resources[0]:"",c=Db(l);c&&(i=c.send)}}return!r||!i?(n(void 0,424),Gk):r.query(t,i,n)().abort}function qk(){}function I8(e){e.iconsLoaderFlag||(e.iconsLoaderFlag=!0,setTimeout(()=>{e.iconsLoaderFlag=!1,w8(e)}))}function $8(e){const t=[],n=[];return e.forEach(r=>{(r.match(m2)?t:n).push(r)}),{valid:t,invalid:n}}function kp(e,t,n){function r(){const i=e.pendingIcons;t.forEach(s=>{i&&i.delete(s),e.icons[s]||e.missing.add(s)})}if(n&&typeof n=="object")try{if(!g2(e,n).length){r();return}}catch(i){console.error(i)}r(),I8(e)}function Yk(e,t){e instanceof Promise?e.then(n=>{t(n)}).catch(()=>{t(null)}):t(e)}function A8(e,t){e.iconsToLoad?e.iconsToLoad=e.iconsToLoad.concat(t).sort():e.iconsToLoad=t,e.iconsQueueFlag||(e.iconsQueueFlag=!0,setTimeout(()=>{e.iconsQueueFlag=!1;const{provider:n,prefix:r}=e,i=e.iconsToLoad;if(delete e.iconsToLoad,!i||!i.length)return;const s=e.loadIcon;if(e.loadIcons&&(i.length>1||!s)){Yk(e.loadIcons(i,r,n),m=>{kp(e,i,m)});return}if(s){i.forEach(m=>{const g=s(m,r,n);Yk(g,b=>{const x=b?{prefix:r,icons:{[m]:b}}:null;kp(e,[m],x)})});return}const{valid:l,invalid:c}=$8(i);if(c.length&&kp(e,c,null),!l.length)return;const d=r.match(m2)?Db(n):null;if(!d){kp(e,l,null);return}d.prepare(n,r,l).forEach(m=>{_8(n,m,g=>{kp(e,m.icons,g)})})}))}const S2=(e,t)=>{const n=C8(e,!0,v2()),r=x8(n);if(!r.pending.length){let d=!0;return t&&setTimeout(()=>{d&&t(r.loaded,r.missing,r.pending,qk)}),()=>{d=!1}}const i=Object.create(null),s=[];let l,c;return r.pending.forEach(d=>{const{provider:h,prefix:m}=d;if(m===c&&h===l)return;l=h,c=m,s.push(Lf(h,m));const g=i[h]||(i[h]=Object.create(null));g[m]||(g[m]=[])}),r.pending.forEach(d=>{const{provider:h,prefix:m,name:g}=d,b=Lf(h,m),x=b.pendingIcons||(b.pendingIcons=new Set);x.has(g)||(x.add(g),i[h][m].push(g))}),s.forEach(d=>{const h=i[d.provider][d.prefix];h.length&&A8(d,h)}),t?k8(t,r,s):qk};function R8(e,t){const n={...e};for(const r in t){const i=t[r],s=typeof i;r in y2?(i===null||i&&(s==="string"||s==="number"))&&(n[r]=i):s===typeof n[r]&&(n[r]=r==="rotate"?i%4:i)}return n}const L8=/[\s,]+/;function M8(e,t){t.split(L8).forEach(n=>{switch(n.trim()){case"horizontal":e.hFlip=!0;break;case"vertical":e.vFlip=!0;break}})}function D8(e,t=0){const n=e.replace(/^-?[0-9.]*/,"");function r(i){for(;i<0;)i+=4;return i%4}if(n===""){const i=parseInt(e);return isNaN(i)?0:r(i)}else if(n!==e){let i=0;switch(n){case"%":i=25;break;case"deg":i=90}if(i){let s=parseFloat(e.slice(0,e.length-n.length));return isNaN(s)?0:(s=s/i,s%1===0?r(s):0)}}return t}function N8(e,t){let n=e.indexOf("xlink:")===-1?"":' xmlns:xlink="http://www.w3.org/1999/xlink"';for(const r in t)n+=" "+r+'="'+t[r]+'"';return'"+e+""}function F8(e){return e.replace(/"/g,"'").replace(/%/g,"%25").replace(/#/g,"%23").replace(//g,"%3E").replace(/\s+/g," ")}function O8(e){return"data:image/svg+xml,"+F8(e)}function z8(e){return'url("'+O8(e)+'")'}let Up;function j8(){try{Up=window.trustedTypes.createPolicy("iconify",{createHTML:e=>e})}catch{Up=null}}function B8(e){return Up===void 0&&j8(),Up?Up.createHTML(e):e}const k2={...b2,inline:!1},V8={xmlns:"http://www.w3.org/2000/svg",xmlnsXlink:"http://www.w3.org/1999/xlink","aria-hidden":!0,role:"img"},U8={display:"inline-block"},Nb={backgroundColor:"currentColor"},C2={backgroundColor:"transparent"},Xk={Image:"var(--svg)",Repeat:"no-repeat",Size:"100% 100%"},Qk={WebkitMask:Nb,mask:Nb,background:C2};for(const e in Qk){const t=Qk[e];for(const n in Xk)t[e+n]=Xk[n]}const K8={...k2,inline:!0};function Jk(e){return e+(e.match(/^[-0-9.]+$/)?"px":"")}const W8=(e,t,n)=>{const r=t.inline?K8:k2,i=R8(r,t),s=t.mode||"svg",l={},c=t.style||{},d={...s==="svg"?V8:{}};if(n){const _=Cv(n,!1,!0);if(_){const T=["iconify"],$=["provider","prefix"];for(const L of $)_[L]&&T.push("iconify--"+_[L]);d.className=T.join(" ")}}for(let _ in t){const T=t[_];if(T!==void 0)switch(_){case"icon":case"style":case"children":case"onLoad":case"mode":case"ssr":break;case"_ref":d.ref=T;break;case"className":d[_]=(d[_]?d[_]+" ":"")+T;break;case"inline":case"hFlip":case"vFlip":i[_]=T===!0||T==="true"||T===1;break;case"flip":typeof T=="string"&&M8(i,T);break;case"color":l.color=T;break;case"rotate":typeof T=="string"?i[_]=D8(T):typeof T=="number"&&(i[_]=T);break;case"ariaHidden":case"aria-hidden":T!==!0&&T!=="true"&&delete d["aria-hidden"];break;default:r[_]===void 0&&(d[_]=T)}}const h=s8(e,i),m=h.attributes;if(i.inline&&(l.verticalAlign="-0.125em"),s==="svg"){d.style={...l,...c},Object.assign(d,m);let _=0,T=t.id;return typeof T=="string"&&(T=T.replace(/-/g,"_")),d.dangerouslySetInnerHTML={__html:B8(c8(h.body,T?()=>T+"ID"+_++:"iconifyReact"))},S.createElement("svg",d)}const{body:g,width:b,height:x}=e,k=s==="mask"||(s==="bg"?!1:g.indexOf("currentColor")!==-1),P=N8(g,{...m,width:b+"",height:x+""});return d.style={...l,"--svg":z8(P),width:Jk(m.width),height:Jk(m.height),...U8,...k?Nb:C2,...c},S.createElement("span",d)};v2(!0);f8("",b8);if(typeof document<"u"&&typeof window<"u"){const e=window;if(e.IconifyPreload!==void 0){const t=e.IconifyPreload,n="Invalid IconifyPreload syntax.";typeof t=="object"&&t!==null&&(t instanceof Array?t:[t]).forEach(r=>{try{(typeof r!="object"||r===null||r instanceof Array||typeof r.icons!="object"||typeof r.prefix!="string"||!Zz(r))&&console.error(n)}catch{console.error(n)}})}if(e.IconifyProviders!==void 0){const t=e.IconifyProviders;if(typeof t=="object"&&t!==null)for(let n in t){const r="IconifyProviders["+n+"] is invalid.";try{const i=t[n];if(typeof i!="object"||!i||i.resources===void 0)continue;d8(n,i)||console.error(r)}catch{console.error(r)}}}}function E2(e){const[t,n]=S.useState(!!e.ssr),[r,i]=S.useState({});function s(x){if(x){const k=e.icon;if(typeof k=="object")return{name:"",data:k};const P=Kk(k);if(P)return{name:k,data:P}}return{name:""}}const[l,c]=S.useState(s(!!e.ssr));function d(){const x=r.callback;x&&(x(),i({}))}function h(x){if(JSON.stringify(l)!==JSON.stringify(x))return d(),c(x),!0}function m(){var x;const k=e.icon;if(typeof k=="object"){h({name:"",data:k});return}const P=Kk(k);if(h({name:k,data:P}))if(P===void 0){const _=S2([k],m);i({callback:_})}else P&&((x=e.onLoad)===null||x===void 0||x.call(e,k))}S.useEffect(()=>(n(!0),d),[]),S.useEffect(()=>{t&&m()},[e.icon,t]);const{name:g,data:b}=l;return b?W8({...nw,...b},e,g):e.children?e.children:e.fallback?e.fallback:S.createElement("span",{})}const Pi=S.forwardRef((e,t)=>E2({...e,_ref:t}));S.forwardRef((e,t)=>E2({inline:!0,...e,_ref:t}));var Mp={exports:{}};/** + * @license + * Lodash + * Copyright OpenJS Foundation and other contributors + * Released under MIT license + * Based on Underscore.js 1.8.3 + * Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors + */var H8=Mp.exports,Zk;function G8(){return Zk||(Zk=1,function(e,t){(function(){var n,r="4.17.21",i=200,s="Unsupported core-js use. Try https://npms.io/search?q=ponyfill.",l="Expected a function",c="Invalid `variable` option passed into `_.template`",d="__lodash_hash_undefined__",h=500,m="__lodash_placeholder__",g=1,b=2,x=4,k=1,P=2,_=1,T=2,$=4,L=8,z=16,K=32,M=64,J=128,re=256,ae=512,j=30,B="...",Y=800,te=16,G=1,ce=2,Z=3,q=1/0,V=9007199254740991,se=17976931348623157e292,R=NaN,U=4294967295,ie=U-1,O=U>>>1,me=[["ary",J],["bind",_],["bindKey",T],["curry",L],["curryRight",z],["flip",ae],["partial",K],["partialRight",M],["rearg",re]],Ce="[object Arguments]",ye="[object Array]",Fe="[object AsyncFunction]",De="[object Boolean]",Te="[object Date]",Xe="[object DOMException]",lt="[object Error]",_e="[object Function]",mt="[object GeneratorFunction]",pt="[object Map]",Vt="[object Number]",Ve="[object Null]",it="[object Object]",Ut="[object Promise]",Zn="[object Proxy]",ln="[object RegExp]",_t="[object Set]",Rt="[object String]",Tn="[object Symbol]",Cr="[object Undefined]",Nt="[object WeakMap]",pe="[object WeakSet]",Se="[object ArrayBuffer]",Oe="[object DataView]",nt="[object Float32Array]",at="[object Float64Array]",Kt="[object Int8Array]",Bn="[object Int16Array]",Qt="[object Int32Array]",Pt="[object Uint8Array]",Er="[object Uint8ClampedArray]",Ft="[object Uint16Array]",er="[object Uint32Array]",an=/\b__p \+= '';/g,ol=/\b(__p \+=) '' \+/g,hs=/(__e\(.*?\)|\b__t\)) \+\n'';/g,ci=/&(?:amp|lt|gt|quot|#39);/g,fi=/[&<>"']/g,la=RegExp(ci.source),Mu=RegExp(fi.source),ms=/<%-([\s\S]+?)%>/g,jr=/<%([\s\S]+?)%>/g,aa=/<%=([\s\S]+?)%>/g,ua=/\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,Jt=/^\w*$/,gs=/[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g,vs=/[\\^$.*+?()[\]{}|]/g,Ro=RegExp(vs.source),ca=/^\s+/,ys=/\s/,sl=/\{(?:\n\/\* \[wrapped with .+\] \*\/)?\n?/,ll=/\{\n\/\* \[wrapped with (.+)\] \*/,fa=/,? & /,Wf=/[^\x00-\x2f\x3a-\x40\x5b-\x60\x7b-\x7f]+/g,Hf=/[()=,{}\[\]\/\s]/,Gf=/\\(\\)?/g,Ye=/\$\{([^\\}]*(?:\\.[^\\}]*)*)\}/g,oo=/\w*$/,Ah=/^[-+]0x[0-9a-f]+$/i,Ov=/^0b[01]+$/i,Rh=/^\[object .+?Constructor\]$/,Lh=/^0o[0-7]+$/i,Mh=/^(?:0|[1-9]\d*)$/,Dh=/[\xc0-\xd6\xd8-\xf6\xf8-\xff\u0100-\u017f]/g,Du=/($^)/,zv=/['\n\r\u2028\u2029\\]/g,Wt="\\ud800-\\udfff",jv="\\u0300-\\u036f",qf="\\ufe20-\\ufe2f",Nh="\\u20d0-\\u20ff",da=jv+qf+Nh,Fh="\\u2700-\\u27bf",Yf="a-z\\xdf-\\xf6\\xf8-\\xff",Nu="\\xac\\xb1\\xd7\\xf7",$i="\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\xbf",Bv="\\u2000-\\u206f",di=" \\t\\x0b\\f\\xa0\\ufeff\\n\\r\\u2028\\u2029\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000",Oh="A-Z\\xc0-\\xd6\\xd8-\\xde",zh="\\ufe0e\\ufe0f",jh=Nu+$i+Bv+di,al="['’]",Fu="["+Wt+"]",ul="["+jh+"]",bs="["+da+"]",Bh="\\d+",Vv="["+Fh+"]",Ou="["+Yf+"]",Xf="[^"+Wt+jh+Bh+Fh+Yf+Oh+"]",pa="\\ud83c[\\udffb-\\udfff]",ha="(?:"+bs+"|"+pa+")",Vh="[^"+Wt+"]",ma="(?:\\ud83c[\\udde6-\\uddff]){2}",Et="[\\ud800-\\udbff][\\udc00-\\udfff]",xs="["+Oh+"]",Qf="\\u200d",zu="(?:"+Ou+"|"+Xf+")",Uh="(?:"+xs+"|"+Xf+")",Jf="(?:"+al+"(?:d|ll|m|re|s|t|ve))?",Zf="(?:"+al+"(?:D|LL|M|RE|S|T|VE))?",ju=ha+"?",ga="["+zh+"]?",Lo="(?:"+Qf+"(?:"+[Vh,ma,Et].join("|")+")"+ga+ju+")*",Mo="\\d*(?:1st|2nd|3rd|(?![123])\\dth)(?=\\b|[A-Z_])",Do="\\d*(?:1ST|2ND|3RD|(?![123])\\dTH)(?=\\b|[a-z_])",cl=ga+ju+Lo,va="(?:"+[Vv,ma,Et].join("|")+")"+cl,No="(?:"+[Vh+bs+"?",bs,ma,Et,Fu].join("|")+")",Uv=RegExp(al,"g"),Kh=RegExp(bs,"g"),ws=RegExp(pa+"(?="+pa+")|"+No+cl,"g"),Kv=RegExp([xs+"?"+Ou+"+"+Jf+"(?="+[ul,xs,"$"].join("|")+")",Uh+"+"+Zf+"(?="+[ul,xs+zu,"$"].join("|")+")",xs+"?"+zu+"+"+Jf,xs+"+"+Zf,Do,Mo,Bh,va].join("|"),"g"),Wh=RegExp("["+Qf+Wt+da+zh+"]"),Bu=/[a-z][A-Z]|[A-Z]{2}[a-z]|[0-9][a-zA-Z]|[a-zA-Z][0-9]|[^a-zA-Z0-9 ]/,Hh=["Array","Buffer","DataView","Date","Error","Float32Array","Float64Array","Function","Int8Array","Int16Array","Int32Array","Map","Math","Object","Promise","RegExp","Set","String","Symbol","TypeError","Uint8Array","Uint8ClampedArray","Uint16Array","Uint32Array","WeakMap","_","clearTimeout","isFinite","parseInt","setTimeout"],Wv=-1,It={};It[nt]=It[at]=It[Kt]=It[Bn]=It[Qt]=It[Pt]=It[Er]=It[Ft]=It[er]=!0,It[Ce]=It[ye]=It[Se]=It[De]=It[Oe]=It[Te]=It[lt]=It[_e]=It[pt]=It[Vt]=It[it]=It[ln]=It[_t]=It[Rt]=It[Nt]=!1;var Tt={};Tt[Ce]=Tt[ye]=Tt[Se]=Tt[Oe]=Tt[De]=Tt[Te]=Tt[nt]=Tt[at]=Tt[Kt]=Tt[Bn]=Tt[Qt]=Tt[pt]=Tt[Vt]=Tt[it]=Tt[ln]=Tt[_t]=Tt[Rt]=Tt[Tn]=Tt[Pt]=Tt[Er]=Tt[Ft]=Tt[er]=!0,Tt[lt]=Tt[_e]=Tt[Nt]=!1;var fl={À:"A",Á:"A",Â:"A",Ã:"A",Ä:"A",Å:"A",à:"a",á:"a",â:"a",ã:"a",ä:"a",å:"a",Ç:"C",ç:"c",Ð:"D",ð:"d",È:"E",É:"E",Ê:"E",Ë:"E",è:"e",é:"e",ê:"e",ë:"e",Ì:"I",Í:"I",Î:"I",Ï:"I",ì:"i",í:"i",î:"i",ï:"i",Ñ:"N",ñ:"n",Ò:"O",Ó:"O",Ô:"O",Õ:"O",Ö:"O",Ø:"O",ò:"o",ó:"o",ô:"o",õ:"o",ö:"o",ø:"o",Ù:"U",Ú:"U",Û:"U",Ü:"U",ù:"u",ú:"u",û:"u",ü:"u",Ý:"Y",ý:"y",ÿ:"y",Æ:"Ae",æ:"ae",Þ:"Th",þ:"th",ß:"ss",Ā:"A",Ă:"A",Ą:"A",ā:"a",ă:"a",ą:"a",Ć:"C",Ĉ:"C",Ċ:"C",Č:"C",ć:"c",ĉ:"c",ċ:"c",č:"c",Ď:"D",Đ:"D",ď:"d",đ:"d",Ē:"E",Ĕ:"E",Ė:"E",Ę:"E",Ě:"E",ē:"e",ĕ:"e",ė:"e",ę:"e",ě:"e",Ĝ:"G",Ğ:"G",Ġ:"G",Ģ:"G",ĝ:"g",ğ:"g",ġ:"g",ģ:"g",Ĥ:"H",Ħ:"H",ĥ:"h",ħ:"h",Ĩ:"I",Ī:"I",Ĭ:"I",Į:"I",İ:"I",ĩ:"i",ī:"i",ĭ:"i",į:"i",ı:"i",Ĵ:"J",ĵ:"j",Ķ:"K",ķ:"k",ĸ:"k",Ĺ:"L",Ļ:"L",Ľ:"L",Ŀ:"L",Ł:"L",ĺ:"l",ļ:"l",ľ:"l",ŀ:"l",ł:"l",Ń:"N",Ņ:"N",Ň:"N",Ŋ:"N",ń:"n",ņ:"n",ň:"n",ŋ:"n",Ō:"O",Ŏ:"O",Ő:"O",ō:"o",ŏ:"o",ő:"o",Ŕ:"R",Ŗ:"R",Ř:"R",ŕ:"r",ŗ:"r",ř:"r",Ś:"S",Ŝ:"S",Ş:"S",Š:"S",ś:"s",ŝ:"s",ş:"s",š:"s",Ţ:"T",Ť:"T",Ŧ:"T",ţ:"t",ť:"t",ŧ:"t",Ũ:"U",Ū:"U",Ŭ:"U",Ů:"U",Ű:"U",Ų:"U",ũ:"u",ū:"u",ŭ:"u",ů:"u",ű:"u",ų:"u",Ŵ:"W",ŵ:"w",Ŷ:"Y",ŷ:"y",Ÿ:"Y",Ź:"Z",Ż:"Z",Ž:"Z",ź:"z",ż:"z",ž:"z",IJ:"IJ",ij:"ij",Œ:"Oe",œ:"oe",ʼn:"'n",ſ:"s"},Vu={"&":"&","<":"<",">":">",'"':""","'":"'"},Hv={"&":"&","<":"<",">":">",""":'"',"'":"'"},Gv={"\\":"\\","'":"'","\n":"n","\r":"r","\u2028":"u2028","\u2029":"u2029"},ed=parseFloat,Uu=parseInt,Ku=typeof og=="object"&&og&&og.Object===Object&&og,Gh=typeof self=="object"&&self&&self.Object===Object&&self,Ht=Ku||Gh||Function("return this")(),ya=t&&!t.nodeType&&t,Ai=ya&&!0&&e&&!e.nodeType&&e,td=Ai&&Ai.exports===ya,dl=td&&Ku.process,tr=function(){try{var ne=Ai&&Ai.require&&Ai.require("util").types;return ne||dl&&dl.binding&&dl.binding("util")}catch{}}(),nd=tr&&tr.isArrayBuffer,dr=tr&&tr.isDate,Ss=tr&&tr.isMap,Wu=tr&&tr.isRegExp,pl=tr&&tr.isSet,qh=tr&&tr.isTypedArray;function nr(ne,he,fe){switch(fe.length){case 0:return ne.call(he);case 1:return ne.call(he,fe[0]);case 2:return ne.call(he,fe[0],fe[1]);case 3:return ne.call(he,fe[0],fe[1],fe[2])}return ne.apply(he,fe)}function rd(ne,he,fe,Ae){for(var rt=-1,wt=ne==null?0:ne.length;++rt-1}function od(ne,he,fe){for(var Ae=-1,rt=ne==null?0:ne.length;++Ae-1;);return fe}function dd(ne,he){for(var fe=ne.length;fe--&&hl(he,ne[fe],0)>-1;);return fe}function nm(ne,he){for(var fe=ne.length,Ae=0;fe--;)ne[fe]===he&&++Ae;return Ae}var rm=Yu(fl),im=Yu(Vu);function om(ne){return"\\"+Gv[ne]}function ml(ne,he){return ne==null?n:ne[he]}function gl(ne){return Wh.test(ne)}function Zv(ne){return Bu.test(ne)}function ey(ne){for(var he,fe=[];!(he=ne.next()).done;)fe.push(he.value);return fe}function Xu(ne){var he=-1,fe=Array(ne.size);return ne.forEach(function(Ae,rt){fe[++he]=[rt,Ae]}),fe}function pd(ne,he){return function(fe){return ne(he(fe))}}function Br(ne,he){for(var fe=-1,Ae=ne.length,rt=0,wt=[];++fe-1}function gm(u,f){var y=this.__data__,E=Gn(y,u);return E<0?(++this.size,y.push([u,f])):y[E][1]=f,this}rr.prototype.clear=Tl,rr.prototype.delete=mr,rr.prototype.get=cc,rr.prototype.has=mm,rr.prototype.set=gm;function Ur(u){var f=-1,y=u==null?0:u.length;for(this.clear();++f=f?u:f)),u}function gr(u,f,y,E,I,F){var H,Q=f&g,oe=f&b,ge=f&x;if(y&&(H=I?y(u,E,I,F):y(u)),H!==n)return H;if(!fn(u))return u;var ve=st(u);if(ve){if(H=Ga(u),!Q)return ir(u,H)}else{var we=Fn(u),Ie=we==_e||we==mt;if(Kl(u))return Dd(u,Q);if(we==it||we==Ce||Ie&&!I){if(H=oe||Ie?{}:On(u),!Q)return oe?ay(u,hi(H,u)):Tc(u,jt(H,u))}else{if(!Tt[we])return I?u:{};H=uy(u,we,Q)}}F||(F=new Hn);var Ue=F.get(u);if(Ue)return Ue;F.set(u,H),Bw(u)?u.forEach(function(Ze){H.add(gr(Ze,f,y,Ze,u,F))}):zw(u)&&u.forEach(function(Ze,gt){H.set(gt,gr(Ze,f,y,gt,u,F))});var Je=ge?oe?Ka:Ua:oe?ei:Xn,dt=ve?n:Je(u);return Vn(dt||u,function(Ze,gt){dt&&(gt=Ze,Ze=u[gt]),$s(H,gt,gr(Ze,f,y,gt,u,F))}),H}function xm(u){var f=Xn(u);return function(y){return Aa(y,u,f)}}function Aa(u,f,y){var E=y.length;if(u==null)return!E;for(u=$t(u);E--;){var I=y[E],F=f[I],H=u[I];if(H===n&&!(I in u)||!F(H))return!1}return!0}function wd(u,f,y){if(typeof u!="function")throw new Vr(l);return Bl(function(){u.apply(n,y)},f)}function Oi(u,f,y,E){var I=-1,F=Gu,H=!0,Q=u.length,oe=[],ge=f.length;if(!Q)return oe;y&&(f=Lt(f,Pr(y))),E?(F=od,H=!1):f.length>=i&&(F=so,H=!1,f=new Ts(f));e:for(;++II?0:I+y),E=E===n||E>I?I:ct(E),E<0&&(E+=I),E=y>E?0:Uw(E);y0&&y(Q)?f>1?rn(Q,f-1,y,E,I):Oo(I,Q):E||(I[I.length]=Q)}return I}var mc=Ic(),La=Ic(!0);function $r(u,f){return u&&mc(u,f,Xn)}function Ho(u,f){return u&&La(u,f,Xn)}function Il(u,f){return Fo(f,function(y){return Ks(u[y])})}function po(u,f){f=Vi(f,u);for(var y=0,E=f.length;u!=null&&yf}function Hr(u,f){return u!=null&&St.call(u,f)}function Rs(u,f){return u!=null&&f in $t(u)}function kd(u,f,y){return u>=Un(f,y)&&u=120&&ve.length>=120)?new Ts(H&&ve):n}ve=u[0];var we=-1,Ie=Q[0];e:for(;++we-1;)Q!==u&&rc.call(Q,oe,1),rc.call(u,oe,1);return u}function bn(u,f){for(var y=u?f.length:0,E=y-1;y--;){var I=f[y];if(y==E||I!==F){var F=I;qt(I)?rc.call(u,I,1):Cc(u,I)}}return u}function Rl(u,f){return u+jo(Pa()*(f-u+1))}function Fa(u,f,y,E){for(var I=-1,F=hn(Es((f-u)/(y||1)),0),H=fe(F);F--;)H[E?F:++I]=u,u+=y;return H}function Ms(u,f){var y="";if(!u||f<1||f>V)return y;do f%2&&(y+=u),f=jo(f/2),f&&(u+=u);while(f);return y}function ut(u,f){return Ar(Oc(u,f,ti),u+"")}function qn(u){return Ni(rf(u))}function Id(u,f){var y=rf(u);return zc(y,fo(f,0,y.length))}function Ds(u,f,y,E){if(!fn(u))return u;f=Vi(f,u);for(var I=-1,F=f.length,H=F-1,Q=u;Q!=null&&++II?0:I+f),y=y>I?I:y,y<0&&(y+=I),I=f>y?0:y-f>>>0,f>>>=0;for(var F=fe(I);++E>>1,H=u[F];H!==null&&!Si(H)&&(y?H<=f:H=i){var ge=f?null:Lm(u);if(ge)return zo(ge);H=!1,I=so,oe=new Ts}else oe=f?[]:Q;e:for(;++E=E?u:Yn(u,f,y)}var Md=dm||function(u){return Ht.clearTimeout(u)};function Dd(u,f){if(f)return u.slice();var y=u.length,E=md?md(y):new u.constructor(y);return u.copy(E),E}function ja(u){var f=new u.constructor(u.byteLength);return new Ca(f).set(new Ca(u)),f}function Pm(u,f){var y=f?ja(u.buffer):u.buffer;return new u.constructor(y,u.byteOffset,u.byteLength)}function Tm(u){var f=new u.constructor(u.source,oo.exec(u));return f.lastIndex=u.lastIndex,f}function _m(u){return _r?$t(_r.call(u)):{}}function Im(u,f){var y=f?ja(u.buffer):u.buffer;return new u.constructor(y,u.byteOffset,u.length)}function Nd(u,f){if(u!==f){var y=u!==n,E=u===null,I=u===u,F=Si(u),H=f!==n,Q=f===null,oe=f===f,ge=Si(f);if(!Q&&!ge&&!F&&u>f||F&&H&&oe&&!Q&&!ge||E&&H&&oe||!y&&oe||!I)return 1;if(!E&&!F&&!ge&&u=Q)return oe;var ge=y[E];return oe*(ge=="desc"?-1:1)}}return u.index-f.index}function $m(u,f,y,E){for(var I=-1,F=u.length,H=y.length,Q=-1,oe=f.length,ge=hn(F-H,0),ve=fe(oe+ge),we=!E;++Q1?y[I-1]:n,H=I>2?y[2]:n;for(F=u.length>3&&typeof F=="function"?(I--,F):n,H&&sr(y[0],y[1],H)&&(F=I<3?n:F,I=1),f=$t(f);++E-1?I[F?f[H]:H]:n}}function Ac(u){return Ki(function(f){var y=f.length,E=y,I=Kn.prototype.thru;for(u&&f.reverse();E--;){var F=f[E];if(typeof F!="function")throw new Vr(l);if(I&&!H&&zl(F)=="wrapper")var H=new Kn([],!0)}for(E=H?E:y;++E1&&xt.reverse(),ve&&oeQ))return!1;var ge=F.get(u),ve=F.get(f);if(ge&&ve)return ge==f&&ve==u;var we=-1,Ie=!0,Ue=y&P?new Ts:n;for(F.set(u,f),F.set(f,u);++we1?"& ":"")+f[E],f=f.join(y>2?", ":" "),u.replace(sl,`{ +/* [wrapped with `+f+`] */ +`)}function Nc(u){return st(u)||ru(u)||!!(fm&&u&&u[fm])}function qt(u,f){var y=typeof u;return f=f??V,!!f&&(y=="number"||y!="symbol"&&Mh.test(u))&&u>-1&&u%1==0&&u0){if(++f>=Y)return arguments[0]}else f=0;return u.apply(n,arguments)}}function zc(u,f){var y=-1,E=u.length,I=E-1;for(f=f===n?E:f;++y1?u[f-1]:n;return y=typeof y=="function"?(u.pop(),y):n,en(u,y)});function qc(u){var f=N(u);return f.__chain__=!0,f}function xy(u,f){return f(u),u}function wi(u,f){return f(u)}var Yc=Ki(function(u){var f=u.length,y=f?u[0]:0,E=this.__wrapped__,I=function(F){return hc(F,u)};return f>1||this.__actions__.length||!(E instanceof ot)||!qt(y)?this.thru(I):(E=E.slice(y,+y+(f?1:0)),E.__actions__.push({func:wi,args:[I],thisArg:n}),new Kn(E,this.__chain__).thru(function(F){return f&&!F.length&&F.push(n),F}))});function Vs(){return qc(this)}function Xc(){return new Kn(this.value(),this.__chain__)}function ap(){this.__values__===n&&(this.__values__=Vw(this.value()));var u=this.__index__>=this.__values__.length,f=u?n:this.__values__[this.__index__++];return{done:u,value:f}}function up(){return this}function wy(u){for(var f,y=this;y instanceof Mi;){var E=Vm(y);E.__index__=0,E.__values__=n,f?I.__wrapped__=E:f=E;var I=E;y=y.__wrapped__}return I.__wrapped__=u,f}function cp(){var u=this.__wrapped__;if(u instanceof ot){var f=u;return this.__actions__.length&&(f=new ot(this)),f=f.reverse(),f.__actions__.push({func:wi,args:[Wc],thisArg:n}),new Kn(f,this.__chain__)}return this.thru(Wc)}function Sy(){return Ml(this.__wrapped__,this.__actions__)}var Qm=_c(function(u,f,y){St.call(u,y)?++u[y]:Fi(u,y,1)});function Jm(u,f,y){var E=st(u)?id:Ra;return y&&sr(u,f,y)&&(f=n),E(u,Ge(f,3))}function Qc(u,f){var y=st(u)?Fo:Sd;return y(u,Ge(f,3))}var Jc=Fs(Jo),Zm=Fs(Qa);function fp(u,f){return rn(Us(u,f),1)}function ky(u,f){return rn(Us(u,f),q)}function eg(u,f,y){return y=y===n?1:ct(y),rn(Us(u,f),y)}function Zc(u,f){var y=st(u)?Vn:zi;return y(u,Ge(f,3))}function tu(u,f){var y=st(u)?Hu:wm;return y(u,Ge(f,3))}var dp=_c(function(u,f,y){St.call(u,y)?u[y].push(f):Fi(u,y,[f])});function ef(u,f,y,E){u=Zr(u)?u:rf(u),y=y&&!E?ct(y):0;var I=u.length;return y<0&&(y=hn(I+y,0)),rg(u)?y<=I&&u.indexOf(f,y)>-1:!!I&&hl(u,f,y)>-1}var tg=ut(function(u,f,y){var E=-1,I=typeof f=="function",F=Zr(u)?fe(u.length):[];return zi(u,function(H){F[++E]=I?nr(f,H,y):Gr(H,f,y)}),F}),Cy=_c(function(u,f,y){Fi(u,y,f)});function Us(u,f){var y=st(u)?Lt:Pd;return y(u,Ge(f,3))}function Ey(u,f,y,E){return u==null?[]:(st(f)||(f=f==null?[]:[f]),y=E?n:y,st(y)||(y=y==null?[]:[y]),Na(u,f,y))}var nu=_c(function(u,f,y){u[y?0:1].push(f)},function(){return[[],[]]});function Py(u,f,y){var E=st(u)?sd:Zh,I=arguments.length<3;return E(u,Ge(f,4),y,I,zi)}function tf(u,f,y){var E=st(u)?qv:Zh,I=arguments.length<3;return E(u,Ge(f,4),y,I,wm)}function o(u,f){var y=st(u)?Fo:Sd;return y(u,Ee(Ge(f,3)))}function a(u){var f=st(u)?Ni:qn;return f(u)}function p(u,f,y){(y?sr(u,f,y):f===n)?f=1:f=ct(f);var E=st(u)?Is:Id;return E(u,f)}function v(u){var f=st(u)?bm:Yr;return f(u)}function w(u){if(u==null)return 0;if(Zr(u))return rg(u)?ks(u):u.length;var f=Fn(u);return f==pt||f==_t?u.size:go(u).length}function C(u,f,y){var E=st(u)?ld:$d;return y&&sr(u,f,y)&&(f=n),E(u,Ge(f,3))}var A=ut(function(u,f){if(u==null)return[];var y=f.length;return y>1&&sr(u,f[0],f[1])?f=[]:y>2&&sr(f[0],f[1],f[2])&&(f=[f[0]]),Na(u,rn(f,1),[])}),W=Ot||function(){return Ht.Date.now()};function X(u,f){if(typeof f!="function")throw new Vr(l);return u=ct(u),function(){if(--u<1)return f.apply(this,arguments)}}function de(u,f,y){return f=y?n:f,f=u&&f==null?u.length:f,Ui(u,J,n,n,n,n,f)}function xe(u,f){var y;if(typeof f!="function")throw new Vr(l);return u=ct(u),function(){return--u>0&&(y=f.apply(this,arguments)),u<=1&&(f=n),y}}var ke=ut(function(u,f,y){var E=_;if(y.length){var I=Br(y,bo(ke));E|=K}return Ui(u,E,f,y,I)}),be=ut(function(u,f,y){var E=_|T;if(y.length){var I=Br(y,bo(be));E|=K}return Ui(f,E,u,y,I)});function Re(u,f,y){f=y?n:f;var E=Ui(u,L,n,n,n,n,n,f);return E.placeholder=Re.placeholder,E}function Me(u,f,y){f=y?n:f;var E=Ui(u,z,n,n,n,n,n,f);return E.placeholder=Me.placeholder,E}function Ne(u,f,y){var E,I,F,H,Q,oe,ge=0,ve=!1,we=!1,Ie=!0;if(typeof u!="function")throw new Vr(l);f=Hi(f)||0,fn(y)&&(ve=!!y.leading,we="maxWait"in y,F=we?hn(Hi(y.maxWait)||0,f):F,Ie="trailing"in y?!!y.trailing:Ie);function Ue(Sn){var ko=E,Hs=I;return E=I=n,ge=Sn,H=u.apply(Hs,ko),H}function Je(Sn){return ge=Sn,Q=Bl(gt,f),ve?Ue(Sn):H}function dt(Sn){var ko=Sn-oe,Hs=Sn-ge,t1=f-ko;return we?Un(t1,F-Hs):t1}function Ze(Sn){var ko=Sn-oe,Hs=Sn-ge;return oe===n||ko>=f||ko<0||we&&Hs>=F}function gt(){var Sn=W();if(Ze(Sn))return xt(Sn);Q=Bl(gt,dt(Sn))}function xt(Sn){return Q=n,Ie&&E?Ue(Sn):(E=I=n,H)}function ki(){Q!==n&&Md(Q),ge=0,E=oe=I=Q=n}function Lr(){return Q===n?H:xt(W())}function Ci(){var Sn=W(),ko=Ze(Sn);if(E=arguments,I=this,oe=Sn,ko){if(Q===n)return Je(oe);if(we)return Md(Q),Q=Bl(gt,f),Ue(oe)}return Q===n&&(Q=Bl(gt,f)),H}return Ci.cancel=ki,Ci.flush=Lr,Ci}var cn=ut(function(u,f){return wd(u,1,f)}),le=ut(function(u,f,y){return wd(u,Hi(f)||0,y)});function ee(u){return Ui(u,ae)}function ue(u,f){if(typeof u!="function"||f!=null&&typeof f!="function")throw new Vr(l);var y=function(){var E=arguments,I=f?f.apply(this,E):E[0],F=y.cache;if(F.has(I))return F.get(I);var H=u.apply(this,E);return y.cache=F.set(I,H)||F,H};return y.cache=new(ue.Cache||Ur),y}ue.Cache=Ur;function Ee(u){if(typeof u!="function")throw new Vr(l);return function(){var f=arguments;switch(f.length){case 0:return!u.call(this);case 1:return!u.call(this,f[0]);case 2:return!u.call(this,f[0],f[1]);case 3:return!u.call(this,f[0],f[1],f[2])}return!u.apply(this,f)}}function Be(u){return xe(2,u)}var He=Em(function(u,f){f=f.length==1&&st(f[0])?Lt(f[0],Pr(Ge())):Lt(rn(f,1),Pr(Ge()));var y=f.length;return ut(function(E){for(var I=-1,F=Un(E.length,y);++I=f}),ru=yc(function(){return arguments}())?yc:function(u){return gn(u)&&St.call(u,"callee")&&!nc.call(u,"callee")},st=fe.isArray,F$=nd?Pr(nd):km;function Zr(u){return u!=null&&ng(u.length)&&!Ks(u)}function wn(u){return gn(u)&&Zr(u)}function O$(u){return u===!0||u===!1||gn(u)&&Dn(u)==De}var Kl=vd||Oy,z$=dr?Pr(dr):mo;function j$(u){return gn(u)&&u.nodeType===1&&!pp(u)}function B$(u){if(u==null)return!0;if(Zr(u)&&(st(u)||typeof u=="string"||typeof u.splice=="function"||Kl(u)||nf(u)||ru(u)))return!u.length;var f=Fn(u);if(f==pt||f==_t)return!u.size;if(xo(u))return!go(u).length;for(var y in u)if(St.call(u,y))return!1;return!0}function V$(u,f){return qr(u,f)}function U$(u,f,y){y=typeof y=="function"?y:n;var E=y?y(u,f):n;return E===n?qr(u,f,n,y):!!E}function _y(u){if(!gn(u))return!1;var f=Dn(u);return f==lt||f==Xe||typeof u.message=="string"&&typeof u.name=="string"&&!pp(u)}function K$(u){return typeof u=="number"&&xl(u)}function Ks(u){if(!fn(u))return!1;var f=Dn(u);return f==_e||f==mt||f==Fe||f==Zn}function Ow(u){return typeof u=="number"&&u==ct(u)}function ng(u){return typeof u=="number"&&u>-1&&u%1==0&&u<=V}function fn(u){var f=typeof u;return u!=null&&(f=="object"||f=="function")}function gn(u){return u!=null&&typeof u=="object"}var zw=Ss?Pr(Ss):Cm;function W$(u,f){return u===f||$l(u,f,Ha(f))}function H$(u,f,y){return y=typeof y=="function"?y:n,$l(u,f,Ha(f),y)}function G$(u){return jw(u)&&u!=+u}function q$(u){if(fy(u))throw new rt(s);return Cd(u)}function Y$(u){return u===null}function X$(u){return u==null}function jw(u){return typeof u=="number"||gn(u)&&Dn(u)==Vt}function pp(u){if(!gn(u)||Dn(u)!=it)return!1;var f=pi(u);if(f===null)return!0;var y=St.call(f,"constructor")&&f.constructor;return typeof y=="function"&&y instanceof y&&wa.call(y)==ec}var Iy=Wu?Pr(Wu):Ma;function Q$(u){return Ow(u)&&u>=-V&&u<=V}var Bw=pl?Pr(pl):ji;function rg(u){return typeof u=="string"||!st(u)&&gn(u)&&Dn(u)==Rt}function Si(u){return typeof u=="symbol"||gn(u)&&Dn(u)==Tn}var nf=qh?Pr(qh):Da;function J$(u){return u===n}function Z$(u){return gn(u)&&Fn(u)==Nt}function eA(u){return gn(u)&&Dn(u)==pe}var tA=Lc(qo),nA=Lc(function(u,f){return u<=f});function Vw(u){if(!u)return[];if(Zr(u))return rg(u)?Tr(u):ir(u);if(uo&&u[uo])return ey(u[uo]());var f=Fn(u),y=f==pt?Xu:f==_t?zo:rf;return y(u)}function Ws(u){if(!u)return u===0?u:0;if(u=Hi(u),u===q||u===-q){var f=u<0?-1:1;return f*se}return u===u?u:0}function ct(u){var f=Ws(u),y=f%1;return f===f?y?f-y:f:0}function Uw(u){return u?fo(ct(u),0,U):0}function Hi(u){if(typeof u=="number")return u;if(Si(u))return R;if(fn(u)){var f=typeof u.valueOf=="function"?u.valueOf():u;u=fn(f)?f+"":f}if(typeof u!="string")return u===0?u:+u;u=em(u);var y=Ov.test(u);return y||Lh.test(u)?Uu(u.slice(2),y?2:8):Ah.test(u)?R:+u}function Kw(u){return mi(u,ei(u))}function rA(u){return u?fo(ct(u),-V,V):u===0?u:0}function At(u){return u==null?"":vr(u)}var iA=Nl(function(u,f){if(xo(f)||Zr(f)){mi(f,Xn(f),u);return}for(var y in f)St.call(f,y)&&$s(u,y,f[y])}),Ww=Nl(function(u,f){mi(f,ei(f),u)}),ig=Nl(function(u,f,y,E){mi(f,ei(f),u,E)}),oA=Nl(function(u,f,y,E){mi(f,Xn(f),u,E)}),sA=Ki(hc);function lA(u,f){var y=El(u);return f==null?y:jt(y,f)}var aA=ut(function(u,f){u=$t(u);var y=-1,E=f.length,I=E>2?f[2]:n;for(I&&sr(f[0],f[1],I)&&(E=1);++y1),F}),mi(u,Ka(u),y),E&&(y=gr(y,g|b|x,Kd));for(var I=f.length;I--;)Cc(y,f[I]);return y});function PA(u,f){return Gw(u,Ee(Ge(f)))}var TA=Ki(function(u,f){return u==null?{}:_d(u,f)});function Gw(u,f){if(u==null)return{};var y=Lt(Ka(u),function(E){return[E]});return f=Ge(f),Yo(u,y,function(E,I){return f(E,I[0])})}function _A(u,f,y){f=Vi(f,u);var E=-1,I=f.length;for(I||(I=1,u=n);++Ef){var E=u;u=f,f=E}if(y||u%1||f%1){var I=Pa();return Un(u+I*(f-u+ed("1e-"+((I+"").length-1))),f)}return Rl(u,f)}var zA=Ns(function(u,f,y){return f=f.toLowerCase(),u+(y?Xw(f):f)});function Xw(u){return Ry(At(u).toLowerCase())}function Qw(u){return u=At(u),u&&u.replace(Dh,rm).replace(Kh,"")}function jA(u,f,y){u=At(u),f=vr(f);var E=u.length;y=y===n?E:fo(ct(y),0,E);var I=y;return y-=f.length,y>=0&&u.slice(y,I)==f}function BA(u){return u=At(u),u&&Mu.test(u)?u.replace(fi,im):u}function VA(u){return u=At(u),u&&Ro.test(u)?u.replace(vs,"\\$&"):u}var UA=Ns(function(u,f,y){return u+(y?"-":"")+f.toLowerCase()}),KA=Ns(function(u,f,y){return u+(y?" ":"")+f.toLowerCase()}),WA=Od("toLowerCase");function HA(u,f,y){u=At(u),f=ct(f);var E=f?ks(u):0;if(!f||E>=f)return u;var I=(f-E)/2;return Va(jo(I),y)+u+Va(Es(I),y)}function GA(u,f,y){u=At(u),f=ct(f);var E=f?ks(u):0;return f&&E>>0,y?(u=At(u),u&&(typeof f=="string"||f!=null&&!Iy(f))&&(f=vr(f),!f&&gl(u))?yo(Tr(u),0,y):u.split(f,y)):[]}var eR=Ns(function(u,f,y){return u+(y?" ":"")+Ry(f)});function tR(u,f,y){return u=At(u),y=y==null?0:fo(ct(y),0,u.length),f=vr(f),u.slice(y,y+f.length)==f}function nR(u,f,y){var E=N.templateSettings;y&&sr(u,f,y)&&(f=n),u=At(u),f=ig({},f,E,Vd);var I=ig({},f.imports,E.imports,Vd),F=Xn(I),H=ba(I,F),Q,oe,ge=0,ve=f.interpolate||Du,we="__p += '",Ie=xa((f.escape||Du).source+"|"+ve.source+"|"+(ve===aa?Ye:Du).source+"|"+(f.evaluate||Du).source+"|$","g"),Ue="//# sourceURL="+(St.call(f,"sourceURL")?(f.sourceURL+"").replace(/\s/g," "):"lodash.templateSources["+ ++Wv+"]")+` +`;u.replace(Ie,function(Ze,gt,xt,ki,Lr,Ci){return xt||(xt=ki),we+=u.slice(ge,Ci).replace(zv,om),gt&&(Q=!0,we+=`' + +__e(`+gt+`) + +'`),Lr&&(oe=!0,we+=`'; +`+Lr+`; +__p += '`),xt&&(we+=`' + +((__t = (`+xt+`)) == null ? '' : __t) + +'`),ge=Ci+Ze.length,Ze}),we+=`'; +`;var Je=St.call(f,"variable")&&f.variable;if(!Je)we=`with (obj) { +`+we+` +} +`;else if(Hf.test(Je))throw new rt(c);we=(oe?we.replace(an,""):we).replace(ol,"$1").replace(hs,"$1;"),we="function("+(Je||"obj")+`) { +`+(Je?"":`obj || (obj = {}); +`)+"var __t, __p = ''"+(Q?", __e = _.escape":"")+(oe?`, __j = Array.prototype.join; +function print() { __p += __j.call(arguments, '') } +`:`; +`)+we+`return __p +}`;var dt=Zw(function(){return wt(F,Ue+"return "+we).apply(n,H)});if(dt.source=we,_y(dt))throw dt;return dt}function rR(u){return At(u).toLowerCase()}function iR(u){return At(u).toUpperCase()}function oR(u,f,y){if(u=At(u),u&&(y||f===n))return em(u);if(!u||!(f=vr(f)))return u;var E=Tr(u),I=Tr(f),F=tm(E,I),H=dd(E,I)+1;return yo(E,F,H).join("")}function sR(u,f,y){if(u=At(u),u&&(y||f===n))return u.slice(0,Ju(u)+1);if(!u||!(f=vr(f)))return u;var E=Tr(u),I=dd(E,Tr(f))+1;return yo(E,0,I).join("")}function lR(u,f,y){if(u=At(u),u&&(y||f===n))return u.replace(ca,"");if(!u||!(f=vr(f)))return u;var E=Tr(u),I=tm(E,Tr(f));return yo(E,I).join("")}function aR(u,f){var y=j,E=B;if(fn(f)){var I="separator"in f?f.separator:I;y="length"in f?ct(f.length):y,E="omission"in f?vr(f.omission):E}u=At(u);var F=u.length;if(gl(u)){var H=Tr(u);F=H.length}if(y>=F)return u;var Q=y-ks(E);if(Q<1)return E;var oe=H?yo(H,0,Q).join(""):u.slice(0,Q);if(I===n)return oe+E;if(H&&(Q+=oe.length-Q),Iy(I)){if(u.slice(Q).search(I)){var ge,ve=oe;for(I.global||(I=xa(I.source,At(oo.exec(I))+"g")),I.lastIndex=0;ge=I.exec(ve);)var we=ge.index;oe=oe.slice(0,we===n?Q:we)}}else if(u.indexOf(vr(I),Q)!=Q){var Ie=oe.lastIndexOf(I);Ie>-1&&(oe=oe.slice(0,Ie))}return oe+E}function uR(u){return u=At(u),u&&la.test(u)?u.replace(ci,sm):u}var cR=Ns(function(u,f,y){return u+(y?" ":"")+f.toUpperCase()}),Ry=Od("toUpperCase");function Jw(u,f,y){return u=At(u),f=y?n:f,f===n?Zv(u)?ry(u):Xv(u):u.match(f)||[]}var Zw=ut(function(u,f){try{return nr(u,n,f)}catch(y){return _y(y)?y:new rt(y)}}),fR=Ki(function(u,f){return Vn(f,function(y){y=bi(y),Fi(u,y,ke(u[y],u))}),u});function dR(u){var f=u==null?0:u.length,y=Ge();return u=f?Lt(u,function(E){if(typeof E[1]!="function")throw new Vr(l);return[y(E[0]),E[1]]}):[],ut(function(E){for(var I=-1;++IV)return[];var y=U,E=Un(u,U);f=Ge(f),u-=U;for(var I=fd(E,f);++y0||f<0)?new ot(y):(u<0?y=y.takeRight(-u):u&&(y=y.drop(u)),f!==n&&(f=ct(f),y=f<0?y.dropRight(-f):y.take(f-u)),y)},ot.prototype.takeRightWhile=function(u){return this.reverse().takeWhile(u).reverse()},ot.prototype.toArray=function(){return this.take(U)},$r(ot.prototype,function(u,f){var y=/^(?:filter|find|map|reject)|While$/.test(f),E=/^(?:head|last)$/.test(f),I=N[E?"take"+(f=="last"?"Right":""):f],F=E||/^find/.test(f);I&&(N.prototype[f]=function(){var H=this.__wrapped__,Q=E?[1]:arguments,oe=H instanceof ot,ge=Q[0],ve=oe||st(H),we=function(gt){var xt=I.apply(N,Oo([gt],Q));return E&&Ie?xt[0]:xt};ve&&y&&typeof ge=="function"&&ge.length!=1&&(oe=ve=!1);var Ie=this.__chain__,Ue=!!this.__actions__.length,Je=F&&!Ie,dt=oe&&!Ue;if(!F&&ve){H=dt?H:new ot(this);var Ze=u.apply(H,Q);return Ze.__actions__.push({func:wi,args:[we],thisArg:n}),new Kn(Ze,Ie)}return Je&&dt?u.apply(this,Q):(Ze=this.thru(we),Je?E?Ze.value()[0]:Ze.value():Ze)})}),Vn(["pop","push","shift","sort","splice","unshift"],function(u){var f=lo[u],y=/^(?:push|sort|unshift)$/.test(u)?"tap":"thru",E=/^(?:pop|shift)$/.test(u);N.prototype[u]=function(){var I=arguments;if(E&&!this.__chain__){var F=this.value();return f.apply(st(F)?F:[],I)}return this[y](function(H){return f.apply(st(H)?H:[],I)})}}),$r(ot.prototype,function(u,f){var y=N[f];if(y){var E=y.name+"";St.call(kl,E)||(kl[E]=[]),kl[E].push({name:f,func:y})}}),kl[Ol(n,T).name]=[{name:"wrapper",func:n}],ot.prototype.clone=uc,ot.prototype.reverse=bd,ot.prototype.value=Pl,N.prototype.at=Yc,N.prototype.chain=Vs,N.prototype.commit=Xc,N.prototype.next=ap,N.prototype.plant=wy,N.prototype.reverse=cp,N.prototype.toJSON=N.prototype.valueOf=N.prototype.value=Sy,N.prototype.first=N.prototype.head,uo&&(N.prototype[uo]=up),N},vl=iy();Ai?((Ai.exports=vl)._=vl,ya._=vl):Ht._=vl}).call(H8)}(Mp,Mp.exports)),Mp.exports}var P2=G8();class q8{plugins={};activePlugins=[];listeners=new Set;register(t){this.plugins[t.name]={isActivated:!1,config:t},this.notify()}activate(t){const n=this.plugins[t];!n||n.isActivated||(n.isActivated=!0,n.config.onActivate&&n.config.onActivate(),this.produceActivePlugins(),this.notify())}deactivate(t){const n=this.plugins[t];!n||!n.isActivated||(n.isActivated=!1,n.config.onDeactivate&&n.config.onDeactivate(),this.produceActivePlugins(),this.notify())}isPluginActivated(t){const n=this.plugins[t];return!!n&&n.isActivated}getPlugin(t){const n=this.plugins[t];return!n||!n.isActivated?null:n}getActivePlugins(){return this.activePlugins}subscribe(t){return this.listeners.add(t),()=>this.listeners.delete(t)}notify(){this.listeners.forEach(t=>t())}produceActivePlugins(){this.activePlugins=P2.transform(this.plugins,(t,n)=>{n.isActivated&&t.push(n.config)},[])}}const xr=new q8;const T2="FeedbackFormPlugin",_2={name:T2,components:{FeedbackForm:S.lazy(()=>no(()=>import("./FeedbackForm-Cuu7ROp3.js"),__vite__mapDeps([0,1,2,3,4])))}},I2="ChatOptionsPlugin",$2={name:I2,components:{ChatOptionsForm:S.lazy(()=>no(()=>import("./ChatOptionsForm-CUT15Ecj.js"),__vite__mapDeps([5,1,2,3,4])))}},A2=S.createContext(void 0),R2="SharePluginName",L2={name:R2,components:{ShareButton:S.lazy(()=>no(()=>import("./ShareButton-DpNGX0tU.js"),__vite__mapDeps([6,4])))}},eC=e=>{let t;const n=new Set,r=(h,m)=>{const g=typeof h=="function"?h(t):h;if(!Object.is(g,t)){const b=t;t=m??(typeof g!="object"||g===null)?g:Object.assign({},t,g),n.forEach(x=>x(t,b))}},i=()=>t,c={setState:r,getState:i,getInitialState:()=>d,subscribe:h=>(n.add(h),()=>n.delete(h))},d=t=e(r,i,c);return c},tC=e=>e?eC(e):eC,Y8=e=>e;function M2(e,t=Y8){const n=We.useSyncExternalStore(e.subscribe,()=>t(e.getState()),()=>t(e.getInitialState()));return We.useDebugValue(n),n}const ur=[];for(let e=0;e<256;++e)ur.push((e+256).toString(16).slice(1));function X8(e,t=0){return(ur[e[t+0]]+ur[e[t+1]]+ur[e[t+2]]+ur[e[t+3]]+"-"+ur[e[t+4]]+ur[e[t+5]]+"-"+ur[e[t+6]]+ur[e[t+7]]+"-"+ur[e[t+8]]+ur[e[t+9]]+"-"+ur[e[t+10]]+ur[e[t+11]]+ur[e[t+12]]+ur[e[t+13]]+ur[e[t+14]]+ur[e[t+15]]).toLowerCase()}let w0;const Q8=new Uint8Array(16);function J8(){if(!w0){if(typeof crypto>"u"||!crypto.getRandomValues)throw new Error("crypto.getRandomValues() not supported. See https://github.com/uuidjs/uuid#getrandomvalues-not-supported");w0=crypto.getRandomValues.bind(crypto)}return w0(Q8)}const Z8=typeof crypto<"u"&&crypto.randomUUID&&crypto.randomUUID.bind(crypto),nC={randomUUID:Z8};function D2(e,t,n){if(nC.randomUUID&&!e)return nC.randomUUID();e=e||{};const r=e.random??e.rng?.()??J8();if(r.length<16)throw new Error("Random bytes length must be >= 16");return r[6]=r[6]&15|64,r[8]=r[8]&63|128,X8(r)}function e7(e){return Object.values(e).map(t=>({role:t.role,content:t.content}))}var N2=Symbol.for("immer-nothing"),rC=Symbol.for("immer-draftable"),_i=Symbol.for("immer-state");function To(e,...t){throw new Error(`[Immer] minified error nr: ${e}. Full error at: https://bit.ly/3cXEKWf`)}var Mf=Object.getPrototypeOf;function Df(e){return!!e&&!!e[_i]}function Pu(e){return e?F2(e)||Array.isArray(e)||!!e[rC]||!!e.constructor?.[rC]||Pv(e)||Tv(e):!1}var t7=Object.prototype.constructor.toString();function F2(e){if(!e||typeof e!="object")return!1;const t=Mf(e);if(t===null)return!0;const n=Object.hasOwnProperty.call(t,"constructor")&&t.constructor;return n===Object?!0:typeof n=="function"&&Function.toString.call(n)===t7}function rv(e,t){Ev(e)===0?Reflect.ownKeys(e).forEach(n=>{t(n,e[n],e)}):e.forEach((n,r)=>t(r,n,e))}function Ev(e){const t=e[_i];return t?t.type_:Array.isArray(e)?1:Pv(e)?2:Tv(e)?3:0}function Fb(e,t){return Ev(e)===2?e.has(t):Object.prototype.hasOwnProperty.call(e,t)}function O2(e,t,n){const r=Ev(e);r===2?e.set(t,n):r===3?e.add(n):e[t]=n}function n7(e,t){return e===t?e!==0||1/e===1/t:e!==e&&t!==t}function Pv(e){return e instanceof Map}function Tv(e){return e instanceof Set}function du(e){return e.copy_||e.base_}function Ob(e,t){if(Pv(e))return new Map(e);if(Tv(e))return new Set(e);if(Array.isArray(e))return Array.prototype.slice.call(e);const n=F2(e);if(t===!0||t==="class_only"&&!n){const r=Object.getOwnPropertyDescriptors(e);delete r[_i];let i=Reflect.ownKeys(r);for(let s=0;s1&&(e.set=e.add=e.clear=e.delete=r7),Object.freeze(e),t&&Object.entries(e).forEach(([n,r])=>sw(r,!0))),e}function r7(){To(2)}function _v(e){return Object.isFrozen(e)}var i7={};function Tu(e){const t=i7[e];return t||To(0,e),t}var uh;function z2(){return uh}function o7(e,t){return{drafts_:[],parent_:e,immer_:t,canAutoFreeze_:!0,unfinalizedDrafts_:0}}function iC(e,t){t&&(Tu("Patches"),e.patches_=[],e.inversePatches_=[],e.patchListener_=t)}function zb(e){jb(e),e.drafts_.forEach(s7),e.drafts_=null}function jb(e){e===uh&&(uh=e.parent_)}function oC(e){return uh=o7(uh,e)}function s7(e){const t=e[_i];t.type_===0||t.type_===1?t.revoke_():t.revoked_=!0}function sC(e,t){t.unfinalizedDrafts_=t.drafts_.length;const n=t.drafts_[0];return e!==void 0&&e!==n?(n[_i].modified_&&(zb(t),To(4)),Pu(e)&&(e=iv(t,e),t.parent_||ov(t,e)),t.patches_&&Tu("Patches").generateReplacementPatches_(n[_i].base_,e,t.patches_,t.inversePatches_)):e=iv(t,n,[]),zb(t),t.patches_&&t.patchListener_(t.patches_,t.inversePatches_),e!==N2?e:void 0}function iv(e,t,n){if(_v(t))return t;const r=t[_i];if(!r)return rv(t,(i,s)=>lC(e,r,t,i,s,n)),t;if(r.scope_!==e)return t;if(!r.modified_)return ov(e,r.base_,!0),r.base_;if(!r.finalized_){r.finalized_=!0,r.scope_.unfinalizedDrafts_--;const i=r.copy_;let s=i,l=!1;r.type_===3&&(s=new Set(i),i.clear(),l=!0),rv(s,(c,d)=>lC(e,r,i,c,d,n,l)),ov(e,i,!1),n&&e.patches_&&Tu("Patches").generatePatches_(r,n,e.patches_,e.inversePatches_)}return r.copy_}function lC(e,t,n,r,i,s,l){if(Df(i)){const c=s&&t&&t.type_!==3&&!Fb(t.assigned_,r)?s.concat(r):void 0,d=iv(e,i,c);if(O2(n,r,d),Df(d))e.canAutoFreeze_=!1;else return}else l&&n.add(i);if(Pu(i)&&!_v(i)){if(!e.immer_.autoFreeze_&&e.unfinalizedDrafts_<1)return;iv(e,i),(!t||!t.scope_.parent_)&&typeof r!="symbol"&&Object.prototype.propertyIsEnumerable.call(n,r)&&ov(e,i)}}function ov(e,t,n=!1){!e.parent_&&e.immer_.autoFreeze_&&e.canAutoFreeze_&&sw(t,n)}function l7(e,t){const n=Array.isArray(e),r={type_:n?1:0,scope_:t?t.scope_:z2(),modified_:!1,finalized_:!1,assigned_:{},parent_:t,base_:e,draft_:null,copy_:null,revoke_:null,isManual_:!1};let i=r,s=lw;n&&(i=[r],s=ch);const{revoke:l,proxy:c}=Proxy.revocable(i,s);return r.draft_=c,r.revoke_=l,c}var lw={get(e,t){if(t===_i)return e;const n=du(e);if(!Fb(n,t))return a7(e,n,t);const r=n[t];return e.finalized_||!Pu(r)?r:r===S0(e.base_,t)?(k0(e),e.copy_[t]=Vb(r,e)):r},has(e,t){return t in du(e)},ownKeys(e){return Reflect.ownKeys(du(e))},set(e,t,n){const r=j2(du(e),t);if(r?.set)return r.set.call(e.draft_,n),!0;if(!e.modified_){const i=S0(du(e),t),s=i?.[_i];if(s&&s.base_===n)return e.copy_[t]=n,e.assigned_[t]=!1,!0;if(n7(n,i)&&(n!==void 0||Fb(e.base_,t)))return!0;k0(e),Bb(e)}return e.copy_[t]===n&&(n!==void 0||t in e.copy_)||Number.isNaN(n)&&Number.isNaN(e.copy_[t])||(e.copy_[t]=n,e.assigned_[t]=!0),!0},deleteProperty(e,t){return S0(e.base_,t)!==void 0||t in e.base_?(e.assigned_[t]=!1,k0(e),Bb(e)):delete e.assigned_[t],e.copy_&&delete e.copy_[t],!0},getOwnPropertyDescriptor(e,t){const n=du(e),r=Reflect.getOwnPropertyDescriptor(n,t);return r&&{writable:!0,configurable:e.type_!==1||t!=="length",enumerable:r.enumerable,value:n[t]}},defineProperty(){To(11)},getPrototypeOf(e){return Mf(e.base_)},setPrototypeOf(){To(12)}},ch={};rv(lw,(e,t)=>{ch[e]=function(){return arguments[0]=arguments[0][0],t.apply(this,arguments)}});ch.deleteProperty=function(e,t){return ch.set.call(this,e,t,void 0)};ch.set=function(e,t,n){return lw.set.call(this,e[0],t,n,e[0])};function S0(e,t){const n=e[_i];return(n?du(n):e)[t]}function a7(e,t,n){const r=j2(t,n);return r?"value"in r?r.value:r.get?.call(e.draft_):void 0}function j2(e,t){if(!(t in e))return;let n=Mf(e);for(;n;){const r=Object.getOwnPropertyDescriptor(n,t);if(r)return r;n=Mf(n)}}function Bb(e){e.modified_||(e.modified_=!0,e.parent_&&Bb(e.parent_))}function k0(e){e.copy_||(e.copy_=Ob(e.base_,e.scope_.immer_.useStrictShallowCopy_))}var u7=class{constructor(e){this.autoFreeze_=!0,this.useStrictShallowCopy_=!1,this.produce=(t,n,r)=>{if(typeof t=="function"&&typeof n!="function"){const s=n;n=t;const l=this;return function(d=s,...h){return l.produce(d,m=>n.call(this,m,...h))}}typeof n!="function"&&To(6),r!==void 0&&typeof r!="function"&&To(7);let i;if(Pu(t)){const s=oC(this),l=Vb(t,void 0);let c=!0;try{i=n(l),c=!1}finally{c?zb(s):jb(s)}return iC(s,r),sC(i,s)}else if(!t||typeof t!="object"){if(i=n(t),i===void 0&&(i=t),i===N2&&(i=void 0),this.autoFreeze_&&sw(i,!0),r){const s=[],l=[];Tu("Patches").generateReplacementPatches_(t,i,s,l),r(s,l)}return i}else To(1,t)},this.produceWithPatches=(t,n)=>{if(typeof t=="function")return(l,...c)=>this.produceWithPatches(l,d=>t(d,...c));let r,i;return[this.produce(t,n,(l,c)=>{r=l,i=c}),r,i]},typeof e?.autoFreeze=="boolean"&&this.setAutoFreeze(e.autoFreeze),typeof e?.useStrictShallowCopy=="boolean"&&this.setUseStrictShallowCopy(e.useStrictShallowCopy)}createDraft(e){Pu(e)||To(8),Df(e)&&(e=c7(e));const t=oC(this),n=Vb(e,void 0);return n[_i].isManual_=!0,jb(t),n}finishDraft(e,t){const n=e&&e[_i];(!n||!n.isManual_)&&To(9);const{scope_:r}=n;return iC(r,t),sC(void 0,r)}setAutoFreeze(e){this.autoFreeze_=e}setUseStrictShallowCopy(e){this.useStrictShallowCopy_=e}applyPatches(e,t){let n;for(n=t.length-1;n>=0;n--){const i=t[n];if(i.path.length===0&&i.op==="replace"){e=i.value;break}}n>-1&&(t=t.slice(n+1));const r=Tu("Patches").applyPatches_;return Df(e)?r(e,t):this.produce(e,i=>r(i,t))}};function Vb(e,t){const n=Pv(e)?Tu("MapSet").proxyMap_(e,t):Tv(e)?Tu("MapSet").proxySet_(e,t):l7(e,t);return(t?t.scope_:z2()).drafts_.push(n),n}function c7(e){return Df(e)||To(10,e),B2(e)}function B2(e){if(!Pu(e)||_v(e))return e;const t=e[_i];let n;if(t){if(!t.modified_)return t.base_;t.finalized_=!0,n=Ob(e,t.scope_.immer_.useStrictShallowCopy_)}else n=Ob(e,!0);return rv(n,(r,i)=>{O2(n,r,B2(i))}),t&&(t.finalized_=!1),n}var Ii=new u7,Ch=Ii.produce;Ii.produceWithPatches.bind(Ii);Ii.setAutoFreeze.bind(Ii);Ii.setUseStrictShallowCopy.bind(Ii);Ii.applyPatches.bind(Ii);Ii.createDraft.bind(Ii);Ii.finishDraft.bind(Ii);const f7=e=>(t,n,r)=>(r.setState=(i,s,...l)=>{const c=typeof i=="function"?Ch(i):i;return t(c,s,...l)},e(r.setState,n,r)),d7=f7,p7=({content:e},t)=>{t.serverState=e},h7=({content:e},t,n)=>{const r=n.conversationIdRef.current;return t.conversationId=e,n.conversationIdRef.current=e,{originalConversationId:r}},m7=(e,t,{originalConversationId:n,conversationIdRef:r})=>{const i=t.conversations[n];if(!i)throw new Error("Received events for non-existent conversation");t.conversations[r.current]=i,t.currentConversation===n&&(t.currentConversation=r.current),delete t.conversations[n]},g7=({content:e},t)=>{t.followupMessages=e},v7=(e,t,n)=>{const r=t.history[n.messageId];r.content+=e.content},y7=(e,t,n)=>{const r=t.history[n.messageId];r.references=[...r.references??[],e.content]},b7=(e,t,n)=>{const r=t.history[n.messageId];r.serverId=e.content},x7=(e,t,n)=>{const r=t.history[n.messageId],{update_id:i,content:s,type:l}=e.content,c=Ch(r.liveUpdates??{},d=>{l===Vz.Start&&i in d&&console.error(`Got duplicate start event for update_id: ${i}. Ignoring the event.`),d[i]=s});r.liveUpdates=c},w7=(e,t,n)=>{const r=t.history[n.messageId],i=e.content;r.images=Ch(r.images??{},s=>{s[i.id]&&console.error(`Got duplicate image event for image_id: ${i.id}. Ignoring the event.`),s[i.id]=i.url})},S7=(e,t,n)=>{const r=t.history[n.messageId];t.history[n.messageId]={id:r.id,role:r.role,content:""}},k7=(e,t,n)=>{const r=t.history[n.messageId];r.usage=e.content},C7=({content:e},t,n)=>{const r=t.history[n.messageId],i=r.tasks??[],s=Ch(i,l=>{const c=l.findIndex(d=>d.id===e.id);c===-1?l.push(e):l[c]=e});r.tasks=s};class E7{handlers=new Map;register(t,n){this.handlers.has(t)&&console.warn(`Handler for ${String(t)} already registered - overwriting.`),this.handlers.set(t,n)}get(t){const n=this.handlers.get(t);if(!n)throw new Error(`No handler registered for type: ${String(t)}`);return n}}const ro=new E7;ro.register(zr.StateUpdate,{handle:p7});ro.register(zr.ConversationId,{handle:h7,after:m7});ro.register(zr.FollowupMessages,{handle:g7});ro.register(zr.Text,{handle:v7});ro.register(zr.Reference,{handle:y7});ro.register(zr.MessageId,{handle:b7});ro.register(zr.LiveUpdate,{handle:x7});ro.register(zr.Image,{handle:w7});ro.register(zr.ClearMessage,{handle:S7});ro.register(zr.Usage,{handle:k7});ro.register(zr.TodoItem,{handle:C7});const V2="temp-",U2=()=>`${V2}${D2()}`,Ub=()=>({history:{},followupMessages:null,serverState:null,conversationId:U2(),eventsLog:[],lastMessageId:null,context:void 0,chatOptions:void 0,isLoading:!1,abortController:null}),P7=()=>{const e=Ub();return{conversations:{[e.conversationId]:e},currentConversation:e.conversationId}},os=(e,t)=>n=>{const r=n.conversations[e];if(!r)throw new Error(`Conversation with ID '${e}' does not exist`);t(r)},aC=e=>e.startsWith(V2),uC=d7((e,t)=>({...P7(),computed:{getContext:()=>{const{primitives:{getCurrentConversation:n}}=t(),r=n(),{serverState:i,conversationId:s,chatOptions:l}=r;return{...i??{},...s&&!aC(r.conversationId)?{conversation_id:s}:{},...l?{user_settings:l}:{}}}},_internal:{_hasHydrated:!1,_setHasHydrated:n=>{e(r=>{r._internal._hasHydrated=n})},handleResponse:(n,r,i)=>{let s;const l=ro.get(i.type);e(os(n.current,c=>{if(!c.history[r])throw new Error(`Message ID ${r} not found in history`);s=l.handle(i,c,{conversationIdRef:n,messageId:r})})),e(c=>{l.after?.(i,c,{conversationIdRef:n,messageId:r,...s})}),e(os(n.current,c=>{c.eventsLog[c.eventsLog.length-1].push(i)}))}},primitives:{getCurrentConversation:()=>{const{currentConversation:n,conversations:r}=t(),i=r[n];if(!i)throw new Error("Tried to get conversation that doesn't exist.");return i},restore:(n,r,i,s)=>{const l=U2(),c={...Ub(),followupMessages:r,chatOptions:i,serverState:s,history:n,conversationId:l},d=Object.values(n).filter(h=>h.role!==Sf.User);c.eventsLog=d.map(()=>[]),e(h=>{h.conversations[l]=c,h.currentConversation=l})},addMessage:(n,r)=>{const i=D2(),s={...r,id:i};return e(os(n,l=>{l.followupMessages=null,l.lastMessageId=i,l.history[i]=s})),i},deleteMessage:(n,r)=>{e(os(n,i=>{const{history:s}=i,l=Object.keys(s);l.at(-1)===r&&(i.lastMessageId=l.at(-2)??null),delete i.history[r]}))},stopAnswering:n=>{const r=t().conversations[n];if(!r)throw new Error("Tried to stop answering for conversation that doesn't exist");r.abortController?.abort(),e(os(n,i=>{i.abortController=null,i.isLoading=!1}))}},actions:{selectConversation:n=>{e(r=>{if(!r.conversations[n])throw new Error(`Tried to select conversation that doesn't exist, id: ${n}`);r.currentConversation=n})},deleteConversation:n=>{const{actions:{newConversation:r},primitives:{stopAnswering:i},currentConversation:s}=t();if(i(n),e(l=>{delete l.conversations[n]}),n===s)return r()},mergeExtensions:(n,r)=>{const{currentConversation:i}=t();e(os(i,s=>{if(!(n in s.history))throw new Error("Attempted to set extensions for a message that does not exist.");const l=s.history[n];l.extensions={...l.extensions,...r},s.history[n]=l}))},initializeChatOptions:n=>{const{currentConversation:r}=t();e(os(r,i=>{const s=i.chatOptions??{};Object.keys(s).forEach(l=>{l in n||delete s[l]}),Object.keys(n).forEach(l=>{l in s||(s[l]=n[l])}),i.chatOptions=s}))},setChatOptions:n=>{const{currentConversation:r}=t();e(os(r,i=>{i.chatOptions=n}))},stopAnswering:()=>{const{currentConversation:n,primitives:{stopAnswering:r}}=t();r(n)},newConversation:()=>{const n=Ub();return e(r=>{r.conversations[n.conversationId]=n,r.currentConversation=n.conversationId,r.conversations=P2.omitBy(r.conversations,i=>aC(i.conversationId)&&i.conversationId!==r.currentConversation)}),n.conversationId},sendMessage:(n,r)=>{const{_internal:{handleResponse:i},primitives:{addMessage:s,getCurrentConversation:l,stopAnswering:c},computed:{getContext:d}}=t(),{history:h,conversationId:m}=l();s(m,{role:Sf.User,content:n});const g=s(m,{role:Sf.Assistant,content:""}),b={message:n,history:e7(h),context:d()};e(os(m,P=>{P.eventsLog.push([])}));const x=new AbortController,k={current:m};e(os(m,P=>{P.abortController=x,P.isLoading=!0})),r.makeStreamRequest("/api/chat",b,{onMessage:P=>i(k,g,P),onError:P=>{i(k,g,{type:zr.Text,content:P.message}),c(k.current)},onClose:()=>{c(k.current)}},x.signal)}}}));function K2(e,t){let n;try{n=e()}catch{return}return{getItem:i=>{var s;const l=d=>d===null?null:JSON.parse(d,void 0),c=(s=n.getItem(i))!=null?s:null;return c instanceof Promise?c.then(l):l(c)},setItem:(i,s)=>n.setItem(i,JSON.stringify(s,void 0)),removeItem:i=>n.removeItem(i)}}const Kb=e=>t=>{try{const n=e(t);return n instanceof Promise?n:{then(r){return Kb(r)(n)},catch(r){return this}}}catch(n){return{then(r){return this},catch(r){return Kb(r)(n)}}}},T7=(e,t)=>(n,r,i)=>{let s={storage:K2(()=>localStorage),partialize:P=>P,version:0,merge:(P,_)=>({..._,...P}),...t},l=!1;const c=new Set,d=new Set;let h=s.storage;if(!h)return e((...P)=>{console.warn(`[zustand persist middleware] Unable to update item '${s.name}', the given storage is currently unavailable.`),n(...P)},r,i);const m=()=>{const P=s.partialize({...r()});return h.setItem(s.name,{state:P,version:s.version})},g=i.setState;i.setState=(P,_)=>{g(P,_),m()};const b=e((...P)=>{n(...P),m()},r,i);i.getInitialState=()=>b;let x;const k=()=>{var P,_;if(!h)return;l=!1,c.forEach($=>{var L;return $((L=r())!=null?L:b)});const T=((_=s.onRehydrateStorage)==null?void 0:_.call(s,(P=r())!=null?P:b))||void 0;return Kb(h.getItem.bind(h))(s.name).then($=>{if($)if(typeof $.version=="number"&&$.version!==s.version){if(s.migrate){const L=s.migrate($.state,$.version);return L instanceof Promise?L.then(z=>[!0,z]):[!0,L]}console.error("State loaded from storage couldn't be migrated since no migrate function was provided")}else return[!1,$.state];return[!1,void 0]}).then($=>{var L;const[z,K]=$;if(x=s.merge(K,(L=r())!=null?L:b),n(x,!0),z)return m()}).then(()=>{T?.(x,void 0),x=r(),l=!0,d.forEach($=>$(x))}).catch($=>{T?.(void 0,$)})};return i.persist={setOptions:P=>{s={...s,...P},P.storage&&(h=P.storage)},clearStorage:()=>{h?.removeItem(s.name)},getOptions:()=>s,rehydrate:()=>k(),hasHydrated:()=>l,onHydrate:P=>(c.add(P),()=>{c.delete(P)}),onFinishHydration:P=>(d.add(P),()=>{d.delete(P)})},s.skipHydration||k(),x||b},_7=T7;function Iv(e){return new Promise((t,n)=>{e.oncomplete=e.onsuccess=()=>t(e.result),e.onabort=e.onerror=()=>n(e.error)})}function I7(e,t){let n;const r=()=>{if(n)return n;const i=indexedDB.open(e);return i.onupgradeneeded=()=>i.result.createObjectStore(t),n=Iv(i),n.then(s=>{s.onclose=()=>n=void 0},()=>{}),n};return(i,s)=>r().then(l=>s(l.transaction(t,i).objectStore(t)))}let C0;function aw(){return C0||(C0=I7("keyval-store","keyval")),C0}function $7(e,t=aw()){return t("readonly",n=>Iv(n.get(e)))}function A7(e,t,n=aw()){return n("readwrite",r=>(r.put(t,e),Iv(r.transaction)))}function R7(e,t=aw()){return t("readwrite",n=>(n.delete(e),Iv(n.transaction)))}const L7={getItem:async e=>await $7(e)||null,setItem:async(e,t)=>{await A7(e,t)},removeItem:async e=>{await R7(e)}},W2=S.createContext(null);function H2(){return D.jsx("div",{className:yn("bg-background flex h-screen w-screen items-start justify-center"),children:D.jsxs("div",{className:"text-default-900 m-auto flex flex-col items-center gap-4",children:[D.jsx(Z_,{size:"lg","aria-label":"Progress indicator"}),D.jsx("p",{children:"Initializing..."})]})})}const cC="ragbits-history-store";function M7(e,t){if(e)return tC(_7(uC,{name:t,partialize:r=>({conversations:r.conversations}),onRehydrateStorage:r=>()=>r._internal._setHasHydrated(!0),merge:(r,i)=>{const s=r?.conversations??{},{conversations:l,currentConversation:c}=i,d=Object.values(s).reduce((h,m)=>(m.conversationId===null||(h[m.conversationId]={...m,isLoading:!1,abortController:null}),h),{});return{...i,currentConversation:c,conversations:{...d,...l}}},storage:K2(()=>L7)}));const n=tC(uC);return n.getState()._internal._setHasHydrated(!0),n}function D7({children:e,shouldStoreHistory:t}){const[n,r]=S.useState(cC),i=S.useMemo(()=>M7(t,n),[t,n]),s=M2(i,d=>d._internal._hasHydrated),l=d=>{r(`${cC}-${d}`)},c=S.useMemo(()=>({store:i,initializeUserStore:l}),[i]);return t&&!s?D.jsx(H2,{}):D.jsx(W2.Provider,{value:c,children:e})}/** + * react-router v7.7.1 + * + * Copyright (c) Remix Software Inc. + * + * This source code is licensed under the MIT license found in the + * LICENSE.md file in the root directory of this source tree. + * + * @license MIT + */var fC="popstate";function N7(e={}){function t(r,i){let{pathname:s,search:l,hash:c}=r.location;return Wb("",{pathname:s,search:l,hash:c},i.state&&i.state.usr||null,i.state&&i.state.key||"default")}function n(r,i){return typeof i=="string"?i:fh(i)}return O7(t,n,null,e)}function Mn(e,t){if(e===!1||e===null||typeof e>"u")throw new Error(t)}function $o(e,t){if(!e){typeof console<"u"&&console.warn(t);try{throw new Error(t)}catch{}}}function F7(){return Math.random().toString(36).substring(2,10)}function dC(e,t){return{usr:e.state,key:e.key,idx:t}}function Wb(e,t,n=null,r){return{pathname:typeof e=="string"?e:e.pathname,search:"",hash:"",...typeof t=="string"?Eh(t):t,state:n,key:t&&t.key||r||F7()}}function fh({pathname:e="/",search:t="",hash:n=""}){return t&&t!=="?"&&(e+=t.charAt(0)==="?"?t:"?"+t),n&&n!=="#"&&(e+=n.charAt(0)==="#"?n:"#"+n),e}function Eh(e){let t={};if(e){let n=e.indexOf("#");n>=0&&(t.hash=e.substring(n),e=e.substring(0,n));let r=e.indexOf("?");r>=0&&(t.search=e.substring(r),e=e.substring(0,r)),e&&(t.pathname=e)}return t}function O7(e,t,n,r={}){let{window:i=document.defaultView,v5Compat:s=!1}=r,l=i.history,c="POP",d=null,h=m();h==null&&(h=0,l.replaceState({...l.state,idx:h},""));function m(){return(l.state||{idx:null}).idx}function g(){c="POP";let _=m(),T=_==null?null:_-h;h=_,d&&d({action:c,location:P.location,delta:T})}function b(_,T){c="PUSH";let $=Wb(P.location,_,T);h=m()+1;let L=dC($,h),z=P.createHref($);try{l.pushState(L,"",z)}catch(K){if(K instanceof DOMException&&K.name==="DataCloneError")throw K;i.location.assign(z)}s&&d&&d({action:c,location:P.location,delta:1})}function x(_,T){c="REPLACE";let $=Wb(P.location,_,T);h=m();let L=dC($,h),z=P.createHref($);l.replaceState(L,"",z),s&&d&&d({action:c,location:P.location,delta:0})}function k(_){return z7(_)}let P={get action(){return c},get location(){return e(i,l)},listen(_){if(d)throw new Error("A history only accepts one active listener");return i.addEventListener(fC,g),d=_,()=>{i.removeEventListener(fC,g),d=null}},createHref(_){return t(i,_)},createURL:k,encodeLocation(_){let T=k(_);return{pathname:T.pathname,search:T.search,hash:T.hash}},push:b,replace:x,go(_){return l.go(_)}};return P}function z7(e,t=!1){let n="http://localhost";typeof window<"u"&&(n=window.location.origin!=="null"?window.location.origin:window.location.href),Mn(n,"No window.location.(origin|href) available to create URL");let r=typeof e=="string"?e:fh(e);return r=r.replace(/ $/,"%20"),!t&&r.startsWith("//")&&(r=n+r),new URL(r,n)}function G2(e,t,n="/"){return j7(e,t,n,!1)}function j7(e,t,n,r){let i=typeof t=="string"?Eh(t):t,s=tl(i.pathname||"/",n);if(s==null)return null;let l=q2(e);B7(l);let c=null;for(let d=0;c==null&&d{let d={relativePath:c===void 0?s.path||"":c,caseSensitive:s.caseSensitive===!0,childrenIndex:l,route:s};d.relativePath.startsWith("/")&&(Mn(d.relativePath.startsWith(r),`Absolute route path "${d.relativePath}" nested under path "${r}" is not valid. An absolute child route path must start with the combined path of all its parent routes.`),d.relativePath=d.relativePath.slice(r.length));let h=Js([r,d.relativePath]),m=n.concat(d);s.children&&s.children.length>0&&(Mn(s.index!==!0,`Index routes must not have child routes. Please remove all child routes from route path "${h}".`),q2(s.children,t,m,h)),!(s.path==null&&!s.index)&&t.push({path:h,score:q7(h,s.index),routesMeta:m})};return e.forEach((s,l)=>{if(s.path===""||!s.path?.includes("?"))i(s,l);else for(let c of Y2(s.path))i(s,l,c)}),t}function Y2(e){let t=e.split("/");if(t.length===0)return[];let[n,...r]=t,i=n.endsWith("?"),s=n.replace(/\?$/,"");if(r.length===0)return i?[s,""]:[s];let l=Y2(r.join("/")),c=[];return c.push(...l.map(d=>d===""?s:[s,d].join("/"))),i&&c.push(...l),c.map(d=>e.startsWith("/")&&d===""?"/":d)}function B7(e){e.sort((t,n)=>t.score!==n.score?n.score-t.score:Y7(t.routesMeta.map(r=>r.childrenIndex),n.routesMeta.map(r=>r.childrenIndex)))}var V7=/^:[\w-]+$/,U7=3,K7=2,W7=1,H7=10,G7=-2,pC=e=>e==="*";function q7(e,t){let n=e.split("/"),r=n.length;return n.some(pC)&&(r+=G7),t&&(r+=K7),n.filter(i=>!pC(i)).reduce((i,s)=>i+(V7.test(s)?U7:s===""?W7:H7),r)}function Y7(e,t){return e.length===t.length&&e.slice(0,-1).every((r,i)=>r===t[i])?e[e.length-1]-t[t.length-1]:0}function X7(e,t,n=!1){let{routesMeta:r}=e,i={},s="/",l=[];for(let c=0;c{if(m==="*"){let k=c[b]||"";l=s.slice(0,s.length-k.length).replace(/(.)\/+$/,"$1")}const x=c[b];return g&&!x?h[m]=void 0:h[m]=(x||"").replace(/%2F/g,"/"),h},{}),pathname:s,pathnameBase:l,pattern:e}}function Q7(e,t=!1,n=!0){$o(e==="*"||!e.endsWith("*")||e.endsWith("/*"),`Route path "${e}" will be treated as if it were "${e.replace(/\*$/,"/*")}" because the \`*\` character must always follow a \`/\` in the pattern. To get rid of this warning, please change the route path to "${e.replace(/\*$/,"/*")}".`);let r=[],i="^"+e.replace(/\/*\*?$/,"").replace(/^\/*/,"/").replace(/[\\.*+^${}|()[\]]/g,"\\$&").replace(/\/:([\w-]+)(\?)?/g,(l,c,d)=>(r.push({paramName:c,isOptional:d!=null}),d?"/?([^\\/]+)?":"/([^\\/]+)"));return e.endsWith("*")?(r.push({paramName:"*"}),i+=e==="*"||e==="/*"?"(.*)$":"(?:\\/(.+)|\\/*)$"):n?i+="\\/*$":e!==""&&e!=="/"&&(i+="(?:(?=\\/|$))"),[new RegExp(i,t?void 0:"i"),r]}function J7(e){try{return e.split("/").map(t=>decodeURIComponent(t).replace(/\//g,"%2F")).join("/")}catch(t){return $o(!1,`The URL path "${e}" could not be decoded because it is a malformed URL segment. This is probably due to a bad percent encoding (${t}).`),e}}function tl(e,t){if(t==="/")return e;if(!e.toLowerCase().startsWith(t.toLowerCase()))return null;let n=t.endsWith("/")?t.length-1:t.length,r=e.charAt(n);return r&&r!=="/"?null:e.slice(n)||"/"}function Z7(e,t="/"){let{pathname:n,search:r="",hash:i=""}=typeof e=="string"?Eh(e):e;return{pathname:n?n.startsWith("/")?n:ej(n,t):t,search:rj(r),hash:ij(i)}}function ej(e,t){let n=t.replace(/\/+$/,"").split("/");return e.split("/").forEach(i=>{i===".."?n.length>1&&n.pop():i!=="."&&n.push(i)}),n.length>1?n.join("/"):"/"}function E0(e,t,n,r){return`Cannot include a '${e}' character in a manually specified \`to.${t}\` field [${JSON.stringify(r)}]. Please separate it out to the \`to.${n}\` field. Alternatively you may provide the full path as a string in and the router will parse it for you.`}function tj(e){return e.filter((t,n)=>n===0||t.route.path&&t.route.path.length>0)}function uw(e){let t=tj(e);return t.map((n,r)=>r===t.length-1?n.pathname:n.pathnameBase)}function cw(e,t,n,r=!1){let i;typeof e=="string"?i=Eh(e):(i={...e},Mn(!i.pathname||!i.pathname.includes("?"),E0("?","pathname","search",i)),Mn(!i.pathname||!i.pathname.includes("#"),E0("#","pathname","hash",i)),Mn(!i.search||!i.search.includes("#"),E0("#","search","hash",i)));let s=e===""||i.pathname==="",l=s?"/":i.pathname,c;if(l==null)c=n;else{let g=t.length-1;if(!r&&l.startsWith("..")){let b=l.split("/");for(;b[0]==="..";)b.shift(),g-=1;i.pathname=b.join("/")}c=g>=0?t[g]:"/"}let d=Z7(i,c),h=l&&l!=="/"&&l.endsWith("/"),m=(s||l===".")&&n.endsWith("/");return!d.pathname.endsWith("/")&&(h||m)&&(d.pathname+="/"),d}var Js=e=>e.join("/").replace(/\/\/+/g,"/"),nj=e=>e.replace(/\/+$/,"").replace(/^\/*/,"/"),rj=e=>!e||e==="?"?"":e.startsWith("?")?e:"?"+e,ij=e=>!e||e==="#"?"":e.startsWith("#")?e:"#"+e;function oj(e){return e!=null&&typeof e.status=="number"&&typeof e.statusText=="string"&&typeof e.internal=="boolean"&&"data"in e}var X2=["POST","PUT","PATCH","DELETE"];new Set(X2);var sj=["GET",...X2];new Set(sj);var Bf=S.createContext(null);Bf.displayName="DataRouter";var $v=S.createContext(null);$v.displayName="DataRouterState";S.createContext(!1);var Q2=S.createContext({isTransitioning:!1});Q2.displayName="ViewTransition";var lj=S.createContext(new Map);lj.displayName="Fetchers";var aj=S.createContext(null);aj.displayName="Await";var Ao=S.createContext(null);Ao.displayName="Navigation";var Av=S.createContext(null);Av.displayName="Location";var io=S.createContext({outlet:null,matches:[],isDataRoute:!1});io.displayName="Route";var fw=S.createContext(null);fw.displayName="RouteError";function uj(e,{relative:t}={}){Mn(Vf(),"useHref() may be used only in the context of a component.");let{basename:n,navigator:r}=S.useContext(Ao),{hash:i,pathname:s,search:l}=Ph(e,{relative:t}),c=s;return n!=="/"&&(c=s==="/"?n:Js([n,s])),r.createHref({pathname:c,search:l,hash:i})}function Vf(){return S.useContext(Av)!=null}function ia(){return Mn(Vf(),"useLocation() may be used only in the context of a component."),S.useContext(Av).location}var J2="You should call navigate() in a React.useEffect(), not when your component is first rendered.";function Z2(e){S.useContext(Ao).static||S.useLayoutEffect(e)}function dw(){let{isDataRoute:e}=S.useContext(io);return e?Cj():cj()}function cj(){Mn(Vf(),"useNavigate() may be used only in the context of a component.");let e=S.useContext(Bf),{basename:t,navigator:n}=S.useContext(Ao),{matches:r}=S.useContext(io),{pathname:i}=ia(),s=JSON.stringify(uw(r)),l=S.useRef(!1);return Z2(()=>{l.current=!0}),S.useCallback((d,h={})=>{if($o(l.current,J2),!l.current)return;if(typeof d=="number"){n.go(d);return}let m=cw(d,JSON.parse(s),i,h.relative==="path");e==null&&t!=="/"&&(m.pathname=m.pathname==="/"?t:Js([t,m.pathname])),(h.replace?n.replace:n.push)(m,h.state,h)},[t,n,s,i,e])}var fj=S.createContext(null);function dj(e){let t=S.useContext(io).outlet;return t&&S.createElement(fj.Provider,{value:e},t)}function eI(){let{matches:e}=S.useContext(io),t=e[e.length-1];return t?t.params:{}}function Ph(e,{relative:t}={}){let{matches:n}=S.useContext(io),{pathname:r}=ia(),i=JSON.stringify(uw(n));return S.useMemo(()=>cw(e,JSON.parse(i),r,t==="path"),[e,i,r,t])}function pj(e,t){return tI(e)}function tI(e,t,n,r){Mn(Vf(),"useRoutes() may be used only in the context of a component.");let{navigator:i}=S.useContext(Ao),{matches:s}=S.useContext(io),l=s[s.length-1],c=l?l.params:{},d=l?l.pathname:"/",h=l?l.pathnameBase:"/",m=l&&l.route;{let T=m&&m.path||"";nI(d,!m||T.endsWith("*")||T.endsWith("*?"),`You rendered descendant (or called \`useRoutes()\`) at "${d}" (under ) but the parent route path has no trailing "*". This means if you navigate deeper, the parent won't match anymore and therefore the child routes will never render. + +Please change the parent to .`)}let g=ia(),b;b=g;let x=b.pathname||"/",k=x;if(h!=="/"){let T=h.replace(/^\//,"").split("/");k="/"+x.replace(/^\//,"").split("/").slice(T.length).join("/")}let P=G2(e,{pathname:k});return $o(m||P!=null,`No routes matched location "${b.pathname}${b.search}${b.hash}" `),$o(P==null||P[P.length-1].route.element!==void 0||P[P.length-1].route.Component!==void 0||P[P.length-1].route.lazy!==void 0,`Matched leaf route at location "${b.pathname}${b.search}${b.hash}" does not have an element or Component. This means it will render an with a null value by default resulting in an "empty" page.`),yj(P&&P.map(T=>Object.assign({},T,{params:Object.assign({},c,T.params),pathname:Js([h,i.encodeLocation?i.encodeLocation(T.pathname).pathname:T.pathname]),pathnameBase:T.pathnameBase==="/"?h:Js([h,i.encodeLocation?i.encodeLocation(T.pathnameBase).pathname:T.pathnameBase])})),s,n,r)}function hj(){let e=kj(),t=oj(e)?`${e.status} ${e.statusText}`:e instanceof Error?e.message:JSON.stringify(e),n=e instanceof Error?e.stack:null,r="rgba(200,200,200, 0.5)",i={padding:"0.5rem",backgroundColor:r},s={padding:"2px 4px",backgroundColor:r},l=null;return console.error("Error handled by React Router default ErrorBoundary:",e),l=S.createElement(S.Fragment,null,S.createElement("p",null,"💿 Hey developer 👋"),S.createElement("p",null,"You can provide a way better UX than this when your app throws errors by providing your own ",S.createElement("code",{style:s},"ErrorBoundary")," or"," ",S.createElement("code",{style:s},"errorElement")," prop on your route.")),S.createElement(S.Fragment,null,S.createElement("h2",null,"Unexpected Application Error!"),S.createElement("h3",{style:{fontStyle:"italic"}},t),n?S.createElement("pre",{style:i},n):null,l)}var mj=S.createElement(hj,null),gj=class extends S.Component{constructor(e){super(e),this.state={location:e.location,revalidation:e.revalidation,error:e.error}}static getDerivedStateFromError(e){return{error:e}}static getDerivedStateFromProps(e,t){return t.location!==e.location||t.revalidation!=="idle"&&e.revalidation==="idle"?{error:e.error,location:e.location,revalidation:e.revalidation}:{error:e.error!==void 0?e.error:t.error,location:t.location,revalidation:e.revalidation||t.revalidation}}componentDidCatch(e,t){console.error("React Router caught the following error during render",e,t)}render(){return this.state.error!==void 0?S.createElement(io.Provider,{value:this.props.routeContext},S.createElement(fw.Provider,{value:this.state.error,children:this.props.component})):this.props.children}};function vj({routeContext:e,match:t,children:n}){let r=S.useContext(Bf);return r&&r.static&&r.staticContext&&(t.route.errorElement||t.route.ErrorBoundary)&&(r.staticContext._deepestRenderedBoundaryId=t.route.id),S.createElement(io.Provider,{value:e},n)}function yj(e,t=[],n=null,r=null){if(e==null){if(!n)return null;if(n.errors)e=n.matches;else if(t.length===0&&!n.initialized&&n.matches.length>0)e=n.matches;else return null}let i=e,s=n?.errors;if(s!=null){let d=i.findIndex(h=>h.route.id&&s?.[h.route.id]!==void 0);Mn(d>=0,`Could not find a matching route for errors on route IDs: ${Object.keys(s).join(",")}`),i=i.slice(0,Math.min(i.length,d+1))}let l=!1,c=-1;if(n)for(let d=0;d=0?i=i.slice(0,c+1):i=[i[0]];break}}}return i.reduceRight((d,h,m)=>{let g,b=!1,x=null,k=null;n&&(g=s&&h.route.id?s[h.route.id]:void 0,x=h.route.errorElement||mj,l&&(c<0&&m===0?(nI("route-fallback",!1,"No `HydrateFallback` element provided to render during initial hydration"),b=!0,k=null):c===m&&(b=!0,k=h.route.hydrateFallbackElement||null)));let P=t.concat(i.slice(0,m+1)),_=()=>{let T;return g?T=x:b?T=k:h.route.Component?T=S.createElement(h.route.Component,null):h.route.element?T=h.route.element:T=d,S.createElement(vj,{match:h,routeContext:{outlet:d,matches:P,isDataRoute:n!=null},children:T})};return n&&(h.route.ErrorBoundary||h.route.errorElement||m===0)?S.createElement(gj,{location:n.location,revalidation:n.revalidation,component:x,error:g,children:_(),routeContext:{outlet:null,matches:P,isDataRoute:!0}}):_()},null)}function pw(e){return`${e} must be used within a data router. See https://reactrouter.com/en/main/routers/picking-a-router.`}function bj(e){let t=S.useContext(Bf);return Mn(t,pw(e)),t}function xj(e){let t=S.useContext($v);return Mn(t,pw(e)),t}function wj(e){let t=S.useContext(io);return Mn(t,pw(e)),t}function hw(e){let t=wj(e),n=t.matches[t.matches.length-1];return Mn(n.route.id,`${e} can only be used on routes that contain a unique "id"`),n.route.id}function Sj(){return hw("useRouteId")}function kj(){let e=S.useContext(fw),t=xj("useRouteError"),n=hw("useRouteError");return e!==void 0?e:t.errors?.[n]}function Cj(){let{router:e}=bj("useNavigate"),t=hw("useNavigate"),n=S.useRef(!1);return Z2(()=>{n.current=!0}),S.useCallback(async(i,s={})=>{$o(n.current,J2),n.current&&(typeof i=="number"?e.navigate(i):await e.navigate(i,{fromRouteId:t,...s}))},[e,t])}var hC={};function nI(e,t,n){!t&&!hC[e]&&(hC[e]=!0,$o(!1,n))}S.memo(Ej);function Ej({routes:e,future:t,state:n}){return tI(e,void 0,n,t)}function WG({to:e,replace:t,state:n,relative:r}){Mn(Vf()," may be used only in the context of a component.");let{static:i}=S.useContext(Ao);$o(!i," must not be used on the initial render in a . This is a no-op, but you should modify your code so the is only ever rendered in response to some user interaction or state change.");let{matches:s}=S.useContext(io),{pathname:l}=ia(),c=dw(),d=cw(e,uw(s),l,r==="path"),h=JSON.stringify(d);return S.useEffect(()=>{c(JSON.parse(h),{replace:t,state:n,relative:r})},[c,h,r,t,n]),null}function Pj(e){return dj(e.context)}function Tj({basename:e="/",children:t=null,location:n,navigationType:r="POP",navigator:i,static:s=!1}){Mn(!Vf(),"You cannot render a inside another . You should never have more than one in your app.");let l=e.replace(/^\/*/,"/"),c=S.useMemo(()=>({basename:l,navigator:i,static:s,future:{}}),[l,i,s]);typeof n=="string"&&(n=Eh(n));let{pathname:d="/",search:h="",hash:m="",state:g=null,key:b="default"}=n,x=S.useMemo(()=>{let k=tl(d,l);return k==null?null:{location:{pathname:k,search:h,hash:m,state:g,key:b},navigationType:r}},[l,d,h,m,g,b,r]);return $o(x!=null,` is not able to match the URL "${d}${h}${m}" because it does not start with the basename, so the won't render anything.`),x==null?null:S.createElement(Ao.Provider,{value:c},S.createElement(Av.Provider,{children:t,value:x}))}var Fg="get",Og="application/x-www-form-urlencoded";function Rv(e){return e!=null&&typeof e.tagName=="string"}function _j(e){return Rv(e)&&e.tagName.toLowerCase()==="button"}function Ij(e){return Rv(e)&&e.tagName.toLowerCase()==="form"}function $j(e){return Rv(e)&&e.tagName.toLowerCase()==="input"}function Aj(e){return!!(e.metaKey||e.altKey||e.ctrlKey||e.shiftKey)}function Rj(e,t){return e.button===0&&(!t||t==="_self")&&!Aj(e)}var Sg=null;function Lj(){if(Sg===null)try{new FormData(document.createElement("form"),0),Sg=!1}catch{Sg=!0}return Sg}var Mj=new Set(["application/x-www-form-urlencoded","multipart/form-data","text/plain"]);function P0(e){return e!=null&&!Mj.has(e)?($o(!1,`"${e}" is not a valid \`encType\` for \`
\`/\`\` and will default to "${Og}"`),null):e}function Dj(e,t){let n,r,i,s,l;if(Ij(e)){let c=e.getAttribute("action");r=c?tl(c,t):null,n=e.getAttribute("method")||Fg,i=P0(e.getAttribute("enctype"))||Og,s=new FormData(e)}else if(_j(e)||$j(e)&&(e.type==="submit"||e.type==="image")){let c=e.form;if(c==null)throw new Error('Cannot submit a
- ---- - -### 3) Apply TodoOrchestrator - -Plug in a concrete todo manager for persistence, progress tracking, and retries. - -```python -# mock-up code!!! -from ragbits.agents.tools.todo import TodoOrchestrator - -todo_orchestrator = TodoOrchestrator(domain_context="") - - -# Similar flow as before -``` - -UI/Console mock-up: - - - ---- - -### 4) Re-run evaluation (expected improvement) - -Re-run the same suites with orchestration. - -```bash -uv run python examples/evaluate/agent-benchmarking/run_gaia.py --agent todo_orchestrated # or sth like this -uv run python examples/evaluate/agent-benchmarking/run_hotpot.py --agent todo_orchestrated # might be full code snippets -uv run python examples/evaluate/agent-benchmarking/run_humaneval.py --agent todo_orchestrated -``` - -Mock results snapshot (after orchestration): - -
- - - -Key expected gains (mock): -- **GAIA**: +XXX% task success via [argument here]. -- **HotpotQA**: +XXX% F1 through [argument here]. -- **HumanEval**: +XXX% pass@1K with [some argument here]. - ---- - -### 5) MOCK-UP Operational tips - -- **Auditability**: export run logs and todo timelines for regression analysis. -- **Backoff**: configure retries for unreliable tools. -- **Safety**: restrict tool scopes and validate step outputs. - ---- - -### 6) References & examples - -- Tooling: `packages/ragbits-agents/src/ragbits/agents/tools/todo.py` -- Complete example: `examples/agents/todo_tools_example.py` -- Evaluations: - - GAIA: `examples/evaluate/agent-benchmarking/run_gaia.py` - - HotpotQA: `examples/evaluate/agent-benchmarking/run_hotpot.py` - - HumanEval: `examples/evaluate/agent-benchmarking/run_humaneval.py` - -Related tutorials: -- Agents tutorial: `https://ragbits.deepsense.ai/stable/tutorials/agents/` -- RAG tutorial: `https://ragbits.deepsense.ai/stable/tutorials/rag/` -- Chat tutorial: `https://ragbits.deepsense.ai/stable/tutorials/chat/` - ---- - -### Appendix (copy-paste mocks) - -```bash - -# run the agent example (mock) -uv run python examples/agents/todo_tools_example.py -``` - - execution -> audit export or sth goes here> From 2b9b8fbfbc602963f0b4687a39fdbe65743553c0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Przemys=C5=82aw=20Kaleta?= Date: Mon, 13 Oct 2025 12:22:59 +0200 Subject: [PATCH 40/43] docs: installation & source fixes (#844) --- docs/tutorials/intro.md | 2 +- packages/ragbits-core/README.md | 2 ++ packages/ragbits-document-search/README.md | 8 +++++--- 3 files changed, 8 insertions(+), 4 deletions(-) diff --git a/docs/tutorials/intro.md b/docs/tutorials/intro.md index 31fb830dc..49cad6e14 100644 --- a/docs/tutorials/intro.md +++ b/docs/tutorials/intro.md @@ -2,7 +2,7 @@ Let's walk through a quick example of **basic question answering**. Specifically, let's build **a system for answering tech questions**, e.g. about Linux or iPhone apps. -Install the latest Ragbits via `pip install -U ragbits` and follow along. +Install the latest Ragbits via `pip install -U ragbits ragbits-agents` and follow along. ## Configuring the environment diff --git a/packages/ragbits-core/README.md b/packages/ragbits-core/README.md index 807dea7e7..dc467e413 100644 --- a/packages/ragbits-core/README.md +++ b/packages/ragbits-core/README.md @@ -11,6 +11,8 @@ pip install ragbits-core ## Quick Start ```python +import asyncio + from pydantic import BaseModel from ragbits.core.prompt import Prompt from ragbits.core.llms.litellm import LiteLLM diff --git a/packages/ragbits-document-search/README.md b/packages/ragbits-document-search/README.md index 70c1f7b47..a4f6ca2bb 100644 --- a/packages/ragbits-document-search/README.md +++ b/packages/ragbits-document-search/README.md @@ -12,7 +12,9 @@ pip install ragbits-document-search ## Quickstart ```python -from ragbits.core.embeddings.litellm import LiteLLMEmbedder +import asyncio + +from ragbits.core.embeddings import LiteLLMEmbedder from ragbits.core.vector_stores.in_memory import InMemoryVectorStore from ragbits.document_search import DocumentSearch @@ -21,7 +23,7 @@ async def main() -> None: Run the example. """ embedder = LiteLLMEmbedder( - model="text-embedding-3-small", + model_name="text-embedding-3-small", ) vector_store = InMemoryVectorStore(embedder=embedder) document_search = DocumentSearch( @@ -29,7 +31,7 @@ async def main() -> None: ) # Ingest all .txt files from the "biographies" directory - await document_search.ingest("file://biographies/*.txt") + await document_search.ingest("local://biographies/*.txt") # Search the documents for the query results = await document_search.search("When was Marie Curie-Sklodowska born?") From 9650a70c35d95e84345ec9bc12c7d6be8373de46 Mon Sep 17 00:00:00 2001 From: dazy-ds <135028324+dazy-ds@users.noreply.github.com> Date: Mon, 13 Oct 2025 14:20:59 +0200 Subject: [PATCH 41/43] feat: conversation summary (#840) --- examples/chat/chat.py | 2 + packages/ragbits-chat/CHANGELOG.md | 1 + .../src/ragbits/chat/interface/_interface.py | 16 ++ .../src/ragbits/chat/interface/summary.py | 82 +++++++++ .../src/ragbits/chat/interface/types.py | 7 + .../generate_typescript_from_json_schema.py | 1 + .../@ragbits/api-client/src/autogen.types.ts | 20 ++- .../ChatHistoryPlugin/ChatHistory.test.tsx | 122 ++++++++++++- .../ChatOptionsForm.test.tsx | 18 +- .../eventHandlers/eventHandlerRegistry.ts | 4 + .../eventHandlers/nonMessageHandlers.ts | 7 + .../core/stores/HistoryStore/historyStore.ts | 7 +- .../components/ChatHistory.tsx | 164 ++++++++++++++---- .../components/ChatOptionsForm.tsx | 5 +- typescript/ui/src/types/history.ts | 7 +- 15 files changed, 412 insertions(+), 51 deletions(-) create mode 100644 packages/ragbits-chat/src/ragbits/chat/interface/summary.py diff --git a/examples/chat/chat.py b/examples/chat/chat.py index 566de498c..5e81f72bf 100644 --- a/examples/chat/chat.py +++ b/examples/chat/chat.py @@ -28,6 +28,7 @@ from ragbits.chat.interface import ChatInterface from ragbits.chat.interface.forms import FeedbackConfig, UserSettings +from ragbits.chat.interface.summary import HybridSummaryGenerator from ragbits.chat.interface.types import ChatContext, ChatResponse, LiveUpdateType from ragbits.chat.interface.ui_customization import HeaderCustomization, PageMetaCustomization, UICustomization from ragbits.core.llms import LiteLLM @@ -93,6 +94,7 @@ class MyChat(ChatInterface): def __init__(self) -> None: self.llm = LiteLLM(model_name="gpt-4o-mini") + self.summary_generator = HybridSummaryGenerator(self.llm) async def chat( self, diff --git a/packages/ragbits-chat/CHANGELOG.md b/packages/ragbits-chat/CHANGELOG.md index 1c43ff86b..a46555766 100644 --- a/packages/ragbits-chat/CHANGELOG.md +++ b/packages/ragbits-chat/CHANGELOG.md @@ -1,6 +1,7 @@ # CHANGELOG ## Unreleased +- Add automatic topic extraction to be used as conversation title with ability to edit in the client side (#840) - Add todo list component to the UI, add support for todo events in API (#827) ## 1.3.0 (2025-09-11) diff --git a/packages/ragbits-chat/src/ragbits/chat/interface/_interface.py b/packages/ragbits-chat/src/ragbits/chat/interface/_interface.py index 7a68af9e9..ad0153212 100644 --- a/packages/ragbits-chat/src/ragbits/chat/interface/_interface.py +++ b/packages/ragbits-chat/src/ragbits/chat/interface/_interface.py @@ -10,6 +10,7 @@ from typing import Any from ragbits.agents.tools.todo import Task +from ragbits.chat.interface.summary import SummaryGenerator from ragbits.chat.interface.ui_customization import UICustomization from ragbits.core.audit.metrics import record_metric from ragbits.core.audit.metrics.base import MetricType @@ -85,6 +86,13 @@ async def wrapper( interface_class=self.__class__.__name__, ) + # Generate summary to serve as title for new conversations + try: + summary = await self.generate_conversation_summary(message, history, context) + yield ChatResponse(type=ChatResponseType.CONVERSATION_SUMMARY, content=summary) + except Exception: + logger.exception("Failed to generate conversation title") + responses = [] main_response = "" extra_responses = [] @@ -185,6 +193,7 @@ class ChatInterface(ABC): show_usage: bool = False ui_customization: UICustomization | None = None history_persistence: HistoryPersistenceStrategy | None = None + summary_generator: SummaryGenerator | None = None def __init_subclass__(cls, **kwargs: dict) -> None: """Automatically apply the with_chat_metadata decorator to the chat method in subclasses.""" @@ -371,3 +380,10 @@ async def save_feedback( ) logger.info(f"[{self.__class__.__name__}] Saving {feedback} for message {message_id} with payload {payload}") + + async def generate_conversation_summary(self, message: str, history: ChatFormat, context: ChatContext) -> str: + """Delegate to the configured summary generator.""" + if not self.summary_generator: + raise Exception("Tried to invoke `generate_conversation_summary`. No SummaryGenerator found.") + + return await self.summary_generator.generate(message, history, context) diff --git a/packages/ragbits-chat/src/ragbits/chat/interface/summary.py b/packages/ragbits-chat/src/ragbits/chat/interface/summary.py new file mode 100644 index 000000000..c27e3d513 --- /dev/null +++ b/packages/ragbits-chat/src/ragbits/chat/interface/summary.py @@ -0,0 +1,82 @@ +import asyncio +import logging +from abc import ABC, abstractmethod + +from ragbits.chat.interface.types import ChatContext +from ragbits.core.llms.base import LLM +from ragbits.core.prompt.base import ChatFormat + +logger = logging.getLogger(__name__) + + +class SummaryGenerator(ABC): + """Base class for summary generators.""" + + @abstractmethod + async def generate(self, message: str, history: ChatFormat, context: ChatContext) -> str: + """Generate a concise conversation title.""" + ... + + +class HeuristicSummaryGenerator(SummaryGenerator): + """Simple title generator using heuristics (no LLM).""" + + SIMPLE_MESSAGE_LENGTH = 2 + + def __init__(self, max_words: int = 6, fallback_title: str = "New chat"): + self.max_words = max_words + self.fallback_title = fallback_title + + async def generate(self, message: str, _history: ChatFormat, _context: ChatContext) -> str: + """Generate a concise conversation title using heuristic approach.""" + t = (message or "").strip() + if not t or len(t.split()) <= self.SIMPLE_MESSAGE_LENGTH: + return self.fallback_title + return " ".join(t.split()[: self.max_words]) + + +class LLMSummaryGenerator(SummaryGenerator): + """Generates a short conversation title using an LLM.""" + + DEFAULT_PROMPT = ( + "You are a concise title generator for conversation threads. " + "Given the user's first message, return a single short title (3–8 words) summarizing the topic. " + "If the message is just a greeting or otherwise generic, respond exactly with: New chat\n\n" + "User message:\n{message}\n\nTitle:" + ) + DEFAULT_TIMEOUT = 5 + + def __init__(self, llm: LLM, timeout: int = DEFAULT_TIMEOUT, prompt_template: str | None = None): + self.llm = llm + self.timeout = timeout + self.prompt_template = prompt_template or self.DEFAULT_PROMPT + + async def generate(self, message: str, _history: ChatFormat, _context: ChatContext) -> str: + """Generate a concise conversation title using LLM.""" + prompt = self.prompt_template.format(message=message) + try: + raw = await asyncio.wait_for(self.llm.generate(prompt), self.timeout) + title = str(raw).strip().splitlines()[0] + return title or "New chat" + except asyncio.TimeoutError: + logger.warning("LLM title generation timed out — using fallback.") + return "New chat" + except Exception: + logger.exception("Error generating title with LLM — using fallback.") + return "New chat" + + +class HybridSummaryGenerator(SummaryGenerator): + """Generates a short conversation title using an LLM with heuristic approach as a fallback.""" + + def __init__(self, llm: LLM): + self.llm_gen = LLMSummaryGenerator(llm) + self.heuristic = HeuristicSummaryGenerator() + + async def generate(self, message: str, history: ChatFormat, context: ChatContext) -> str: + """Generate summary using either LLM with heuristic approach as a fallback.""" + try: + title = await self.llm_gen.generate(message, history, context) + return title or await self.heuristic.generate(message, history, context) + except Exception: + return await self.heuristic.generate(message, history, context) diff --git a/packages/ragbits-chat/src/ragbits/chat/interface/types.py b/packages/ragbits-chat/src/ragbits/chat/interface/types.py index 75bfd4d01..6c465d5af 100644 --- a/packages/ragbits-chat/src/ragbits/chat/interface/types.py +++ b/packages/ragbits-chat/src/ragbits/chat/interface/types.py @@ -117,6 +117,7 @@ class ChatResponseType(str, Enum): STATE_UPDATE = "state_update" MESSAGE_ID = "message_id" CONVERSATION_ID = "conversation_id" + CONVERSATION_SUMMARY = "conversation_summary" LIVE_UPDATE = "live_update" FOLLOWUP_MESSAGES = "followup_messages" IMAGE = "image" @@ -234,6 +235,12 @@ def as_task(self) -> Task | None: """ return cast(Task, self.content) if self.type == ChatResponseType.TODO_ITEM else None + def as_conversation_summary(self) -> str | None: + """ + Return the content as string if this is an conversation summary response, else None + """ + return cast(str, self.content) if self.type == ChatResponseType.CONVERSATION_SUMMARY else None + class ChatMessageRequest(BaseModel): """Client-side chat request interface.""" diff --git a/scripts/generate_typescript_from_json_schema.py b/scripts/generate_typescript_from_json_schema.py index 317b7fce8..c1d7ec3b3 100644 --- a/scripts/generate_typescript_from_json_schema.py +++ b/scripts/generate_typescript_from_json_schema.py @@ -202,6 +202,7 @@ def _generate_chat_response_union_type() -> str: ("ClearMessageResponse", "clear_message", "never"), ("MessageUsageChatResponse", "usage", "Record"), ("TodoItemChatResonse", "todo_item", "Task"), + ("ConversationSummaryResponse", "conversation_summary", "string"), ] internal_response_interfaces = [ diff --git a/typescript/@ragbits/api-client/src/autogen.types.ts b/typescript/@ragbits/api-client/src/autogen.types.ts index 0240f250c..ebeeb03f8 100644 --- a/typescript/@ragbits/api-client/src/autogen.types.ts +++ b/typescript/@ragbits/api-client/src/autogen.types.ts @@ -17,6 +17,7 @@ export const ChatResponseType = { StateUpdate: 'state_update', MessageId: 'message_id', ConversationId: 'conversation_id', + ConversationSummary: 'conversation_summary', LiveUpdate: 'live_update', FollowupMessages: 'followup_messages', Image: 'image', @@ -66,6 +67,9 @@ export const TaskStatus = { Pending: 'pending', InProgress: 'in_progress', Completed: 'completed', + Failed: 'failed', + Cancelled: 'cancelled', + Retrying: 'retrying', } as const export type TaskStatus = TypeFrom @@ -191,10 +195,18 @@ export interface Task { /** * Task status options. */ - status: 'pending' | 'in_progress' | 'completed' + status: + | 'pending' + | 'in_progress' + | 'completed' + | 'failed' + | 'cancelled' + | 'retrying' order: number summary: string | null parent_id: string | null + full_response: string | null + dependencies: string[] } /** @@ -497,6 +509,11 @@ export interface TodoItemChatResonse { content: Task } +export interface ConversationSummaryResponse { + type: 'conversation_summary' + content: string +} + export interface ChunkedChatResponse { type: 'chunked_content' content: ChunkedContent @@ -517,3 +534,4 @@ export type ChatResponse = | ClearMessageResponse | MessageUsageChatResponse | TodoItemChatResonse + | ConversationSummaryResponse diff --git a/typescript/ui/__tests__/unit/plugin/ChatHistoryPlugin/ChatHistory.test.tsx b/typescript/ui/__tests__/unit/plugin/ChatHistoryPlugin/ChatHistory.test.tsx index 413b91264..a2ecfad24 100644 --- a/typescript/ui/__tests__/unit/plugin/ChatHistoryPlugin/ChatHistory.test.tsx +++ b/typescript/ui/__tests__/unit/plugin/ChatHistoryPlugin/ChatHistory.test.tsx @@ -1,4 +1,4 @@ -import { render, screen } from "@testing-library/react"; +import { render, screen, waitFor } from "@testing-library/react"; import { describe, it, expect, vi, Mock } from "vitest"; vi.mock("../../../../src/core/stores/HistoryStore/useHistoryStore", () => { @@ -7,15 +7,18 @@ vi.mock("../../../../src/core/stores/HistoryStore/useHistoryStore", () => { }; }); +const selectConversationMock = vi.fn(); +const deleteConversationMock = vi.fn(); +const newConversationMock = vi.fn(); +const setConversationPropertiesMock = vi.fn(); + vi.mock("../../../../src/core/stores/HistoryStore/selectors", () => { - const selectConversationMock = vi.fn(); - const deleteConversationMock = vi.fn(); - const newConversationMock = vi.fn(); return { useHistoryActions: () => ({ selectConversation: selectConversationMock, deleteConversation: deleteConversationMock, newConversation: newConversationMock, + setConversationProperties: setConversationPropertiesMock, }), }; }); @@ -98,7 +101,7 @@ describe("ChatHistory", () => { expect(selectedConversation).toHaveAttribute("data-active", "true"); }); - it("renders delete buttons", () => { + it("renders dropdown buttons", () => { const mockConversationsKeys = Object.keys(MOCK_CONVERSATIONS); mockStore(null); render(); @@ -110,7 +113,7 @@ describe("ChatHistory", () => { console.log(`delete-conversation-${key}`); expect( - screen.getByTestId(`delete-conversation-${key}`), + screen.getByTestId(`dropdown-conversation-${key}`), ).toBeInTheDocument(); }); }); @@ -136,12 +139,16 @@ describe("ChatHistory", () => { const selectedKey = Object.keys(MOCK_CONVERSATIONS)[0]; mockStore(null); render(); + const user = userEvent.setup(); + const dropdownButton = screen.getByTestId( + `dropdown-conversation-${selectedKey}`, + ); + await user.click(dropdownButton); const deleteButton = screen.getByTestId( `delete-conversation-${selectedKey}`, ); expect(deleteButton).toBeInTheDocument(); - const user = userEvent.setup(); await user.click(deleteButton); const deleteMock = useHistoryActions().deleteConversation; @@ -159,4 +166,105 @@ describe("ChatHistory", () => { const newConversationMock = useHistoryActions().newConversation; expect(newConversationMock).toHaveBeenCalled(); }); + + it("starts editing when Edit is clicked (input appears and is focused)", async () => { + mockStore(null); + render(); + + const key = Object.keys(MOCK_CONVERSATIONS)[0]; + const user = userEvent.setup(); + + const dropdownButton = screen.getByTestId(`dropdown-conversation-${key}`); + await user.click(dropdownButton); + + const editButton = screen.getByTestId(`edit-conversation-${key}`); + await user.click(editButton); + + const input = await screen.findByDisplayValue( + MOCK_CONVERSATIONS[key].conversationId, + ); + expect(input).toBeInTheDocument(); + + await waitFor(() => { + expect(document.activeElement).toBe(input); + }); + }); + + it("saves edited value on Enter and calls setConversationProperties", async () => { + mockStore(null); + render(); + + const key = Object.keys(MOCK_CONVERSATIONS)[0]; + const user = userEvent.setup(); + + const dropdownButton = screen.getByTestId(`dropdown-conversation-${key}`); + await user.click(dropdownButton); + + const editButton = screen.getByTestId(`edit-conversation-${key}`); + await user.click(editButton); + + const input = await screen.findByDisplayValue( + MOCK_CONVERSATIONS[key].conversationId, + ); + expect(input).toBeInTheDocument(); + + await waitFor(() => { + expect(document.activeElement).toBe(input); + }); + }); + + it("does NOT call setConversationProperties for whitespace-only input", async () => { + mockStore(null); + render(); + + const key = Object.keys(MOCK_CONVERSATIONS)[0]; + const user = userEvent.setup(); + + await user.click(screen.getByTestId(`dropdown-conversation-${key}`)); + await user.click(screen.getByTestId(`edit-conversation-${key}`)); + + const input = await screen.findByDisplayValue( + MOCK_CONVERSATIONS[key].conversationId, + ); + + await user.clear(input); + await user.type(input, " "); + await user.keyboard("{Enter}"); + + await waitFor(() => { + expect(setConversationPropertiesMock).not.toHaveBeenCalled(); + }); + + await waitFor(() => { + expect( + screen.queryByDisplayValue(MOCK_CONVERSATIONS[key].conversationId), + ).not.toBeInTheDocument(); + }); + }); + + it("cancels edit when Escape is pressed and does not call setConversationProperties", async () => { + mockStore(null); + render(); + + const key = Object.keys(MOCK_CONVERSATIONS)[0]; + const user = userEvent.setup(); + + await user.click(screen.getByTestId(`dropdown-conversation-${key}`)); + await user.click(screen.getByTestId(`edit-conversation-${key}`)); + + const input = await screen.findByDisplayValue( + MOCK_CONVERSATIONS[key].conversationId, + ); + + await user.type(input, "temp"); + await user.type(input, "{Escape}"); + + await waitFor(() => { + expect(setConversationPropertiesMock).not.toHaveBeenCalled(); + }); + + await waitFor(() => { + expect(screen.queryByDisplayValue("temp")).not.toBeInTheDocument(); + }); + }); }); diff --git a/typescript/ui/__tests__/unit/plugin/ChatOptionsPlugin/ChatOptionsForm.test.tsx b/typescript/ui/__tests__/unit/plugin/ChatOptionsPlugin/ChatOptionsForm.test.tsx index d4ecd79e5..1474e139c 100644 --- a/typescript/ui/__tests__/unit/plugin/ChatOptionsPlugin/ChatOptionsForm.test.tsx +++ b/typescript/ui/__tests__/unit/plugin/ChatOptionsPlugin/ChatOptionsForm.test.tsx @@ -8,7 +8,7 @@ import { useConfigContext } from "../../../../src/core/contexts/ConfigContext/us vi.mock("../../../../src/core/stores/HistoryStore/selectors", () => ({ useConversationProperty: vi.fn(() => ({})), useHistoryActions: vi.fn(() => ({ - setChatOptions: vi.fn(), + setConversationProperties: vi.fn(), initializeChatOptions: vi.fn(), })), })); @@ -40,11 +40,11 @@ vi.mock("@rjsf/utils/lib/schema/getDefaultFormState", () => ({ getDefaultBasedOnSchemaType: vi.fn(() => ({ example: "default" })), })); -const setChatOptionsMock = vi.fn(); +const setConversationProperitesMock = vi.fn(); const initializeChatOptionsMock = vi.fn(); function mockActions() { (useHistoryActions as Mock).mockReturnValue({ - setChatOptions: setChatOptionsMock, + setConversationProperties: setConversationProperitesMock, initializeChatOptions: initializeChatOptionsMock, }); } @@ -80,7 +80,12 @@ describe("ChatOptionsForm", () => { await user.click(screen.getByTestId("chat-options-submit")); await waitFor(() => { - expect(setChatOptionsMock).toHaveBeenCalledWith({}); + expect(setConversationProperitesMock).toHaveBeenCalledWith( + expect.anything(), + { + chatOptions: {}, + }, + ); }); }); @@ -95,7 +100,10 @@ describe("ChatOptionsForm", () => { await user.click(restoreBtn); await waitFor(() => { - expect(setChatOptionsMock).toHaveBeenCalledWith({ example: "default" }); + expect(setConversationProperitesMock).toHaveBeenCalledWith( + expect.anything(), + { chatOptions: { example: "default" } }, + ); }); }); diff --git a/typescript/ui/src/core/stores/HistoryStore/eventHandlers/eventHandlerRegistry.ts b/typescript/ui/src/core/stores/HistoryStore/eventHandlers/eventHandlerRegistry.ts index 7e0d456e9..b52dcb37f 100644 --- a/typescript/ui/src/core/stores/HistoryStore/eventHandlers/eventHandlerRegistry.ts +++ b/typescript/ui/src/core/stores/HistoryStore/eventHandlers/eventHandlerRegistry.ts @@ -3,6 +3,7 @@ import { Conversation, HistoryStore } from "../../../../types/history"; import { handleAfterConversationId, handleConversationId, + handleConversationSummary, handleFollowupMessages, handleStateUpdate, } from "./nonMessageHandlers"; @@ -105,3 +106,6 @@ ChatHandlerRegistry.register(ChatResponseType.Usage, { ChatHandlerRegistry.register(ChatResponseType.TodoItem, { handle: handleTodoItem, }); +ChatHandlerRegistry.register(ChatResponseType.ConversationSummary, { + handle: handleConversationSummary, +}); diff --git a/typescript/ui/src/core/stores/HistoryStore/eventHandlers/nonMessageHandlers.ts b/typescript/ui/src/core/stores/HistoryStore/eventHandlers/nonMessageHandlers.ts index 3ba45f774..1b2b7c99a 100644 --- a/typescript/ui/src/core/stores/HistoryStore/eventHandlers/nonMessageHandlers.ts +++ b/typescript/ui/src/core/stores/HistoryStore/eventHandlers/nonMessageHandlers.ts @@ -1,5 +1,6 @@ import { ConversationIdChatResponse, + ConversationSummaryResponse, FollowupMessagesChatResponse, StateUpdateChatResponse, } from "@ragbits/api-client-react"; @@ -45,3 +46,9 @@ export const handleFollowupMessages: PrimaryHandler< > = ({ content }, draft) => { draft.followupMessages = content; }; + +export const handleConversationSummary: PrimaryHandler< + ConversationSummaryResponse +> = ({ content }, draft) => { + draft.summary = content; +}; diff --git a/typescript/ui/src/core/stores/HistoryStore/historyStore.ts b/typescript/ui/src/core/stores/HistoryStore/historyStore.ts index 67bbb8059..4d6024186 100644 --- a/typescript/ui/src/core/stores/HistoryStore/historyStore.ts +++ b/typescript/ui/src/core/stores/HistoryStore/historyStore.ts @@ -278,11 +278,10 @@ export const createHistoryStore = immer((set, get) => ({ }), ); }, - setChatOptions: (options) => { - const { currentConversation } = get(); + setConversationProperties: (conversationKey, properties) => { set( - updateConversation(currentConversation, (draft) => { - draft.chatOptions = options; + updateConversation(conversationKey, (draft) => { + Object.assign(draft, properties); }), ); }, diff --git a/typescript/ui/src/plugins/ChatHistoryPlugin/components/ChatHistory.tsx b/typescript/ui/src/plugins/ChatHistoryPlugin/components/ChatHistory.tsx index aa4a0fbd5..0d82c184b 100644 --- a/typescript/ui/src/plugins/ChatHistoryPlugin/components/ChatHistory.tsx +++ b/typescript/ui/src/plugins/ChatHistoryPlugin/components/ChatHistory.tsx @@ -1,7 +1,14 @@ -import { Button } from "@heroui/react"; +import { + Button, + Dropdown, + DropdownItem, + DropdownMenu, + DropdownTrigger, + Input, +} from "@heroui/react"; import { Icon } from "@iconify/react"; import { motion, AnimatePresence } from "framer-motion"; -import { useState } from "react"; +import { useRef, useState } from "react"; import DelayedTooltip from "../../../core/components/DelayedTooltip"; import { useHistoryActions } from "../../../core/stores/HistoryStore/selectors"; import { useHistoryStore } from "../../../core/stores/HistoryStore/useHistoryStore"; @@ -9,19 +16,62 @@ import { isTemporaryConversation } from "../../../core/stores/HistoryStore/histo import { useNavigate } from "react-router"; import { getConversationRoute } from "../utils"; import { useShallow } from "zustand/shallow"; +import { zip } from "lodash"; export default function ChatHistory() { - const { selectConversation, deleteConversation, newConversation } = - useHistoryActions(); + const { + selectConversation, + deleteConversation, + newConversation, + setConversationProperties, + } = useHistoryActions(); const navigate = useNavigate(); const conversations = useHistoryStore( useShallow((s) => Object.keys(s.conversations).reverse()), ); + const summaries = useHistoryStore( + useShallow((s) => + Object.values(s.conversations) + .reverse() + .map((entry) => entry.summary), + ), + ); const currentConversation = useHistoryStore((s) => s.currentConversation); const [isCollapsed, setCollapsed] = useState(false); + const [editingKey, setEditingKey] = useState(null); + const [editValue, setEditValue] = useState(""); + const [ignoreBlur, setIgnoreBlur] = useState(false); + const inputRef = useRef(null); const collapseButtonTitle = isCollapsed ? "Open sidebar" : "Close sidebar"; const newChatIcon = ; + const handleStartEdit = (conversationKey: string, currentSummary: string) => { + setEditingKey(conversationKey); + setEditValue(currentSummary ?? ""); + setIgnoreBlur(true); + setTimeout(() => { + inputRef.current?.focus?.(); + setTimeout(() => setIgnoreBlur(false), 120); + }, 0); + }; + + const handleSaveEdit = (conversationKey: string) => { + if (editingKey !== conversationKey) return; + const trimmed = (editValue || "").trim(); + if (trimmed) { + setConversationProperties(conversationKey, { summary: trimmed }); + } + setEditingKey(null); + setEditValue(""); + setIgnoreBlur(false); + }; + + const handleCancelEdit = () => { + setEditingKey(null); + setEditValue(""); + setIgnoreBlur(false); + }; + const handleNewConversation = () => { const conversationId = newConversation(); navigate(getConversationRoute(conversationId)); @@ -115,42 +165,94 @@ export default function ChatHistory() { width: 0, }} > - {conversations.map((conversation) => { - if (isTemporaryConversation(conversation)) { + {zip(conversations, summaries).map(([conversation, summary]) => { + if (!conversation || isTemporaryConversation(conversation)) { return null; } const isSelected = conversation === currentConversation; + const isEdited = conversation === editingKey; const variant = isSelected ? "solid" : "light"; return ( -
- - +
+ {isEdited ? ( + setEditValue(e.target.value)} + onBlur={() => { + if (ignoreBlur) return; + handleSaveEdit(conversation); + }} + onKeyDown={(e) => { + if (e.key === "Enter") handleSaveEdit(conversation); + if (e.key === "Escape") handleCancelEdit(); + }} + className="flex-1" + data-testid={`input-conversation-${conversation}`} + /> + ) : ( - + )} + + + + + + + } + onPress={() => + handleStartEdit(conversation, summary ?? conversation) + } + data-testid={`edit-conversation-${conversation}`} + > + Edit + + } + onPress={() => deleteConversation(conversation)} + data-testid={`delete-conversation-${conversation}`} + > + Delete conversation + + +
); })} diff --git a/typescript/ui/src/plugins/ChatOptionsPlugin/components/ChatOptionsForm.tsx b/typescript/ui/src/plugins/ChatOptionsPlugin/components/ChatOptionsForm.tsx index bac0a531d..cad006d2a 100644 --- a/typescript/ui/src/plugins/ChatOptionsPlugin/components/ChatOptionsForm.tsx +++ b/typescript/ui/src/plugins/ChatOptionsPlugin/components/ChatOptionsForm.tsx @@ -31,7 +31,8 @@ export default function ChatOptionsForm() { const chatOptions = useConversationProperty((s) => s.chatOptions); // Needed to solve flicker to default settings when the modal is closing const pendingSettingsRef = useRef | null>(null); - const { setChatOptions, initializeChatOptions } = useHistoryActions(); + const { setConversationProperties, initializeChatOptions } = + useHistoryActions(); const currentConversation = useHistoryStore((s) => s.currentConversation); const { config: { user_settings: userSettings }, @@ -82,7 +83,7 @@ export default function ChatOptionsForm() { } const settings = pendingSettingsRef.current; - setChatOptions(settings); + setConversationProperties(currentConversation, { chatOptions: settings }); ensureSyncWithStorage(settings); pendingSettingsRef.current = null; }; diff --git a/typescript/ui/src/types/history.ts b/typescript/ui/src/types/history.ts index 74205eb36..249264577 100644 --- a/typescript/ui/src/types/history.ts +++ b/typescript/ui/src/types/history.ts @@ -38,7 +38,9 @@ export interface Conversation { chatOptions: Record | undefined; isLoading: boolean; abortController: AbortController | null; + summary?: string; } + export interface HistoryStore { conversations: Record; currentConversation: string; @@ -61,7 +63,10 @@ export interface HistoryStore { extensions: Record, ) => void; initializeChatOptions: (defaults: Record) => void; - setChatOptions: (options: Record) => void; + setConversationProperties: ( + conversationKey: string, + properties: Partial, + ) => void; }; primitives: { From 7fa44c52817e21947d9b2db2605031d461903f52 Mon Sep 17 00:00:00 2001 From: ds-ragbits-robot Date: Mon, 13 Oct 2025 12:21:45 +0000 Subject: [PATCH 42/43] Automated UI build --- ...uard-Cg314rC1.js => AuthGuard-CLPypBq0.js} | 2 +- .../ui-build/assets/ChatHistory-C9npR0N7.js | 2 + .../ui-build/assets/ChatHistory-Dzy0EI1-.js | 1 - .../assets/ChatOptionsForm-BmoJGYUy.js | 1 + .../assets/ChatOptionsForm-CUT15Ecj.js | 1 - .../ui-build/assets/FeedbackForm-Cav2SsCB.js | 1 + .../ui-build/assets/FeedbackForm-Cuu7ROp3.js | 1 - .../{Login-xlop2v42.js => Login-Bcduy8Fr.js} | 2 +- ...n-Cp3E_g1o.js => LogoutButton-CgB7xh9T.js} | 2 +- ...on-DpNGX0tU.js => ShareButton-B1XlPNhP.js} | 2 +- .../ui-build/assets/UsageButton-I3vvJAZH.js | 1 - .../ui-build/assets/UsageButton-dxos0384.js | 1 + ...tore-Ur4ZGows.js => authStore-BmdbjFC4.js} | 2 +- .../assets/chunk-IGSAU2ZA-Beuyhkep.js | 1 + .../assets/chunk-IGSAU2ZA-RYoue1Xd.js | 1 - .../assets/chunk-SSA7SXE4-CTW6lkmA.js | 1 + .../assets/chunk-SSA7SXE4-CpT2ku66.js | 1 - .../chat/ui-build/assets/index-CTrBaHsz.js | 32 --------- .../chat/ui-build/assets/index-CYQIHhg3.js | 1 - .../chat/ui-build/assets/index-DHfXqRui.css | 1 - .../chat/ui-build/assets/index-DYyF6Jyf.js | 1 + .../{index-BTypXP0X.js => index-DaG4uPnK.js} | 66 +++++++++---------- .../chat/ui-build/assets/index-DmyaiLHy.js | 32 +++++++++ .../chat/ui-build/assets/index-IAfGflqy.css | 1 + .../chat/ui-build/assets/index-nfbmdcVN.js | 4 -- .../chat/ui-build/assets/index-qUEoadOF.js | 4 ++ .../assets/useMenuTriggerState-BKJ8iWug.js | 1 + .../assets/useSelectableItem-ChcXAf8h.js | 1 + .../src/ragbits/chat/ui-build/index.html | 4 +- 29 files changed, 87 insertions(+), 84 deletions(-) rename packages/ragbits-chat/src/ragbits/chat/ui-build/assets/{AuthGuard-Cg314rC1.js => AuthGuard-CLPypBq0.js} (56%) create mode 100644 packages/ragbits-chat/src/ragbits/chat/ui-build/assets/ChatHistory-C9npR0N7.js delete mode 100644 packages/ragbits-chat/src/ragbits/chat/ui-build/assets/ChatHistory-Dzy0EI1-.js create mode 100644 packages/ragbits-chat/src/ragbits/chat/ui-build/assets/ChatOptionsForm-BmoJGYUy.js delete mode 100644 packages/ragbits-chat/src/ragbits/chat/ui-build/assets/ChatOptionsForm-CUT15Ecj.js create mode 100644 packages/ragbits-chat/src/ragbits/chat/ui-build/assets/FeedbackForm-Cav2SsCB.js delete mode 100644 packages/ragbits-chat/src/ragbits/chat/ui-build/assets/FeedbackForm-Cuu7ROp3.js rename packages/ragbits-chat/src/ragbits/chat/ui-build/assets/{Login-xlop2v42.js => Login-Bcduy8Fr.js} (79%) rename packages/ragbits-chat/src/ragbits/chat/ui-build/assets/{LogoutButton-Cp3E_g1o.js => LogoutButton-CgB7xh9T.js} (81%) rename packages/ragbits-chat/src/ragbits/chat/ui-build/assets/{ShareButton-DpNGX0tU.js => ShareButton-B1XlPNhP.js} (80%) delete mode 100644 packages/ragbits-chat/src/ragbits/chat/ui-build/assets/UsageButton-I3vvJAZH.js create mode 100644 packages/ragbits-chat/src/ragbits/chat/ui-build/assets/UsageButton-dxos0384.js rename packages/ragbits-chat/src/ragbits/chat/ui-build/assets/{authStore-Ur4ZGows.js => authStore-BmdbjFC4.js} (74%) create mode 100644 packages/ragbits-chat/src/ragbits/chat/ui-build/assets/chunk-IGSAU2ZA-Beuyhkep.js delete mode 100644 packages/ragbits-chat/src/ragbits/chat/ui-build/assets/chunk-IGSAU2ZA-RYoue1Xd.js create mode 100644 packages/ragbits-chat/src/ragbits/chat/ui-build/assets/chunk-SSA7SXE4-CTW6lkmA.js delete mode 100644 packages/ragbits-chat/src/ragbits/chat/ui-build/assets/chunk-SSA7SXE4-CpT2ku66.js delete mode 100644 packages/ragbits-chat/src/ragbits/chat/ui-build/assets/index-CTrBaHsz.js delete mode 100644 packages/ragbits-chat/src/ragbits/chat/ui-build/assets/index-CYQIHhg3.js delete mode 100644 packages/ragbits-chat/src/ragbits/chat/ui-build/assets/index-DHfXqRui.css create mode 100644 packages/ragbits-chat/src/ragbits/chat/ui-build/assets/index-DYyF6Jyf.js rename packages/ragbits-chat/src/ragbits/chat/ui-build/assets/{index-BTypXP0X.js => index-DaG4uPnK.js} (86%) create mode 100644 packages/ragbits-chat/src/ragbits/chat/ui-build/assets/index-DmyaiLHy.js create mode 100644 packages/ragbits-chat/src/ragbits/chat/ui-build/assets/index-IAfGflqy.css delete mode 100644 packages/ragbits-chat/src/ragbits/chat/ui-build/assets/index-nfbmdcVN.js create mode 100644 packages/ragbits-chat/src/ragbits/chat/ui-build/assets/index-qUEoadOF.js create mode 100644 packages/ragbits-chat/src/ragbits/chat/ui-build/assets/useMenuTriggerState-BKJ8iWug.js create mode 100644 packages/ragbits-chat/src/ragbits/chat/ui-build/assets/useSelectableItem-ChcXAf8h.js diff --git a/packages/ragbits-chat/src/ragbits/chat/ui-build/assets/AuthGuard-Cg314rC1.js b/packages/ragbits-chat/src/ragbits/chat/ui-build/assets/AuthGuard-CLPypBq0.js similarity index 56% rename from packages/ragbits-chat/src/ragbits/chat/ui-build/assets/AuthGuard-Cg314rC1.js rename to packages/ragbits-chat/src/ragbits/chat/ui-build/assets/AuthGuard-CLPypBq0.js index 42af54d7e..8ba84a9b9 100644 --- a/packages/ragbits-chat/src/ragbits/chat/ui-build/assets/AuthGuard-Cg314rC1.js +++ b/packages/ragbits-chat/src/ragbits/chat/ui-build/assets/AuthGuard-CLPypBq0.js @@ -1 +1 @@ -import{r as a,j as s,aP as c,h as x,aK as g,bj as m,bk as p,bl as j,bm as k,bn as v}from"./index-BTypXP0X.js";import{a as r}from"./authStore-Ur4ZGows.js";const b=a.createContext(null);function A({children:o}){const[n]=a.useState(()=>r);return s.jsx(b.Provider,{value:n,children:o})}function C(){const{token:o,tokenExpiration:n,logout:l}=c(r,e=>e),i=x(e=>e.isLoading),u=g(),d=a.useRef(i);a.useEffect(()=>{d.current=i},[i]);const t=a.useCallback(()=>{const e=()=>{d.current?setTimeout(e,500):(l(),u("/login"))};e()},[l,u]);return a.useEffect(()=>{if(!o||!n)return;const e=Date.now(),h=n-e;if(h<=0){t();return}const f=setTimeout(()=>{t()},h);return()=>clearTimeout(f)},[o,n,t]),null}function R({children:o}){const n=m(),l=c(r,t=>t.isAuthenticated),i=c(r,t=>t.hasHydrated),u=c(r,t=>t.token?.access_token),d=c(r,t=>t.logout);return i?n.pathname==="/login"?o:l&&u?s.jsx(A,{children:s.jsxs(j,{baseUrl:k,auth:{getToken:()=>u,onUnauthorized:d},children:[o,s.jsx(C,{})]})}):s.jsx(v,{to:"/login",replace:!0}):s.jsx(p,{})}export{R as default}; +import{r as a,j as s,aW as c,h as x,aE as g,bp as m,bq as p,br as v,bs as b,bt as j}from"./index-DaG4uPnK.js";import{a as r}from"./authStore-BmdbjFC4.js";const k=a.createContext(null);function A({children:o}){const[n]=a.useState(()=>r);return s.jsx(k.Provider,{value:n,children:o})}function C(){const{token:o,tokenExpiration:n,logout:l}=c(r,e=>e),i=x(e=>e.isLoading),u=g(),d=a.useRef(i);a.useEffect(()=>{d.current=i},[i]);const t=a.useCallback(()=>{const e=()=>{d.current?setTimeout(e,500):(l(),u("/login"))};e()},[l,u]);return a.useEffect(()=>{if(!o||!n)return;const e=Date.now(),h=n-e;if(h<=0){t();return}const f=setTimeout(()=>{t()},h);return()=>clearTimeout(f)},[o,n,t]),null}function S({children:o}){const n=m(),l=c(r,t=>t.isAuthenticated),i=c(r,t=>t.hasHydrated),u=c(r,t=>t.token?.access_token),d=c(r,t=>t.logout);return i?n.pathname==="/login"?o:l&&u?s.jsx(A,{children:s.jsxs(v,{baseUrl:b,auth:{getToken:()=>u,onUnauthorized:d},children:[o,s.jsx(C,{})]})}):s.jsx(j,{to:"/login",replace:!0}):s.jsx(p,{})}export{S as default}; diff --git a/packages/ragbits-chat/src/ragbits/chat/ui-build/assets/ChatHistory-C9npR0N7.js b/packages/ragbits-chat/src/ragbits/chat/ui-build/assets/ChatHistory-C9npR0N7.js new file mode 100644 index 000000000..a38fed748 --- /dev/null +++ b/packages/ragbits-chat/src/ragbits/chat/ui-build/assets/ChatHistory-C9npR0N7.js @@ -0,0 +1,2 @@ +const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/index-DYyF6Jyf.js","assets/index-DaG4uPnK.js","assets/index-IAfGflqy.css"])))=>i.map(i=>d[i]); +import{r as P,t as ae,k as Xe,Z as W,ax as Me,$ as Ze,j as t,q as me,L as xe,_ as Ye,n as ye,T as Pe,s as et,v as R,V as tt,d as X,l as se,aq as Ie,o as ot,H as ke,a9 as rt,J as Ne,ay as at,ac as pe,U as st,X as _e,af as he,az as nt,aA as lt,ag as it,K as dt,O as be,Q as ct,W as ut,a0 as pt,ah as ft,a2 as K,a3 as Ae,ai as vt,R as ht,aB as bt,a8 as gt,aC as mt,aD as xt,a5 as yt,a as Pt,aE as Ct,i as fe,aF as Ce,aG as ve,D as we,I as Q,as as wt,aH as $t,aI as $e}from"./index-DaG4uPnK.js";import{u as jt,b as St,c as je,d as Dt,e as Mt,m as It,$ as kt,a as Nt}from"./useMenuTriggerState-BKJ8iWug.js";import{$ as _t}from"./useSelectableItem-ChcXAf8h.js";import{i as At}from"./chunk-SSA7SXE4-CTW6lkmA.js";var Ot=(e,r)=>{var n;let s=[];const a=(n=P.Children.map(e,d=>P.isValidElement(d)&&d.type===r?(s.push(d),null):d))==null?void 0:n.filter(Boolean),u=s.length>=0?s:void 0;return[a,u]},Ft=ae({base:["w-full","p-1","min-w-[200px]"]});ae({slots:{base:["flex","group","gap-2","items-center","justify-between","relative","px-2","py-1.5","w-full","h-full","box-border","rounded-small","outline-hidden","cursor-pointer","tap-highlight-transparent","data-[pressed=true]:opacity-70",...Xe,"data-[focus-visible=true]:dark:ring-offset-background-content1"],wrapper:"w-full flex flex-col items-start justify-center",title:"flex-1 text-small font-normal truncate",description:["w-full","text-tiny","text-foreground-500","group-hover:text-current"],selectedIcon:["text-inherit","w-3","h-3","shrink-0"],shortcut:["px-1","py-0.5","rounded-sm","font-sans","text-foreground-500","text-tiny","border-small","border-default-300","group-hover:border-current"]},variants:{variant:{solid:{base:""},bordered:{base:"border-medium border-transparent bg-transparent"},light:{base:"bg-transparent"},faded:{base:"border-small border-transparent hover:border-default data-[hover=true]:bg-default-100"},flat:{base:""},shadow:{base:"data-[hover=true]:shadow-lg"}},color:{default:{},primary:{},secondary:{},success:{},warning:{},danger:{}},isDisabled:{true:{base:"opacity-disabled pointer-events-none"}},disableAnimation:{true:{},false:{}}},defaultVariants:{variant:"solid",color:"default"},compoundVariants:[{variant:"solid",color:"default",class:{base:"data-[hover=true]:bg-default data-[hover=true]:text-default-foreground"}},{variant:"solid",color:"primary",class:{base:"data-[hover=true]:bg-primary data-[hover=true]:text-primary-foreground"}},{variant:"solid",color:"secondary",class:{base:"data-[hover=true]:bg-secondary data-[hover=true]:text-secondary-foreground"}},{variant:"solid",color:"success",class:{base:"data-[hover=true]:bg-success data-[hover=true]:text-success-foreground"}},{variant:"solid",color:"warning",class:{base:"data-[hover=true]:bg-warning data-[hover=true]:text-warning-foreground"}},{variant:"solid",color:"danger",class:{base:"data-[hover=true]:bg-danger data-[hover=true]:text-danger-foreground"}},{variant:"shadow",color:"default",class:{base:"data-[hover=true]:shadow-default/50 data-[hover=true]:bg-default data-[hover=true]:text-default-foreground"}},{variant:"shadow",color:"primary",class:{base:"data-[hover=true]:shadow-primary/30 data-[hover=true]:bg-primary data-[hover=true]:text-primary-foreground"}},{variant:"shadow",color:"secondary",class:{base:"data-[hover=true]:shadow-secondary/30 data-[hover=true]:bg-secondary data-[hover=true]:text-secondary-foreground"}},{variant:"shadow",color:"success",class:{base:"data-[hover=true]:shadow-success/30 data-[hover=true]:bg-success data-[hover=true]:text-success-foreground"}},{variant:"shadow",color:"warning",class:{base:"data-[hover=true]:shadow-warning/30 data-[hover=true]:bg-warning data-[hover=true]:text-warning-foreground"}},{variant:"shadow",color:"danger",class:{base:"data-[hover=true]:shadow-danger/30 data-[hover=true]:bg-danger data-[hover=true]:text-danger-foreground"}},{variant:"bordered",color:"default",class:{base:"data-[hover=true]:border-default"}},{variant:"bordered",color:"primary",class:{base:"data-[hover=true]:border-primary data-[hover=true]:text-primary"}},{variant:"bordered",color:"secondary",class:{base:"data-[hover=true]:border-secondary data-[hover=true]:text-secondary"}},{variant:"bordered",color:"success",class:{base:"data-[hover=true]:border-success data-[hover=true]:text-success"}},{variant:"bordered",color:"warning",class:{base:"data-[hover=true]:border-warning data-[hover=true]:text-warning"}},{variant:"bordered",color:"danger",class:{base:"data-[hover=true]:border-danger data-[hover=true]:text-danger"}},{variant:"flat",color:"default",class:{base:"data-[hover=true]:bg-default/40 data-[hover=true]:text-default-foreground"}},{variant:"flat",color:"primary",class:{base:"data-[hover=true]:bg-primary/20 data-[hover=true]:text-primary"}},{variant:"flat",color:"secondary",class:{base:"data-[hover=true]:bg-secondary/20 data-[hover=true]:text-secondary"}},{variant:"flat",color:"success",class:{base:"data-[hover=true]:bg-success/20 data-[hover=true]:text-success "}},{variant:"flat",color:"warning",class:{base:"data-[hover=true]:bg-warning/20 data-[hover=true]:text-warning"}},{variant:"flat",color:"danger",class:{base:"data-[hover=true]:bg-danger/20 data-[hover=true]:text-danger"}},{variant:"faded",color:"default",class:{base:"data-[hover=true]:text-default-foreground"}},{variant:"faded",color:"primary",class:{base:"data-[hover=true]:text-primary"}},{variant:"faded",color:"secondary",class:{base:"data-[hover=true]:text-secondary"}},{variant:"faded",color:"success",class:{base:"data-[hover=true]:text-success"}},{variant:"faded",color:"warning",class:{base:"data-[hover=true]:text-warning"}},{variant:"faded",color:"danger",class:{base:"data-[hover=true]:text-danger"}},{variant:"light",color:"default",class:{base:"data-[hover=true]:text-default-500"}},{variant:"light",color:"primary",class:{base:"data-[hover=true]:text-primary"}},{variant:"light",color:"secondary",class:{base:"data-[hover=true]:text-secondary"}},{variant:"light",color:"success",class:{base:"data-[hover=true]:text-success"}},{variant:"light",color:"warning",class:{base:"data-[hover=true]:text-warning"}},{variant:"light",color:"danger",class:{base:"data-[hover=true]:text-danger"}}]});ae({slots:{base:"relative mb-2",heading:"pl-1 text-tiny text-foreground-500",group:"data-[has-title=true]:pt-1",divider:"mt-2"}});ae({base:"w-full flex flex-col gap-0.5 p-1"});var Et=(e,r)=>{if(!e&&!r)return{};const n=new Set([...Object.keys(e||{}),...Object.keys(r||{})]);return Array.from(n).reduce((s,a)=>({...s,[a]:W(e?.[a],r?.[a])}),{})},[Tt,Oe]=Me({name:"PopoverContext",errorMessage:"usePopoverContext: `context` is undefined. Seems you forgot to wrap all popover components within ``"}),Se=()=>Ye(()=>import("./index-DYyF6Jyf.js"),__vite__mapDeps([0,1,2])).then(e=>e.default),Fe=e=>{const{as:r,children:n,className:s,...a}=e,{Component:u,placement:d,backdrop:h,motionProps:l,disableAnimation:c,getPopoverProps:p,getDialogProps:w,getBackdropProps:b,getContentProps:x,isNonModal:I,onClose:j}=Oe(),f=P.useRef(null),{dialogProps:M,titleProps:D}=Ze({},f),y=w({ref:f,...M,...a}),S=r||u||"div",i=t.jsxs(t.Fragment,{children:[!I&&t.jsx(me,{onDismiss:j}),t.jsx(S,{...y,children:t.jsx("div",{...x({className:s}),children:typeof n=="function"?n(D):n})}),t.jsx(me,{onDismiss:j})]}),v=P.useMemo(()=>h==="transparent"?null:c?t.jsx("div",{...b()}):t.jsx(xe,{features:Se,children:t.jsx(ye.div,{animate:"enter",exit:"exit",initial:"exit",variants:Pe.fade,...b()})}),[h,c,b]),k=d?et(d==="center"?"top":d):void 0,o=t.jsx(t.Fragment,{children:c?i:t.jsx(xe,{features:Se,children:t.jsx(ye.div,{animate:"enter",exit:"exit",initial:"initial",style:k,variants:Pe.scaleSpringOpacity,...l,children:i})})});return t.jsxs("div",{...p(),children:[v,o]})};Fe.displayName="HeroUI.PopoverContent";var Rt=Fe,Ee=e=>{var r;const{triggerRef:n,getTriggerProps:s}=Oe(),{children:a,...u}=e,d=P.useMemo(()=>typeof a=="string"?t.jsx("p",{children:a}):P.Children.only(a),[a]),h=(r=d.props.ref)!=null?r:d.ref,{onPress:l,isDisabled:c,...p}=P.useMemo(()=>s(R(u,d.props),h),[s,d.props,u,h]),[,w]=Ot(a,X),{buttonProps:b}=tt({onPress:l,isDisabled:c},n),x=P.useMemo(()=>w?.[0]!==void 0,[w]);return x||delete p.preventFocusOnPress,P.cloneElement(d,R(p,x?{onPress:l,isDisabled:c}:b))};Ee.displayName="HeroUI.PopoverTrigger";var Ht=Ee,Te=se((e,r)=>{const{children:n,...s}=e,a=jt({...s,ref:r}),[u,d]=P.Children.toArray(n),h=t.jsx(ot,{portalContainer:a.portalContainer,children:d});return t.jsxs(Tt,{value:a,children:[u,a.disableAnimation&&a.isOpen?h:t.jsx(Ie,{children:a.isOpen?h:null})]})});Te.displayName="HeroUI.Popover";var Ut=Te,[Kt,Re]=Me({name:"DropdownContext",errorMessage:"useDropdownContext: `context` is undefined. Seems you forgot to wrap all popover components within ``"});function Bt(e){const{isSelected:r,disableAnimation:n,...s}=e;return t.jsx("svg",{"aria-hidden":"true","data-selected":r,role:"presentation",viewBox:"0 0 17 18",...s,children:t.jsx("polyline",{fill:"none",points:"1 9 7 14 15 4",stroke:"currentColor",strokeDasharray:22,strokeDashoffset:r?44:66,strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:1.5,style:n?{}:{transition:"stroke-dashoffset 200ms ease"}})})}const He=new WeakMap;function Vt(e,r,n){let{shouldFocusWrap:s=!0,onKeyDown:a,onKeyUp:u,...d}=e;!e["aria-label"]&&e["aria-labelledby"];let h=ke(e,{labelable:!0}),{listProps:l}=rt({...d,ref:n,selectionManager:r.selectionManager,collection:r.collection,disabledKeys:r.disabledKeys,shouldFocusWrap:s,linkBehavior:"override"});return He.set(r,{onClose:e.onClose,onAction:e.onAction,shouldUseVirtualFocus:e.shouldUseVirtualFocus}),{menuProps:Ne(h,{onKeyDown:a,onKeyUp:u},{role:"menu",...l,onKeyDown:c=>{var p;(c.key!=="Escape"||e.shouldUseVirtualFocus)&&((p=l.onKeyDown)===null||p===void 0||p.call(l,c))}})}}function Lt(e,r,n){let{id:s,key:a,closeOnSelect:u,isVirtualized:d,"aria-haspopup":h,onPressStart:l,onPressUp:c,onPress:p,onPressChange:w,onPressEnd:b,onHoverStart:x,onHoverChange:I,onHoverEnd:j,onKeyDown:f,onKeyUp:M,onFocus:D,onFocusChange:y,onBlur:S,selectionManager:i=r.selectionManager}=e,v=!!h,k=v&&e["aria-expanded"]==="true";var o;let C=(o=e.isDisabled)!==null&&o!==void 0?o:i.isDisabled(a);var _;let A=(_=e.isSelected)!==null&&_!==void 0?_:i.isSelected(a),N=He.get(r),g=r.collection.getItem(a),T=e.onClose||N.onClose,B=at(),$=m=>{var J;if(!v){if(!(g==null||(J=g.props)===null||J===void 0)&&J.onAction?g.props.onAction():e.onAction&&e.onAction(a),N.onAction){let ce=N.onAction;ce(a)}m.target instanceof HTMLAnchorElement&&g&&B.open(m.target,m,g.props.href,g.props.routerOptions)}},E="menuitem";v||(i.selectionMode==="single"?E="menuitemradio":i.selectionMode==="multiple"&&(E="menuitemcheckbox"));let O=pe(),H=pe(),q=pe(),V={id:s,"aria-disabled":C||void 0,role:E,"aria-label":e["aria-label"],"aria-labelledby":O,"aria-describedby":[H,q].filter(Boolean).join(" ")||void 0,"aria-controls":e["aria-controls"],"aria-haspopup":h,"aria-expanded":e["aria-expanded"]};i.selectionMode!=="none"&&!v&&(V["aria-checked"]=A),d&&(V["aria-posinset"]=g?.index,V["aria-setsize"]=St(r.collection));let G=m=>{m.pointerType==="keyboard"&&$(m),l?.(m)},Z=()=>{!v&&T&&(u??(i.selectionMode!=="multiple"||i.isLink(a)))&&T()},Y=m=>{m.pointerType==="mouse"&&($(m),Z()),c?.(m)},ne=m=>{m.pointerType!=="keyboard"&&m.pointerType!=="mouse"&&($(m),Z()),p?.(m)},{itemProps:L,isFocused:ee}=_t({id:s,selectionManager:i,key:a,ref:n,shouldSelectOnPressUp:!0,allowsDifferentPressOrigin:!0,linkBehavior:"none",shouldUseVirtualFocus:N.shouldUseVirtualFocus}),{pressProps:le,isPressed:te}=st({onPressStart:G,onPress:ne,onPressUp:Y,onPressChange:w,onPressEnd:b,isDisabled:C}),{hoverProps:ie}=_e({isDisabled:C,onHoverStart(m){!he()&&!(k&&h)&&(i.setFocused(!0),i.setFocusedKey(a)),x?.(m)},onHoverChange:I,onHoverEnd:j}),{keyboardProps:oe}=nt({onKeyDown:m=>{if(m.repeat){m.continuePropagation();return}switch(m.key){case" ":!C&&i.selectionMode==="none"&&!v&&u!==!1&&T&&T();break;case"Enter":!C&&u!==!1&&!v&&T&&T();break;default:v||m.continuePropagation(),f?.(m);break}},onKeyUp:M}),{focusProps:U}=lt({onBlur:S,onFocus:D,onFocusChange:y}),re=ke(g?.props);delete re.id;let de=it(g?.props);return{menuItemProps:{...V,...Ne(re,de,v?{onFocus:L.onFocus,"data-collection":L["data-collection"],"data-key":L["data-key"]}:L,le,ie,oe,U,N.shouldUseVirtualFocus||v?{onMouseDown:m=>m.preventDefault()}:void 0),tabIndex:L.tabIndex!=null&&k&&!N.shouldUseVirtualFocus?-1:L.tabIndex},labelProps:{id:O},descriptionProps:{id:H},keyboardShortcutProps:{id:q},isFocused:ee,isFocusVisible:ee&&i.isFocused&&he()&&!k,isSelected:A,isPressed:te,isDisabled:C}}function zt(e){let{heading:r,"aria-label":n}=e,s=dt();return{itemProps:{role:"presentation"},headingProps:r?{id:s,role:"presentation"}:{},groupProps:{role:"group","aria-label":n,"aria-labelledby":r?s:void 0}}}function Wt(e){var r,n;const s=be(),[a,u]=ct(e,je.variantKeys),{as:d,item:h,state:l,shortcut:c,description:p,startContent:w,endContent:b,isVirtualized:x,selectedIcon:I,className:j,classNames:f,onAction:M,autoFocus:D,onPress:y,onPressStart:S,onPressUp:i,onPressEnd:v,onPressChange:k,onHoverStart:o,onHoverChange:C,onHoverEnd:_,hideSelectedIcon:A=!1,isReadOnly:N=!1,closeOnSelect:g,onClose:T,onClick:B,...$}=a,E=(n=(r=e.disableAnimation)!=null?r:s?.disableAnimation)!=null?n:!1,O=P.useRef(null),H=d||($?.href?"a":"li"),q=typeof H=="string",{rendered:V,key:G}=h,Z=l.disabledKeys.has(G)||e.isDisabled,Y=l.selectionManager.selectionMode!=="none",ne=Dt(),{isFocusVisible:L,focusProps:ee}=ut({autoFocus:D}),le=P.useCallback(F=>{B?.(F),y?.(F)},[B,y]),{isPressed:te,isFocused:ie,isSelected:oe,isDisabled:U,menuItemProps:re,labelProps:de,descriptionProps:m,keyboardShortcutProps:J}=Lt({key:G,onClose:T,isDisabled:Z,onPress:le,onPressStart:S,onPressUp:i,onPressEnd:v,onPressChange:k,"aria-label":a["aria-label"],closeOnSelect:g,isVirtualized:x,onAction:M},l,O);let{hoverProps:ce,isHovered:ge}=_e({isDisabled:U,onHoverStart(F){he()||(l.selectionManager.setFocused(!0),l.selectionManager.setFocusedKey(G)),o?.(F)},onHoverChange:C,onHoverEnd:_}),ue=re;const z=P.useMemo(()=>je({...u,isDisabled:U,disableAnimation:E,hasTitleTextChild:typeof V=="string",hasDescriptionTextChild:typeof p=="string"}),[pt(u),U,E,V,p]),ze=W(f?.base,j);N&&(ue=ft(ue));const We=(F={})=>({ref:O,...R(N?{}:ee,Ae($,{enabled:q}),ue,ce,F),"data-focus":K(ie),"data-selectable":K(Y),"data-hover":K(ne?ge||te:ge),"data-disabled":K(U),"data-selected":K(oe),"data-pressed":K(te),"data-focus-visible":K(L),className:z.base({class:W(ze,F.className)})}),qe=(F={})=>({...R(de,F),className:z.title({class:f?.title})}),Ge=(F={})=>({...R(m,F),className:z.description({class:f?.description})}),Je=(F={})=>({...R(J,F),className:z.shortcut({class:f?.shortcut})}),Qe=P.useCallback((F={})=>({"aria-hidden":K(!0),"data-disabled":K(U),className:z.selectedIcon({class:f?.selectedIcon}),...F}),[U,z,f]);return{Component:H,domRef:O,slots:z,classNames:f,isSelectable:Y,isSelected:oe,isDisabled:U,rendered:V,shortcut:c,description:p,startContent:w,endContent:b,selectedIcon:I,disableAnimation:E,getItemProps:We,getLabelProps:qe,hideSelectedIcon:A,getDescriptionProps:Ge,getKeyboardShortcutProps:Je,getSelectedIconProps:Qe}}var Ue=e=>{const{Component:r,slots:n,classNames:s,rendered:a,shortcut:u,description:d,isSelectable:h,isSelected:l,isDisabled:c,selectedIcon:p,startContent:w,endContent:b,disableAnimation:x,hideSelectedIcon:I,getItemProps:j,getLabelProps:f,getDescriptionProps:M,getKeyboardShortcutProps:D,getSelectedIconProps:y}=Wt(e),S=P.useMemo(()=>{const i=t.jsx(Bt,{disableAnimation:x,isSelected:l});return typeof p=="function"?p({icon:i,isSelected:l,isDisabled:c}):p||i},[p,l,c,x]);return t.jsxs(r,{...j(),children:[w,d?t.jsxs("div",{className:n.wrapper({class:s?.wrapper}),children:[t.jsx("span",{...f(),children:a}),t.jsx("span",{...M(),children:d})]}):t.jsx("span",{...f(),children:a}),u&&t.jsx("kbd",{...D(),children:u}),h&&!I&&t.jsx("span",{...y(),children:S}),b]})};Ue.displayName="HeroUI.MenuItem";var Ke=Ue,Be=se(({item:e,state:r,as:n,variant:s,color:a,disableAnimation:u,onAction:d,closeOnSelect:h,className:l,classNames:c,showDivider:p=!1,hideSelectedIcon:w,dividerProps:b={},itemClasses:x,title:I,...j},f)=>{const M=n||"li",D=P.useMemo(()=>Mt(),[]),y=W(c?.base,l),S=W(c?.divider,b?.className),{itemProps:i,headingProps:v,groupProps:k}=zt({heading:e.rendered,"aria-label":e["aria-label"]});return t.jsxs(M,{"data-slot":"base",...R(i,j),className:D.base({class:y}),children:[e.rendered&&t.jsx("span",{...v,className:D.heading({class:c?.heading}),"data-slot":"heading",children:e.rendered}),t.jsxs("ul",{...k,className:D.group({class:c?.group}),"data-has-title":!!e.rendered,"data-slot":"group",children:[[...e.childNodes].map(o=>{const{key:C,props:_}=o;let A=t.jsx(Ke,{classNames:x,closeOnSelect:h,color:a,disableAnimation:u,hideSelectedIcon:w,item:o,state:r,variant:s,onAction:d,..._},C);return o.wrapper&&(A=o.wrapper(A)),A}),p&&t.jsx(vt,{as:"li",className:D.divider({class:S}),...b})]})]})});Be.displayName="HeroUI.MenuSection";var qt=Be;function Gt(e){var r;const n=be(),{as:s,ref:a,variant:u,color:d,children:h,disableAnimation:l=(r=n?.disableAnimation)!=null?r:!1,onAction:c,closeOnSelect:p,itemClasses:w,className:b,state:x,topContent:I,bottomContent:j,hideEmptyContent:f=!1,hideSelectedIcon:M=!1,emptyContent:D="No items.",menuProps:y,onClose:S,classNames:i,...v}=e,k=s||"ul",o=ht(a),C=typeof k=="string",_=bt({...v,...y,children:h}),A=x||_,{menuProps:N}=Vt({...v,...y,onAction:c},A,o),g=P.useMemo(()=>It({className:b}),[b]),T=W(i?.base,b);return{Component:k,state:A,variant:u,color:d,disableAnimation:l,onClose:S,topContent:I,bottomContent:j,closeOnSelect:p,className:b,itemClasses:w,getBaseProps:(O={})=>({ref:o,"data-slot":"base",className:g.base({class:T}),...Ae(v,{enabled:C}),...O}),getListProps:(O={})=>({"data-slot":"list",className:g.list({class:i?.list}),...N,...O}),hideEmptyContent:f,hideSelectedIcon:M,getEmptyContentProps:(O={})=>({children:D,className:g.emptyContent({class:i?.emptyContent}),...O})}}var Jt=se(function(r,n){const{Component:s,state:a,closeOnSelect:u,color:d,disableAnimation:h,hideSelectedIcon:l,hideEmptyContent:c,variant:p,onClose:w,topContent:b,bottomContent:x,itemClasses:I,getBaseProps:j,getListProps:f,getEmptyContentProps:M}=Gt({...r,ref:n}),D=t.jsxs(s,{...f(),children:[!a.collection.size&&!c&&t.jsx("li",{children:t.jsx("div",{...M()})}),[...a.collection].map(y=>{const S={closeOnSelect:u,color:d,disableAnimation:h,item:y,state:a,variant:p,onClose:w,hideSelectedIcon:l,...y.props},i=Et(I,S?.classNames);if(y.type==="section")return t.jsx(qt,{...S,itemClasses:i},y.key);let v=t.jsx(Ke,{...S,classNames:i},y.key);return y.wrapper&&(v=y.wrapper(v)),v})]});return t.jsxs("div",{...j(),children:[b,D,x]})}),Qt=Jt,Xt=gt,De=Xt,Zt=se(function(r,n){const{getMenuProps:s}=Re();return t.jsx(Rt,{children:t.jsx(mt,{contain:!0,restoreFocus:!0,children:t.jsx(Qt,{...s(r,n)})})})}),Yt=Zt,Ve=e=>{const{getMenuTriggerProps:r}=Re(),{children:n,...s}=e;return t.jsx(Ht,{...r(s),children:n})};Ve.displayName="HeroUI.DropdownTrigger";var eo=Ve,to=(e,r)=>{if(e){const n=Array.isArray(e.children)?e.children:[...e?.items||[]];if(n&&n.length)return n.find(a=>{if(a&&a.key===r)return a})||{}}return null},oo=(e,r,n)=>{const s=n||to(e,r);return s&&s.props&&"closeOnSelect"in s.props?s.props.closeOnSelect:e?.closeOnSelect};function ro(e){var r;const n=be(),{as:s,triggerRef:a,isOpen:u,defaultOpen:d,onOpenChange:h,isDisabled:l,type:c="menu",trigger:p="press",placement:w="bottom",closeOnSelect:b=!0,shouldBlockScroll:x=!0,classNames:I,disableAnimation:j=(r=n?.disableAnimation)!=null?r:!1,onClose:f,className:M,...D}=e,y=s||"div",S=P.useRef(null),i=a||S,v=P.useRef(null),k=P.useRef(null),o=kt({trigger:p,isOpen:u,defaultOpen:d,onOpenChange:$=>{h?.($),$||f?.()}}),{menuTriggerProps:C,menuProps:_}=Nt({type:c,trigger:p,isDisabled:l},o,i),A=P.useMemo(()=>Ft({className:M}),[M]),N=$=>{$!==void 0&&!$||b&&o.close()},g=($={})=>{const E=R(D,$);return{state:o,placement:w,ref:k,disableAnimation:j,shouldBlockScroll:x,scrollRef:v,triggerRef:i,...E,classNames:{...I,...$.classNames,content:W(A,I?.content,$.className)}}},T=($={})=>{const{onPress:E,onPressStart:O,...H}=C;return R(H,{isDisabled:l},$)},B=($,E=null)=>({ref:xt(E,v),menuProps:_,closeOnSelect:b,...R($,{onAction:(O,H)=>{const q=oo($,O,H);N(q)},onClose:o.close})});return{Component:y,menuRef:v,menuProps:_,closeOnSelect:b,onClose:o.close,autoFocus:o.focusStrategy||!0,disableAnimation:j,getPopoverProps:g,getMenuProps:B,getMenuTriggerProps:T}}var Le=e=>{const{children:r,...n}=e,s=ro(n),[a,u]=yt.Children.toArray(r);return t.jsx(Kt,{value:s,children:t.jsxs(Ut,{...s.getPopoverProps(),children:[a,u]})})};Le.displayName="HeroUI.Dropdown";var ao=Le;function co(){const{selectConversation:e,deleteConversation:r,newConversation:n,setConversationProperties:s}=Pt(),a=Ct(),u=fe(Ce(o=>Object.keys(o.conversations).reverse())),d=fe(Ce(o=>Object.values(o.conversations).reverse().map(C=>C.summary))),h=fe(o=>o.currentConversation),[l,c]=P.useState(!1),[p,w]=P.useState(null),[b,x]=P.useState(""),[I,j]=P.useState(!1),f=P.useRef(null),M=l?"Open sidebar":"Close sidebar",D=t.jsx(Q,{icon:"heroicons:pencil-square"}),y=(o,C)=>{w(o),x(C??""),j(!0),setTimeout(()=>{f.current?.focus?.(),setTimeout(()=>j(!1),120)},0)},S=o=>{if(p!==o)return;const C=(b||"").trim();C&&s(o,{summary:C}),w(null),x(""),j(!1)},i=()=>{w(null),x(""),j(!1)},v=()=>{const o=n();a($e(o))},k=o=>{e(o),a($e(o))};return t.jsx(ve.div,{initial:!1,animate:{maxWidth:l?"4.5rem":"16rem"},className:"rounded-l-medium border-small border-divider ml-4 flex h-full w-full min-w-[4.5rem] flex-grow flex-col space-y-2 overflow-hidden border-r-0 p-4 py-3",children:t.jsxs(Ie,{children:[t.jsx(we,{content:M,placement:"bottom",children:t.jsx(X,{isIconOnly:!0,"aria-label":M,variant:"ghost",onPress:()=>c(o=>!o),"data-testid":"chat-history-collapse-button",className:"ml-auto",children:t.jsx(Q,{icon:l?"heroicons:chevron-double-right":"heroicons:chevron-double-left"})})},"collapse-button"),!l&&t.jsx(ve.p,{initial:!1,animate:{opacity:1,width:"100%",height:"auto"},exit:{opacity:0,width:0,height:0,marginBottom:0},className:"text-small text-foreground truncate leading-5 font-semibold",children:"Conversations"},"conversations"),t.jsx(we,{content:"New conversation",placement:"right",children:t.jsx(X,{"aria-label":"New conversation",variant:"ghost",onPress:v,"data-testid":"chat-history-clear-chat-button",startContent:D,isIconOnly:l,children:!l&&"New conversation"})},"new-conversation-button"),!l&&t.jsx(ve.div,{className:"mt-2 flex flex-1 flex-col gap-2 overflow-auto overflow-x-hidden",initial:!1,animate:{opacity:1,width:"100%"},exit:{opacity:0,width:0},children:wt.zip(u,d).map(([o,C])=>{if(!o||$t(o))return null;const _=o===h,A=o===p,N=_?"solid":"light";return t.jsxs("div",{className:"flex w-full justify-between gap-2",children:[A?t.jsx(At,{ref:f,size:"sm",variant:"bordered",value:b,onChange:g=>x(g.target.value),onBlur:()=>{I||S(o)},onKeyDown:g=>{g.key==="Enter"&&S(o),g.key==="Escape"&&i()},className:"flex-1","data-testid":`input-conversation-${o}`}):t.jsx(X,{variant:N,"aria-label":`Select conversation ${o}`,"data-active":_,onPress:()=>k(o),title:C??o,"data-testid":`select-conversation-${o}`,className:"flex-1 justify-start",children:t.jsx("div",{className:"text-small truncate",children:C??o})}),t.jsxs(ao,{children:[t.jsx(eo,{children:t.jsx(X,{isIconOnly:!0,variant:"light","aria-label":`Conversation actions for ${o}`,"data-testid":`dropdown-conversation-${o}`,children:t.jsx(Q,{icon:"heroicons:ellipsis-vertical",className:"rotate-90"})})}),t.jsxs(Yt,{"aria-label":"Conversation actions",children:[t.jsx(De,{startContent:t.jsx(Q,{icon:"heroicons:pencil-square",className:"mb-0.5"}),onPress:()=>y(o,C??o),"data-testid":`edit-conversation-${o}`,children:"Edit"},"edit"),t.jsx(De,{className:"text-danger mb-0.5",color:"danger",startContent:t.jsx(Q,{icon:"heroicons:trash"}),onPress:()=>r(o),"data-testid":`delete-conversation-${o}`,children:"Delete conversation"},"delete")]})]})]},`${o}-${N}`)})},"conversation-list")]})})}export{co as default}; diff --git a/packages/ragbits-chat/src/ragbits/chat/ui-build/assets/ChatHistory-Dzy0EI1-.js b/packages/ragbits-chat/src/ragbits/chat/ui-build/assets/ChatHistory-Dzy0EI1-.js deleted file mode 100644 index 4ff764322..000000000 --- a/packages/ragbits-chat/src/ragbits/chat/ui-build/assets/ChatHistory-Dzy0EI1-.js +++ /dev/null @@ -1 +0,0 @@ -import{a as y,aK as C,i as h,aL as N,r as I,j as t,aM as n,aD as O,D as o,d as s,I as i,aN as $,aO as u}from"./index-BTypXP0X.js";function P(){const{selectConversation:m,deleteConversation:x,newConversation:v}=y(),l=C(),p=h(N(e=>Object.keys(e.conversations).reverse())),f=h(e=>e.currentConversation),[a,b]=I.useState(!1),r=a?"Open sidebar":"Close sidebar",g=t.jsx(i,{icon:"heroicons:pencil-square"}),j=()=>{const e=v();l(u(e))},w=e=>{m(e),l(u(e))};return t.jsx(n.div,{initial:!1,animate:{maxWidth:a?"4.5rem":"16rem"},className:"rounded-l-medium border-small border-divider ml-4 flex h-full w-full min-w-[4.5rem] flex-grow flex-col space-y-2 overflow-hidden border-r-0 p-4 py-3",children:t.jsxs(O,{children:[t.jsx(o,{content:r,placement:"bottom",children:t.jsx(s,{isIconOnly:!0,"aria-label":r,variant:"ghost",onPress:()=>b(e=>!e),"data-testid":"chat-history-collapse-button",className:"ml-auto",children:t.jsx(i,{icon:a?"heroicons:chevron-double-right":"heroicons:chevron-double-left"})})},"collapse-button"),!a&&t.jsx(n.p,{initial:!1,animate:{opacity:1,width:"100%",height:"auto"},exit:{opacity:0,width:0,height:0,marginBottom:0},className:"text-small text-foreground truncate leading-5 font-semibold",children:"Conversations"},"conversations"),t.jsx(o,{content:"New conversation",placement:"right",children:t.jsx(s,{"aria-label":"New conversation",variant:"ghost",onPress:j,"data-testid":"chat-history-clear-chat-button",startContent:g,isIconOnly:a,children:!a&&"New conversation"})},"new-conversation-button"),!a&&t.jsx(n.div,{className:"mt-2 flex flex-1 flex-col gap-2 overflow-auto overflow-x-hidden",initial:!1,animate:{opacity:1,width:"100%"},exit:{opacity:0,width:0},children:p.map(e=>{if($(e))return null;const c=e===f,d=c?"solid":"light";return t.jsxs("div",{className:"flex gap-2",children:[t.jsx(s,{variant:d,"aria-label":`Select conversation ${e}`,"data-active":c,onPress:()=>w(e),title:e,"data-testid":`select-conversation-${e}`,children:t.jsx("div",{className:"text-small truncate",children:e})}),t.jsx(o,{content:"Delete conversation",placement:"right",children:t.jsx(s,{isIconOnly:!0,"aria-label":`Delete conversation ${e}`,onPress:()=>x(e),variant:"ghost","data-testid":`delete-conversation-${e}`,children:t.jsx(i,{icon:"heroicons:trash"})})})]},`${e}-${d}`)})},"conversation-list")]})})}export{P as default}; diff --git a/packages/ragbits-chat/src/ragbits/chat/ui-build/assets/ChatOptionsForm-BmoJGYUy.js b/packages/ragbits-chat/src/ragbits/chat/ui-build/assets/ChatOptionsForm-BmoJGYUy.js new file mode 100644 index 000000000..12250a51e --- /dev/null +++ b/packages/ragbits-chat/src/ragbits/chat/ui-build/assets/ChatOptionsForm-BmoJGYUy.js @@ -0,0 +1 @@ +import{g as z,r as f,u as ie,h as ce,a as ue,i as le,b as fe,p as Y,C as Q,j as l,D as de,d as A,I as me,m as ge,e as he,f as pe}from"./index-DaG4uPnK.js";import{g as Z,v as W,F as ve,t as be}from"./index-DmyaiLHy.js";import{m as Se}from"./chunk-IGSAU2ZA-Beuyhkep.js";import"./chunk-SSA7SXE4-CTW6lkmA.js";import"./useMenuTriggerState-BKJ8iWug.js";import"./useSelectableItem-ChcXAf8h.js";import"./index-qUEoadOF.js";var B,V;function xe(){if(V)return B;V=1;var n="Expected a function",t=NaN,s="[object Symbol]",m=/^\s+|\s+$/g,g=/^[-+]0x[0-9a-f]+$/i,h=/^0b[01]+$/i,i=/^0o[0-7]+$/i,b=parseInt,S=typeof z=="object"&&z&&z.Object===Object&&z,y=typeof self=="object"&&self&&self.Object===Object&&self,C=S||y||Function("return this")(),d=Object.prototype,r=d.toString,c=Math.max,O=Math.min,E=function(){return C.Date.now()};function $(e,u,v){var T,L,P,I,p,j,R=0,G=!1,D=!1,k=!0;if(typeof e!="function")throw new TypeError(n);u=q(u)||0,_(v)&&(G=!!v.leading,D="maxWait"in v,P=D?c(q(v.maxWait)||0,u):P,k="trailing"in v?!!v.trailing:k);function H(o){var x=T,F=L;return T=L=void 0,R=o,I=e.apply(F,x),I}function re(o){return R=o,p=setTimeout(N,u),G?H(o):I}function oe(o){var x=o-j,F=o-R,X=u-x;return D?O(X,P-F):X}function U(o){var x=o-j,F=o-R;return j===void 0||x>=u||x<0||D&&F>=P}function N(){var o=E();if(U(o))return K(o);p=setTimeout(N,oe(o))}function K(o){return p=void 0,k&&T?H(o):(T=L=void 0,I)}function se(){p!==void 0&&clearTimeout(p),R=0,T=j=L=p=void 0}function ae(){return p===void 0?I:K(E())}function M(){var o=E(),x=U(o);if(T=arguments,L=this,j=o,x){if(p===void 0)return re(j);if(D)return p=setTimeout(N,u),H(j)}return p===void 0&&(p=setTimeout(N,u)),I}return M.cancel=se,M.flush=ae,M}function _(e){var u=typeof e;return!!e&&(u=="object"||u=="function")}function a(e){return!!e&&typeof e=="object"}function w(e){return typeof e=="symbol"||a(e)&&r.call(e)==s}function q(e){if(typeof e=="number")return e;if(w(e))return t;if(_(e)){var u=typeof e.valueOf=="function"?e.valueOf():e;e=_(u)?u+"":u}if(typeof e!="string")return e===0?e:+e;e=e.replace(m,"");var v=h.test(e);return v||i.test(e)?b(e.slice(2),v?2:8):g.test(e)?t:+e}return B=$,B}xe();var ne=typeof window<"u"?f.useLayoutEffect:f.useEffect;function ee(n,t,s,m){const g=f.useRef(t);ne(()=>{g.current=t},[t]),f.useEffect(()=>{const h=window;if(!(h&&h.addEventListener))return;const i=b=>{g.current(b)};return h.addEventListener(n,i,m),()=>{h.removeEventListener(n,i,m)}},[n,s,m])}function te(n){const t=f.useRef(()=>{throw new Error("Cannot call an event handler while rendering.")});return ne(()=>{t.current=n},[n]),f.useCallback((...s)=>{var m;return(m=t.current)==null?void 0:m.call(t,...s)},[t])}var J=typeof window>"u";function ye(n,t,s={}){const{initializeWithValue:m=!0}=s,g=f.useCallback(r=>s.serializer?s.serializer(r):JSON.stringify(r),[s]),h=f.useCallback(r=>{if(s.deserializer)return s.deserializer(r);if(r==="undefined")return;const c=t instanceof Function?t():t;let O;try{O=JSON.parse(r)}catch(E){return console.error("Error parsing JSON:",E),c}return O},[s,t]),i=f.useCallback(()=>{const r=t instanceof Function?t():t;if(J)return r;try{const c=window.localStorage.getItem(n);return c?h(c):r}catch(c){return console.warn(`Error reading localStorage key “${n}”:`,c),r}},[t,n,h]),[b,S]=f.useState(()=>m?i():t instanceof Function?t():t),y=te(r=>{J&&console.warn(`Tried setting localStorage key “${n}” even though environment is not a client`);try{const c=r instanceof Function?r(i()):r;window.localStorage.setItem(n,g(c)),S(c),window.dispatchEvent(new StorageEvent("local-storage",{key:n}))}catch(c){console.warn(`Error setting localStorage key “${n}”:`,c)}}),C=te(()=>{J&&console.warn(`Tried removing localStorage key “${n}” even though environment is not a client`);const r=t instanceof Function?t():t;window.localStorage.removeItem(n),S(r),window.dispatchEvent(new StorageEvent("local-storage",{key:n}))});f.useEffect(()=>{S(i())},[n]);const d=f.useCallback(r=>{r.key&&r.key!==n||S(i())},[n,i]);return ee("storage",d),ee("local-storage",d),[b,y,C]}const Ce="ragbits-no-history-chat-options";function Le(){const{isOpen:n,onOpen:t,onClose:s}=ie(),m=ce(a=>a.chatOptions),g=f.useRef(null),{setConversationProperties:h,initializeChatOptions:i}=ue(),b=le(a=>a.currentConversation),{config:{user_settings:S}}=fe(),[y,C]=ye(Ce,null),d=S?.form,r=a=>{Y.isPluginActivated(Q.name)||C(a)},c=()=>{t()},O=(a,w)=>{w.preventDefault(),g.current=a.formData,s()},E=()=>{if(!d)return;const a=Z(W,d);g.current=a,s()},$=()=>{s()},_=a=>{if(a!=="exit"||!g.current)return;const w=g.current;h(b,{chatOptions:w}),r(w),g.current=null};return f.useEffect(()=>{if(!d)return;const a=Z(W,d);Y.isPluginActivated(Q.name)?i(a):y!==null?i(y):(i(a),C(a))},[i,d,b,y,C]),d?l.jsxs(l.Fragment,{children:[l.jsx(de,{content:"Chat Options",placement:"bottom",children:l.jsx(A,{isIconOnly:!0,variant:"ghost",className:"p-0","aria-label":"Open chat options",onPress:c,"data-testid":"open-chat-options",children:l.jsx(me,{icon:"heroicons:cog-6-tooth"})})}),l.jsx(ge,{isOpen:n,onOpenChange:$,motionProps:{onAnimationComplete:_},children:l.jsxs(he,{children:[l.jsx(Se,{className:"text-default-900 flex flex-col gap-1",children:d.title||"Chat Options"}),l.jsx(pe,{children:l.jsx("div",{className:"flex flex-col gap-4",children:l.jsx(ve,{schema:d,validator:W,formData:m,onSubmit:O,transformErrors:be,liveValidate:!0,children:l.jsxs("div",{className:"flex justify-end gap-4 py-4",children:[l.jsx(A,{className:"mr-auto",color:"primary",variant:"light",onPress:E,"aria-label":"Restore default user settings",children:"Restore defaults"}),l.jsx(A,{color:"danger",variant:"light",onPress:s,"aria-label":"Close chat options form",children:"Cancel"}),l.jsx(A,{color:"primary",type:"submit","aria-label":"Save chat options","data-testid":"chat-options-submit",children:"Save"})]})})})})]})})]}):null}export{Le as default}; diff --git a/packages/ragbits-chat/src/ragbits/chat/ui-build/assets/ChatOptionsForm-CUT15Ecj.js b/packages/ragbits-chat/src/ragbits/chat/ui-build/assets/ChatOptionsForm-CUT15Ecj.js deleted file mode 100644 index d74a4f5e2..000000000 --- a/packages/ragbits-chat/src/ragbits/chat/ui-build/assets/ChatOptionsForm-CUT15Ecj.js +++ /dev/null @@ -1 +0,0 @@ -import{g as z,r as f,u as ie,h as ce,a as ue,i as le,b as fe,p as Y,C as Q,j as l,D as de,d as A,I as me,m as ge,e as he,f as pe}from"./index-BTypXP0X.js";import{g as Z,v as W,F as be,t as ve}from"./index-CTrBaHsz.js";import{m as Se}from"./chunk-IGSAU2ZA-RYoue1Xd.js";import"./chunk-SSA7SXE4-CpT2ku66.js";import"./index-nfbmdcVN.js";var B,V;function xe(){if(V)return B;V=1;var n="Expected a function",t=NaN,s="[object Symbol]",m=/^\s+|\s+$/g,g=/^[-+]0x[0-9a-f]+$/i,h=/^0b[01]+$/i,i=/^0o[0-7]+$/i,x=parseInt,v=typeof z=="object"&&z&&z.Object===Object&&z,y=typeof self=="object"&&self&&self.Object===Object&&self,C=v||y||Function("return this")(),d=Object.prototype,r=d.toString,c=Math.max,O=Math.min,E=function(){return C.Date.now()};function $(e,u,b){var T,L,N,I,p,j,R=0,G=!1,D=!1,k=!0;if(typeof e!="function")throw new TypeError(n);u=q(u)||0,_(b)&&(G=!!b.leading,D="maxWait"in b,N=D?c(q(b.maxWait)||0,u):N,k="trailing"in b?!!b.trailing:k);function H(o){var S=T,F=L;return T=L=void 0,R=o,I=e.apply(F,S),I}function re(o){return R=o,p=setTimeout(P,u),G?H(o):I}function oe(o){var S=o-j,F=o-R,X=u-S;return D?O(X,N-F):X}function U(o){var S=o-j,F=o-R;return j===void 0||S>=u||S<0||D&&F>=N}function P(){var o=E();if(U(o))return K(o);p=setTimeout(P,oe(o))}function K(o){return p=void 0,k&&T?H(o):(T=L=void 0,I)}function se(){p!==void 0&&clearTimeout(p),R=0,T=j=L=p=void 0}function ae(){return p===void 0?I:K(E())}function M(){var o=E(),S=U(o);if(T=arguments,L=this,j=o,S){if(p===void 0)return re(j);if(D)return p=setTimeout(P,u),H(j)}return p===void 0&&(p=setTimeout(P,u)),I}return M.cancel=se,M.flush=ae,M}function _(e){var u=typeof e;return!!e&&(u=="object"||u=="function")}function a(e){return!!e&&typeof e=="object"}function w(e){return typeof e=="symbol"||a(e)&&r.call(e)==s}function q(e){if(typeof e=="number")return e;if(w(e))return t;if(_(e)){var u=typeof e.valueOf=="function"?e.valueOf():e;e=_(u)?u+"":u}if(typeof e!="string")return e===0?e:+e;e=e.replace(m,"");var b=h.test(e);return b||i.test(e)?x(e.slice(2),b?2:8):g.test(e)?t:+e}return B=$,B}xe();var ne=typeof window<"u"?f.useLayoutEffect:f.useEffect;function ee(n,t,s,m){const g=f.useRef(t);ne(()=>{g.current=t},[t]),f.useEffect(()=>{const h=window;if(!(h&&h.addEventListener))return;const i=x=>{g.current(x)};return h.addEventListener(n,i,m),()=>{h.removeEventListener(n,i,m)}},[n,s,m])}function te(n){const t=f.useRef(()=>{throw new Error("Cannot call an event handler while rendering.")});return ne(()=>{t.current=n},[n]),f.useCallback((...s)=>{var m;return(m=t.current)==null?void 0:m.call(t,...s)},[t])}var J=typeof window>"u";function ye(n,t,s={}){const{initializeWithValue:m=!0}=s,g=f.useCallback(r=>s.serializer?s.serializer(r):JSON.stringify(r),[s]),h=f.useCallback(r=>{if(s.deserializer)return s.deserializer(r);if(r==="undefined")return;const c=t instanceof Function?t():t;let O;try{O=JSON.parse(r)}catch(E){return console.error("Error parsing JSON:",E),c}return O},[s,t]),i=f.useCallback(()=>{const r=t instanceof Function?t():t;if(J)return r;try{const c=window.localStorage.getItem(n);return c?h(c):r}catch(c){return console.warn(`Error reading localStorage key “${n}”:`,c),r}},[t,n,h]),[x,v]=f.useState(()=>m?i():t instanceof Function?t():t),y=te(r=>{J&&console.warn(`Tried setting localStorage key “${n}” even though environment is not a client`);try{const c=r instanceof Function?r(i()):r;window.localStorage.setItem(n,g(c)),v(c),window.dispatchEvent(new StorageEvent("local-storage",{key:n}))}catch(c){console.warn(`Error setting localStorage key “${n}”:`,c)}}),C=te(()=>{J&&console.warn(`Tried removing localStorage key “${n}” even though environment is not a client`);const r=t instanceof Function?t():t;window.localStorage.removeItem(n),v(r),window.dispatchEvent(new StorageEvent("local-storage",{key:n}))});f.useEffect(()=>{v(i())},[n]);const d=f.useCallback(r=>{r.key&&r.key!==n||v(i())},[n,i]);return ee("storage",d),ee("local-storage",d),[x,y,C]}const Ce="ragbits-no-history-chat-options";function Ie(){const{isOpen:n,onOpen:t,onClose:s}=ie(),m=ce(a=>a.chatOptions),g=f.useRef(null),{setChatOptions:h,initializeChatOptions:i}=ue(),x=le(a=>a.currentConversation),{config:{user_settings:v}}=fe(),[y,C]=ye(Ce,null),d=v?.form,r=a=>{Y.isPluginActivated(Q.name)||C(a)},c=()=>{t()},O=(a,w)=>{w.preventDefault(),g.current=a.formData,s()},E=()=>{if(!d)return;const a=Z(W,d);g.current=a,s()},$=()=>{s()},_=a=>{if(a!=="exit"||!g.current)return;const w=g.current;h(w),r(w),g.current=null};return f.useEffect(()=>{if(!d)return;const a=Z(W,d);Y.isPluginActivated(Q.name)?i(a):y!==null?i(y):(i(a),C(a))},[i,d,x,y,C]),d?l.jsxs(l.Fragment,{children:[l.jsx(de,{content:"Chat Options",placement:"bottom",children:l.jsx(A,{isIconOnly:!0,variant:"ghost",className:"p-0","aria-label":"Open chat options",onPress:c,"data-testid":"open-chat-options",children:l.jsx(me,{icon:"heroicons:cog-6-tooth"})})}),l.jsx(ge,{isOpen:n,onOpenChange:$,motionProps:{onAnimationComplete:_},children:l.jsxs(he,{children:[l.jsx(Se,{className:"text-default-900 flex flex-col gap-1",children:d.title||"Chat Options"}),l.jsx(pe,{children:l.jsx("div",{className:"flex flex-col gap-4",children:l.jsx(be,{schema:d,validator:W,formData:m,onSubmit:O,transformErrors:ve,liveValidate:!0,children:l.jsxs("div",{className:"flex justify-end gap-4 py-4",children:[l.jsx(A,{className:"mr-auto",color:"primary",variant:"light",onPress:E,"aria-label":"Restore default user settings",children:"Restore defaults"}),l.jsx(A,{color:"danger",variant:"light",onPress:s,"aria-label":"Close chat options form",children:"Cancel"}),l.jsx(A,{color:"primary",type:"submit","aria-label":"Save chat options","data-testid":"chat-options-submit",children:"Save"})]})})})})]})})]}):null}export{Ie as default}; diff --git a/packages/ragbits-chat/src/ragbits/chat/ui-build/assets/FeedbackForm-Cav2SsCB.js b/packages/ragbits-chat/src/ragbits/chat/ui-build/assets/FeedbackForm-Cav2SsCB.js new file mode 100644 index 000000000..57ac155b5 --- /dev/null +++ b/packages/ragbits-chat/src/ragbits/chat/ui-build/assets/FeedbackForm-Cav2SsCB.js @@ -0,0 +1 @@ +import{u as g,a as v,b as C,r as _,F as s,c as T,j as e,D as b,d as n,I as u,m as w,e as D,f as I}from"./index-DaG4uPnK.js";import{F as O,t as S,v as E}from"./index-DmyaiLHy.js";import{m as N}from"./chunk-IGSAU2ZA-Beuyhkep.js";import"./chunk-SSA7SXE4-CTW6lkmA.js";import"./useMenuTriggerState-BKJ8iWug.js";import"./useSelectableItem-ChcXAf8h.js";import"./index-qUEoadOF.js";function z({message:t}){const{isOpen:f,onOpen:h,onClose:r}=g(),{mergeExtensions:p}=v(),{config:{feedback:o}}=C(),[i,x]=_.useState(s.Like),k=T("/api/feedback",{headers:{"Content-Type":"application/json"},method:"POST"}),l=o[i].form,j=()=>{r()},c=async a=>{if(!t.serverId)throw new Error('Feedback is only available for messages with "serverId" set');try{await k.call({body:{message_id:t.serverId,feedback:i,payload:a??{}}})}catch(F){console.error(F)}},y=a=>{p(t.id,{feedbackType:i}),c(a.formData),r()},d=async a=>{if(x(a),o[a].form===null){await c(null);return}h()};if(!l)return null;const m=t.extensions?.feedbackType;return e.jsxs(e.Fragment,{children:[o.like.enabled&&e.jsx(b,{content:"Like",placement:"bottom",children:e.jsx(n,{isIconOnly:!0,variant:"ghost",className:"p-0","aria-label":"Rate message as helpful",onPress:()=>d(s.Like),"data-testid":"feedback-like",children:e.jsx(u,{icon:m===s.Like?"heroicons:hand-thumb-up-solid":"heroicons:hand-thumb-up"})})}),o.dislike.enabled&&e.jsx(b,{content:"Dislike",placement:"bottom",children:e.jsx(n,{isIconOnly:!0,variant:"ghost",className:"p-0","aria-label":"Rate message as unhelpful",onPress:()=>d(s.Dislike),"data-testid":"feedback-dislike",children:e.jsx(u,{icon:m===s.Dislike?"heroicons:hand-thumb-down-solid":"heroicons:hand-thumb-down"})})}),e.jsx(w,{isOpen:f,onOpenChange:j,children:e.jsx(D,{children:a=>e.jsxs(e.Fragment,{children:[e.jsx(N,{className:"text-default-900 flex flex-col gap-1",children:l.title}),e.jsx(I,{children:e.jsx("div",{className:"flex flex-col gap-4",children:e.jsx(O,{schema:l,validator:E,onSubmit:y,transformErrors:S,liveValidate:!0,children:e.jsxs("div",{className:"flex justify-end gap-4 py-4",children:[e.jsx(n,{color:"danger",variant:"light",onPress:a,"aria-label":"Close feedback form",children:"Cancel"}),e.jsx(n,{color:"primary",type:"submit","aria-label":"Submit feedback","data-testid":"feedback-submit",children:"Submit"})]})})})})]})})})]})}export{z as default}; diff --git a/packages/ragbits-chat/src/ragbits/chat/ui-build/assets/FeedbackForm-Cuu7ROp3.js b/packages/ragbits-chat/src/ragbits/chat/ui-build/assets/FeedbackForm-Cuu7ROp3.js deleted file mode 100644 index f6d416891..000000000 --- a/packages/ragbits-chat/src/ragbits/chat/ui-build/assets/FeedbackForm-Cuu7ROp3.js +++ /dev/null @@ -1 +0,0 @@ -import{u as g,a as v,b as C,r as _,F as s,c as T,j as e,D as b,d as n,I as u,m as w,e as D,f as I}from"./index-BTypXP0X.js";import{F as O,t as S,v as E}from"./index-CTrBaHsz.js";import{m as N}from"./chunk-IGSAU2ZA-RYoue1Xd.js";import"./chunk-SSA7SXE4-CpT2ku66.js";import"./index-nfbmdcVN.js";function V({message:t}){const{isOpen:f,onOpen:h,onClose:r}=g(),{mergeExtensions:p}=v(),{config:{feedback:o}}=C(),[l,x]=_.useState(s.Like),k=T("/api/feedback",{headers:{"Content-Type":"application/json"},method:"POST"}),i=o[l].form,j=()=>{r()},c=async a=>{if(!t.serverId)throw new Error('Feedback is only available for messages with "serverId" set');try{await k.call({body:{message_id:t.serverId,feedback:l,payload:a??{}}})}catch(F){console.error(F)}},y=a=>{p(t.id,{feedbackType:l}),c(a.formData),r()},d=async a=>{if(x(a),o[a].form===null){await c(null);return}h()};if(!i)return null;const m=t.extensions?.feedbackType;return e.jsxs(e.Fragment,{children:[o.like.enabled&&e.jsx(b,{content:"Like",placement:"bottom",children:e.jsx(n,{isIconOnly:!0,variant:"ghost",className:"p-0","aria-label":"Rate message as helpful",onPress:()=>d(s.Like),"data-testid":"feedback-like",children:e.jsx(u,{icon:m===s.Like?"heroicons:hand-thumb-up-solid":"heroicons:hand-thumb-up"})})}),o.dislike.enabled&&e.jsx(b,{content:"Dislike",placement:"bottom",children:e.jsx(n,{isIconOnly:!0,variant:"ghost",className:"p-0","aria-label":"Rate message as unhelpful",onPress:()=>d(s.Dislike),"data-testid":"feedback-dislike",children:e.jsx(u,{icon:m===s.Dislike?"heroicons:hand-thumb-down-solid":"heroicons:hand-thumb-down"})})}),e.jsx(w,{isOpen:f,onOpenChange:j,children:e.jsx(D,{children:a=>e.jsxs(e.Fragment,{children:[e.jsx(N,{className:"text-default-900 flex flex-col gap-1",children:i.title}),e.jsx(I,{children:e.jsx("div",{className:"flex flex-col gap-4",children:e.jsx(O,{schema:i,validator:E,onSubmit:y,transformErrors:S,liveValidate:!0,children:e.jsxs("div",{className:"flex justify-end gap-4 py-4",children:[e.jsx(n,{color:"danger",variant:"light",onPress:a,"aria-label":"Close feedback form",children:"Cancel"}),e.jsx(n,{color:"primary",type:"submit","aria-label":"Submit feedback","data-testid":"feedback-submit",children:"Submit"})]})})})})]})})})]})}export{V as default}; diff --git a/packages/ragbits-chat/src/ragbits/chat/ui-build/assets/Login-xlop2v42.js b/packages/ragbits-chat/src/ragbits/chat/ui-build/assets/Login-Bcduy8Fr.js similarity index 79% rename from packages/ragbits-chat/src/ragbits/chat/ui-build/assets/Login-xlop2v42.js rename to packages/ragbits-chat/src/ragbits/chat/ui-build/assets/Login-Bcduy8Fr.js index 04d6d32fa..c780033a1 100644 --- a/packages/ragbits-chat/src/ragbits/chat/ui-build/assets/Login-xlop2v42.js +++ b/packages/ragbits-chat/src/ragbits/chat/ui-build/assets/Login-Bcduy8Fr.js @@ -1 +1 @@ -import{r as n,bg as w,c as y,aP as b,aK as S,j as e,aD as j,aM as v,d as P,bh as C}from"./index-BTypXP0X.js";import{a as N}from"./authStore-Ur4ZGows.js";import{i as c}from"./chunk-SSA7SXE4-CpT2ku66.js";const D=()=>{const a=n.useContext(w);if(!a)throw new Error("useInitializeUserStore must be used within a HistoryStoreContextProvider");return a.initializeUserStore};function U(){const[a,m]=n.useState({username:"",password:""}),u=y("/api/auth/login",{headers:{"Content-Type":"application/json"},method:"POST"}),p=b(N,s=>s.login),g=S(),x=D(),[f,o]=n.useState(!1),h=async s=>{o(!1),s.preventDefault(),s.stopPropagation();const r=new FormData(s.currentTarget),i=r.get("username"),l=r.get("password");try{const t=await u.call({body:{username:i,password:l}});if(!t.success||!t.jwt_token||!t.user){o(!0);return}p(t.user,t.jwt_token),x(t.user.user_id),g("/")}catch(t){o(!0),console.error("Failed to login",t)}},d=s=>r=>m(i=>C(i,l=>{l[s]=r.target.value}));return n.useEffect(()=>{document.title="Login"},[]),e.jsx("div",{className:"flex h-screen w-screen",children:e.jsxs("form",{className:"rounded-medium border-small border-divider m-auto flex w-full max-w-xs flex-col gap-4 p-4",onSubmit:h,children:[e.jsxs("div",{className:"text-small",children:[e.jsx("div",{className:"text-foreground truncate leading-5 font-semibold",children:"Sign in"}),e.jsx("div",{className:"text-default-500 truncate leading-5 font-normal",children:"Sign in to start chatting."})]}),e.jsx(c,{label:"Username",name:"username",labelPlacement:"outside",placeholder:"Your username",required:!0,isRequired:!0,value:a.username,onChange:d("username")}),e.jsx(c,{label:"Password",labelPlacement:"outside",id:"password",name:"password",type:"password",placeholder:"••••••••",required:!0,isRequired:!0,value:a.password,onChange:d("password")}),e.jsx(j,{children:f&&!u.isLoading&&e.jsx(v.div,{className:"text-small text-danger",initial:{opacity:0,y:-10},animate:{opacity:1,y:0},exit:{opacity:0,y:-10},transition:{duration:.3,ease:"easeOut"},children:"We couldn't sign you in. Please verify your credentials and try again."})}),e.jsx(P,{type:"submit",color:a.password&&a.username?"primary":"default",children:"Sign in"})]})})}export{U as default}; +import{r as n,bm as w,c as y,aW as b,aE as S,j as e,aq as j,aG as v,d as C,bn as P}from"./index-DaG4uPnK.js";import{a as E}from"./authStore-BmdbjFC4.js";import{i as c}from"./chunk-SSA7SXE4-CTW6lkmA.js";const N=()=>{const a=n.useContext(w);if(!a)throw new Error("useInitializeUserStore must be used within a HistoryStoreContextProvider");return a.initializeUserStore};function U(){const[a,m]=n.useState({username:"",password:""}),u=y("/api/auth/login",{headers:{"Content-Type":"application/json"},method:"POST"}),p=b(E,s=>s.login),g=S(),x=N(),[f,o]=n.useState(!1),h=async s=>{o(!1),s.preventDefault(),s.stopPropagation();const r=new FormData(s.currentTarget),i=r.get("username"),l=r.get("password");try{const t=await u.call({body:{username:i,password:l}});if(!t.success||!t.jwt_token||!t.user){o(!0);return}p(t.user,t.jwt_token),x(t.user.user_id),g("/")}catch(t){o(!0),console.error("Failed to login",t)}},d=s=>r=>m(i=>P(i,l=>{l[s]=r.target.value}));return n.useEffect(()=>{document.title="Login"},[]),e.jsx("div",{className:"flex h-screen w-screen",children:e.jsxs("form",{className:"rounded-medium border-small border-divider m-auto flex w-full max-w-xs flex-col gap-4 p-4",onSubmit:h,children:[e.jsxs("div",{className:"text-small",children:[e.jsx("div",{className:"text-foreground truncate leading-5 font-semibold",children:"Sign in"}),e.jsx("div",{className:"text-default-500 truncate leading-5 font-normal",children:"Sign in to start chatting."})]}),e.jsx(c,{label:"Username",name:"username",labelPlacement:"outside",placeholder:"Your username",required:!0,isRequired:!0,value:a.username,onChange:d("username")}),e.jsx(c,{label:"Password",labelPlacement:"outside",id:"password",name:"password",type:"password",placeholder:"••••••••",required:!0,isRequired:!0,value:a.password,onChange:d("password")}),e.jsx(j,{children:f&&!u.isLoading&&e.jsx(v.div,{className:"text-small text-danger",initial:{opacity:0,y:-10},animate:{opacity:1,y:0},exit:{opacity:0,y:-10},transition:{duration:.3,ease:"easeOut"},children:"We couldn't sign you in. Please verify your credentials and try again."})}),e.jsx(C,{type:"submit",color:a.password&&a.username?"primary":"default",children:"Sign in"})]})})}export{U as default}; diff --git a/packages/ragbits-chat/src/ragbits/chat/ui-build/assets/LogoutButton-Cp3E_g1o.js b/packages/ragbits-chat/src/ragbits/chat/ui-build/assets/LogoutButton-CgB7xh9T.js similarity index 81% rename from packages/ragbits-chat/src/ragbits/chat/ui-build/assets/LogoutButton-Cp3E_g1o.js rename to packages/ragbits-chat/src/ragbits/chat/ui-build/assets/LogoutButton-CgB7xh9T.js index 4a53057ca..53fddb164 100644 --- a/packages/ragbits-chat/src/ragbits/chat/ui-build/assets/LogoutButton-Cp3E_g1o.js +++ b/packages/ragbits-chat/src/ragbits/chat/ui-build/assets/LogoutButton-CgB7xh9T.js @@ -1 +1 @@ -import{c as u,aP as s,aK as i,j as o,D as g,d,I as p}from"./index-BTypXP0X.js";import{a as n}from"./authStore-Ur4ZGows.js";function m(){const r=u("/api/auth/logout",{headers:{"Content-Type":"application/json"},method:"POST"}),c=s(n,t=>t.logout),e=s(n,t=>t.token?.access_token),a=i(),l=async()=>{if(!e){a("/login");return}try{if(!(await r.call({body:{token:e}})).success)return;c(),a("/login")}catch(t){console.error("Failed to logout",t)}};return o.jsx(g,{content:"Logout",placement:"bottom",children:o.jsx(d,{isIconOnly:!0,"aria-label":"Logout",variant:"ghost",onPress:l,"data-testid":"logout-button",children:o.jsx(p,{icon:"heroicons:arrow-left-start-on-rectangle"})})})}export{m as default}; +import{c as u,aW as s,aE as i,j as o,D as g,d,I as p}from"./index-DaG4uPnK.js";import{a as n}from"./authStore-BmdbjFC4.js";function m(){const r=u("/api/auth/logout",{headers:{"Content-Type":"application/json"},method:"POST"}),c=s(n,t=>t.logout),e=s(n,t=>t.token?.access_token),a=i(),l=async()=>{if(!e){a("/login");return}try{if(!(await r.call({body:{token:e}})).success)return;c(),a("/login")}catch(t){console.error("Failed to logout",t)}};return o.jsx(g,{content:"Logout",placement:"bottom",children:o.jsx(d,{isIconOnly:!0,"aria-label":"Logout",variant:"ghost",onPress:l,"data-testid":"logout-button",children:o.jsx(p,{icon:"heroicons:arrow-left-start-on-rectangle"})})})}export{m as default}; diff --git a/packages/ragbits-chat/src/ragbits/chat/ui-build/assets/ShareButton-DpNGX0tU.js b/packages/ragbits-chat/src/ragbits/chat/ui-build/assets/ShareButton-B1XlPNhP.js similarity index 80% rename from packages/ragbits-chat/src/ragbits/chat/ui-build/assets/ShareButton-DpNGX0tU.js rename to packages/ragbits-chat/src/ragbits/chat/ui-build/assets/ShareButton-B1XlPNhP.js index c07f73fb3..ecc7a860d 100644 --- a/packages/ragbits-chat/src/ragbits/chat/ui-build/assets/ShareButton-DpNGX0tU.js +++ b/packages/ragbits-chat/src/ragbits/chat/ui-build/assets/ShareButton-B1XlPNhP.js @@ -1 +1 @@ -import{aI as Gr,u as Jr,r as hr,i as Wr,j as k,D as qr,d as gr,I as Yr,m as Kr,e as Lr,f as Qr,aJ as Vr}from"./index-BTypXP0X.js";import{m as Xr}from"./chunk-IGSAU2ZA-RYoue1Xd.js";var T=Uint8Array,$=Uint16Array,jr=Int32Array,lr=new T([0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0,0,0,0]),sr=new T([0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13,0,0]),pr=new T([16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15]),Nr=function(r,e){for(var a=new $(31),n=0;n<31;++n)a[n]=e+=1<>1|(y&21845)<<1;Q=(Q&52428)>>2|(Q&13107)<<2,Q=(Q&61680)>>4|(Q&3855)<<4,Cr[y]=((Q&65280)>>8|(Q&255)<<8)>>1}var q=function(r,e,a){for(var n=r.length,t=0,o=new $(e);t>h]=c}else for(l=new $(n),t=0;t>15-r[t]);return l},V=new T(288);for(var y=0;y<144;++y)V[y]=8;for(var y=144;y<256;++y)V[y]=9;for(var y=256;y<280;++y)V[y]=7;for(var y=280;y<288;++y)V[y]=8;var fr=new T(32);for(var y=0;y<32;++y)fr[y]=5;var re=q(V,9,0),ee=q(V,9,1),ae=q(fr,5,0),ne=q(fr,5,1),wr=function(r){for(var e=r[0],a=1;ae&&(e=r[a]);return e},J=function(r,e,a){var n=e/8|0;return(r[n]|r[n+1]<<8)>>(e&7)&a},xr=function(r,e){var a=e/8|0;return(r[a]|r[a+1]<<8|r[a+2]<<16)>>(e&7)},Ar=function(r){return(r+7)/8|0},cr=function(r,e,a){return(e==null||e<0)&&(e=0),(a==null||a>r.length)&&(a=r.length),new T(r.subarray(e,a))},te=["unexpected EOF","invalid block type","invalid length/literal","invalid distance","stream finished","no stream handler",,"no callback","invalid UTF-8 data","extra field too long","date not in range 1980-2099","filename too long","stream finishing","invalid zip data"],G=function(r,e,a){var n=new Error(e||te[r]);if(n.code=r,Error.captureStackTrace&&Error.captureStackTrace(n,G),!a)throw n;return n},oe=function(r,e,a,n){var t=r.length,o=0;if(!t||e.f&&!e.l)return a||new T(0);var v=!a,l=v||e.i!=2,h=e.i;v&&(a=new T(t*3));var c=function(ar){var nr=a.length;if(ar>nr){var rr=new T(Math.max(nr*2,ar));rr.set(a),a=rr}},f=e.f||0,i=e.p||0,u=e.b||0,x=e.l,S=e.d,w=e.m,d=e.n,m=t*8;do{if(!x){f=J(r,i,1);var R=J(r,i+1,3);if(i+=3,R)if(R==1)x=ee,S=ne,w=9,d=5;else if(R==2){var N=J(r,i,31)+257,A=J(r,i+10,15)+4,g=N+J(r,i+5,31)+1;i+=14;for(var s=new T(g),M=new T(19),C=0;C>4;if(j<16)s[C++]=j;else{var E=0,b=0;for(j==16?(b=3+J(r,i,3),i+=2,E=s[C-1]):j==17?(b=3+J(r,i,7),i+=3):j==18&&(b=11+J(r,i,127),i+=7);b--;)s[C++]=E}}var z=s.subarray(0,N),F=s.subarray(N);w=wr(z),d=wr(F),x=q(z,w,1),S=q(F,d,1)}else G(1);else{var j=Ar(i)+4,D=r[j-4]|r[j-3]<<8,I=j+D;if(I>t){h&&G(0);break}l&&c(u+D),a.set(r.subarray(j,I),u),e.b=u+=D,e.p=i=I*8,e.f=f;continue}if(i>m){h&&G(0);break}}l&&c(u+131072);for(var er=(1<>4;if(i+=E&15,i>m){h&&G(0);break}if(E||G(2),H<256)a[u++]=H;else if(H==256){Y=i,x=null;break}else{var P=H-254;if(H>264){var C=H-257,p=lr[C];P=J(r,i,(1<>4;W||G(3),i+=W&15;var F=Zr[X];if(X>3){var p=sr[X];F+=xr(r,i)&(1<m){h&&G(0);break}l&&c(u+131072);var Z=u+P;if(u>8},tr=function(r,e,a){a<<=e&7;var n=e/8|0;r[n]|=a,r[n+1]|=a>>8,r[n+2]|=a>>16},yr=function(r,e){for(var a=[],n=0;nu&&(u=o[n].s);var x=new $(u+1),S=Tr(a[f-1],x,0);if(S>e){var n=0,w=0,d=S-e,m=1<e)w+=m-(1<>=d;w>0;){var j=o[n].s;x[j]=0&&w;--n){var D=o[n].s;x[D]==e&&(--x[D],++w)}S=e}return{t:new T(x),l:S}},Tr=function(r,e,a){return r.s==-1?Math.max(Tr(r.l,e,a+1),Tr(r.r,e,a+1)):e[r.s]=a},Er=function(r){for(var e=r.length;e&&!r[--e];);for(var a=new $(++e),n=0,t=r[0],o=1,v=function(h){a[n++]=h},l=1;l<=e;++l)if(r[l]==t&&l!=e)++o;else{if(!t&&o>2){for(;o>138;o-=138)v(32754);o>2&&(v(o>10?o-11<<5|28690:o-3<<5|12305),o=0)}else if(o>3){for(v(t),--o;o>6;o-=6)v(8304);o>2&&(v(o-3<<5|8208),o=0)}for(;o--;)v(t);o=1,t=r[l]}return{c:a.subarray(0,n),n:e}},or=function(r,e){for(var a=0,n=0;n>8,r[t+2]=r[t]^255,r[t+3]=r[t+1]^255;for(var o=0;o4&&!M[pr[O-1]];--O);var L=c+5<<3,U=or(t,V)+or(o,fr)+v,_=or(t,u)+or(o,w)+v+14+3*O+or(A,M)+2*A[16]+3*A[17]+7*A[18];if(h>=0&&L<=U&&L<=_)return Ur(e,f,r.subarray(h,h+c));var E,b,z,F;if(K(e,f,1+(_15&&(K(e,f,H[g]>>5&127),f+=H[g]>>12)}}else E=re,b=V,z=ae,F=fr;for(var g=0;g255){var P=p>>18&31;tr(e,f,E[P+257]),f+=b[P+257],P>7&&(K(e,f,p>>23&31),f+=lr[P]);var W=p&31;tr(e,f,z[W]),f+=F[W],W>3&&(tr(e,f,p>>5&8191),f+=sr[W])}else tr(e,f,E[p]),f+=b[p]}return tr(e,f,E[256]),f+b[256]},fe=new jr([65540,131080,131088,131104,262176,1048704,1048832,2114560,2117632]),Hr=new T(0),ie=function(r,e,a,n,t,o){var v=o.z||r.length,l=new T(n+v+5*(1+Math.ceil(v/7e3))+t),h=l.subarray(n,l.length-t),c=o.l,f=(o.r||0)&7;if(e){f&&(h[0]=o.r>>3);for(var i=fe[e-1],u=i>>13,x=i&8191,S=(1<7e3||M>24576)&&(E>423||!c)){f=Fr(r,h,0,D,I,N,g,M,O,s-O,f),M=A=g=0,O=s;for(var b=0;b<286;++b)I[b]=0;for(var b=0;b<30;++b)N[b]=0}var z=2,F=0,er=x,B=U-_&32767;if(E>2&&L==j(s-B))for(var Y=Math.min(u,E)-1,H=Math.min(32767,s),P=Math.min(258,E);B<=H&&--er&&U!=_;){if(r[s+z]==r[s+z-B]){for(var p=0;pz){if(z=p,F=B,p>Y)break;for(var W=Math.min(B,p-2),X=0,b=0;bX&&(X=vr,_=Z)}}}U=_,_=w[U],B+=U-_&32767}if(F){D[M++]=268435456|mr[z]<<18|Mr[F];var ar=mr[z]&31,nr=Mr[F]&31;g+=lr[ar]+sr[nr],++I[257+ar],++N[nr],C=s+z,++A}else D[M++]=r[s],++I[r[s]]}}for(s=Math.max(s,C);s=v&&(h[f/8|0]=c,rr=v),f=Ur(h,f+1,r.subarray(s,rr))}o.i=v}return cr(l,0,n+Ar(f)+t)},Pr=function(){var r=1,e=0;return{p:function(a){for(var n=r,t=e,o=a.length|0,v=0;v!=o;){for(var l=Math.min(v+2655,o);v>16),t=(t&65535)+15*(t>>16)}r=n,e=t},d:function(){return r%=65521,e%=65521,(r&255)<<24|(r&65280)<<8|(e&255)<<8|e>>8}}},ve=function(r,e,a,n,t){if(!t&&(t={l:1},e.dictionary)){var o=e.dictionary.subarray(-32768),v=new T(o.length+r.length);v.set(o),v.set(r,o.length),r=v,t.w=o.length}return ie(r,e.level==null?6:e.level,e.mem==null?t.l?Math.ceil(Math.max(8,Math.min(13,Math.log(r.length)))*1.5):20:12+e.mem,a,n,t)},$r=function(r,e,a){for(;a;++e)r[e]=a,a>>>=8},le=function(r,e){var a=e.level,n=a==0?0:a<6?1:a==9?3:2;if(r[0]=120,r[1]=n<<6|(e.dictionary&&32),r[1]|=31-(r[0]<<8|r[1])%31,e.dictionary){var t=Pr();t.p(e.dictionary),$r(r,2,t.d())}},se=function(r,e){return((r[0]&15)!=8||r[0]>>4>7||(r[0]<<8|r[1])%31)&&G(6,"invalid zlib data"),(r[1]>>5&1)==1&&G(6,"invalid zlib data: "+(r[1]&32?"need":"unexpected")+" dictionary"),(r[1]>>3&4)+2};function ce(r,e){e||(e={});var a=Pr();a.p(r);var n=ve(r,e,e.dictionary?6:2,4);return le(n,e),$r(n,n.length-4,a.d()),n}function ue(r,e){return oe(r.subarray(se(r),-4),{i:2},e,e)}var Ir=typeof TextEncoder<"u"&&new TextEncoder,dr=typeof TextDecoder<"u"&&new TextDecoder,he=0;try{dr.decode(Hr,{stream:!0}),he=1}catch{}var ge=function(r){for(var e="",a=0;;){var n=r[a++],t=(n>127)+(n>223)+(n>239);if(a+t>r.length)return{s:e,r:cr(r,a-1)};t?t==3?(n=((n&15)<<18|(r[a++]&63)<<12|(r[a++]&63)<<6|r[a++]&63)-65536,e+=String.fromCharCode(55296|n>>10,56320|n&1023)):t&1?e+=String.fromCharCode((n&31)<<6|r[a++]&63):e+=String.fromCharCode((n&15)<<12|(r[a++]&63)<<6|r[a++]&63):e+=String.fromCharCode(n)}};function Or(r,e){if(e){for(var a=new T(r.length),n=0;n>1)),v=0,l=function(f){o[v++]=f},n=0;no.length){var h=new T(v+8+(t-n<<1));h.set(o),o=h}var c=r.charCodeAt(n);c<128||e?l(c):c<2048?(l(192|c>>6),l(128|c&63)):c>55295&&c<57344?(c=65536+(c&1047552)|r.charCodeAt(++n)&1023,l(240|c>>18),l(128|c>>12&63),l(128|c>>6&63),l(128|c&63)):(l(224|c>>12),l(128|c>>6&63),l(128|c&63))}return cr(o,0,v)}function kr(r,e){if(e){for(var a="",n=0;n`,br=``;function xe(r){if(typeof r!="object"||r===null)return!1;const e=r;return!(typeof e.history!="object"||"followupMessages"in e&&typeof e.followupMessages!="object"||"chatOptions"in e&&typeof e.chatOptions!="object"||"serverState"in e&&typeof e.serverState!="object"||"conversationId"in e&&typeof e.conversationId!="string"&&typeof e.conversationId!="object")}function be(){const{restore:r}=Gr(),{isOpen:e,onOpen:a,onClose:n}=Jr(),[t,o]=hr.useState(Dr),v=hr.useRef(null),{getCurrentConversation:l}=Wr(f=>f.primitives),h=()=>{const{chatOptions:f,history:i,serverState:u,conversationId:x,followupMessages:S}=l(),w=Vr({chatOptions:f,history:i,serverState:u,conversationId:x,followupMessages:S}),d=Or(`${Sr}${JSON.stringify(w)}${br}`),m=btoa(kr(ce(d,{level:9}),!0));navigator.clipboard.writeText(m),o(we),n(),v.current&&clearTimeout(v.current),v.current=setTimeout(()=>{o(Dr)},2e3)},c=()=>{n()};return hr.useEffect(()=>{const f=i=>{if(!i.clipboardData)return;const u=i.clipboardData.types;if(!u.includes("text/plain")&&!u.includes("text"))return;const x=i.clipboardData.getData("text/plain")??i.clipboardData.getData("text");try{const S=atob(x);if(!S.startsWith("xÚ"))return;const w=kr(ue(Or(S,!0)));if(!w.startsWith(Sr)||!w.endsWith(br))return;i.preventDefault(),i.stopPropagation();const d=w.slice(Sr.length,-br.length),m=JSON.parse(d);if(!xe(m))return;r(m.history,m.followupMessages,m.chatOptions,m.serverState,m.conversationId)}catch(S){console.error("Couldn't parse pasted string as valid Ragbits state",S)}};return window.addEventListener("paste",f),()=>{window.removeEventListener("paste",f)}}),k.jsxs(k.Fragment,{children:[k.jsx(qr,{content:"Share conversation",placement:"bottom",children:k.jsx(gr,{isIconOnly:!0,variant:"ghost",className:"p-0","aria-label":"Share conversation",onPress:a,children:k.jsx(Yr,{icon:t})})}),k.jsx(Kr,{isOpen:e,onOpenChange:c,children:k.jsx(Lr,{children:f=>k.jsxs(k.Fragment,{children:[k.jsx(Xr,{className:"text-default-900 flex flex-col gap-1",children:"Share conversation"}),k.jsx(Qr,{children:k.jsxs("div",{className:"flex flex-col gap-4",children:[k.jsx("p",{className:"text-medium text-default-500",children:"You are about to copy a code that allows sharing and storing your current app state. Once copied, you can paste this code anywhere on the site to instantly return to this exact setup. It’s a quick way to save your progress or share it with others."}),k.jsxs("div",{className:"flex justify-end gap-4 py-4",children:[k.jsx(gr,{color:"danger",variant:"light",onPress:f,"aria-label":"Close share modal",children:"Cancel"}),k.jsx(gr,{color:"primary",onPress:h,"aria-label":"Copy to clipboard to share the conversation",children:"Copy to clipboard"})]})]})})]})})})]})}export{be as default}; +import{av as Gr,u as Jr,r as hr,i as Wr,j as I,D as qr,d as gr,I as Yr,m as Kr,e as Lr,f as Qr,aw as Vr}from"./index-DaG4uPnK.js";import{m as Xr}from"./chunk-IGSAU2ZA-Beuyhkep.js";var T=Uint8Array,$=Uint16Array,jr=Int32Array,lr=new T([0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0,0,0,0]),sr=new T([0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13,0,0]),pr=new T([16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15]),Nr=function(r,e){for(var a=new $(31),n=0;n<31;++n)a[n]=e+=1<>1|(y&21845)<<1;Q=(Q&52428)>>2|(Q&13107)<<2,Q=(Q&61680)>>4|(Q&3855)<<4,Cr[y]=((Q&65280)>>8|(Q&255)<<8)>>1}var q=function(r,e,a){for(var n=r.length,t=0,o=new $(e);t>h]=c}else for(l=new $(n),t=0;t>15-r[t]);return l},V=new T(288);for(var y=0;y<144;++y)V[y]=8;for(var y=144;y<256;++y)V[y]=9;for(var y=256;y<280;++y)V[y]=7;for(var y=280;y<288;++y)V[y]=8;var fr=new T(32);for(var y=0;y<32;++y)fr[y]=5;var re=q(V,9,0),ee=q(V,9,1),ae=q(fr,5,0),ne=q(fr,5,1),wr=function(r){for(var e=r[0],a=1;ae&&(e=r[a]);return e},J=function(r,e,a){var n=e/8|0;return(r[n]|r[n+1]<<8)>>(e&7)&a},xr=function(r,e){var a=e/8|0;return(r[a]|r[a+1]<<8|r[a+2]<<16)>>(e&7)},Ar=function(r){return(r+7)/8|0},cr=function(r,e,a){return(e==null||e<0)&&(e=0),(a==null||a>r.length)&&(a=r.length),new T(r.subarray(e,a))},te=["unexpected EOF","invalid block type","invalid length/literal","invalid distance","stream finished","no stream handler",,"no callback","invalid UTF-8 data","extra field too long","date not in range 1980-2099","filename too long","stream finishing","invalid zip data"],G=function(r,e,a){var n=new Error(e||te[r]);if(n.code=r,Error.captureStackTrace&&Error.captureStackTrace(n,G),!a)throw n;return n},oe=function(r,e,a,n){var t=r.length,o=0;if(!t||e.f&&!e.l)return a||new T(0);var v=!a,l=v||e.i!=2,h=e.i;v&&(a=new T(t*3));var c=function(ar){var nr=a.length;if(ar>nr){var rr=new T(Math.max(nr*2,ar));rr.set(a),a=rr}},f=e.f||0,i=e.p||0,u=e.b||0,x=e.l,S=e.d,w=e.m,d=e.n,m=t*8;do{if(!x){f=J(r,i,1);var R=J(r,i+1,3);if(i+=3,R)if(R==1)x=ee,S=ne,w=9,d=5;else if(R==2){var N=J(r,i,31)+257,A=J(r,i+10,15)+4,g=N+J(r,i+5,31)+1;i+=14;for(var s=new T(g),M=new T(19),C=0;C>4;if(j<16)s[C++]=j;else{var E=0,b=0;for(j==16?(b=3+J(r,i,3),i+=2,E=s[C-1]):j==17?(b=3+J(r,i,7),i+=3):j==18&&(b=11+J(r,i,127),i+=7);b--;)s[C++]=E}}var z=s.subarray(0,N),F=s.subarray(N);w=wr(z),d=wr(F),x=q(z,w,1),S=q(F,d,1)}else G(1);else{var j=Ar(i)+4,D=r[j-4]|r[j-3]<<8,O=j+D;if(O>t){h&&G(0);break}l&&c(u+D),a.set(r.subarray(j,O),u),e.b=u+=D,e.p=i=O*8,e.f=f;continue}if(i>m){h&&G(0);break}}l&&c(u+131072);for(var er=(1<>4;if(i+=E&15,i>m){h&&G(0);break}if(E||G(2),H<256)a[u++]=H;else if(H==256){Y=i,x=null;break}else{var P=H-254;if(H>264){var C=H-257,p=lr[C];P=J(r,i,(1<>4;W||G(3),i+=W&15;var F=Zr[X];if(X>3){var p=sr[X];F+=xr(r,i)&(1<m){h&&G(0);break}l&&c(u+131072);var Z=u+P;if(u>8},tr=function(r,e,a){a<<=e&7;var n=e/8|0;r[n]|=a,r[n+1]|=a>>8,r[n+2]|=a>>16},yr=function(r,e){for(var a=[],n=0;nu&&(u=o[n].s);var x=new $(u+1),S=Tr(a[f-1],x,0);if(S>e){var n=0,w=0,d=S-e,m=1<e)w+=m-(1<>=d;w>0;){var j=o[n].s;x[j]=0&&w;--n){var D=o[n].s;x[D]==e&&(--x[D],++w)}S=e}return{t:new T(x),l:S}},Tr=function(r,e,a){return r.s==-1?Math.max(Tr(r.l,e,a+1),Tr(r.r,e,a+1)):e[r.s]=a},Er=function(r){for(var e=r.length;e&&!r[--e];);for(var a=new $(++e),n=0,t=r[0],o=1,v=function(h){a[n++]=h},l=1;l<=e;++l)if(r[l]==t&&l!=e)++o;else{if(!t&&o>2){for(;o>138;o-=138)v(32754);o>2&&(v(o>10?o-11<<5|28690:o-3<<5|12305),o=0)}else if(o>3){for(v(t),--o;o>6;o-=6)v(8304);o>2&&(v(o-3<<5|8208),o=0)}for(;o--;)v(t);o=1,t=r[l]}return{c:a.subarray(0,n),n:e}},or=function(r,e){for(var a=0,n=0;n>8,r[t+2]=r[t]^255,r[t+3]=r[t+1]^255;for(var o=0;o4&&!M[pr[k-1]];--k);var L=c+5<<3,U=or(t,V)+or(o,fr)+v,_=or(t,u)+or(o,w)+v+14+3*k+or(A,M)+2*A[16]+3*A[17]+7*A[18];if(h>=0&&L<=U&&L<=_)return Ur(e,f,r.subarray(h,h+c));var E,b,z,F;if(K(e,f,1+(_15&&(K(e,f,H[g]>>5&127),f+=H[g]>>12)}}else E=re,b=V,z=ae,F=fr;for(var g=0;g255){var P=p>>18&31;tr(e,f,E[P+257]),f+=b[P+257],P>7&&(K(e,f,p>>23&31),f+=lr[P]);var W=p&31;tr(e,f,z[W]),f+=F[W],W>3&&(tr(e,f,p>>5&8191),f+=sr[W])}else tr(e,f,E[p]),f+=b[p]}return tr(e,f,E[256]),f+b[256]},fe=new jr([65540,131080,131088,131104,262176,1048704,1048832,2114560,2117632]),Hr=new T(0),ie=function(r,e,a,n,t,o){var v=o.z||r.length,l=new T(n+v+5*(1+Math.ceil(v/7e3))+t),h=l.subarray(n,l.length-t),c=o.l,f=(o.r||0)&7;if(e){f&&(h[0]=o.r>>3);for(var i=fe[e-1],u=i>>13,x=i&8191,S=(1<7e3||M>24576)&&(E>423||!c)){f=Fr(r,h,0,D,O,N,g,M,k,s-k,f),M=A=g=0,k=s;for(var b=0;b<286;++b)O[b]=0;for(var b=0;b<30;++b)N[b]=0}var z=2,F=0,er=x,B=U-_&32767;if(E>2&&L==j(s-B))for(var Y=Math.min(u,E)-1,H=Math.min(32767,s),P=Math.min(258,E);B<=H&&--er&&U!=_;){if(r[s+z]==r[s+z-B]){for(var p=0;pz){if(z=p,F=B,p>Y)break;for(var W=Math.min(B,p-2),X=0,b=0;bX&&(X=vr,_=Z)}}}U=_,_=w[U],B+=U-_&32767}if(F){D[M++]=268435456|mr[z]<<18|Mr[F];var ar=mr[z]&31,nr=Mr[F]&31;g+=lr[ar]+sr[nr],++O[257+ar],++N[nr],C=s+z,++A}else D[M++]=r[s],++O[r[s]]}}for(s=Math.max(s,C);s=v&&(h[f/8|0]=c,rr=v),f=Ur(h,f+1,r.subarray(s,rr))}o.i=v}return cr(l,0,n+Ar(f)+t)},Pr=function(){var r=1,e=0;return{p:function(a){for(var n=r,t=e,o=a.length|0,v=0;v!=o;){for(var l=Math.min(v+2655,o);v>16),t=(t&65535)+15*(t>>16)}r=n,e=t},d:function(){return r%=65521,e%=65521,(r&255)<<24|(r&65280)<<8|(e&255)<<8|e>>8}}},ve=function(r,e,a,n,t){if(!t&&(t={l:1},e.dictionary)){var o=e.dictionary.subarray(-32768),v=new T(o.length+r.length);v.set(o),v.set(r,o.length),r=v,t.w=o.length}return ie(r,e.level==null?6:e.level,e.mem==null?t.l?Math.ceil(Math.max(8,Math.min(13,Math.log(r.length)))*1.5):20:12+e.mem,a,n,t)},$r=function(r,e,a){for(;a;++e)r[e]=a,a>>>=8},le=function(r,e){var a=e.level,n=a==0?0:a<6?1:a==9?3:2;if(r[0]=120,r[1]=n<<6|(e.dictionary&&32),r[1]|=31-(r[0]<<8|r[1])%31,e.dictionary){var t=Pr();t.p(e.dictionary),$r(r,2,t.d())}},se=function(r,e){return((r[0]&15)!=8||r[0]>>4>7||(r[0]<<8|r[1])%31)&&G(6,"invalid zlib data"),(r[1]>>5&1)==1&&G(6,"invalid zlib data: "+(r[1]&32?"need":"unexpected")+" dictionary"),(r[1]>>3&4)+2};function ce(r,e){e||(e={});var a=Pr();a.p(r);var n=ve(r,e,e.dictionary?6:2,4);return le(n,e),$r(n,n.length-4,a.d()),n}function ue(r,e){return oe(r.subarray(se(r),-4),{i:2},e,e)}var Or=typeof TextEncoder<"u"&&new TextEncoder,dr=typeof TextDecoder<"u"&&new TextDecoder,he=0;try{dr.decode(Hr,{stream:!0}),he=1}catch{}var ge=function(r){for(var e="",a=0;;){var n=r[a++],t=(n>127)+(n>223)+(n>239);if(a+t>r.length)return{s:e,r:cr(r,a-1)};t?t==3?(n=((n&15)<<18|(r[a++]&63)<<12|(r[a++]&63)<<6|r[a++]&63)-65536,e+=String.fromCharCode(55296|n>>10,56320|n&1023)):t&1?e+=String.fromCharCode((n&31)<<6|r[a++]&63):e+=String.fromCharCode((n&15)<<12|(r[a++]&63)<<6|r[a++]&63):e+=String.fromCharCode(n)}};function kr(r,e){if(e){for(var a=new T(r.length),n=0;n>1)),v=0,l=function(f){o[v++]=f},n=0;no.length){var h=new T(v+8+(t-n<<1));h.set(o),o=h}var c=r.charCodeAt(n);c<128||e?l(c):c<2048?(l(192|c>>6),l(128|c&63)):c>55295&&c<57344?(c=65536+(c&1047552)|r.charCodeAt(++n)&1023,l(240|c>>18),l(128|c>>12&63),l(128|c>>6&63),l(128|c&63)):(l(224|c>>12),l(128|c>>6&63),l(128|c&63))}return cr(o,0,v)}function Ir(r,e){if(e){for(var a="",n=0;n`,br=``;function xe(r){if(typeof r!="object"||r===null)return!1;const e=r;return!(typeof e.history!="object"||"followupMessages"in e&&typeof e.followupMessages!="object"||"chatOptions"in e&&typeof e.chatOptions!="object"||"serverState"in e&&typeof e.serverState!="object"||"conversationId"in e&&typeof e.conversationId!="string"&&typeof e.conversationId!="object")}function be(){const{restore:r}=Gr(),{isOpen:e,onOpen:a,onClose:n}=Jr(),[t,o]=hr.useState(Dr),v=hr.useRef(null),{getCurrentConversation:l}=Wr(f=>f.primitives),h=()=>{const{chatOptions:f,history:i,serverState:u,conversationId:x,followupMessages:S}=l(),w=Vr({chatOptions:f,history:i,serverState:u,conversationId:x,followupMessages:S}),d=kr(`${Sr}${JSON.stringify(w)}${br}`),m=btoa(Ir(ce(d,{level:9}),!0));navigator.clipboard.writeText(m),o(we),n(),v.current&&clearTimeout(v.current),v.current=setTimeout(()=>{o(Dr)},2e3)},c=()=>{n()};return hr.useEffect(()=>{const f=i=>{if(!i.clipboardData)return;const u=i.clipboardData.types;if(!u.includes("text/plain")&&!u.includes("text"))return;const x=i.clipboardData.getData("text/plain")??i.clipboardData.getData("text");try{const S=atob(x);if(!S.startsWith("xÚ"))return;const w=Ir(ue(kr(S,!0)));if(!w.startsWith(Sr)||!w.endsWith(br))return;i.preventDefault(),i.stopPropagation();const d=w.slice(Sr.length,-br.length),m=JSON.parse(d);if(!xe(m))return;r(m.history,m.followupMessages,m.chatOptions,m.serverState,m.conversationId)}catch(S){console.error("Couldn't parse pasted string as valid Ragbits state",S)}};return window.addEventListener("paste",f),()=>{window.removeEventListener("paste",f)}}),I.jsxs(I.Fragment,{children:[I.jsx(qr,{content:"Share conversation",placement:"bottom",children:I.jsx(gr,{isIconOnly:!0,variant:"ghost",className:"p-0","aria-label":"Share conversation",onPress:a,children:I.jsx(Yr,{icon:t})})}),I.jsx(Kr,{isOpen:e,onOpenChange:c,children:I.jsx(Lr,{children:f=>I.jsxs(I.Fragment,{children:[I.jsx(Xr,{className:"text-default-900 flex flex-col gap-1",children:"Share conversation"}),I.jsx(Qr,{children:I.jsxs("div",{className:"flex flex-col gap-4",children:[I.jsx("p",{className:"text-medium text-default-500",children:"You are about to copy a code that allows sharing and storing your current app state. Once copied, you can paste this code anywhere on the site to instantly return to this exact setup. It’s a quick way to save your progress or share it with others."}),I.jsxs("div",{className:"flex justify-end gap-4 py-4",children:[I.jsx(gr,{color:"danger",variant:"light",onPress:f,"aria-label":"Close share modal",children:"Cancel"}),I.jsx(gr,{color:"primary",onPress:h,"aria-label":"Copy to clipboard to share the conversation",children:"Copy to clipboard"})]})]})})]})})})]})}export{be as default}; diff --git a/packages/ragbits-chat/src/ragbits/chat/ui-build/assets/UsageButton-I3vvJAZH.js b/packages/ragbits-chat/src/ragbits/chat/ui-build/assets/UsageButton-I3vvJAZH.js deleted file mode 100644 index 42024c530..000000000 --- a/packages/ragbits-chat/src/ragbits/chat/ui-build/assets/UsageButton-I3vvJAZH.js +++ /dev/null @@ -1 +0,0 @@ -import{r as B,aQ as Ml,aR as ae,t as Ne,l as ie,n as z,aS as W,aT as U,aU as te,aV as Tl,W as _,aW as Rl,aX as Vl,a3 as ze,aY as ue,aZ as Ol,k as pe,a7 as Hl,a8 as J,a9 as Ll,a_ as L,as as Ul,a$ as Y,b0 as Z,b1 as le,ac as Wl,b2 as Gl,b3 as Ce,b4 as Yl,O as T,A as M,G as X,J as K,j as h,w as I,M as w,aC as be,aH as Fe,ag as O,Z as Zl,a1 as _l,a0 as ql,ai as q,x as Jl,y as Pe,H as Ke,ae as Ie,u as Xl,aF as De,D as Ql,d as eu,I as tu,m as lu,e as uu,f as nu,b5 as ou}from"./index-BTypXP0X.js";import{b as fe,a as je,C as su,u as iu}from"./index-nfbmdcVN.js";import{m as ru}from"./chunk-IGSAU2ZA-RYoue1Xd.js";function Me(e,t){const l=B.useRef(!0),u=B.useRef(null);B.useEffect(()=>(l.current=!0,()=>{l.current=!1}),[]),B.useEffect(()=>{let o=u.current;l.current?l.current=!1:(!o||t.some((n,i)=>!Object.is(n,o[i])))&&e(),u.current=t},t)}function au(e,t){let l=t?.isDisabled,[u,o]=B.useState(!1);return Ml(()=>{if(e?.current&&!l){let n=()=>{if(e.current){let a=ae(e.current,{tabbable:!0});o(!!a.nextNode())}};n();let i=new MutationObserver(n);return i.observe(e.current,{subtree:!0,childList:!0,attributes:!0,attributeFilter:["tabIndex","disabled"]}),()=>{i.disconnect()}}}),l?!1:u}var Be=Ne({base:"w-px h-px inline-block",variants:{isInline:{true:"inline-block",false:"block"}},defaultVariants:{isInline:!1}}),ke=Ne({slots:{base:"flex flex-col relative gap-4",wrapper:["p-4","z-0","flex","flex-col","relative","justify-between","gap-4","shadow-small","bg-content1","overflow-auto"],table:"min-w-full h-auto",thead:"[&>tr]:first:rounded-lg",tbody:"after:block",tr:["group/tr","outline-hidden",...ie],th:["group/th","px-3","h-10","text-start","align-middle","bg-default-100","whitespace-nowrap","text-foreground-500","text-tiny","font-semibold","first:rounded-s-lg","last:rounded-e-lg","outline-hidden","data-[sortable=true]:cursor-pointer","data-[hover=true]:text-foreground-400",...ie],td:["py-2","px-3","relative","align-middle","whitespace-normal","text-small","font-normal","outline-hidden","[&>*]:z-1","[&>*]:relative",...ie,"before:pointer-events-none","before:content-['']","before:absolute","before:z-0","before:inset-0","before:opacity-0","data-[selected=true]:before:opacity-100","group-data-[disabled=true]/tr:text-foreground-300","group-data-[disabled=true]/tr:cursor-not-allowed"],tfoot:"",sortIcon:["ms-2","mb-px","opacity-0","text-inherit","inline-block","transition-transform-opacity","data-[visible=true]:opacity-100","group-data-[hover=true]/th:opacity-100","data-[direction=ascending]:rotate-180"],emptyWrapper:"text-foreground-400 align-middle text-center h-40",loadingWrapper:"absolute inset-0 flex items-center justify-center"},variants:{color:{default:{td:"before:bg-default/60 data-[selected=true]:text-default-foreground"},primary:{td:"before:bg-primary/20 data-[selected=true]:text-primary"},secondary:{td:"before:bg-secondary/20 data-[selected=true]:text-secondary"},success:{td:"before:bg-success/20 data-[selected=true]:text-success-600 dark:data-[selected=true]:text-success"},warning:{td:"before:bg-warning/20 data-[selected=true]:text-warning-600 dark:data-[selected=true]:text-warning"},danger:{td:"before:bg-danger/20 data-[selected=true]:text-danger dark:data-[selected=true]:text-danger-500"}},layout:{auto:{table:"table-auto"},fixed:{table:"table-fixed"}},shadow:{none:{wrapper:"shadow-none"},sm:{wrapper:"shadow-small"},md:{wrapper:"shadow-medium"},lg:{wrapper:"shadow-large"}},hideHeader:{true:{thead:"hidden"}},isStriped:{true:{td:["group-data-[odd=true]/tr:before:bg-default-100","group-data-[odd=true]/tr:before:opacity-100","group-data-[odd=true]/tr:before:-z-10"]}},isCompact:{true:{td:"py-1"},false:{}},isHeaderSticky:{true:{thead:"sticky top-0 z-20 [&>tr]:first:shadow-small"}},isSelectable:{true:{tr:"cursor-default",td:["group-aria-[selected=false]/tr:group-data-[hover=true]/tr:before:bg-default-100","group-aria-[selected=false]/tr:group-data-[hover=true]/tr:before:opacity-70"]}},isMultiSelectable:{true:{td:["group-data-[first=true]/tr:first:before:rounded-ss-lg","group-data-[first=true]/tr:last:before:rounded-se-lg","group-data-[middle=true]/tr:before:rounded-none","group-data-[last=true]/tr:first:before:rounded-es-lg","group-data-[last=true]/tr:last:before:rounded-ee-lg"]},false:{td:["first:before:rounded-s-lg","last:before:rounded-e-lg"]}},radius:{none:{wrapper:"rounded-none",th:["first:rounded-s-none","first:before:rounded-s-none","last:rounded-e-none","last:before:rounded-e-none"],td:["first:before:rounded-s-none","last:before:rounded-e-none","group-data-[first=true]/tr:first:before:rounded-ss-none","group-data-[first=true]/tr:last:before:rounded-se-none","group-data-[last=true]/tr:first:before:rounded-es-none","group-data-[last=true]/tr:last:before:rounded-ee-none"]},sm:{wrapper:"rounded-small"},md:{wrapper:"rounded-medium"},lg:{wrapper:"rounded-large"}},fullWidth:{true:{base:"w-full",wrapper:"w-full",table:"w-full"}},align:{start:{th:"text-start",td:"text-start"},center:{th:"text-center",td:"text-center"},end:{th:"text-end",td:"text-end"}}},defaultVariants:{layout:"auto",shadow:"sm",radius:"lg",color:"default",isCompact:!1,hideHeader:!1,isStriped:!1,fullWidth:!0,align:"start"},compoundVariants:[{isStriped:!0,color:"default",class:{td:"group-data-[odd=true]/tr:data-[selected=true]/tr:before:bg-default/60"}},{isStriped:!0,color:"primary",class:{td:"group-data-[odd=true]/tr:data-[selected=true]/tr:before:bg-primary/20"}},{isStriped:!0,color:"secondary",class:{td:"group-data-[odd=true]/tr:data-[selected=true]/tr:before:bg-secondary/20"}},{isStriped:!0,color:"success",class:{td:"group-data-[odd=true]/tr:data-[selected=true]/tr:before:bg-success/20"}},{isStriped:!0,color:"warning",class:{td:"group-data-[odd=true]/tr:data-[selected=true]/tr:before:bg-warning/20"}},{isStriped:!0,color:"danger",class:{td:"group-data-[odd=true]/tr:data-[selected=true]/tr:before:bg-danger/20"}}]});const he=new WeakMap;function ce(e){return typeof e=="string"?e.replace(/\s*/g,""):""+e}function cu(e,t){let l=he.get(e);if(!l)throw new Error("Unknown grid");return`${l}-${ce(t)}`}function Te(e,t,l){let u=he.get(e);if(!u)throw new Error("Unknown grid");return`${u}-${ce(t)}-${ce(l)}`}function Re(e,t){return[...e.collection.rowHeaderColumnKeys].map(l=>Te(e,t,l)).join(" ")}var Ve={};Ve={ascending:"تصاعدي",ascendingSort:e=>`ترتيب حسب العمود ${e.columnName} بترتيب تصاعدي`,columnSize:e=>`${e.value} بالبكسل`,descending:"تنازلي",descendingSort:e=>`ترتيب حسب العمود ${e.columnName} بترتيب تنازلي`,resizerDescription:"اضغط على مفتاح Enter لبدء تغيير الحجم",select:"تحديد",selectAll:"تحديد الكل",sortable:"عمود قابل للترتيب"};var Oe={};Oe={ascending:"възходящ",ascendingSort:e=>`сортирано по колона ${e.columnName} във възходящ ред`,columnSize:e=>`${e.value} пиксела`,descending:"низходящ",descendingSort:e=>`сортирано по колона ${e.columnName} в низходящ ред`,resizerDescription:"Натиснете „Enter“, за да започнете да преоразмерявате",select:"Изберете",selectAll:"Изберете всичко",sortable:"сортираща колона"};var He={};He={ascending:"vzestupně",ascendingSort:e=>`řazeno vzestupně podle sloupce ${e.columnName}`,columnSize:e=>`${e.value} pixelů`,descending:"sestupně",descendingSort:e=>`řazeno sestupně podle sloupce ${e.columnName}`,resizerDescription:"Stisknutím klávesy Enter začnete měnit velikost",select:"Vybrat",selectAll:"Vybrat vše",sortable:"sloupec s možností řazení"};var Le={};Le={ascending:"stigende",ascendingSort:e=>`sorteret efter kolonne ${e.columnName} i stigende rækkefølge`,columnSize:e=>`${e.value} pixels`,descending:"faldende",descendingSort:e=>`sorteret efter kolonne ${e.columnName} i faldende rækkefølge`,resizerDescription:"Tryk på Enter for at ændre størrelse",select:"Vælg",selectAll:"Vælg alle",sortable:"sorterbar kolonne"};var Ue={};Ue={ascending:"aufsteigend",ascendingSort:e=>`sortiert nach Spalte ${e.columnName} in aufsteigender Reihenfolge`,columnSize:e=>`${e.value} Pixel`,descending:"absteigend",descendingSort:e=>`sortiert nach Spalte ${e.columnName} in absteigender Reihenfolge`,resizerDescription:"Eingabetaste zum Starten der Größenänderung drücken",select:"Auswählen",selectAll:"Alles auswählen",sortable:"sortierbare Spalte"};var We={};We={ascending:"αύξουσα",ascendingSort:e=>`διαλογή ανά στήλη ${e.columnName} σε αύξουσα σειρά`,columnSize:e=>`${e.value} pixel`,descending:"φθίνουσα",descendingSort:e=>`διαλογή ανά στήλη ${e.columnName} σε φθίνουσα σειρά`,resizerDescription:"Πατήστε Enter για έναρξη της αλλαγής μεγέθους",select:"Επιλογή",selectAll:"Επιλογή όλων",sortable:"Στήλη διαλογής"};var Ge={};Ge={select:"Select",selectAll:"Select All",sortable:"sortable column",ascending:"ascending",descending:"descending",ascendingSort:e=>`sorted by column ${e.columnName} in ascending order`,descendingSort:e=>`sorted by column ${e.columnName} in descending order`,columnSize:e=>`${e.value} pixels`,resizerDescription:"Press Enter to start resizing"};var Ye={};Ye={ascending:"ascendente",ascendingSort:e=>`ordenado por columna ${e.columnName} en sentido ascendente`,columnSize:e=>`${e.value} píxeles`,descending:"descendente",descendingSort:e=>`ordenado por columna ${e.columnName} en orden descendente`,resizerDescription:"Pulse Intro para empezar a redimensionar",select:"Seleccionar",selectAll:"Seleccionar todos",sortable:"columna ordenable"};var Ze={};Ze={ascending:"tõusev järjestus",ascendingSort:e=>`sorditud veeru järgi ${e.columnName} tõusvas järjestuses`,columnSize:e=>`${e.value} pikslit`,descending:"laskuv järjestus",descendingSort:e=>`sorditud veeru järgi ${e.columnName} laskuvas järjestuses`,resizerDescription:"Suuruse muutmise alustamiseks vajutage klahvi Enter",select:"Vali",selectAll:"Vali kõik",sortable:"sorditav veerg"};var _e={};_e={ascending:"nouseva",ascendingSort:e=>`lajiteltu sarakkeen ${e.columnName} mukaan nousevassa järjestyksessä`,columnSize:e=>`${e.value} pikseliä`,descending:"laskeva",descendingSort:e=>`lajiteltu sarakkeen ${e.columnName} mukaan laskevassa järjestyksessä`,resizerDescription:"Aloita koon muutos painamalla Enter-näppäintä",select:"Valitse",selectAll:"Valitse kaikki",sortable:"lajiteltava sarake"};var qe={};qe={ascending:"croissant",ascendingSort:e=>`trié en fonction de la colonne ${e.columnName} par ordre croissant`,columnSize:e=>`${e.value} pixels`,descending:"décroissant",descendingSort:e=>`trié en fonction de la colonne ${e.columnName} par ordre décroissant`,resizerDescription:"Appuyez sur Entrée pour commencer le redimensionnement.",select:"Sélectionner",selectAll:"Sélectionner tout",sortable:"colonne triable"};var Je={};Je={ascending:"עולה",ascendingSort:e=>`מוין לפי עמודה ${e.columnName} בסדר עולה`,columnSize:e=>`${e.value} פיקסלים`,descending:"יורד",descendingSort:e=>`מוין לפי עמודה ${e.columnName} בסדר יורד`,resizerDescription:"הקש Enter כדי לשנות את הגודל",select:"בחר",selectAll:"בחר הכול",sortable:"עמודה שניתן למיין"};var Xe={};Xe={ascending:"rastući",ascendingSort:e=>`razvrstano po stupcima ${e.columnName} rastućem redoslijedom`,columnSize:e=>`${e.value} piksela`,descending:"padajući",descendingSort:e=>`razvrstano po stupcima ${e.columnName} padajućim redoslijedom`,resizerDescription:"Pritisnite Enter da biste započeli promenu veličine",select:"Odaberite",selectAll:"Odaberite sve",sortable:"stupac koji se može razvrstati"};var Qe={};Qe={ascending:"növekvő",ascendingSort:e=>`rendezve a(z) ${e.columnName} oszlop szerint, növekvő sorrendben`,columnSize:e=>`${e.value} képpont`,descending:"csökkenő",descendingSort:e=>`rendezve a(z) ${e.columnName} oszlop szerint, csökkenő sorrendben`,resizerDescription:"Nyomja le az Enter billentyűt az átméretezés megkezdéséhez",select:"Kijelölés",selectAll:"Összes kijelölése",sortable:"rendezendő oszlop"};var et={};et={ascending:"crescente",ascendingSort:e=>`in ordine crescente in base alla colonna ${e.columnName}`,columnSize:e=>`${e.value} pixel`,descending:"decrescente",descendingSort:e=>`in ordine decrescente in base alla colonna ${e.columnName}`,resizerDescription:"Premi Invio per iniziare a ridimensionare",select:"Seleziona",selectAll:"Seleziona tutto",sortable:"colonna ordinabile"};var tt={};tt={ascending:"昇順",ascendingSort:e=>`列 ${e.columnName} を昇順で並べ替え`,columnSize:e=>`${e.value} ピクセル`,descending:"降順",descendingSort:e=>`列 ${e.columnName} を降順で並べ替え`,resizerDescription:"Enter キーを押してサイズ変更を開始",select:"選択",selectAll:"すべて選択",sortable:"並べ替え可能な列"};var lt={};lt={ascending:"오름차순",ascendingSort:e=>`${e.columnName} 열을 기준으로 오름차순으로 정렬됨`,columnSize:e=>`${e.value} 픽셀`,descending:"내림차순",descendingSort:e=>`${e.columnName} 열을 기준으로 내림차순으로 정렬됨`,resizerDescription:"크기 조정을 시작하려면 Enter를 누르세요.",select:"선택",selectAll:"모두 선택",sortable:"정렬 가능한 열"};var ut={};ut={ascending:"didėjančia tvarka",ascendingSort:e=>`surikiuota pagal stulpelį ${e.columnName} didėjančia tvarka`,columnSize:e=>`${e.value} piks.`,descending:"mažėjančia tvarka",descendingSort:e=>`surikiuota pagal stulpelį ${e.columnName} mažėjančia tvarka`,resizerDescription:"Paspauskite „Enter“, kad pradėtumėte keisti dydį",select:"Pasirinkti",selectAll:"Pasirinkti viską",sortable:"rikiuojamas stulpelis"};var nt={};nt={ascending:"augošā secībā",ascendingSort:e=>`kārtots pēc kolonnas ${e.columnName} augošā secībā`,columnSize:e=>`${e.value} pikseļi`,descending:"dilstošā secībā",descendingSort:e=>`kārtots pēc kolonnas ${e.columnName} dilstošā secībā`,resizerDescription:"Nospiediet Enter, lai sāktu izmēru mainīšanu",select:"Atlasīt",selectAll:"Atlasīt visu",sortable:"kārtojamā kolonna"};var ot={};ot={ascending:"stigende",ascendingSort:e=>`sortert etter kolonne ${e.columnName} i stigende rekkefølge`,columnSize:e=>`${e.value} piksler`,descending:"synkende",descendingSort:e=>`sortert etter kolonne ${e.columnName} i synkende rekkefølge`,resizerDescription:"Trykk på Enter for å starte størrelsesendring",select:"Velg",selectAll:"Velg alle",sortable:"kolonne som kan sorteres"};var st={};st={ascending:"oplopend",ascendingSort:e=>`gesorteerd in oplopende volgorde in kolom ${e.columnName}`,columnSize:e=>`${e.value} pixels`,descending:"aflopend",descendingSort:e=>`gesorteerd in aflopende volgorde in kolom ${e.columnName}`,resizerDescription:"Druk op Enter om het formaat te wijzigen",select:"Selecteren",selectAll:"Alles selecteren",sortable:"sorteerbare kolom"};var it={};it={ascending:"rosnąco",ascendingSort:e=>`posortowano według kolumny ${e.columnName} w porządku rosnącym`,columnSize:e=>`Liczba pikseli: ${e.value}`,descending:"malejąco",descendingSort:e=>`posortowano według kolumny ${e.columnName} w porządku malejącym`,resizerDescription:"Naciśnij Enter, aby rozpocząć zmienianie rozmiaru",select:"Zaznacz",selectAll:"Zaznacz wszystko",sortable:"kolumna z możliwością sortowania"};var rt={};rt={ascending:"crescente",ascendingSort:e=>`classificado pela coluna ${e.columnName} em ordem crescente`,columnSize:e=>`${e.value} pixels`,descending:"decrescente",descendingSort:e=>`classificado pela coluna ${e.columnName} em ordem decrescente`,resizerDescription:"Pressione Enter para começar a redimensionar",select:"Selecionar",selectAll:"Selecionar tudo",sortable:"coluna classificável"};var at={};at={ascending:"ascendente",ascendingSort:e=>`Ordenar por coluna ${e.columnName} em ordem ascendente`,columnSize:e=>`${e.value} pixels`,descending:"descendente",descendingSort:e=>`Ordenar por coluna ${e.columnName} em ordem descendente`,resizerDescription:"Prima Enter para iniciar o redimensionamento",select:"Selecionar",selectAll:"Selecionar tudo",sortable:"Coluna ordenável"};var ct={};ct={ascending:"crescătoare",ascendingSort:e=>`sortate după coloana ${e.columnName} în ordine crescătoare`,columnSize:e=>`${e.value} pixeli`,descending:"descrescătoare",descendingSort:e=>`sortate după coloana ${e.columnName} în ordine descrescătoare`,resizerDescription:"Apăsați pe Enter pentru a începe redimensionarea",select:"Selectare",selectAll:"Selectare totală",sortable:"coloană sortabilă"};var dt={};dt={ascending:"возрастание",ascendingSort:e=>`сортировать столбец ${e.columnName} в порядке возрастания`,columnSize:e=>`${e.value} пикс.`,descending:"убывание",descendingSort:e=>`сортировать столбец ${e.columnName} в порядке убывания`,resizerDescription:"Нажмите клавишу Enter для начала изменения размеров",select:"Выбрать",selectAll:"Выбрать все",sortable:"сортируемый столбец"};var mt={};mt={ascending:"vzostupne",ascendingSort:e=>`zoradené zostupne podľa stĺpca ${e.columnName}`,columnSize:e=>`Počet pixelov: ${e.value}`,descending:"zostupne",descendingSort:e=>`zoradené zostupne podľa stĺpca ${e.columnName}`,resizerDescription:"Stlačením klávesu Enter začnete zmenu veľkosti",select:"Vybrať",selectAll:"Vybrať všetko",sortable:"zoraditeľný stĺpec"};var pt={};pt={ascending:"naraščajoče",ascendingSort:e=>`razvrščeno po stolpcu ${e.columnName} v naraščajočem vrstnem redu`,columnSize:e=>`${e.value} slikovnih pik`,descending:"padajoče",descendingSort:e=>`razvrščeno po stolpcu ${e.columnName} v padajočem vrstnem redu`,resizerDescription:"Pritisnite tipko Enter da začnete spreminjati velikost",select:"Izberite",selectAll:"Izberite vse",sortable:"razvrstljivi stolpec"};var bt={};bt={ascending:"rastući",ascendingSort:e=>`sortirano po kolonama ${e.columnName} rastućim redosledom`,columnSize:e=>`${e.value} piksela`,descending:"padajući",descendingSort:e=>`sortirano po kolonama ${e.columnName} padajućim redosledom`,resizerDescription:"Pritisnite Enter da biste započeli promenu veličine",select:"Izaberite",selectAll:"Izaberite sve",sortable:"kolona koja se može sortirati"};var ft={};ft={ascending:"stigande",ascendingSort:e=>`sorterat på kolumn ${e.columnName} i stigande ordning`,columnSize:e=>`${e.value} pixlar`,descending:"fallande",descendingSort:e=>`sorterat på kolumn ${e.columnName} i fallande ordning`,resizerDescription:"Tryck på Retur för att börja ändra storlek",select:"Markera",selectAll:"Markera allt",sortable:"sorterbar kolumn"};var ht={};ht={ascending:"artan sırada",ascendingSort:e=>`${e.columnName} sütuna göre artan düzende sırala`,columnSize:e=>`${e.value} piksel`,descending:"azalan sırada",descendingSort:e=>`${e.columnName} sütuna göre azalan düzende sırala`,resizerDescription:"Yeniden boyutlandırmak için Enter'a basın",select:"Seç",selectAll:"Tümünü Seç",sortable:"Sıralanabilir sütun"};var vt={};vt={ascending:"висхідний",ascendingSort:e=>`відсортовано за стовпцем ${e.columnName} у висхідному порядку`,columnSize:e=>`${e.value} пікс.`,descending:"низхідний",descendingSort:e=>`відсортовано за стовпцем ${e.columnName} у низхідному порядку`,resizerDescription:"Натисніть Enter, щоб почати зміну розміру",select:"Вибрати",selectAll:"Вибрати все",sortable:"сортувальний стовпець"};var gt={};gt={ascending:"升序",ascendingSort:e=>`按列 ${e.columnName} 升序排序`,columnSize:e=>`${e.value} 像素`,descending:"降序",descendingSort:e=>`按列 ${e.columnName} 降序排序`,resizerDescription:"按“输入”键开始调整大小。",select:"选择",selectAll:"全选",sortable:"可排序的列"};var $t={};$t={ascending:"遞增",ascendingSort:e=>`已依據「${e.columnName}」欄遞增排序`,columnSize:e=>`${e.value} 像素`,descending:"遞減",descendingSort:e=>`已依據「${e.columnName}」欄遞減排序`,resizerDescription:"按 Enter 鍵以開始調整大小",select:"選取",selectAll:"全選",sortable:"可排序的欄"};var ne={};ne={"ar-AE":Ve,"bg-BG":Oe,"cs-CZ":He,"da-DK":Le,"de-DE":Ue,"el-GR":We,"en-US":Ge,"es-ES":Ye,"et-EE":Ze,"fi-FI":_e,"fr-FR":qe,"he-IL":Je,"hr-HR":Xe,"hu-HU":Qe,"it-IT":et,"ja-JP":tt,"ko-KR":lt,"lt-LT":ut,"lv-LV":nt,"nb-NO":ot,"nl-NL":st,"pl-PL":it,"pt-BR":rt,"pt-PT":at,"ro-RO":ct,"ru-RU":dt,"sk-SK":mt,"sl-SI":pt,"sr-SP":bt,"sv-SE":ft,"tr-TR":ht,"uk-UA":vt,"zh-CN":gt,"zh-TW":$t};class yt{isCell(t){return t.type==="cell"}isRow(t){return t.type==="row"||t.type==="item"}isDisabled(t){var l;return this.disabledBehavior==="all"&&(((l=t.props)===null||l===void 0?void 0:l.isDisabled)||this.disabledKeys.has(t.key))}findPreviousKey(t,l){let u=t!=null?this.collection.getKeyBefore(t):this.collection.getLastKey();for(;u!=null;){let o=this.collection.getItem(u);if(!o)return null;if(!this.isDisabled(o)&&(!l||l(o)))return u;u=this.collection.getKeyBefore(u)}return null}findNextKey(t,l){let u=t!=null?this.collection.getKeyAfter(t):this.collection.getFirstKey();for(;u!=null;){let o=this.collection.getItem(u);if(!o)return null;if(!this.isDisabled(o)&&(!l||l(o)))return u;if(u=this.collection.getKeyAfter(u),u==null)return null}return null}getKeyForItemInRowByIndex(t,l=0){if(l<0)return null;let u=this.collection.getItem(t);if(!u)return null;let o=0;for(let a of z(u,this.collection)){var n;if(a.colSpan&&a.colSpan+o>l)return(n=a.key)!==null&&n!==void 0?n:null;a.colSpan&&(o=o+a.colSpan-1);var i;if(o===l)return(i=a.key)!==null&&i!==void 0?i:null;o++}return null}getKeyBelow(t){let l=t,u=this.collection.getItem(l);if(!u)return null;var o;if(this.isCell(u)&&(l=(o=u.parentKey)!==null&&o!==void 0?o:null),l==null)return null;if(l=this.findNextKey(l,n=>n.type==="item"),l!=null){if(this.isCell(u)){let n=u.colIndex?u.colIndex:u.index;return this.getKeyForItemInRowByIndex(l,n)}if(this.focusMode==="row")return l}return null}getKeyAbove(t){let l=t,u=this.collection.getItem(l);if(!u)return null;var o;if(this.isCell(u)&&(l=(o=u.parentKey)!==null&&o!==void 0?o:null),l==null)return null;if(l=this.findPreviousKey(l,n=>n.type==="item"),l!=null){if(this.isCell(u)){let n=u.colIndex?u.colIndex:u.index;return this.getKeyForItemInRowByIndex(l,n)}if(this.focusMode==="row")return l}return null}getKeyRightOf(t){let l=this.collection.getItem(t);if(!l)return null;if(this.isRow(l)){var u,o;let d=z(l,this.collection);var n;return(n=this.direction==="rtl"?(u=W(d))===null||u===void 0?void 0:u.key:(o=U(d))===null||o===void 0?void 0:o.key)!==null&&n!==void 0?n:null}if(this.isCell(l)&&l.parentKey!=null){let d=this.collection.getItem(l.parentKey);if(!d)return null;let r=z(d,this.collection);var i;let p=(i=this.direction==="rtl"?te(r,l.index-1):te(r,l.index+1))!==null&&i!==void 0?i:null;var a;if(p)return(a=p.key)!==null&&a!==void 0?a:null;var m;if(this.focusMode==="row")return(m=l.parentKey)!==null&&m!==void 0?m:null;var c;return(c=this.direction==="rtl"?this.getFirstKey(t):this.getLastKey(t))!==null&&c!==void 0?c:null}return null}getKeyLeftOf(t){let l=this.collection.getItem(t);if(!l)return null;if(this.isRow(l)){var u,o;let d=z(l,this.collection);var n;return(n=this.direction==="rtl"?(u=U(d))===null||u===void 0?void 0:u.key:(o=W(d))===null||o===void 0?void 0:o.key)!==null&&n!==void 0?n:null}if(this.isCell(l)&&l.parentKey!=null){let d=this.collection.getItem(l.parentKey);if(!d)return null;let r=z(d,this.collection);var i;let p=(i=this.direction==="rtl"?te(r,l.index+1):te(r,l.index-1))!==null&&i!==void 0?i:null;var a;if(p)return(a=p.key)!==null&&a!==void 0?a:null;var m;if(this.focusMode==="row")return(m=l.parentKey)!==null&&m!==void 0?m:null;var c;return(c=this.direction==="rtl"?this.getLastKey(t):this.getFirstKey(t))!==null&&c!==void 0?c:null}return null}getFirstKey(t,l){let u=t??null,o;if(u!=null){if(o=this.collection.getItem(u),!o)return null;if(this.isCell(o)&&!l&&o.parentKey!=null){var n;let c=this.collection.getItem(o.parentKey);if(!c)return null;var i;return(i=(n=U(z(c,this.collection)))===null||n===void 0?void 0:n.key)!==null&&i!==void 0?i:null}}if(u=this.findNextKey(void 0,c=>c.type==="item"),u!=null&&(o&&this.isCell(o)&&l||this.focusMode==="cell")){var a;let c=this.collection.getItem(u);if(!c)return null;var m;u=(m=(a=U(z(c,this.collection)))===null||a===void 0?void 0:a.key)!==null&&m!==void 0?m:null}return u}getLastKey(t,l){let u=t??null,o;if(u!=null){if(o=this.collection.getItem(u),!o)return null;if(this.isCell(o)&&!l&&o.parentKey!=null){var n;let c=this.collection.getItem(o.parentKey);if(!c)return null;let d=z(c,this.collection);var i;return(i=(n=W(d))===null||n===void 0?void 0:n.key)!==null&&i!==void 0?i:null}}if(u=this.findPreviousKey(void 0,c=>c.type==="item"),u!=null&&(o&&this.isCell(o)&&l||this.focusMode==="cell")){var a;let c=this.collection.getItem(u);if(!c)return null;let d=z(c,this.collection);var m;u=(m=(a=W(d))===null||a===void 0?void 0:a.key)!==null&&m!==void 0?m:null}return u}getKeyPageAbove(t){let l=t,u=this.layoutDelegate.getItemRect(l);if(!u)return null;let o=Math.max(0,u.y+u.height-this.layoutDelegate.getVisibleRect().height);for(;u&&u.y>o&&l!=null;){var n;if(l=(n=this.getKeyAbove(l))!==null&&n!==void 0?n:null,l==null)break;u=this.layoutDelegate.getItemRect(l)}return l}getKeyPageBelow(t){let l=t,u=this.layoutDelegate.getItemRect(l);if(!u)return null;let o=this.layoutDelegate.getVisibleRect().height,n=Math.min(this.layoutDelegate.getContentSize().height,u.y+o);for(;u&&u.y+u.heightr.type==="item"),u==null&&!a&&(u=this.getFirstKey(),a=!0)}return null}constructor(t){if(this.collection=t.collection,this.disabledKeys=t.disabledKeys,this.disabledBehavior=t.disabledBehavior||"all",this.direction=t.direction,this.collator=t.collator,!t.layout&&!t.ref)throw new Error("Either a layout or a ref must be specified.");this.layoutDelegate=t.layoutDelegate||(t.layout?new du(t.layout):new Tl(t.ref)),this.focusMode=t.focusMode||"row"}}class du{getContentSize(){return this.layout.getContentSize()}getItemRect(t){var l;return((l=this.layout.getLayoutInfo(t))===null||l===void 0?void 0:l.rect)||null}getVisibleRect(){return this.layout.virtualizer.visibleRect}constructor(t){this.layout=t}}const ve=new WeakMap;var xt={};xt={deselectedItem:e=>`${e.item} غير المحدد`,longPressToSelect:"اضغط مطولًا للدخول إلى وضع التحديد.",select:"تحديد",selectedAll:"جميع العناصر المحددة.",selectedCount:(e,t)=>`${t.plural(e.count,{"=0":"لم يتم تحديد عناصر",one:()=>`${t.number(e.count)} عنصر محدد`,other:()=>`${t.number(e.count)} عنصر محدد`})}.`,selectedItem:e=>`${e.item} المحدد`};var Ct={};Ct={deselectedItem:e=>`${e.item} не е избран.`,longPressToSelect:"Натиснете и задръжте за да влезете в избирателен режим.",select:"Изберете",selectedAll:"Всички елементи са избрани.",selectedCount:(e,t)=>`${t.plural(e.count,{"=0":"Няма избрани елементи",one:()=>`${t.number(e.count)} избран елемент`,other:()=>`${t.number(e.count)} избрани елементи`})}.`,selectedItem:e=>`${e.item} избран.`};var Dt={};Dt={deselectedItem:e=>`Položka ${e.item} není vybrána.`,longPressToSelect:"Dlouhým stisknutím přejdete do režimu výběru.",select:"Vybrat",selectedAll:"Vybrány všechny položky.",selectedCount:(e,t)=>`${t.plural(e.count,{"=0":"Nevybrány žádné položky",one:()=>`Vybrána ${t.number(e.count)} položka`,other:()=>`Vybráno ${t.number(e.count)} položek`})}.`,selectedItem:e=>`Vybrána položka ${e.item}.`};var Bt={};Bt={deselectedItem:e=>`${e.item} ikke valgt.`,longPressToSelect:"Lav et langt tryk for at aktivere valgtilstand.",select:"Vælg",selectedAll:"Alle elementer valgt.",selectedCount:(e,t)=>`${t.plural(e.count,{"=0":"Ingen elementer valgt",one:()=>`${t.number(e.count)} element valgt`,other:()=>`${t.number(e.count)} elementer valgt`})}.`,selectedItem:e=>`${e.item} valgt.`};var kt={};kt={deselectedItem:e=>`${e.item} nicht ausgewählt.`,longPressToSelect:"Gedrückt halten, um Auswahlmodus zu öffnen.",select:"Auswählen",selectedAll:"Alle Elemente ausgewählt.",selectedCount:(e,t)=>`${t.plural(e.count,{"=0":"Keine Elemente ausgewählt",one:()=>`${t.number(e.count)} Element ausgewählt`,other:()=>`${t.number(e.count)} Elemente ausgewählt`})}.`,selectedItem:e=>`${e.item} ausgewählt.`};var Et={};Et={deselectedItem:e=>`Δεν επιλέχθηκε το στοιχείο ${e.item}.`,longPressToSelect:"Πατήστε παρατεταμένα για να μπείτε σε λειτουργία επιλογής.",select:"Επιλογή",selectedAll:"Επιλέχθηκαν όλα τα στοιχεία.",selectedCount:(e,t)=>`${t.plural(e.count,{"=0":"Δεν επιλέχθηκαν στοιχεία",one:()=>`Επιλέχθηκε ${t.number(e.count)} στοιχείο`,other:()=>`Επιλέχθηκαν ${t.number(e.count)} στοιχεία`})}.`,selectedItem:e=>`Επιλέχθηκε το στοιχείο ${e.item}.`};var St={};St={deselectedItem:e=>`${e.item} not selected.`,select:"Select",selectedCount:(e,t)=>`${t.plural(e.count,{"=0":"No items selected",one:()=>`${t.number(e.count)} item selected`,other:()=>`${t.number(e.count)} items selected`})}.`,selectedAll:"All items selected.",selectedItem:e=>`${e.item} selected.`,longPressToSelect:"Long press to enter selection mode."};var At={};At={deselectedItem:e=>`${e.item} no seleccionado.`,longPressToSelect:"Mantenga pulsado para abrir el modo de selección.",select:"Seleccionar",selectedAll:"Todos los elementos seleccionados.",selectedCount:(e,t)=>`${t.plural(e.count,{"=0":"Ningún elemento seleccionado",one:()=>`${t.number(e.count)} elemento seleccionado`,other:()=>`${t.number(e.count)} elementos seleccionados`})}.`,selectedItem:e=>`${e.item} seleccionado.`};var wt={};wt={deselectedItem:e=>`${e.item} pole valitud.`,longPressToSelect:"Valikurežiimi sisenemiseks vajutage pikalt.",select:"Vali",selectedAll:"Kõik üksused valitud.",selectedCount:(e,t)=>`${t.plural(e.count,{"=0":"Üksusi pole valitud",one:()=>`${t.number(e.count)} üksus valitud`,other:()=>`${t.number(e.count)} üksust valitud`})}.`,selectedItem:e=>`${e.item} valitud.`};var Nt={};Nt={deselectedItem:e=>`Kohdetta ${e.item} ei valittu.`,longPressToSelect:"Siirry valintatilaan painamalla pitkään.",select:"Valitse",selectedAll:"Kaikki kohteet valittu.",selectedCount:(e,t)=>`${t.plural(e.count,{"=0":"Ei yhtään kohdetta valittu",one:()=>`${t.number(e.count)} kohde valittu`,other:()=>`${t.number(e.count)} kohdetta valittu`})}.`,selectedItem:e=>`${e.item} valittu.`};var zt={};zt={deselectedItem:e=>`${e.item} non sélectionné.`,longPressToSelect:"Appuyez de manière prolongée pour passer en mode de sélection.",select:"Sélectionner",selectedAll:"Tous les éléments sélectionnés.",selectedCount:(e,t)=>`${t.plural(e.count,{"=0":"Aucun élément sélectionné",one:()=>`${t.number(e.count)} élément sélectionné`,other:()=>`${t.number(e.count)} éléments sélectionnés`})}.`,selectedItem:e=>`${e.item} sélectionné.`};var Ft={};Ft={deselectedItem:e=>`${e.item} לא נבחר.`,longPressToSelect:"הקשה ארוכה לכניסה למצב בחירה.",select:"בחר",selectedAll:"כל הפריטים נבחרו.",selectedCount:(e,t)=>`${t.plural(e.count,{"=0":"לא נבחרו פריטים",one:()=>`פריט ${t.number(e.count)} נבחר`,other:()=>`${t.number(e.count)} פריטים נבחרו`})}.`,selectedItem:e=>`${e.item} נבחר.`};var Pt={};Pt={deselectedItem:e=>`Stavka ${e.item} nije odabrana.`,longPressToSelect:"Dugo pritisnite za ulazak u način odabira.",select:"Odaberite",selectedAll:"Odabrane su sve stavke.",selectedCount:(e,t)=>`${t.plural(e.count,{"=0":"Nije odabrana nijedna stavka",one:()=>`Odabrana je ${t.number(e.count)} stavka`,other:()=>`Odabrano je ${t.number(e.count)} stavki`})}.`,selectedItem:e=>`Stavka ${e.item} je odabrana.`};var Kt={};Kt={deselectedItem:e=>`${e.item} nincs kijelölve.`,longPressToSelect:"Nyomja hosszan a kijelöléshez.",select:"Kijelölés",selectedAll:"Az összes elem kijelölve.",selectedCount:(e,t)=>`${t.plural(e.count,{"=0":"Egy elem sincs kijelölve",one:()=>`${t.number(e.count)} elem kijelölve`,other:()=>`${t.number(e.count)} elem kijelölve`})}.`,selectedItem:e=>`${e.item} kijelölve.`};var It={};It={deselectedItem:e=>`${e.item} non selezionato.`,longPressToSelect:"Premi a lungo per passare alla modalità di selezione.",select:"Seleziona",selectedAll:"Tutti gli elementi selezionati.",selectedCount:(e,t)=>`${t.plural(e.count,{"=0":"Nessun elemento selezionato",one:()=>`${t.number(e.count)} elemento selezionato`,other:()=>`${t.number(e.count)} elementi selezionati`})}.`,selectedItem:e=>`${e.item} selezionato.`};var jt={};jt={deselectedItem:e=>`${e.item} が選択されていません。`,longPressToSelect:"長押しして選択モードを開きます。",select:"選択",selectedAll:"すべての項目を選択しました。",selectedCount:(e,t)=>`${t.plural(e.count,{"=0":"項目が選択されていません",one:()=>`${t.number(e.count)} 項目を選択しました`,other:()=>`${t.number(e.count)} 項目を選択しました`})}。`,selectedItem:e=>`${e.item} を選択しました。`};var Mt={};Mt={deselectedItem:e=>`${e.item}이(가) 선택되지 않았습니다.`,longPressToSelect:"선택 모드로 들어가려면 길게 누르십시오.",select:"선택",selectedAll:"모든 항목이 선택되었습니다.",selectedCount:(e,t)=>`${t.plural(e.count,{"=0":"선택된 항목이 없습니다",one:()=>`${t.number(e.count)}개 항목이 선택되었습니다`,other:()=>`${t.number(e.count)}개 항목이 선택되었습니다`})}.`,selectedItem:e=>`${e.item}이(가) 선택되었습니다.`};var Tt={};Tt={deselectedItem:e=>`${e.item} nepasirinkta.`,longPressToSelect:"Norėdami įjungti pasirinkimo režimą, paspauskite ir palaikykite.",select:"Pasirinkti",selectedAll:"Pasirinkti visi elementai.",selectedCount:(e,t)=>`${t.plural(e.count,{"=0":"Nepasirinktas nė vienas elementas",one:()=>`Pasirinktas ${t.number(e.count)} elementas`,other:()=>`Pasirinkta elementų: ${t.number(e.count)}`})}.`,selectedItem:e=>`Pasirinkta: ${e.item}.`};var Rt={};Rt={deselectedItem:e=>`Vienums ${e.item} nav atlasīts.`,longPressToSelect:"Ilgi turiet nospiestu. lai ieslēgtu atlases režīmu.",select:"Atlasīt",selectedAll:"Atlasīti visi vienumi.",selectedCount:(e,t)=>`${t.plural(e.count,{"=0":"Nav atlasīts neviens vienums",one:()=>`Atlasīto vienumu skaits: ${t.number(e.count)}`,other:()=>`Atlasīto vienumu skaits: ${t.number(e.count)}`})}.`,selectedItem:e=>`Atlasīts vienums ${e.item}.`};var Vt={};Vt={deselectedItem:e=>`${e.item} er ikke valgt.`,longPressToSelect:"Bruk et langt trykk for å gå inn i valgmodus.",select:"Velg",selectedAll:"Alle elementer er valgt.",selectedCount:(e,t)=>`${t.plural(e.count,{"=0":"Ingen elementer er valgt",one:()=>`${t.number(e.count)} element er valgt`,other:()=>`${t.number(e.count)} elementer er valgt`})}.`,selectedItem:e=>`${e.item} er valgt.`};var Ot={};Ot={deselectedItem:e=>`${e.item} niet geselecteerd.`,longPressToSelect:"Druk lang om de selectiemodus te openen.",select:"Selecteren",selectedAll:"Alle items geselecteerd.",selectedCount:(e,t)=>`${t.plural(e.count,{"=0":"Geen items geselecteerd",one:()=>`${t.number(e.count)} item geselecteerd`,other:()=>`${t.number(e.count)} items geselecteerd`})}.`,selectedItem:e=>`${e.item} geselecteerd.`};var Ht={};Ht={deselectedItem:e=>`Nie zaznaczono ${e.item}.`,longPressToSelect:"Naciśnij i przytrzymaj, aby wejść do trybu wyboru.",select:"Zaznacz",selectedAll:"Wszystkie zaznaczone elementy.",selectedCount:(e,t)=>`${t.plural(e.count,{"=0":"Nie zaznaczono żadnych elementów",one:()=>`${t.number(e.count)} zaznaczony element`,other:()=>`${t.number(e.count)} zaznaczonych elementów`})}.`,selectedItem:e=>`Zaznaczono ${e.item}.`};var Lt={};Lt={deselectedItem:e=>`${e.item} não selecionado.`,longPressToSelect:"Mantenha pressionado para entrar no modo de seleção.",select:"Selecionar",selectedAll:"Todos os itens selecionados.",selectedCount:(e,t)=>`${t.plural(e.count,{"=0":"Nenhum item selecionado",one:()=>`${t.number(e.count)} item selecionado`,other:()=>`${t.number(e.count)} itens selecionados`})}.`,selectedItem:e=>`${e.item} selecionado.`};var Ut={};Ut={deselectedItem:e=>`${e.item} não selecionado.`,longPressToSelect:"Prima continuamente para entrar no modo de seleção.",select:"Selecionar",selectedAll:"Todos os itens selecionados.",selectedCount:(e,t)=>`${t.plural(e.count,{"=0":"Nenhum item selecionado",one:()=>`${t.number(e.count)} item selecionado`,other:()=>`${t.number(e.count)} itens selecionados`})}.`,selectedItem:e=>`${e.item} selecionado.`};var Wt={};Wt={deselectedItem:e=>`${e.item} neselectat.`,longPressToSelect:"Apăsați lung pentru a intra în modul de selectare.",select:"Selectare",selectedAll:"Toate elementele selectate.",selectedCount:(e,t)=>`${t.plural(e.count,{"=0":"Niciun element selectat",one:()=>`${t.number(e.count)} element selectat`,other:()=>`${t.number(e.count)} elemente selectate`})}.`,selectedItem:e=>`${e.item} selectat.`};var Gt={};Gt={deselectedItem:e=>`${e.item} не выбрано.`,longPressToSelect:"Нажмите и удерживайте для входа в режим выбора.",select:"Выбрать",selectedAll:"Выбраны все элементы.",selectedCount:(e,t)=>`${t.plural(e.count,{"=0":"Нет выбранных элементов",one:()=>`${t.number(e.count)} элемент выбран`,other:()=>`${t.number(e.count)} элементов выбрано`})}.`,selectedItem:e=>`${e.item} выбрано.`};var Yt={};Yt={deselectedItem:e=>`Nevybraté položky: ${e.item}.`,longPressToSelect:"Dlhším stlačením prejdite do režimu výberu.",select:"Vybrať",selectedAll:"Všetky vybraté položky.",selectedCount:(e,t)=>`${t.plural(e.count,{"=0":"Žiadne vybraté položky",one:()=>`${t.number(e.count)} vybratá položka`,other:()=>`Počet vybratých položiek:${t.number(e.count)}`})}.`,selectedItem:e=>`Vybraté položky: ${e.item}.`};var Zt={};Zt={deselectedItem:e=>`Element ${e.item} ni izbran.`,longPressToSelect:"Za izbirni način pritisnite in dlje časa držite.",select:"Izberite",selectedAll:"Vsi elementi so izbrani.",selectedCount:(e,t)=>`${t.plural(e.count,{"=0":"Noben element ni izbran",one:()=>`${t.number(e.count)} element je izbran`,other:()=>`${t.number(e.count)} elementov je izbranih`})}.`,selectedItem:e=>`Element ${e.item} je izbran.`};var _t={};_t={deselectedItem:e=>`${e.item} nije izabrano.`,longPressToSelect:"Dugo pritisnite za ulazak u režim biranja.",select:"Izaberite",selectedAll:"Izabrane su sve stavke.",selectedCount:(e,t)=>`${t.plural(e.count,{"=0":"Nije izabrana nijedna stavka",one:()=>`Izabrana je ${t.number(e.count)} stavka`,other:()=>`Izabrano je ${t.number(e.count)} stavki`})}.`,selectedItem:e=>`${e.item} je izabrano.`};var qt={};qt={deselectedItem:e=>`${e.item} ej markerat.`,longPressToSelect:"Tryck länge när du vill öppna väljarläge.",select:"Markera",selectedAll:"Alla markerade objekt.",selectedCount:(e,t)=>`${t.plural(e.count,{"=0":"Inga markerade objekt",one:()=>`${t.number(e.count)} markerat objekt`,other:()=>`${t.number(e.count)} markerade objekt`})}.`,selectedItem:e=>`${e.item} markerat.`};var Jt={};Jt={deselectedItem:e=>`${e.item} seçilmedi.`,longPressToSelect:"Seçim moduna girmek için uzun basın.",select:"Seç",selectedAll:"Tüm ögeler seçildi.",selectedCount:(e,t)=>`${t.plural(e.count,{"=0":"Hiçbir öge seçilmedi",one:()=>`${t.number(e.count)} öge seçildi`,other:()=>`${t.number(e.count)} öge seçildi`})}.`,selectedItem:e=>`${e.item} seçildi.`};var Xt={};Xt={deselectedItem:e=>`${e.item} не вибрано.`,longPressToSelect:"Виконайте довге натиснення, щоб перейти в режим вибору.",select:"Вибрати",selectedAll:"Усі елементи вибрано.",selectedCount:(e,t)=>`${t.plural(e.count,{"=0":"Жодних елементів не вибрано",one:()=>`${t.number(e.count)} елемент вибрано`,other:()=>`Вибрано елементів: ${t.number(e.count)}`})}.`,selectedItem:e=>`${e.item} вибрано.`};var Qt={};Qt={deselectedItem:e=>`未选择 ${e.item}。`,longPressToSelect:"长按以进入选择模式。",select:"选择",selectedAll:"已选择所有项目。",selectedCount:(e,t)=>`${t.plural(e.count,{"=0":"未选择项目",one:()=>`已选择 ${t.number(e.count)} 个项目`,other:()=>`已选择 ${t.number(e.count)} 个项目`})}。`,selectedItem:e=>`已选择 ${e.item}。`};var el={};el={deselectedItem:e=>`未選取「${e.item}」。`,longPressToSelect:"長按以進入選擇模式。",select:"選取",selectedAll:"已選取所有項目。",selectedCount:(e,t)=>`${t.plural(e.count,{"=0":"未選取任何項目",one:()=>`已選取 ${t.number(e.count)} 個項目`,other:()=>`已選取 ${t.number(e.count)} 個項目`})}。`,selectedItem:e=>`已選取「${e.item}」。`};var oe={};oe={"ar-AE":xt,"bg-BG":Ct,"cs-CZ":Dt,"da-DK":Bt,"de-DE":kt,"el-GR":Et,"en-US":St,"es-ES":At,"et-EE":wt,"fi-FI":Nt,"fr-FR":zt,"he-IL":Ft,"hr-HR":Pt,"hu-HU":Kt,"it-IT":It,"ja-JP":jt,"ko-KR":Mt,"lt-LT":Tt,"lv-LV":Rt,"nb-NO":Vt,"nl-NL":Ot,"pl-PL":Ht,"pt-BR":Lt,"pt-PT":Ut,"ro-RO":Wt,"ru-RU":Gt,"sk-SK":Yt,"sl-SI":Zt,"sr-SP":_t,"sv-SE":qt,"tr-TR":Jt,"uk-UA":Xt,"zh-CN":Qt,"zh-TW":el};const tl=7e3;let V=null;function ll(e,t="assertive",l=tl){V?V.announce(e,t,l):(V=new mu,(typeof IS_REACT_ACT_ENVIRONMENT=="boolean"?IS_REACT_ACT_ENVIRONMENT:typeof jest<"u")?V.announce(e,t,l):setTimeout(()=>{V?.isAttached()&&V?.announce(e,t,l)},100))}class mu{isAttached(){var t;return(t=this.node)===null||t===void 0?void 0:t.isConnected}createLog(t){let l=document.createElement("div");return l.setAttribute("role","log"),l.setAttribute("aria-live",t),l.setAttribute("aria-relevant","additions"),l}destroy(){this.node&&(document.body.removeChild(this.node),this.node=null)}announce(t,l="assertive",u=tl){var o,n;if(!this.node)return;let i=document.createElement("div");typeof t=="object"?(i.setAttribute("role","img"),i.setAttribute("aria-labelledby",t["aria-labelledby"])):i.textContent=t,l==="assertive"?(o=this.assertiveLog)===null||o===void 0||o.appendChild(i):(n=this.politeLog)===null||n===void 0||n.appendChild(i),t!==""&&setTimeout(()=>{i.remove()},u)}clear(t){this.node&&((!t||t==="assertive")&&this.assertiveLog&&(this.assertiveLog.innerHTML=""),(!t||t==="polite")&&this.politeLog&&(this.politeLog.innerHTML=""))}constructor(){this.node=null,this.assertiveLog=null,this.politeLog=null,typeof document<"u"&&(this.node=document.createElement("div"),this.node.dataset.liveAnnouncer="true",Object.assign(this.node.style,{border:0,clip:"rect(0 0 0 0)",clipPath:"inset(50%)",height:"1px",margin:"-1px",overflow:"hidden",padding:0,position:"absolute",width:"1px",whiteSpace:"nowrap"}),this.assertiveLog=this.createLog("assertive"),this.node.appendChild(this.assertiveLog),this.politeLog=this.createLog("polite"),this.node.appendChild(this.politeLog),document.body.prepend(this.node))}}function pu(e){return e&&e.__esModule?e.default:e}function bu(e,t){let{getRowText:l=a=>{var m,c,d,r;return(r=(m=(c=t.collection).getTextValue)===null||m===void 0?void 0:m.call(c,a))!==null&&r!==void 0?r:(d=t.collection.getItem(a))===null||d===void 0?void 0:d.textValue}}=e,u=_(pu(oe),"@react-aria/grid"),o=t.selectionManager.rawSelection,n=B.useRef(o),i=Rl(()=>{var a;if(!t.selectionManager.isFocused||o===n.current){n.current=o;return}let m=Ee(o,n.current),c=Ee(n.current,o),d=t.selectionManager.selectionBehavior==="replace",r=[];if(t.selectionManager.selectedKeys.size===1&&d){let p=t.selectionManager.selectedKeys.keys().next().value;if(p!=null&&t.collection.getItem(p)){let s=l(p);s&&r.push(u.format("selectedItem",{item:s}))}}else if(m.size===1&&c.size===0){let p=m.keys().next().value;if(p!=null){let s=l(p);s&&r.push(u.format("selectedItem",{item:s}))}}else if(c.size===1&&m.size===0){let p=c.keys().next().value;if(p!=null&&t.collection.getItem(p)){let s=l(p);s&&r.push(u.format("deselectedItem",{item:s}))}}t.selectionManager.selectionMode==="multiple"&&(r.length===0||o==="all"||o.size>1||n.current==="all"||((a=n.current)===null||a===void 0?void 0:a.size)>1)&&r.push(o==="all"?u.format("selectedAll"):u.format("selectedCount",{count:o.size})),r.length>0&&ll(r.join(" ")),n.current=o});Me(()=>{if(t.selectionManager.isFocused)i();else{let a=requestAnimationFrame(i);return()=>cancelAnimationFrame(a)}},[o,t.selectionManager.isFocused])}function Ee(e,t){let l=new Set;if(e==="all"||t==="all")return l;for(let u of e.keys())t.has(u)||l.add(u);return l}function fu(e){return e&&e.__esModule?e.default:e}function hu(e){let t=_(fu(oe),"@react-aria/grid"),l=Vl(),u=(l==="pointer"||l==="virtual"||l==null)&&typeof window<"u"&&"ontouchstart"in window,o=B.useMemo(()=>{let i=e.selectionManager.selectionMode,a=e.selectionManager.selectionBehavior,m;return u&&(m=t.format("longPressToSelect")),a==="replace"&&i!=="none"&&e.hasItemActions?m:void 0},[e.selectionManager.selectionMode,e.selectionManager.selectionBehavior,e.hasItemActions,t,u]);return fe(o)}function vu(e,t,l){let{isVirtualized:u,disallowTypeAhead:o,keyboardDelegate:n,focusMode:i,scrollRef:a,getRowText:m,onRowAction:c,onCellAction:d,escapeKeyBehavior:r="clearSelection",shouldSelectOnPressUp:p}=e,{selectionManager:s}=t;!e["aria-label"]&&!e["aria-labelledby"]&&console.warn("An aria-label or aria-labelledby prop is required for accessibility.");let b=ze({usage:"search",sensitivity:"base"}),{direction:v}=ue(),g=t.selectionManager.disabledBehavior,x=B.useMemo(()=>n||new yt({collection:t.collection,disabledKeys:t.disabledKeys,disabledBehavior:g,ref:l,direction:v,collator:b,focusMode:i}),[n,t.collection,t.disabledKeys,g,l,v,b,i]),{collectionProps:D}=Ol({ref:l,selectionManager:s,keyboardDelegate:x,isVirtualized:u,scrollRef:a,disallowTypeAhead:o,escapeKeyBehavior:r}),y=pe(e.id);ve.set(t,{keyboardDelegate:x,actions:{onRowAction:c,onCellAction:d},shouldSelectOnPressUp:p});let $=hu({selectionManager:s,hasItemActions:!!(c||d)}),f=Hl(e,{labelable:!0}),E=B.useCallback(C=>{if(s.isFocused){C.currentTarget.contains(C.target)||s.setFocused(!1);return}C.currentTarget.contains(C.target)&&s.setFocused(!0)},[s]),S=B.useMemo(()=>({onBlur:D.onBlur,onFocus:E}),[E,D.onBlur]),A=au(l,{isDisabled:t.collection.size!==0}),k=J(f,{role:"grid",id:y,"aria-multiselectable":s.selectionMode==="multiple"?"true":void 0},t.isKeyboardNavigationDisabled?S:D,t.collection.size===0&&{tabIndex:A?-1:0}||void 0,$);return u&&(k["aria-rowcount"]=t.collection.size,k["aria-colcount"]=t.collection.columnCount),bu({getRowText:m},t),{gridProps:k}}function gu(){return{rowGroupProps:{role:"rowgroup"}}}function $u(e,t,l){var u,o;let{node:n,isVirtualized:i,shouldSelectOnPressUp:a,onAction:m}=e,{actions:c,shouldSelectOnPressUp:d}=ve.get(t),r=c.onRowAction?()=>{var g;return(g=c.onRowAction)===null||g===void 0?void 0:g.call(c,n.key)}:m,{itemProps:p,...s}=je({selectionManager:t.selectionManager,key:n.key,ref:l,isVirtualized:i,shouldSelectOnPressUp:d||a,onAction:r||!(n==null||(u=n.props)===null||u===void 0)&&u.onAction?Ll(n==null||(o=n.props)===null||o===void 0?void 0:o.onAction,r):void 0,isDisabled:t.collection.size===0}),b=t.selectionManager.isSelected(n.key),v={role:"row","aria-selected":t.selectionManager.selectionMode!=="none"?b:void 0,"aria-disabled":s.isDisabled||void 0,...p};return i&&(v["aria-rowindex"]=n.index+1),{rowProps:v,...s}}function ul(e,t,l){let{node:u,isVirtualized:o,focusMode:n="child",shouldSelectOnPressUp:i,onAction:a}=e,{direction:m}=ue(),{keyboardDelegate:c,actions:{onCellAction:d}}=ve.get(t),r=B.useRef(null),p=()=>{if(l.current){let y=ae(l.current);if(n==="child"){if(l.current.contains(document.activeElement)&&l.current!==document.activeElement)return;let $=t.selectionManager.childFocusStrategy==="last"?re(y):y.firstChild();if($){L($);return}}(r.current!=null&&u.key!==r.current||!l.current.contains(document.activeElement))&&L(l.current)}},{itemProps:s,isPressed:b}=je({selectionManager:t.selectionManager,key:u.key,ref:l,isVirtualized:o,focus:p,shouldSelectOnPressUp:i,onAction:d?()=>d(u.key):a,isDisabled:t.collection.size===0}),v=y=>{if(!y.currentTarget.contains(y.target)||t.isKeyboardNavigationDisabled||!l.current||!document.activeElement)return;let $=ae(l.current);switch($.currentNode=document.activeElement,y.key){case"ArrowLeft":{let C=m==="rtl"?$.nextNode():$.previousNode();if(n==="child"&&C===l.current&&(C=null),y.preventDefault(),y.stopPropagation(),C)L(C),Y(C,{containingElement:Z(l.current)});else{var f;if(((f=c.getKeyLeftOf)===null||f===void 0?void 0:f.call(c,u.key))!==u.key){var E;(E=l.current.parentElement)===null||E===void 0||E.dispatchEvent(new KeyboardEvent(y.nativeEvent.type,y.nativeEvent));break}n==="cell"&&m==="rtl"?(L(l.current),Y(l.current,{containingElement:Z(l.current)})):($.currentNode=l.current,C=m==="rtl"?$.firstChild():re($),C&&(L(C),Y(C,{containingElement:Z(l.current)})))}break}case"ArrowRight":{let C=m==="rtl"?$.previousNode():$.nextNode();if(n==="child"&&C===l.current&&(C=null),y.preventDefault(),y.stopPropagation(),C)L(C),Y(C,{containingElement:Z(l.current)});else{var S;if(((S=c.getKeyRightOf)===null||S===void 0?void 0:S.call(c,u.key))!==u.key){var A;(A=l.current.parentElement)===null||A===void 0||A.dispatchEvent(new KeyboardEvent(y.nativeEvent.type,y.nativeEvent));break}n==="cell"&&m==="ltr"?(L(l.current),Y(l.current,{containingElement:Z(l.current)})):($.currentNode=l.current,C=m==="rtl"?re($):$.firstChild(),C&&(L(C),Y(C,{containingElement:Z(l.current)})))}break}case"ArrowUp":case"ArrowDown":if(!y.altKey&&l.current.contains(y.target)){var k;y.stopPropagation(),y.preventDefault(),(k=l.current.parentElement)===null||k===void 0||k.dispatchEvent(new KeyboardEvent(y.nativeEvent.type,y.nativeEvent))}break}},g=y=>{if(r.current=u.key,y.target!==l.current){Ul()||t.selectionManager.setFocusedKey(u.key);return}requestAnimationFrame(()=>{n==="child"&&document.activeElement===l.current&&p()})},x=J(s,{role:"gridcell",onKeyDownCapture:v,"aria-colspan":u.colSpan,"aria-colindex":u.colIndex!=null?u.colIndex+1:void 0,colSpan:o?void 0:u.colSpan,onFocus:g});var D;return o&&(x["aria-colindex"]=((D=u.colIndex)!==null&&D!==void 0?D:u.index)+1),i&&x.tabIndex!=null&&x.onPointerDown==null&&(x.onPointerDown=y=>{let $=y.currentTarget,f=$.getAttribute("tabindex");$.removeAttribute("tabindex"),requestAnimationFrame(()=>{f!=null&&$.setAttribute("tabindex",f)})}),{gridCellProps:x,isPressed:b}}function re(e){let t=null,l=null;do l=e.lastChild(),l&&(t=l);while(l);return t}function yu(e){return e&&e.__esModule?e.default:e}function xu(e,t){let{key:l}=e,u=t.selectionManager,o=pe(),n=!t.selectionManager.canSelectItem(l),i=t.selectionManager.isSelected(l),a=()=>u.toggleSelection(l);const m=_(yu(oe),"@react-aria/grid");return{checkboxProps:{id:o,"aria-label":m.format("select"),isSelected:i,isDisabled:n,onChange:a}}}class Cu extends yt{isCell(t){return t.type==="cell"||t.type==="rowheader"||t.type==="column"}getKeyBelow(t){let l=this.collection.getItem(t);if(!l)return null;if(l.type==="column"){let u=U(z(l,this.collection));if(u)return u.key;let o=this.getFirstKey();return o==null||!this.collection.getItem(o)?null:super.getKeyForItemInRowByIndex(o,l.index)}return super.getKeyBelow(t)}getKeyAbove(t){let l=this.collection.getItem(t);if(!l)return null;if(l.type==="column"){let n=l.parentKey!=null?this.collection.getItem(l.parentKey):null;return n&&n.type==="column"?n.key:null}let u=super.getKeyAbove(t),o=u!=null?this.collection.getItem(u):null;return o&&o.type!=="headerrow"?u:this.isCell(l)?this.collection.columns[l.index].key:this.collection.columns[0].key}findNextColumnKey(t){let l=this.findNextKey(t.key,o=>o.type==="column");if(l!=null)return l;let u=this.collection.headerRows[t.level];for(let o of z(u,this.collection))if(o.type==="column")return o.key;return null}findPreviousColumnKey(t){let l=this.findPreviousKey(t.key,n=>n.type==="column");if(l!=null)return l;let u=this.collection.headerRows[t.level],o=[...z(u,this.collection)];for(let n=o.length-1;n>=0;n--){let i=o[n];if(i.type==="column")return i.key}return null}getKeyRightOf(t){let l=this.collection.getItem(t);return l?l.type==="column"?this.direction==="rtl"?this.findPreviousColumnKey(l):this.findNextColumnKey(l):super.getKeyRightOf(t):null}getKeyLeftOf(t){let l=this.collection.getItem(t);return l?l.type==="column"?this.direction==="rtl"?this.findNextColumnKey(l):this.findPreviousColumnKey(l):super.getKeyLeftOf(t):null}getKeyForSearch(t,l){if(!this.collator)return null;let u=this.collection,o=l??this.getFirstKey();if(o==null)return null;let n=u.getItem(o);var i;n?.type==="cell"&&(o=(i=n.parentKey)!==null&&i!==void 0?i:null);let a=!1;for(;o!=null;){let m=u.getItem(o);if(!m)return null;if(m.textValue){let c=m.textValue.slice(0,t.length);if(this.collator.compare(c,t)===0)return m.key}for(let c of z(m,this.collection)){let d=u.columns[c.index];if(u.rowHeaderColumnKeys.has(d.key)&&c.textValue){let r=c.textValue.slice(0,t.length);if(this.collator.compare(r,t)===0){let p=l!=null?u.getItem(l):n;return p?.type==="cell"?c.key:m.key}}}o=this.getKeyBelow(o),o==null&&!a&&(o=this.getFirstKey(),a=!0)}return null}}function Du(e){return e&&e.__esModule?e.default:e}function Bu(e,t,l){let{keyboardDelegate:u,isVirtualized:o,layoutDelegate:n,layout:i}=e,a=ze({usage:"search",sensitivity:"base"}),{direction:m}=ue(),c=t.selectionManager.disabledBehavior,d=B.useMemo(()=>u||new Cu({collection:t.collection,disabledKeys:t.disabledKeys,disabledBehavior:c,ref:l,direction:m,collator:a,layoutDelegate:n,layout:i}),[u,t.collection,t.disabledKeys,c,l,m,a,n,i]),r=pe(e.id);he.set(t,r);let{gridProps:p}=vu({...e,id:r,keyboardDelegate:d},t,l);o&&(p["aria-rowcount"]=t.collection.size+t.collection.headerRows.length),le()&&"expandedKeys"in t&&(p.role="treegrid");let{column:s,direction:b}=t.sortDescriptor||{},v=_(Du(ne),"@react-aria/table"),g=B.useMemo(()=>{var D,y;let $=(y=(D=t.collection.columns.find(f=>f.key===s))===null||D===void 0?void 0:D.textValue)!==null&&y!==void 0?y:"";return b&&s?v.format(`${b}Sort`,{columnName:$}):void 0},[b,s,t.collection.columns]),x=fe(g);return Me(()=>{g&&ll(g,"assertive",500)},[g]),{gridProps:J(p,x,{"aria-describedby":[x["aria-describedby"],p["aria-describedby"]].filter(Boolean).join(" ")})}}function ku(e){return e&&e.__esModule?e.default:e}function nl(e,t,l){var u,o;let{node:n}=e,i=n.props.allowsSorting,{gridCellProps:a}=ul({...e,focusMode:"child"},t,l),m=n.props.isSelectionCell&&t.selectionManager.selectionMode==="single",{pressProps:c}=Wl({isDisabled:!i||m,onPress(){t.sort(n.key)},ref:l}),{focusableProps:d}=Gl({},l),r,p=((u=t.sortDescriptor)===null||u===void 0?void 0:u.column)===n.key,s=(o=t.sortDescriptor)===null||o===void 0?void 0:o.direction;n.props.allowsSorting&&!Ce()&&(r=p?s:"none");let b=_(ku(ne),"@react-aria/table"),v;i&&(v=`${b.format("sortable")}`,p&&s&&Ce()&&(v=`${v}, ${b.format(s)}`));let g=fe(v),x=t.collection.size===0;return B.useEffect(()=>{x&&t.selectionManager.focusedKey===n.key&&t.selectionManager.setFocusedKey(null)},[x,t.selectionManager,n.key]),{columnHeaderProps:{...J(d,a,c,g,x?{tabIndex:-1}:null),role:"columnheader",id:cu(t,n.key),"aria-colspan":n.colSpan&&n.colSpan>1?n.colSpan:void 0,"aria-sort":r}}}const Se={expand:{ltr:"ArrowRight",rtl:"ArrowLeft"},collapse:{ltr:"ArrowLeft",rtl:"ArrowRight"}};function Eu(e,t,l){let{node:u,isVirtualized:o}=e,{rowProps:n,...i}=$u(e,t,l),{direction:a}=ue();o&&!(le()&&"expandedKeys"in t)?n["aria-rowindex"]=u.index+1+t.collection.headerRows.length:delete n["aria-rowindex"];let m={};if(le()&&"expandedKeys"in t){let f=t.keyMap.get(u.key);if(f!=null){var c,d,r,p,s,b;let E=((c=f.props)===null||c===void 0?void 0:c.UNSTABLE_childItems)||((r=f.props)===null||r===void 0||(d=r.children)===null||d===void 0?void 0:d.length)>t.userColumnCount;var v,g,x,D;m={onKeyDown:S=>{(S.key===Se.expand[a]&&t.selectionManager.focusedKey===f.key&&E&&t.expandedKeys!=="all"&&!t.expandedKeys.has(f.key)||S.key===Se.collapse[a]&&t.selectionManager.focusedKey===f.key&&E&&(t.expandedKeys==="all"||t.expandedKeys.has(f.key)))&&(t.toggleKey(f.key),S.stopPropagation())},"aria-expanded":E?t.expandedKeys==="all"||t.expandedKeys.has(u.key):void 0,"aria-level":f.level,"aria-posinset":((v=f.indexOfType)!==null&&v!==void 0?v:0)+1,"aria-setsize":f.level>1?((x=(p=W((g=(s=t.keyMap.get(f.parentKey))===null||s===void 0?void 0:s.childNodes)!==null&&g!==void 0?g:[]))===null||p===void 0?void 0:p.indexOfType)!==null&&x!==void 0?x:0)+1:((D=(b=W(t.collection.body.childNodes))===null||b===void 0?void 0:b.indexOfType)!==null&&D!==void 0?D:0)+1}}}let y=Yl(u.props),$=i.hasAction?y:{};return{rowProps:{...J(n,m,$),"aria-labelledby":Re(t,u.key)},...i}}function Su(e,t,l){let{node:u,isVirtualized:o}=e,n={role:"row"};return o&&!(le()&&"expandedKeys"in t)&&(n["aria-rowindex"]=u.index+1),{rowProps:n}}function ol(e,t,l){var u;let{gridCellProps:o,isPressed:n}=ul(e,t,l),i=(u=e.node.column)===null||u===void 0?void 0:u.key;return i!=null&&t.collection.rowHeaderColumnKeys.has(i)&&(o.role="rowheader",o.id=Te(t,e.node.parentKey,i)),{gridCellProps:o,isPressed:n}}function Au(e){return e&&e.__esModule?e.default:e}function wu(e,t){let{key:l}=e;const{checkboxProps:u}=xu(e,t);return{checkboxProps:{...u,"aria-labelledby":`${u.id} ${Re(t,l)}`}}}function Nu(e){let{isEmpty:t,isSelectAll:l,selectionMode:u}=e.selectionManager;return{checkboxProps:{"aria-label":_(Au(ne),"@react-aria/table").format(u==="single"?"select":"selectAll"),isSelected:l,isDisabled:u!=="multiple"||e.collection.size===0||e.collection.rows.length===1&&e.collection.rows[0].type==="loader",isIndeterminate:!t&&!l,onChange:()=>e.selectionManager.toggleSelectAll()}}}function ge(){return gu()}var sl=T((e,t)=>{var l,u;const{as:o,className:n,node:i,slots:a,state:m,selectionMode:c,color:d,checkboxesProps:r,disableAnimation:p,classNames:s,...b}=e,v=o||"th",g=typeof v=="string",x=M(t),{columnHeaderProps:D}=nl({node:i},m,x),{isFocusVisible:y,focusProps:$}=X(),{checkboxProps:f}=Nu(m),E=K(s?.th,n,(l=i.props)==null?void 0:l.className),S=c==="single",{onChange:A,...k}=f;return h.jsx(v,{ref:x,"data-focus-visible":w(y),...I(D,$,O(i.props,{enabled:g}),O(b,{enabled:g})),className:(u=a.th)==null?void 0:u.call(a,{class:E}),children:S?h.jsx(be,{children:f["aria-label"]}):h.jsx(Fe,{color:d,disableAnimation:p,onValueChange:A,...I(r,k)})})});sl.displayName="HeroUI.TableSelectAllCheckbox";var il=sl;function zu(e){let{collection:t,focusMode:l}=e,u=e.UNSAFE_selectionState||Zl(e),o=B.useMemo(()=>e.disabledKeys?new Set(e.disabledKeys):new Set,[e.disabledKeys]),n=u.setFocusedKey;u.setFocusedKey=(m,c)=>{if(l==="cell"&&m!=null){let b=t.getItem(m);if(b?.type==="item"){var d,r;let v=z(b,t);var p,s;c==="last"?m=(p=(d=W(v))===null||d===void 0?void 0:d.key)!==null&&p!==void 0?p:null:m=(s=(r=U(v))===null||r===void 0?void 0:r.key)!==null&&s!==void 0?s:null}}n(m,c)};let i=B.useMemo(()=>new _l(t,u),[t,u]);const a=B.useRef(null);return B.useEffect(()=>{if(u.focusedKey!=null&&a.current&&!t.getItem(u.focusedKey)){const m=a.current.getItem(u.focusedKey),c=m?.parentKey!=null&&(m.type==="cell"||m.type==="rowheader"||m.type==="column")?a.current.getItem(m.parentKey):m;if(!c){u.setFocusedKey(null);return}const d=a.current.rows,r=t.rows,p=d.length-r.length;let s=Math.min(p>1?Math.max(c.index-p+1,0):c.index,r.length-1),b=null;for(;s>=0;){if(!i.isDisabled(r[s].key)&&r[s].type!=="headerrow"){b=r[s];break}sc.index&&(s=c.index),s--)}if(b){const v=b.hasChildNodes?[...z(b,t)]:[],g=b.hasChildNodes&&c!==m&&m&&m.index{let p=this.keyMap.get(r.key);t.visitNode&&(r=t.visitNode(r)),this.keyMap.set(r.key,r);let s=new Set,b=null,v=!1;if(r.type==="item"){var g;for(let f of r.childNodes)if(((g=f.props)===null||g===void 0?void 0:g.colSpan)!==void 0){v=!0;break}}for(let f of r.childNodes){if(f.type==="cell"&&v){var x,D;f.colspan=(x=f.props)===null||x===void 0?void 0:x.colSpan,f.colSpan=(D=f.props)===null||D===void 0?void 0:D.colSpan;var y,$;f.colIndex=b?((y=b.colIndex)!==null&&y!==void 0?y:b.index)+(($=b.colSpan)!==null&&$!==void 0?$:1):f.index}f.type==="cell"&&f.parentKey==null&&(f.parentKey=r.key),s.add(f.key),b?(b.nextKey=f.key,f.prevKey=b.key):f.prevKey=null,l(f),b=f}if(b&&(b.nextKey=null),p)for(let f of p.childNodes)s.has(f.key)||u(f)},u=r=>{this.keyMap.delete(r.key);for(let p of r.childNodes)this.keyMap.get(p.key)===p&&u(p)},o=null;for(let[r,p]of t.items.entries()){var n,i,a,m,c,d;let s={...p,level:(n=p.level)!==null&&n!==void 0?n:0,key:(i=p.key)!==null&&i!==void 0?i:"row-"+r,type:(a=p.type)!==null&&a!==void 0?a:"row",value:(m=p.value)!==null&&m!==void 0?m:null,hasChildNodes:!0,childNodes:[...p.childNodes],rendered:p.rendered,textValue:(c=p.textValue)!==null&&c!==void 0?c:"",index:(d=p.index)!==null&&d!==void 0?d:r};o?(o.nextKey=s.key,s.prevKey=o.key):s.prevKey=null,this.rows.push(s),l(s),o=s}o&&(o.nextKey=null)}}const rl="row-header-column-"+Math.random().toString(36).slice(2);let de="row-header-column-"+Math.random().toString(36).slice(2);for(;rl===de;)de="row-header-column-"+Math.random().toString(36).slice(2);function Pu(e,t){if(t.length===0)return[];let l=[],u=new Map;for(let d of t){let r=d.parentKey,p=[d];for(;r;){let s=e.get(r);if(!s)break;if(u.has(s)){var o,n;(n=(o=s).colSpan)!==null&&n!==void 0||(o.colSpan=0),s.colSpan++,s.colspan=s.colSpan;let{column:b,index:v}=u.get(s);if(v>p.length)break;for(let g=v;gd.length)),a=Array(i).fill(0).map(()=>[]),m=0;for(let d of l){let r=i-1;for(let p of d){if(p){let s=a[r],b=s.reduce((v,g)=>{var x;return v+((x=g.colSpan)!==null&&x!==void 0?x:1)},0);if(b0&&(s[s.length-1].nextKey=v.key,v.prevKey=s[s.length-1].key),s.push(v)}s.length>0&&(s[s.length-1].nextKey=p.key,p.prevKey=s[s.length-1].key),p.level=r,p.colIndex=m,s.push(p)}r--}m++}let c=0;for(let d of a){let r=d.reduce((p,s)=>{var b;return p+((b=s.colSpan)!==null&&b!==void 0?b:1)},0);if(r({type:"headerrow",key:"headerrow-"+r,index:r,value:null,rendered:null,level:0,hasChildNodes:!0,childNodes:d,textValue:""}))}class Ku extends Fu{*[Symbol.iterator](){yield*this.body.childNodes}get size(){return this._size}getKeys(){return this.keyMap.keys()}getKeyBefore(t){let l=this.keyMap.get(t);var u;return(u=l?.prevKey)!==null&&u!==void 0?u:null}getKeyAfter(t){let l=this.keyMap.get(t);var u;return(u=l?.nextKey)!==null&&u!==void 0?u:null}getFirstKey(){var t,l;return(l=(t=U(this.body.childNodes))===null||t===void 0?void 0:t.key)!==null&&l!==void 0?l:null}getLastKey(){var t,l;return(l=(t=W(this.body.childNodes))===null||t===void 0?void 0:t.key)!==null&&l!==void 0?l:null}getItem(t){var l;return(l=this.keyMap.get(t))!==null&&l!==void 0?l:null}at(t){const l=[...this.getKeys()];return this.getItem(l[t])}getChildren(t){return t===this.body.key?this.body.childNodes:super.getChildren(t)}getTextValue(t){let l=this.getItem(t);if(!l)return"";if(l.textValue)return l.textValue;let u=this.rowHeaderColumnKeys;if(u){let o=[];for(let n of l.childNodes){let i=this.columns[n.index];if(u.has(i.key)&&n.textValue&&o.push(n.textValue),o.length===u.size)break}return o.join(" ")}return""}constructor(t,l,u){let o=new Set,n=null,i=[];if(u?.showSelectionCheckboxes){let r={type:"column",key:rl,value:null,textValue:"",level:0,index:u?.showDragButtons?1:0,hasChildNodes:!1,rendered:null,childNodes:[],props:{isSelectionCell:!0}};i.unshift(r)}if(u?.showDragButtons){let r={type:"column",key:de,value:null,textValue:"",level:0,index:0,hasChildNodes:!1,rendered:null,childNodes:[],props:{isDragButtonCell:!0}};i.unshift(r)}let a=[],m=new Map,c=r=>{switch(r.type){case"body":n=r;break;case"column":m.set(r.key,r),r.hasChildNodes||(i.push(r),r.props.isRowHeader&&o.add(r.key));break;case"item":a.push(r);return}for(let p of r.childNodes)c(p)};for(let r of t)c(r);let d=Pu(m,i);if(d.forEach((r,p)=>a.splice(p,0,r)),super({columnCount:i.length,items:a,visitNode:r=>(r.column=i[r.index],r)}),this._size=0,this.columns=i,this.rowHeaderColumnKeys=o,this.body=n,this.headerRows=d,this._size=[...n.childNodes].length,this.rowHeaderColumnKeys.size===0){let r=this.columns.find(p=>{var s,b;return!(!((s=p.props)===null||s===void 0)&&s.isDragButtonCell)&&!(!((b=p.props)===null||b===void 0)&&b.isSelectionCell)});r&&this.rowHeaderColumnKeys.add(r.key)}}}const Iu={ascending:"descending",descending:"ascending"};function ju(e){let[t,l]=B.useState(!1),{selectionMode:u="none",showSelectionCheckboxes:o,showDragButtons:n}=e,i=B.useMemo(()=>({showSelectionCheckboxes:o&&u!=="none",showDragButtons:n,selectionMode:u,columns:[]}),[e.children,o,u,n]),a=ql(e,B.useCallback(r=>new Ku(r,null,i),[i]),i),{disabledKeys:m,selectionManager:c}=zu({...e,collection:a,disabledBehavior:e.disabledBehavior||"selection"});var d;return{collection:a,disabledKeys:m,selectionManager:c,showSelectionCheckboxes:e.showSelectionCheckboxes||!1,sortDescriptor:(d=e.sortDescriptor)!==null&&d!==void 0?d:null,isKeyboardNavigationDisabled:a.size===0||t,setKeyboardNavigationDisabled:l,sort(r,p){var s,b;(b=e.onSortChange)===null||b===void 0||b.call(e,{column:r,direction:p??(((s=e.sortDescriptor)===null||s===void 0?void 0:s.column)===r?Iu[e.sortDescriptor.direction]:"ascending")})}}}function al(e){return null}al.getCollectionNode=function*(t,l){let{children:u,columns:o}=t;if(l.columns=[],typeof u=="function"){if(!o)throw new Error("props.children was a function but props.columns is missing");for(let n of o)yield{type:"column",value:n,renderer:u}}else{let n=[];q.Children.forEach(u,i=>{n.push({type:"column",element:i})}),yield*n}};let Mu=al;function cl(e){return null}cl.getCollectionNode=function*(t){let{children:l,items:u}=t;yield{type:"body",hasChildNodes:!0,props:t,*childNodes(){if(typeof l=="function"){if(!u)throw new Error("props.children was a function but props.items is missing");for(let o of u)yield{type:"item",value:o,renderer:l}}else{let o=[];q.Children.forEach(l,n=>{o.push({type:"item",element:n})}),yield*o}}}};let Tu=cl;function dl(e){return null}dl.getCollectionNode=function*(t,l){let{title:u,children:o,childColumns:n}=t,i=u||o,a=t.textValue||(typeof i=="string"?i:"")||t["aria-label"],m=yield{type:"column",hasChildNodes:!!n||!!u&&q.Children.count(o)>0,rendered:i,textValue:a,props:t,*childNodes(){if(n)for(let d of n)yield{type:"column",value:d};else if(u){let d=[];q.Children.forEach(o,r=>{d.push({type:"column",element:r})}),yield*d}},shouldInvalidate(d){return c(d),!1}},c=d=>{for(let r of m)r.hasChildNodes||d.columns.push(r)};c(l)};let Ru=dl;function me(e){return null}me.getCollectionNode=function*(t,l){let{children:u,textValue:o,UNSTABLE_childItems:n}=t;yield{type:"item",props:t,textValue:o,"aria-label":t["aria-label"],hasChildNodes:!0,*childNodes(){if(l.showDragButtons&&(yield{type:"cell",key:"header-drag",props:{isDragButtonCell:!0}}),l.showSelectionCheckboxes&&l.selectionMode!=="none"&&(yield{type:"cell",key:"header",props:{isSelectionCell:!0}}),typeof u=="function"){for(let i of l.columns)yield{type:"cell",element:u(i.key),key:i.key};if(n)for(let i of n)yield{type:"item",value:i}}else{let i=[],a=[],m=0;if(q.Children.forEach(u,c=>{if(c.type===me){if(i.lengtha.key!==l.columns[m].key)||i.showSelectionCheckboxes!==l.showSelectionCheckboxes||i.showDragButtons!==l.showDragButtons||i.selectionMode!==l.selectionMode}}};let Vu=me;function ml(e){return null}ml.getCollectionNode=function*(t){let{children:l}=t,u=t.textValue||(typeof l=="string"?l:"")||t["aria-label"]||"";yield{type:"cell",props:t,rendered:l,textValue:u,"aria-label":t["aria-label"],hasChildNodes:!1}};let Ou=ml;function pl(e){var t;const l=Jl(),[u,o]=Pe(e,ke.variantKeys),{ref:n,as:i,baseRef:a,children:m,className:c,classNames:d,removeWrapper:r=!1,disableAnimation:p=(t=l?.disableAnimation)!=null?t:!1,isKeyboardNavigationDisabled:s=!1,selectionMode:b="none",topContentPlacement:v="inside",bottomContentPlacement:g="inside",selectionBehavior:x=b==="none"?null:"toggle",disabledBehavior:D="selection",showSelectionCheckboxes:y=b==="multiple"&&x!=="replace",BaseComponent:$="div",checkboxesProps:f,topContent:E,bottomContent:S,sortIcon:A,onRowAction:k,onCellAction:C,...N}=u,j=i||"table",F=typeof j=="string",R=M(n),Q=M(a),G=ju({...e,children:m,showSelectionCheckboxes:y});s&&!G.isKeyboardNavigationDisabled&&G.setKeyboardNavigationDisabled(!0);const{collection:se}=G,{layout:sn,...Fl}=e,{gridProps:$e}=Bu({...Fl},G,R),ee=b!=="none",ye=b==="multiple",H=B.useMemo(()=>ke({...o,isSelectable:ee,isMultiSelectable:ye}),[Ke(o),ee,ye]),xe=K(d?.base,c),Pl=B.useMemo(()=>{var P;return{state:G,slots:H,isSelectable:ee,collection:se,classNames:d,color:e?.color,disableAnimation:p,checkboxesProps:f,isHeaderSticky:(P=e?.isHeaderSticky)!=null?P:!1,selectionMode:b,selectionBehavior:x,disabledBehavior:D,showSelectionCheckboxes:y,onRowAction:k,onCellAction:C}},[H,G,se,ee,d,b,x,f,D,p,y,e?.color,e?.isHeaderSticky,k,C]),Kl=B.useCallback(P=>({...P,ref:Q,className:H.base({class:K(xe,P?.className)})}),[xe,H]),Il=B.useCallback(P=>({...P,ref:Q,className:H.wrapper({class:K(d?.wrapper,P?.className)})}),[d?.wrapper,H]),jl=B.useCallback(P=>({...I($e,O(N,{enabled:F}),P),onKeyDownCapture:void 0,ref:R,className:H.table({class:K(d?.table,P?.className)})}),[d?.table,F,H,$e,N]);return{BaseComponent:$,Component:j,children:m,state:G,collection:se,values:Pl,topContent:E,bottomContent:S,removeWrapper:r,topContentPlacement:v,bottomContentPlacement:g,sortIcon:A,getBaseProps:Kl,getWrapperProps:Il,getTableProps:jl}}var bl=T((e,t)=>{var l,u,o;const{as:n,className:i,node:a,rowKey:m,slots:c,state:d,classNames:r,...p}=e,s=n||"td",b=typeof s=="string",v=M(t),{gridCellProps:g}=ol({node:a},d,v),x=K(r?.td,i,(l=a.props)==null?void 0:l.className),{isFocusVisible:D,focusProps:y}=X(),$=d.selectionManager.isSelected(m),f=B.useMemo(()=>{const S=typeof a.rendered;return S!=="object"&&S!=="function"?h.jsx("span",{children:a.rendered}):a.rendered},[a.rendered]),E=((u=a.column)==null?void 0:u.props)||{};return h.jsx(s,{ref:v,"data-focus-visible":w(D),"data-selected":w($),...I(g,y,O(a.props,{enabled:b}),p),className:(o=c.td)==null?void 0:o.call(c,{align:E.align,class:x}),children:f})});bl.displayName="HeroUI.TableCell";var fl=bl,hl=T((e,t)=>{var l,u;const{as:o,className:n,node:i,rowKey:a,slots:m,state:c,color:d,disableAnimation:r,checkboxesProps:p,selectionMode:s,classNames:b,...v}=e,g=o||"td",x=typeof g=="string",D=M(t),{gridCellProps:y}=ol({node:i},c,D),{isFocusVisible:$,focusProps:f}=X(),{checkboxProps:E}=wu({key:i?.parentKey||i.key},c),S=K(b?.td,n,(l=i.props)==null?void 0:l.className),A=s==="single",{onChange:k,...C}=E,N=c.selectionManager.isSelected(a);return h.jsx(g,{ref:D,"data-focus-visible":w($),"data-selected":w(N),...I(y,f,O(i.props,{enabled:x}),v),className:(u=m.td)==null?void 0:u.call(m,{class:S}),children:A?h.jsx(be,{children:E["aria-label"]}):h.jsx(Fe,{color:d,disableAnimation:r,onValueChange:k,...I(p,C)})})});hl.displayName="HeroUI.TableCheckboxCell";var vl=hl,gl=T((e,t)=>{var l,u;const{as:o,className:n,children:i,node:a,slots:m,state:c,isSelectable:d,classNames:r,...p}=e,s=o||(e?.href?"a":"tr"),b=typeof s=="string",v=M(t),{rowProps:g}=Eu({node:a},c,v),x=K(r?.tr,n,(l=a.props)==null?void 0:l.className),{isFocusVisible:D,focusProps:y}=X(),$=c.disabledKeys.has(a.key),f=c.selectionManager.isSelected(a.key),{isHovered:E,hoverProps:S}=Ie({isDisabled:$}),{isFirst:A,isLast:k,isMiddle:C,isOdd:N}=B.useMemo(()=>{const j=a.key===c.collection.getFirstKey(),F=a.key===c.collection.getLastKey(),R=!j&&!F,Q=a?.index?(a.index+1)%2===0:!1;return{isFirst:j,isLast:F,isMiddle:R,isOdd:Q}},[a,c.collection]);return h.jsx(s,{ref:v,"data-disabled":w($),"data-first":w(A),"data-focus-visible":w(D),"data-hover":w(E),"data-last":w(k),"data-middle":w(C),"data-odd":w(N),"data-selected":w(f),...I(g,y,d?S:{},O(a.props,{enabled:b}),p),className:(u=m.tr)==null?void 0:u.call(m,{class:x}),children:i})});gl.displayName="HeroUI.TableRow";var $l=gl,yl=T((e,t)=>{var l;const{as:u,className:o,slots:n,state:i,collection:a,isSelectable:m,color:c,disableAnimation:d,checkboxesProps:r,selectionMode:p,classNames:s,rowVirtualizer:b,...v}=e,g=u||"tbody",x=typeof g=="string",D=M(t),{rowGroupProps:y}=ge(),$=K(s?.tbody,o),f=a?.body.props,E=f?.isLoading||f?.loadingState==="loading"||f?.loadingState==="loadingMore",S=[...a.body.childNodes],A=b.getVirtualItems();let k,C;return a.size===0&&f.emptyContent&&(k=h.jsx("tr",{role:"row",children:h.jsx("td",{className:n?.emptyWrapper({class:s?.emptyWrapper}),colSpan:a.columnCount,role:"gridcell",children:!E&&f.emptyContent})})),E&&f.loadingContent&&(C=h.jsxs("tr",{role:"row",children:[h.jsx("td",{className:n?.loadingWrapper({class:s?.loadingWrapper}),colSpan:a.columnCount,role:"gridcell",children:f.loadingContent}),!k&&a.size===0?h.jsx("td",{className:n?.emptyWrapper({class:s?.emptyWrapper})}):null]})),h.jsxs(g,{ref:D,...I(y,O(f,{enabled:x}),v),className:(l=n.tbody)==null?void 0:l.call(n,{class:$}),"data-empty":w(a.size===0),"data-loading":w(E),children:[A.map((N,j)=>{const F=S[N.index];return F?h.jsx($l,{classNames:s,isSelectable:m,node:F,slots:n,state:i,style:{transform:`translateY(${N.start-j*N.size}px)`,height:`${N.size}px`},children:[...F.childNodes].map(R=>R.props.isSelectionCell?h.jsx(vl,{checkboxesProps:r,classNames:s,color:c,disableAnimation:d,node:R,rowKey:F.key,selectionMode:p,slots:n,state:i},String(R.key)):h.jsx(fl,{classNames:s,node:R,rowKey:F.key,slots:n,state:i},String(R.key)))},String(F.key)):null}),C,k]})});yl.displayName="HeroUI.VirtualizedTableBody";var Hu=yl,xl=T((e,t)=>{var l,u,o,n,i;const{as:a,className:m,state:c,node:d,slots:r,classNames:p,sortIcon:s,...b}=e,v=a||"th",g=typeof v=="string",x=M(t),{columnHeaderProps:D}=nl({node:d},c,x),y=K(p?.th,m,(l=d.props)==null?void 0:l.className),{isFocusVisible:$,focusProps:f}=X(),{isHovered:E,hoverProps:S}=Ie({}),{hideHeader:A,align:k,...C}=d.props,N=C.allowsSorting,j={"aria-hidden":!0,"data-direction":(u=c.sortDescriptor)==null?void 0:u.direction,"data-visible":w(((o=c.sortDescriptor)==null?void 0:o.column)===d.key),className:(n=r.sortIcon)==null?void 0:n.call(r,{class:p?.sortIcon})},F=typeof s=="function"?s(j):B.isValidElement(s)&&B.cloneElement(s,j);return h.jsxs(v,{ref:x,colSpan:d.colspan,"data-focus-visible":w($),"data-hover":w(E),"data-sortable":w(N),...I(D,f,O(C,{enabled:g}),N?S:{},b),className:(i=r.th)==null?void 0:i.call(r,{align:k,class:y}),children:[A?h.jsx(be,{children:d.rendered}):d.rendered,N&&(F||h.jsx(su,{strokeWidth:3,...j}))]})});xl.displayName="HeroUI.TableColumnHeader";var Cl=xl,Dl=T((e,t)=>{var l,u;const{as:o,className:n,children:i,node:a,slots:m,classNames:c,state:d,...r}=e,p=o||"tr",s=typeof p=="string",b=M(t),{rowProps:v}=Su({node:a},d),g=K(c?.tr,n,(l=a.props)==null?void 0:l.className);return h.jsx(p,{ref:b,...I(v,O(a.props,{enabled:s}),r),className:(u=m.tr)==null?void 0:u.call(m,{class:g}),children:i})});Dl.displayName="HeroUI.TableHeaderRow";var Bl=Dl,kl=B.forwardRef((e,t)=>{var l;const{as:u,className:o,children:n,slots:i,classNames:a,...m}=e,c=u||"thead",d=M(t),{rowGroupProps:r}=ge(),p=K(a?.thead,o);return h.jsx(c,{ref:d,className:(l=i.thead)==null?void 0:l.call(i,{class:p}),...I(r,m),children:n})});kl.displayName="HeroUI.TableRowGroup";var El=kl,Lu={px:"1px",0:"0px",.5:"0.125rem",1:"0.25rem",1.5:"0.375rem",2:"0.5rem",2.5:"0.625rem",3:"0.75rem",3.5:"0.875rem",4:"1rem",5:"1.25rem",6:"1.5rem",7:"1.75rem",8:"2rem",9:"2.25rem",10:"2.5rem",11:"2.75rem",12:"3rem",14:"3.5rem",16:"4rem",20:"5rem",24:"6rem",28:"7rem",32:"8rem",36:"9rem",40:"10rem",44:"11rem",48:"12rem",52:"13rem",56:"14rem",60:"15rem",64:"16rem",72:"18rem",80:"20rem",96:"24rem"},Ae=e=>{var t;return(t=Lu[e])!=null?t:e};function Uu(e){const[t,l]=Pe(e,Be.variantKeys),{as:u,className:o,x:n=1,y:i=1,...a}=t,m=u||"span",c=B.useMemo(()=>Be({...l,className:o}),[Ke(l),o]),d=Ae(n),r=Ae(i);return{Component:m,getSpacerProps:(s={})=>({...s,...a,"aria-hidden":w(!0),className:K(c,s.className),style:{...s.style,...a.style,marginLeft:d,marginTop:r}})}}var Sl=T((e,t)=>{const{Component:l,getSpacerProps:u}=Uu({...e});return h.jsx(l,{ref:t,...u()})});Sl.displayName="HeroUI.Spacer";var Al=Sl,wl=T((e,t)=>{const{BaseComponent:l,Component:u,collection:o,values:n,topContent:i,topContentPlacement:a,bottomContentPlacement:m,bottomContent:c,getBaseProps:d,getWrapperProps:r,getTableProps:p}=pl({...e,ref:t}),{rowHeight:s=40,maxTableHeight:b=600}=e,v=B.useCallback(({children:A})=>h.jsx(l,{...r(),ref:D,style:{height:b,display:"block"},children:A}),[r,b]),x=[...o.body.childNodes].length,D=B.useRef(null),[y,$]=B.useState(0),f=B.useRef(null);B.useLayoutEffect(()=>{f.current&&$(f.current.getBoundingClientRect().height)},[f]);const E=iu({count:x,getScrollElement:()=>D.current,estimateSize:()=>s,overscan:5}),S=p();return h.jsxs("div",{...d(),children:[a==="outside"&&i,h.jsx(v,{children:h.jsxs(h.Fragment,{children:[a==="inside"&&i,h.jsxs(u,{...S,style:{height:`calc(${E.getTotalSize()+y}px)`,...S.style},children:[h.jsxs(El,{ref:f,classNames:n.classNames,slots:n.slots,children:[o.headerRows.map(A=>h.jsx(Bl,{classNames:n.classNames,node:A,slots:n.slots,state:n.state,children:[...A.childNodes].map(k=>{var C;return(C=k?.props)!=null&&C.isSelectionCell?h.jsx(il,{checkboxesProps:n.checkboxesProps,classNames:n.classNames,color:n.color,disableAnimation:n.disableAnimation,node:k,selectionMode:n.selectionMode,slots:n.slots,state:n.state},k?.key):h.jsx(Cl,{classNames:n.classNames,node:k,slots:n.slots,state:n.state},k?.key)})},A?.key)),h.jsx(Al,{as:"tr",tabIndex:-1,y:1})]}),h.jsx(Hu,{checkboxesProps:n.checkboxesProps,classNames:n.classNames,collection:n.collection,color:n.color,disableAnimation:n.disableAnimation,isSelectable:n.isSelectable,rowVirtualizer:E,selectionMode:n.selectionMode,slots:n.slots,state:n.state})]}),m==="inside"&&c]})}),m==="outside"&&c]})});wl.displayName="HeroUI.VirtualizedTable";var Wu=wl,Nl=T((e,t)=>{var l;const{as:u,className:o,slots:n,state:i,collection:a,isSelectable:m,color:c,disableAnimation:d,checkboxesProps:r,selectionMode:p,classNames:s,...b}=e,v=u||"tbody",g=typeof v=="string",x=M(t),{rowGroupProps:D}=ge(),y=K(s?.tbody,o),$=a?.body.props,f=$?.isLoading||$?.loadingState==="loading"||$?.loadingState==="loadingMore",E=B.useMemo(()=>[...a.body.childNodes].map(k=>h.jsx($l,{classNames:s,isSelectable:m,node:k,slots:n,state:i,children:[...k.childNodes].map(C=>C.props.isSelectionCell?h.jsx(vl,{checkboxesProps:r,classNames:s,color:c,disableAnimation:d,node:C,rowKey:k.key,selectionMode:p,slots:n,state:i},C.key):h.jsx(fl,{classNames:s,node:C,rowKey:k.key,slots:n,state:i},C.key))},k.key)),[a.body.childNodes,s,m,n,i]);let S,A;return a.size===0&&$.emptyContent&&(S=h.jsx("tr",{role:"row",children:h.jsx("td",{className:n?.emptyWrapper({class:s?.emptyWrapper}),colSpan:a.columnCount,role:"gridcell",children:!f&&$.emptyContent})})),f&&$.loadingContent&&(A=h.jsxs("tr",{role:"row",children:[h.jsx("td",{className:n?.loadingWrapper({class:s?.loadingWrapper}),colSpan:a.columnCount,role:"gridcell",children:$.loadingContent}),!S&&a.size===0?h.jsx("td",{className:n?.emptyWrapper({class:s?.emptyWrapper})}):null]})),h.jsxs(v,{ref:x,...I(D,O($,{enabled:g}),b),className:(l=n.tbody)==null?void 0:l.call(n,{class:y}),"data-empty":w(a.size===0),"data-loading":w(f),children:[E,A,S]})});Nl.displayName="HeroUI.TableBody";var Gu=Nl,zl=T((e,t)=>{const{BaseComponent:l,Component:u,collection:o,values:n,topContent:i,topContentPlacement:a,bottomContentPlacement:m,bottomContent:c,removeWrapper:d,sortIcon:r,getBaseProps:p,getWrapperProps:s,getTableProps:b}=pl({...e,ref:t}),{isVirtualized:v,rowHeight:g=40,maxTableHeight:x=600}=e,D=v,y=B.useCallback(({children:$})=>d?$:h.jsx(l,{...s(),children:$}),[d,s]);return D?h.jsx(Wu,{...e,ref:t,maxTableHeight:x,rowHeight:g}):h.jsxs("div",{...p(),children:[a==="outside"&&i,h.jsx(y,{children:h.jsxs(h.Fragment,{children:[a==="inside"&&i,h.jsxs(u,{...b(),children:[h.jsxs(El,{classNames:n.classNames,slots:n.slots,children:[o.headerRows.map($=>h.jsx(Bl,{classNames:n.classNames,node:$,slots:n.slots,state:n.state,children:[...$.childNodes].map(f=>{var E;return(E=f?.props)!=null&&E.isSelectionCell?h.jsx(il,{checkboxesProps:n.checkboxesProps,classNames:n.classNames,color:n.color,disableAnimation:n.disableAnimation,node:f,selectionMode:n.selectionMode,slots:n.slots,state:n.state},f?.key):h.jsx(Cl,{classNames:n.classNames,node:f,slots:n.slots,sortIcon:r,state:n.state},f?.key)})},$?.key)),h.jsx(Al,{as:"tr",tabIndex:-1,y:1})]}),h.jsx(Gu,{checkboxesProps:n.checkboxesProps,classNames:n.classNames,collection:n.collection,color:n.color,disableAnimation:n.disableAnimation,isSelectable:n.isSelectable,selectionMode:n.selectionMode,slots:n.slots,state:n.state})]}),m==="inside"&&c]})}),m==="outside"&&c]})});zl.displayName="HeroUI.Table";var Yu=zl,Zu=Ru,_u=Zu,qu=Mu,Ju=qu,Xu=Vu,Qu=Xu,en=Tu,tn=en,ln=Ou,un=ln;const nn={n_requests:"Number Of Requests",estimated_cost:"Estimated Cost ($)"},we=["model","n_requests","prompt_tokens","completion_tokens","total_tokens","estimated_cost"];function on(e){return e.replace(/(-?)(\d*)\.?(\d*)e([+-]\d+)/,function(t,l,u,o,n){return n<0?l+"0."+Array(1-n-u.length).join("0")+o+u:l+u+o+Array(n-o.length+1).join("0")})}function dn({usage:e}){const t=Object.keys(e),{isOpen:l,onOpen:u,onClose:o}=Xl(),n=()=>{o()},i=Object.keys(e[t[0]]),a=[...we.filter(s=>s==="model"||i.includes(s)),...i.filter(s=>!we.includes(s))],m=i.reduce((s,b)=>({...s,[b]:0}),{}),c=t.reduce((s,b)=>(a.reduce((v,g)=>(g==="model"||(v[g]+=e[b][g]),v),s),s),m),d=[...a.map(s=>({key:s,label:nn[s]??De.words(s).map(De.upperFirst).join(" ")}))],r=[...t.map(s=>({model:s,...e[s]})),{model:"Total",...c}],p=h.jsxs("div",{className:"p-2",children:[h.jsxs("div",{className:"flex flex-col gap-2",children:[c.prompt_tokens!==void 0&&h.jsxs("div",{className:"flex justify-between gap-2",children:[h.jsx("span",{className:"font-semibold",children:"Prompt tokens"}),h.jsx("span",{children:c.prompt_tokens})]}),c.completion_tokens!==void 0&&h.jsxs("div",{className:"flex justify-between gap-2",children:[h.jsx("span",{className:"font-semibold",children:"Completion tokens"}),h.jsx("span",{children:c.completion_tokens})]}),c.total_tokens!==void 0&&h.jsxs("div",{className:"flex justify-between gap-2",children:[h.jsx("span",{className:"font-semibold",children:"Total tokens"}),h.jsx("span",{children:c.total_tokens})]}),c.estimated_cost!==void 0&&h.jsxs("div",{className:"flex justify-between gap-2",children:[h.jsx("span",{className:"font-semibold",children:"Estimated cost"}),h.jsxs("span",{children:[on(c.estimated_cost.toString()),"$"]})]})]}),h.jsx("p",{className:"m-auto mt-2 text-center",children:"Show detailed usage breakdown by model."})]});return h.jsxs(h.Fragment,{children:[h.jsx(Ql,{content:p,placement:"bottom",children:h.jsx(eu,{isIconOnly:!0,variant:"ghost",className:"p-0","aria-label":"Open usage details",onPress:u,children:h.jsx(tu,{icon:"heroicons:information-circle"})})}),h.jsx(lu,{isOpen:l,onOpenChange:n,size:"4xl",children:h.jsx(uu,{children:h.jsxs(h.Fragment,{children:[h.jsx(ru,{className:"text-default-900 flex flex-col gap-1",children:"Usage details"}),h.jsx(nu,{children:h.jsxs(Yu,{"aria-label":"Table with detailed usage statistics for each model used to generate the message.",fullWidth:!0,children:[h.jsx(Ju,{columns:d,children:s=>h.jsx(_u,{children:s.label},s.key)}),h.jsx(tn,{items:r,children:s=>h.jsx(Qu,{className:s.model==="Total"?"border-default-200 border-t-1":"",children:b=>h.jsx(un,{children:ou(s,b)})},s.model)})]})})]})})})]})}export{dn as default}; diff --git a/packages/ragbits-chat/src/ragbits/chat/ui-build/assets/UsageButton-dxos0384.js b/packages/ragbits-chat/src/ragbits/chat/ui-build/assets/UsageButton-dxos0384.js new file mode 100644 index 000000000..9d688fcc4 --- /dev/null +++ b/packages/ragbits-chat/src/ragbits/chat/ui-build/assets/UsageButton-dxos0384.js @@ -0,0 +1 @@ +import{r as B,aX as Ml,aY as ae,t as Ne,k as ie,aK as z,aZ as W,a_ as U,a$ as te,b0 as Tl,aT as _,b1 as Rl,b2 as Vl,A as ze,b3 as ue,b4 as Ol,K as pe,H as Hl,J,M as Ll,b5 as L,af as Ul,b6 as Y,b7 as Z,b8 as le,U as Wl,b9 as Gl,ba as Ce,bb as Yl,l as T,R as M,W as X,Z as K,j as h,v as I,a2 as w,ap as be,au as Fe,a3 as O,w as Zl,y as _l,x as ql,a5 as q,O as Jl,Q as Pe,a0 as Ke,X as Ie,u as Xl,as as De,D as Ql,d as eu,I as tu,m as lu,e as uu,f as nu,bc as ou}from"./index-DaG4uPnK.js";import{b as fe,$ as je}from"./useSelectableItem-ChcXAf8h.js";import{C as su,u as iu}from"./index-qUEoadOF.js";import{m as ru}from"./chunk-IGSAU2ZA-Beuyhkep.js";function Me(e,t){const l=B.useRef(!0),u=B.useRef(null);B.useEffect(()=>(l.current=!0,()=>{l.current=!1}),[]),B.useEffect(()=>{let o=u.current;l.current?l.current=!1:(!o||t.some((n,i)=>!Object.is(n,o[i])))&&e(),u.current=t},t)}function au(e,t){let l=t?.isDisabled,[u,o]=B.useState(!1);return Ml(()=>{if(e?.current&&!l){let n=()=>{if(e.current){let a=ae(e.current,{tabbable:!0});o(!!a.nextNode())}};n();let i=new MutationObserver(n);return i.observe(e.current,{subtree:!0,childList:!0,attributes:!0,attributeFilter:["tabIndex","disabled"]}),()=>{i.disconnect()}}}),l?!1:u}var Be=Ne({base:"w-px h-px inline-block",variants:{isInline:{true:"inline-block",false:"block"}},defaultVariants:{isInline:!1}}),ke=Ne({slots:{base:"flex flex-col relative gap-4",wrapper:["p-4","z-0","flex","flex-col","relative","justify-between","gap-4","shadow-small","bg-content1","overflow-auto"],table:"min-w-full h-auto",thead:"[&>tr]:first:rounded-lg",tbody:"after:block",tr:["group/tr","outline-hidden",...ie],th:["group/th","px-3","h-10","text-start","align-middle","bg-default-100","whitespace-nowrap","text-foreground-500","text-tiny","font-semibold","first:rounded-s-lg","last:rounded-e-lg","outline-hidden","data-[sortable=true]:cursor-pointer","data-[hover=true]:text-foreground-400",...ie],td:["py-2","px-3","relative","align-middle","whitespace-normal","text-small","font-normal","outline-hidden","[&>*]:z-1","[&>*]:relative",...ie,"before:pointer-events-none","before:content-['']","before:absolute","before:z-0","before:inset-0","before:opacity-0","data-[selected=true]:before:opacity-100","group-data-[disabled=true]/tr:text-foreground-300","group-data-[disabled=true]/tr:cursor-not-allowed"],tfoot:"",sortIcon:["ms-2","mb-px","opacity-0","text-inherit","inline-block","transition-transform-opacity","data-[visible=true]:opacity-100","group-data-[hover=true]/th:opacity-100","data-[direction=ascending]:rotate-180"],emptyWrapper:"text-foreground-400 align-middle text-center h-40",loadingWrapper:"absolute inset-0 flex items-center justify-center"},variants:{color:{default:{td:"before:bg-default/60 data-[selected=true]:text-default-foreground"},primary:{td:"before:bg-primary/20 data-[selected=true]:text-primary"},secondary:{td:"before:bg-secondary/20 data-[selected=true]:text-secondary"},success:{td:"before:bg-success/20 data-[selected=true]:text-success-600 dark:data-[selected=true]:text-success"},warning:{td:"before:bg-warning/20 data-[selected=true]:text-warning-600 dark:data-[selected=true]:text-warning"},danger:{td:"before:bg-danger/20 data-[selected=true]:text-danger dark:data-[selected=true]:text-danger-500"}},layout:{auto:{table:"table-auto"},fixed:{table:"table-fixed"}},shadow:{none:{wrapper:"shadow-none"},sm:{wrapper:"shadow-small"},md:{wrapper:"shadow-medium"},lg:{wrapper:"shadow-large"}},hideHeader:{true:{thead:"hidden"}},isStriped:{true:{td:["group-data-[odd=true]/tr:before:bg-default-100","group-data-[odd=true]/tr:before:opacity-100","group-data-[odd=true]/tr:before:-z-10"]}},isCompact:{true:{td:"py-1"},false:{}},isHeaderSticky:{true:{thead:"sticky top-0 z-20 [&>tr]:first:shadow-small"}},isSelectable:{true:{tr:"cursor-default",td:["group-aria-[selected=false]/tr:group-data-[hover=true]/tr:before:bg-default-100","group-aria-[selected=false]/tr:group-data-[hover=true]/tr:before:opacity-70"]}},isMultiSelectable:{true:{td:["group-data-[first=true]/tr:first:before:rounded-ss-lg","group-data-[first=true]/tr:last:before:rounded-se-lg","group-data-[middle=true]/tr:before:rounded-none","group-data-[last=true]/tr:first:before:rounded-es-lg","group-data-[last=true]/tr:last:before:rounded-ee-lg"]},false:{td:["first:before:rounded-s-lg","last:before:rounded-e-lg"]}},radius:{none:{wrapper:"rounded-none",th:["first:rounded-s-none","first:before:rounded-s-none","last:rounded-e-none","last:before:rounded-e-none"],td:["first:before:rounded-s-none","last:before:rounded-e-none","group-data-[first=true]/tr:first:before:rounded-ss-none","group-data-[first=true]/tr:last:before:rounded-se-none","group-data-[last=true]/tr:first:before:rounded-es-none","group-data-[last=true]/tr:last:before:rounded-ee-none"]},sm:{wrapper:"rounded-small"},md:{wrapper:"rounded-medium"},lg:{wrapper:"rounded-large"}},fullWidth:{true:{base:"w-full",wrapper:"w-full",table:"w-full"}},align:{start:{th:"text-start",td:"text-start"},center:{th:"text-center",td:"text-center"},end:{th:"text-end",td:"text-end"}}},defaultVariants:{layout:"auto",shadow:"sm",radius:"lg",color:"default",isCompact:!1,hideHeader:!1,isStriped:!1,fullWidth:!0,align:"start"},compoundVariants:[{isStriped:!0,color:"default",class:{td:"group-data-[odd=true]/tr:data-[selected=true]/tr:before:bg-default/60"}},{isStriped:!0,color:"primary",class:{td:"group-data-[odd=true]/tr:data-[selected=true]/tr:before:bg-primary/20"}},{isStriped:!0,color:"secondary",class:{td:"group-data-[odd=true]/tr:data-[selected=true]/tr:before:bg-secondary/20"}},{isStriped:!0,color:"success",class:{td:"group-data-[odd=true]/tr:data-[selected=true]/tr:before:bg-success/20"}},{isStriped:!0,color:"warning",class:{td:"group-data-[odd=true]/tr:data-[selected=true]/tr:before:bg-warning/20"}},{isStriped:!0,color:"danger",class:{td:"group-data-[odd=true]/tr:data-[selected=true]/tr:before:bg-danger/20"}}]});const he=new WeakMap;function ce(e){return typeof e=="string"?e.replace(/\s*/g,""):""+e}function cu(e,t){let l=he.get(e);if(!l)throw new Error("Unknown grid");return`${l}-${ce(t)}`}function Te(e,t,l){let u=he.get(e);if(!u)throw new Error("Unknown grid");return`${u}-${ce(t)}-${ce(l)}`}function Re(e,t){return[...e.collection.rowHeaderColumnKeys].map(l=>Te(e,t,l)).join(" ")}var Ve={};Ve={ascending:"تصاعدي",ascendingSort:e=>`ترتيب حسب العمود ${e.columnName} بترتيب تصاعدي`,columnSize:e=>`${e.value} بالبكسل`,descending:"تنازلي",descendingSort:e=>`ترتيب حسب العمود ${e.columnName} بترتيب تنازلي`,resizerDescription:"اضغط على مفتاح Enter لبدء تغيير الحجم",select:"تحديد",selectAll:"تحديد الكل",sortable:"عمود قابل للترتيب"};var Oe={};Oe={ascending:"възходящ",ascendingSort:e=>`сортирано по колона ${e.columnName} във възходящ ред`,columnSize:e=>`${e.value} пиксела`,descending:"низходящ",descendingSort:e=>`сортирано по колона ${e.columnName} в низходящ ред`,resizerDescription:"Натиснете „Enter“, за да започнете да преоразмерявате",select:"Изберете",selectAll:"Изберете всичко",sortable:"сортираща колона"};var He={};He={ascending:"vzestupně",ascendingSort:e=>`řazeno vzestupně podle sloupce ${e.columnName}`,columnSize:e=>`${e.value} pixelů`,descending:"sestupně",descendingSort:e=>`řazeno sestupně podle sloupce ${e.columnName}`,resizerDescription:"Stisknutím klávesy Enter začnete měnit velikost",select:"Vybrat",selectAll:"Vybrat vše",sortable:"sloupec s možností řazení"};var Le={};Le={ascending:"stigende",ascendingSort:e=>`sorteret efter kolonne ${e.columnName} i stigende rækkefølge`,columnSize:e=>`${e.value} pixels`,descending:"faldende",descendingSort:e=>`sorteret efter kolonne ${e.columnName} i faldende rækkefølge`,resizerDescription:"Tryk på Enter for at ændre størrelse",select:"Vælg",selectAll:"Vælg alle",sortable:"sorterbar kolonne"};var Ue={};Ue={ascending:"aufsteigend",ascendingSort:e=>`sortiert nach Spalte ${e.columnName} in aufsteigender Reihenfolge`,columnSize:e=>`${e.value} Pixel`,descending:"absteigend",descendingSort:e=>`sortiert nach Spalte ${e.columnName} in absteigender Reihenfolge`,resizerDescription:"Eingabetaste zum Starten der Größenänderung drücken",select:"Auswählen",selectAll:"Alles auswählen",sortable:"sortierbare Spalte"};var We={};We={ascending:"αύξουσα",ascendingSort:e=>`διαλογή ανά στήλη ${e.columnName} σε αύξουσα σειρά`,columnSize:e=>`${e.value} pixel`,descending:"φθίνουσα",descendingSort:e=>`διαλογή ανά στήλη ${e.columnName} σε φθίνουσα σειρά`,resizerDescription:"Πατήστε Enter για έναρξη της αλλαγής μεγέθους",select:"Επιλογή",selectAll:"Επιλογή όλων",sortable:"Στήλη διαλογής"};var Ge={};Ge={select:"Select",selectAll:"Select All",sortable:"sortable column",ascending:"ascending",descending:"descending",ascendingSort:e=>`sorted by column ${e.columnName} in ascending order`,descendingSort:e=>`sorted by column ${e.columnName} in descending order`,columnSize:e=>`${e.value} pixels`,resizerDescription:"Press Enter to start resizing"};var Ye={};Ye={ascending:"ascendente",ascendingSort:e=>`ordenado por columna ${e.columnName} en sentido ascendente`,columnSize:e=>`${e.value} píxeles`,descending:"descendente",descendingSort:e=>`ordenado por columna ${e.columnName} en orden descendente`,resizerDescription:"Pulse Intro para empezar a redimensionar",select:"Seleccionar",selectAll:"Seleccionar todos",sortable:"columna ordenable"};var Ze={};Ze={ascending:"tõusev järjestus",ascendingSort:e=>`sorditud veeru järgi ${e.columnName} tõusvas järjestuses`,columnSize:e=>`${e.value} pikslit`,descending:"laskuv järjestus",descendingSort:e=>`sorditud veeru järgi ${e.columnName} laskuvas järjestuses`,resizerDescription:"Suuruse muutmise alustamiseks vajutage klahvi Enter",select:"Vali",selectAll:"Vali kõik",sortable:"sorditav veerg"};var _e={};_e={ascending:"nouseva",ascendingSort:e=>`lajiteltu sarakkeen ${e.columnName} mukaan nousevassa järjestyksessä`,columnSize:e=>`${e.value} pikseliä`,descending:"laskeva",descendingSort:e=>`lajiteltu sarakkeen ${e.columnName} mukaan laskevassa järjestyksessä`,resizerDescription:"Aloita koon muutos painamalla Enter-näppäintä",select:"Valitse",selectAll:"Valitse kaikki",sortable:"lajiteltava sarake"};var qe={};qe={ascending:"croissant",ascendingSort:e=>`trié en fonction de la colonne ${e.columnName} par ordre croissant`,columnSize:e=>`${e.value} pixels`,descending:"décroissant",descendingSort:e=>`trié en fonction de la colonne ${e.columnName} par ordre décroissant`,resizerDescription:"Appuyez sur Entrée pour commencer le redimensionnement.",select:"Sélectionner",selectAll:"Sélectionner tout",sortable:"colonne triable"};var Je={};Je={ascending:"עולה",ascendingSort:e=>`מוין לפי עמודה ${e.columnName} בסדר עולה`,columnSize:e=>`${e.value} פיקסלים`,descending:"יורד",descendingSort:e=>`מוין לפי עמודה ${e.columnName} בסדר יורד`,resizerDescription:"הקש Enter כדי לשנות את הגודל",select:"בחר",selectAll:"בחר הכול",sortable:"עמודה שניתן למיין"};var Xe={};Xe={ascending:"rastući",ascendingSort:e=>`razvrstano po stupcima ${e.columnName} rastućem redoslijedom`,columnSize:e=>`${e.value} piksela`,descending:"padajući",descendingSort:e=>`razvrstano po stupcima ${e.columnName} padajućim redoslijedom`,resizerDescription:"Pritisnite Enter da biste započeli promenu veličine",select:"Odaberite",selectAll:"Odaberite sve",sortable:"stupac koji se može razvrstati"};var Qe={};Qe={ascending:"növekvő",ascendingSort:e=>`rendezve a(z) ${e.columnName} oszlop szerint, növekvő sorrendben`,columnSize:e=>`${e.value} képpont`,descending:"csökkenő",descendingSort:e=>`rendezve a(z) ${e.columnName} oszlop szerint, csökkenő sorrendben`,resizerDescription:"Nyomja le az Enter billentyűt az átméretezés megkezdéséhez",select:"Kijelölés",selectAll:"Összes kijelölése",sortable:"rendezendő oszlop"};var et={};et={ascending:"crescente",ascendingSort:e=>`in ordine crescente in base alla colonna ${e.columnName}`,columnSize:e=>`${e.value} pixel`,descending:"decrescente",descendingSort:e=>`in ordine decrescente in base alla colonna ${e.columnName}`,resizerDescription:"Premi Invio per iniziare a ridimensionare",select:"Seleziona",selectAll:"Seleziona tutto",sortable:"colonna ordinabile"};var tt={};tt={ascending:"昇順",ascendingSort:e=>`列 ${e.columnName} を昇順で並べ替え`,columnSize:e=>`${e.value} ピクセル`,descending:"降順",descendingSort:e=>`列 ${e.columnName} を降順で並べ替え`,resizerDescription:"Enter キーを押してサイズ変更を開始",select:"選択",selectAll:"すべて選択",sortable:"並べ替え可能な列"};var lt={};lt={ascending:"오름차순",ascendingSort:e=>`${e.columnName} 열을 기준으로 오름차순으로 정렬됨`,columnSize:e=>`${e.value} 픽셀`,descending:"내림차순",descendingSort:e=>`${e.columnName} 열을 기준으로 내림차순으로 정렬됨`,resizerDescription:"크기 조정을 시작하려면 Enter를 누르세요.",select:"선택",selectAll:"모두 선택",sortable:"정렬 가능한 열"};var ut={};ut={ascending:"didėjančia tvarka",ascendingSort:e=>`surikiuota pagal stulpelį ${e.columnName} didėjančia tvarka`,columnSize:e=>`${e.value} piks.`,descending:"mažėjančia tvarka",descendingSort:e=>`surikiuota pagal stulpelį ${e.columnName} mažėjančia tvarka`,resizerDescription:"Paspauskite „Enter“, kad pradėtumėte keisti dydį",select:"Pasirinkti",selectAll:"Pasirinkti viską",sortable:"rikiuojamas stulpelis"};var nt={};nt={ascending:"augošā secībā",ascendingSort:e=>`kārtots pēc kolonnas ${e.columnName} augošā secībā`,columnSize:e=>`${e.value} pikseļi`,descending:"dilstošā secībā",descendingSort:e=>`kārtots pēc kolonnas ${e.columnName} dilstošā secībā`,resizerDescription:"Nospiediet Enter, lai sāktu izmēru mainīšanu",select:"Atlasīt",selectAll:"Atlasīt visu",sortable:"kārtojamā kolonna"};var ot={};ot={ascending:"stigende",ascendingSort:e=>`sortert etter kolonne ${e.columnName} i stigende rekkefølge`,columnSize:e=>`${e.value} piksler`,descending:"synkende",descendingSort:e=>`sortert etter kolonne ${e.columnName} i synkende rekkefølge`,resizerDescription:"Trykk på Enter for å starte størrelsesendring",select:"Velg",selectAll:"Velg alle",sortable:"kolonne som kan sorteres"};var st={};st={ascending:"oplopend",ascendingSort:e=>`gesorteerd in oplopende volgorde in kolom ${e.columnName}`,columnSize:e=>`${e.value} pixels`,descending:"aflopend",descendingSort:e=>`gesorteerd in aflopende volgorde in kolom ${e.columnName}`,resizerDescription:"Druk op Enter om het formaat te wijzigen",select:"Selecteren",selectAll:"Alles selecteren",sortable:"sorteerbare kolom"};var it={};it={ascending:"rosnąco",ascendingSort:e=>`posortowano według kolumny ${e.columnName} w porządku rosnącym`,columnSize:e=>`Liczba pikseli: ${e.value}`,descending:"malejąco",descendingSort:e=>`posortowano według kolumny ${e.columnName} w porządku malejącym`,resizerDescription:"Naciśnij Enter, aby rozpocząć zmienianie rozmiaru",select:"Zaznacz",selectAll:"Zaznacz wszystko",sortable:"kolumna z możliwością sortowania"};var rt={};rt={ascending:"crescente",ascendingSort:e=>`classificado pela coluna ${e.columnName} em ordem crescente`,columnSize:e=>`${e.value} pixels`,descending:"decrescente",descendingSort:e=>`classificado pela coluna ${e.columnName} em ordem decrescente`,resizerDescription:"Pressione Enter para começar a redimensionar",select:"Selecionar",selectAll:"Selecionar tudo",sortable:"coluna classificável"};var at={};at={ascending:"ascendente",ascendingSort:e=>`Ordenar por coluna ${e.columnName} em ordem ascendente`,columnSize:e=>`${e.value} pixels`,descending:"descendente",descendingSort:e=>`Ordenar por coluna ${e.columnName} em ordem descendente`,resizerDescription:"Prima Enter para iniciar o redimensionamento",select:"Selecionar",selectAll:"Selecionar tudo",sortable:"Coluna ordenável"};var ct={};ct={ascending:"crescătoare",ascendingSort:e=>`sortate după coloana ${e.columnName} în ordine crescătoare`,columnSize:e=>`${e.value} pixeli`,descending:"descrescătoare",descendingSort:e=>`sortate după coloana ${e.columnName} în ordine descrescătoare`,resizerDescription:"Apăsați pe Enter pentru a începe redimensionarea",select:"Selectare",selectAll:"Selectare totală",sortable:"coloană sortabilă"};var dt={};dt={ascending:"возрастание",ascendingSort:e=>`сортировать столбец ${e.columnName} в порядке возрастания`,columnSize:e=>`${e.value} пикс.`,descending:"убывание",descendingSort:e=>`сортировать столбец ${e.columnName} в порядке убывания`,resizerDescription:"Нажмите клавишу Enter для начала изменения размеров",select:"Выбрать",selectAll:"Выбрать все",sortable:"сортируемый столбец"};var mt={};mt={ascending:"vzostupne",ascendingSort:e=>`zoradené zostupne podľa stĺpca ${e.columnName}`,columnSize:e=>`Počet pixelov: ${e.value}`,descending:"zostupne",descendingSort:e=>`zoradené zostupne podľa stĺpca ${e.columnName}`,resizerDescription:"Stlačením klávesu Enter začnete zmenu veľkosti",select:"Vybrať",selectAll:"Vybrať všetko",sortable:"zoraditeľný stĺpec"};var pt={};pt={ascending:"naraščajoče",ascendingSort:e=>`razvrščeno po stolpcu ${e.columnName} v naraščajočem vrstnem redu`,columnSize:e=>`${e.value} slikovnih pik`,descending:"padajoče",descendingSort:e=>`razvrščeno po stolpcu ${e.columnName} v padajočem vrstnem redu`,resizerDescription:"Pritisnite tipko Enter da začnete spreminjati velikost",select:"Izberite",selectAll:"Izberite vse",sortable:"razvrstljivi stolpec"};var bt={};bt={ascending:"rastući",ascendingSort:e=>`sortirano po kolonama ${e.columnName} rastućim redosledom`,columnSize:e=>`${e.value} piksela`,descending:"padajući",descendingSort:e=>`sortirano po kolonama ${e.columnName} padajućim redosledom`,resizerDescription:"Pritisnite Enter da biste započeli promenu veličine",select:"Izaberite",selectAll:"Izaberite sve",sortable:"kolona koja se može sortirati"};var ft={};ft={ascending:"stigande",ascendingSort:e=>`sorterat på kolumn ${e.columnName} i stigande ordning`,columnSize:e=>`${e.value} pixlar`,descending:"fallande",descendingSort:e=>`sorterat på kolumn ${e.columnName} i fallande ordning`,resizerDescription:"Tryck på Retur för att börja ändra storlek",select:"Markera",selectAll:"Markera allt",sortable:"sorterbar kolumn"};var ht={};ht={ascending:"artan sırada",ascendingSort:e=>`${e.columnName} sütuna göre artan düzende sırala`,columnSize:e=>`${e.value} piksel`,descending:"azalan sırada",descendingSort:e=>`${e.columnName} sütuna göre azalan düzende sırala`,resizerDescription:"Yeniden boyutlandırmak için Enter'a basın",select:"Seç",selectAll:"Tümünü Seç",sortable:"Sıralanabilir sütun"};var vt={};vt={ascending:"висхідний",ascendingSort:e=>`відсортовано за стовпцем ${e.columnName} у висхідному порядку`,columnSize:e=>`${e.value} пікс.`,descending:"низхідний",descendingSort:e=>`відсортовано за стовпцем ${e.columnName} у низхідному порядку`,resizerDescription:"Натисніть Enter, щоб почати зміну розміру",select:"Вибрати",selectAll:"Вибрати все",sortable:"сортувальний стовпець"};var gt={};gt={ascending:"升序",ascendingSort:e=>`按列 ${e.columnName} 升序排序`,columnSize:e=>`${e.value} 像素`,descending:"降序",descendingSort:e=>`按列 ${e.columnName} 降序排序`,resizerDescription:"按“输入”键开始调整大小。",select:"选择",selectAll:"全选",sortable:"可排序的列"};var $t={};$t={ascending:"遞增",ascendingSort:e=>`已依據「${e.columnName}」欄遞增排序`,columnSize:e=>`${e.value} 像素`,descending:"遞減",descendingSort:e=>`已依據「${e.columnName}」欄遞減排序`,resizerDescription:"按 Enter 鍵以開始調整大小",select:"選取",selectAll:"全選",sortable:"可排序的欄"};var ne={};ne={"ar-AE":Ve,"bg-BG":Oe,"cs-CZ":He,"da-DK":Le,"de-DE":Ue,"el-GR":We,"en-US":Ge,"es-ES":Ye,"et-EE":Ze,"fi-FI":_e,"fr-FR":qe,"he-IL":Je,"hr-HR":Xe,"hu-HU":Qe,"it-IT":et,"ja-JP":tt,"ko-KR":lt,"lt-LT":ut,"lv-LV":nt,"nb-NO":ot,"nl-NL":st,"pl-PL":it,"pt-BR":rt,"pt-PT":at,"ro-RO":ct,"ru-RU":dt,"sk-SK":mt,"sl-SI":pt,"sr-SP":bt,"sv-SE":ft,"tr-TR":ht,"uk-UA":vt,"zh-CN":gt,"zh-TW":$t};class yt{isCell(t){return t.type==="cell"}isRow(t){return t.type==="row"||t.type==="item"}isDisabled(t){var l;return this.disabledBehavior==="all"&&(((l=t.props)===null||l===void 0?void 0:l.isDisabled)||this.disabledKeys.has(t.key))}findPreviousKey(t,l){let u=t!=null?this.collection.getKeyBefore(t):this.collection.getLastKey();for(;u!=null;){let o=this.collection.getItem(u);if(!o)return null;if(!this.isDisabled(o)&&(!l||l(o)))return u;u=this.collection.getKeyBefore(u)}return null}findNextKey(t,l){let u=t!=null?this.collection.getKeyAfter(t):this.collection.getFirstKey();for(;u!=null;){let o=this.collection.getItem(u);if(!o)return null;if(!this.isDisabled(o)&&(!l||l(o)))return u;if(u=this.collection.getKeyAfter(u),u==null)return null}return null}getKeyForItemInRowByIndex(t,l=0){if(l<0)return null;let u=this.collection.getItem(t);if(!u)return null;let o=0;for(let a of z(u,this.collection)){var n;if(a.colSpan&&a.colSpan+o>l)return(n=a.key)!==null&&n!==void 0?n:null;a.colSpan&&(o=o+a.colSpan-1);var i;if(o===l)return(i=a.key)!==null&&i!==void 0?i:null;o++}return null}getKeyBelow(t){let l=t,u=this.collection.getItem(l);if(!u)return null;var o;if(this.isCell(u)&&(l=(o=u.parentKey)!==null&&o!==void 0?o:null),l==null)return null;if(l=this.findNextKey(l,n=>n.type==="item"),l!=null){if(this.isCell(u)){let n=u.colIndex?u.colIndex:u.index;return this.getKeyForItemInRowByIndex(l,n)}if(this.focusMode==="row")return l}return null}getKeyAbove(t){let l=t,u=this.collection.getItem(l);if(!u)return null;var o;if(this.isCell(u)&&(l=(o=u.parentKey)!==null&&o!==void 0?o:null),l==null)return null;if(l=this.findPreviousKey(l,n=>n.type==="item"),l!=null){if(this.isCell(u)){let n=u.colIndex?u.colIndex:u.index;return this.getKeyForItemInRowByIndex(l,n)}if(this.focusMode==="row")return l}return null}getKeyRightOf(t){let l=this.collection.getItem(t);if(!l)return null;if(this.isRow(l)){var u,o;let d=z(l,this.collection);var n;return(n=this.direction==="rtl"?(u=W(d))===null||u===void 0?void 0:u.key:(o=U(d))===null||o===void 0?void 0:o.key)!==null&&n!==void 0?n:null}if(this.isCell(l)&&l.parentKey!=null){let d=this.collection.getItem(l.parentKey);if(!d)return null;let r=z(d,this.collection);var i;let p=(i=this.direction==="rtl"?te(r,l.index-1):te(r,l.index+1))!==null&&i!==void 0?i:null;var a;if(p)return(a=p.key)!==null&&a!==void 0?a:null;var m;if(this.focusMode==="row")return(m=l.parentKey)!==null&&m!==void 0?m:null;var c;return(c=this.direction==="rtl"?this.getFirstKey(t):this.getLastKey(t))!==null&&c!==void 0?c:null}return null}getKeyLeftOf(t){let l=this.collection.getItem(t);if(!l)return null;if(this.isRow(l)){var u,o;let d=z(l,this.collection);var n;return(n=this.direction==="rtl"?(u=U(d))===null||u===void 0?void 0:u.key:(o=W(d))===null||o===void 0?void 0:o.key)!==null&&n!==void 0?n:null}if(this.isCell(l)&&l.parentKey!=null){let d=this.collection.getItem(l.parentKey);if(!d)return null;let r=z(d,this.collection);var i;let p=(i=this.direction==="rtl"?te(r,l.index+1):te(r,l.index-1))!==null&&i!==void 0?i:null;var a;if(p)return(a=p.key)!==null&&a!==void 0?a:null;var m;if(this.focusMode==="row")return(m=l.parentKey)!==null&&m!==void 0?m:null;var c;return(c=this.direction==="rtl"?this.getLastKey(t):this.getFirstKey(t))!==null&&c!==void 0?c:null}return null}getFirstKey(t,l){let u=t??null,o;if(u!=null){if(o=this.collection.getItem(u),!o)return null;if(this.isCell(o)&&!l&&o.parentKey!=null){var n;let c=this.collection.getItem(o.parentKey);if(!c)return null;var i;return(i=(n=U(z(c,this.collection)))===null||n===void 0?void 0:n.key)!==null&&i!==void 0?i:null}}if(u=this.findNextKey(void 0,c=>c.type==="item"),u!=null&&(o&&this.isCell(o)&&l||this.focusMode==="cell")){var a;let c=this.collection.getItem(u);if(!c)return null;var m;u=(m=(a=U(z(c,this.collection)))===null||a===void 0?void 0:a.key)!==null&&m!==void 0?m:null}return u}getLastKey(t,l){let u=t??null,o;if(u!=null){if(o=this.collection.getItem(u),!o)return null;if(this.isCell(o)&&!l&&o.parentKey!=null){var n;let c=this.collection.getItem(o.parentKey);if(!c)return null;let d=z(c,this.collection);var i;return(i=(n=W(d))===null||n===void 0?void 0:n.key)!==null&&i!==void 0?i:null}}if(u=this.findPreviousKey(void 0,c=>c.type==="item"),u!=null&&(o&&this.isCell(o)&&l||this.focusMode==="cell")){var a;let c=this.collection.getItem(u);if(!c)return null;let d=z(c,this.collection);var m;u=(m=(a=W(d))===null||a===void 0?void 0:a.key)!==null&&m!==void 0?m:null}return u}getKeyPageAbove(t){let l=t,u=this.layoutDelegate.getItemRect(l);if(!u)return null;let o=Math.max(0,u.y+u.height-this.layoutDelegate.getVisibleRect().height);for(;u&&u.y>o&&l!=null;){var n;if(l=(n=this.getKeyAbove(l))!==null&&n!==void 0?n:null,l==null)break;u=this.layoutDelegate.getItemRect(l)}return l}getKeyPageBelow(t){let l=t,u=this.layoutDelegate.getItemRect(l);if(!u)return null;let o=this.layoutDelegate.getVisibleRect().height,n=Math.min(this.layoutDelegate.getContentSize().height,u.y+o);for(;u&&u.y+u.heightr.type==="item"),u==null&&!a&&(u=this.getFirstKey(),a=!0)}return null}constructor(t){if(this.collection=t.collection,this.disabledKeys=t.disabledKeys,this.disabledBehavior=t.disabledBehavior||"all",this.direction=t.direction,this.collator=t.collator,!t.layout&&!t.ref)throw new Error("Either a layout or a ref must be specified.");this.layoutDelegate=t.layoutDelegate||(t.layout?new du(t.layout):new Tl(t.ref)),this.focusMode=t.focusMode||"row"}}class du{getContentSize(){return this.layout.getContentSize()}getItemRect(t){var l;return((l=this.layout.getLayoutInfo(t))===null||l===void 0?void 0:l.rect)||null}getVisibleRect(){return this.layout.virtualizer.visibleRect}constructor(t){this.layout=t}}const ve=new WeakMap;var xt={};xt={deselectedItem:e=>`${e.item} غير المحدد`,longPressToSelect:"اضغط مطولًا للدخول إلى وضع التحديد.",select:"تحديد",selectedAll:"جميع العناصر المحددة.",selectedCount:(e,t)=>`${t.plural(e.count,{"=0":"لم يتم تحديد عناصر",one:()=>`${t.number(e.count)} عنصر محدد`,other:()=>`${t.number(e.count)} عنصر محدد`})}.`,selectedItem:e=>`${e.item} المحدد`};var Ct={};Ct={deselectedItem:e=>`${e.item} не е избран.`,longPressToSelect:"Натиснете и задръжте за да влезете в избирателен режим.",select:"Изберете",selectedAll:"Всички елементи са избрани.",selectedCount:(e,t)=>`${t.plural(e.count,{"=0":"Няма избрани елементи",one:()=>`${t.number(e.count)} избран елемент`,other:()=>`${t.number(e.count)} избрани елементи`})}.`,selectedItem:e=>`${e.item} избран.`};var Dt={};Dt={deselectedItem:e=>`Položka ${e.item} není vybrána.`,longPressToSelect:"Dlouhým stisknutím přejdete do režimu výběru.",select:"Vybrat",selectedAll:"Vybrány všechny položky.",selectedCount:(e,t)=>`${t.plural(e.count,{"=0":"Nevybrány žádné položky",one:()=>`Vybrána ${t.number(e.count)} položka`,other:()=>`Vybráno ${t.number(e.count)} položek`})}.`,selectedItem:e=>`Vybrána položka ${e.item}.`};var Bt={};Bt={deselectedItem:e=>`${e.item} ikke valgt.`,longPressToSelect:"Lav et langt tryk for at aktivere valgtilstand.",select:"Vælg",selectedAll:"Alle elementer valgt.",selectedCount:(e,t)=>`${t.plural(e.count,{"=0":"Ingen elementer valgt",one:()=>`${t.number(e.count)} element valgt`,other:()=>`${t.number(e.count)} elementer valgt`})}.`,selectedItem:e=>`${e.item} valgt.`};var kt={};kt={deselectedItem:e=>`${e.item} nicht ausgewählt.`,longPressToSelect:"Gedrückt halten, um Auswahlmodus zu öffnen.",select:"Auswählen",selectedAll:"Alle Elemente ausgewählt.",selectedCount:(e,t)=>`${t.plural(e.count,{"=0":"Keine Elemente ausgewählt",one:()=>`${t.number(e.count)} Element ausgewählt`,other:()=>`${t.number(e.count)} Elemente ausgewählt`})}.`,selectedItem:e=>`${e.item} ausgewählt.`};var Et={};Et={deselectedItem:e=>`Δεν επιλέχθηκε το στοιχείο ${e.item}.`,longPressToSelect:"Πατήστε παρατεταμένα για να μπείτε σε λειτουργία επιλογής.",select:"Επιλογή",selectedAll:"Επιλέχθηκαν όλα τα στοιχεία.",selectedCount:(e,t)=>`${t.plural(e.count,{"=0":"Δεν επιλέχθηκαν στοιχεία",one:()=>`Επιλέχθηκε ${t.number(e.count)} στοιχείο`,other:()=>`Επιλέχθηκαν ${t.number(e.count)} στοιχεία`})}.`,selectedItem:e=>`Επιλέχθηκε το στοιχείο ${e.item}.`};var St={};St={deselectedItem:e=>`${e.item} not selected.`,select:"Select",selectedCount:(e,t)=>`${t.plural(e.count,{"=0":"No items selected",one:()=>`${t.number(e.count)} item selected`,other:()=>`${t.number(e.count)} items selected`})}.`,selectedAll:"All items selected.",selectedItem:e=>`${e.item} selected.`,longPressToSelect:"Long press to enter selection mode."};var At={};At={deselectedItem:e=>`${e.item} no seleccionado.`,longPressToSelect:"Mantenga pulsado para abrir el modo de selección.",select:"Seleccionar",selectedAll:"Todos los elementos seleccionados.",selectedCount:(e,t)=>`${t.plural(e.count,{"=0":"Ningún elemento seleccionado",one:()=>`${t.number(e.count)} elemento seleccionado`,other:()=>`${t.number(e.count)} elementos seleccionados`})}.`,selectedItem:e=>`${e.item} seleccionado.`};var wt={};wt={deselectedItem:e=>`${e.item} pole valitud.`,longPressToSelect:"Valikurežiimi sisenemiseks vajutage pikalt.",select:"Vali",selectedAll:"Kõik üksused valitud.",selectedCount:(e,t)=>`${t.plural(e.count,{"=0":"Üksusi pole valitud",one:()=>`${t.number(e.count)} üksus valitud`,other:()=>`${t.number(e.count)} üksust valitud`})}.`,selectedItem:e=>`${e.item} valitud.`};var Nt={};Nt={deselectedItem:e=>`Kohdetta ${e.item} ei valittu.`,longPressToSelect:"Siirry valintatilaan painamalla pitkään.",select:"Valitse",selectedAll:"Kaikki kohteet valittu.",selectedCount:(e,t)=>`${t.plural(e.count,{"=0":"Ei yhtään kohdetta valittu",one:()=>`${t.number(e.count)} kohde valittu`,other:()=>`${t.number(e.count)} kohdetta valittu`})}.`,selectedItem:e=>`${e.item} valittu.`};var zt={};zt={deselectedItem:e=>`${e.item} non sélectionné.`,longPressToSelect:"Appuyez de manière prolongée pour passer en mode de sélection.",select:"Sélectionner",selectedAll:"Tous les éléments sélectionnés.",selectedCount:(e,t)=>`${t.plural(e.count,{"=0":"Aucun élément sélectionné",one:()=>`${t.number(e.count)} élément sélectionné`,other:()=>`${t.number(e.count)} éléments sélectionnés`})}.`,selectedItem:e=>`${e.item} sélectionné.`};var Ft={};Ft={deselectedItem:e=>`${e.item} לא נבחר.`,longPressToSelect:"הקשה ארוכה לכניסה למצב בחירה.",select:"בחר",selectedAll:"כל הפריטים נבחרו.",selectedCount:(e,t)=>`${t.plural(e.count,{"=0":"לא נבחרו פריטים",one:()=>`פריט ${t.number(e.count)} נבחר`,other:()=>`${t.number(e.count)} פריטים נבחרו`})}.`,selectedItem:e=>`${e.item} נבחר.`};var Pt={};Pt={deselectedItem:e=>`Stavka ${e.item} nije odabrana.`,longPressToSelect:"Dugo pritisnite za ulazak u način odabira.",select:"Odaberite",selectedAll:"Odabrane su sve stavke.",selectedCount:(e,t)=>`${t.plural(e.count,{"=0":"Nije odabrana nijedna stavka",one:()=>`Odabrana je ${t.number(e.count)} stavka`,other:()=>`Odabrano je ${t.number(e.count)} stavki`})}.`,selectedItem:e=>`Stavka ${e.item} je odabrana.`};var Kt={};Kt={deselectedItem:e=>`${e.item} nincs kijelölve.`,longPressToSelect:"Nyomja hosszan a kijelöléshez.",select:"Kijelölés",selectedAll:"Az összes elem kijelölve.",selectedCount:(e,t)=>`${t.plural(e.count,{"=0":"Egy elem sincs kijelölve",one:()=>`${t.number(e.count)} elem kijelölve`,other:()=>`${t.number(e.count)} elem kijelölve`})}.`,selectedItem:e=>`${e.item} kijelölve.`};var It={};It={deselectedItem:e=>`${e.item} non selezionato.`,longPressToSelect:"Premi a lungo per passare alla modalità di selezione.",select:"Seleziona",selectedAll:"Tutti gli elementi selezionati.",selectedCount:(e,t)=>`${t.plural(e.count,{"=0":"Nessun elemento selezionato",one:()=>`${t.number(e.count)} elemento selezionato`,other:()=>`${t.number(e.count)} elementi selezionati`})}.`,selectedItem:e=>`${e.item} selezionato.`};var jt={};jt={deselectedItem:e=>`${e.item} が選択されていません。`,longPressToSelect:"長押しして選択モードを開きます。",select:"選択",selectedAll:"すべての項目を選択しました。",selectedCount:(e,t)=>`${t.plural(e.count,{"=0":"項目が選択されていません",one:()=>`${t.number(e.count)} 項目を選択しました`,other:()=>`${t.number(e.count)} 項目を選択しました`})}。`,selectedItem:e=>`${e.item} を選択しました。`};var Mt={};Mt={deselectedItem:e=>`${e.item}이(가) 선택되지 않았습니다.`,longPressToSelect:"선택 모드로 들어가려면 길게 누르십시오.",select:"선택",selectedAll:"모든 항목이 선택되었습니다.",selectedCount:(e,t)=>`${t.plural(e.count,{"=0":"선택된 항목이 없습니다",one:()=>`${t.number(e.count)}개 항목이 선택되었습니다`,other:()=>`${t.number(e.count)}개 항목이 선택되었습니다`})}.`,selectedItem:e=>`${e.item}이(가) 선택되었습니다.`};var Tt={};Tt={deselectedItem:e=>`${e.item} nepasirinkta.`,longPressToSelect:"Norėdami įjungti pasirinkimo režimą, paspauskite ir palaikykite.",select:"Pasirinkti",selectedAll:"Pasirinkti visi elementai.",selectedCount:(e,t)=>`${t.plural(e.count,{"=0":"Nepasirinktas nė vienas elementas",one:()=>`Pasirinktas ${t.number(e.count)} elementas`,other:()=>`Pasirinkta elementų: ${t.number(e.count)}`})}.`,selectedItem:e=>`Pasirinkta: ${e.item}.`};var Rt={};Rt={deselectedItem:e=>`Vienums ${e.item} nav atlasīts.`,longPressToSelect:"Ilgi turiet nospiestu. lai ieslēgtu atlases režīmu.",select:"Atlasīt",selectedAll:"Atlasīti visi vienumi.",selectedCount:(e,t)=>`${t.plural(e.count,{"=0":"Nav atlasīts neviens vienums",one:()=>`Atlasīto vienumu skaits: ${t.number(e.count)}`,other:()=>`Atlasīto vienumu skaits: ${t.number(e.count)}`})}.`,selectedItem:e=>`Atlasīts vienums ${e.item}.`};var Vt={};Vt={deselectedItem:e=>`${e.item} er ikke valgt.`,longPressToSelect:"Bruk et langt trykk for å gå inn i valgmodus.",select:"Velg",selectedAll:"Alle elementer er valgt.",selectedCount:(e,t)=>`${t.plural(e.count,{"=0":"Ingen elementer er valgt",one:()=>`${t.number(e.count)} element er valgt`,other:()=>`${t.number(e.count)} elementer er valgt`})}.`,selectedItem:e=>`${e.item} er valgt.`};var Ot={};Ot={deselectedItem:e=>`${e.item} niet geselecteerd.`,longPressToSelect:"Druk lang om de selectiemodus te openen.",select:"Selecteren",selectedAll:"Alle items geselecteerd.",selectedCount:(e,t)=>`${t.plural(e.count,{"=0":"Geen items geselecteerd",one:()=>`${t.number(e.count)} item geselecteerd`,other:()=>`${t.number(e.count)} items geselecteerd`})}.`,selectedItem:e=>`${e.item} geselecteerd.`};var Ht={};Ht={deselectedItem:e=>`Nie zaznaczono ${e.item}.`,longPressToSelect:"Naciśnij i przytrzymaj, aby wejść do trybu wyboru.",select:"Zaznacz",selectedAll:"Wszystkie zaznaczone elementy.",selectedCount:(e,t)=>`${t.plural(e.count,{"=0":"Nie zaznaczono żadnych elementów",one:()=>`${t.number(e.count)} zaznaczony element`,other:()=>`${t.number(e.count)} zaznaczonych elementów`})}.`,selectedItem:e=>`Zaznaczono ${e.item}.`};var Lt={};Lt={deselectedItem:e=>`${e.item} não selecionado.`,longPressToSelect:"Mantenha pressionado para entrar no modo de seleção.",select:"Selecionar",selectedAll:"Todos os itens selecionados.",selectedCount:(e,t)=>`${t.plural(e.count,{"=0":"Nenhum item selecionado",one:()=>`${t.number(e.count)} item selecionado`,other:()=>`${t.number(e.count)} itens selecionados`})}.`,selectedItem:e=>`${e.item} selecionado.`};var Ut={};Ut={deselectedItem:e=>`${e.item} não selecionado.`,longPressToSelect:"Prima continuamente para entrar no modo de seleção.",select:"Selecionar",selectedAll:"Todos os itens selecionados.",selectedCount:(e,t)=>`${t.plural(e.count,{"=0":"Nenhum item selecionado",one:()=>`${t.number(e.count)} item selecionado`,other:()=>`${t.number(e.count)} itens selecionados`})}.`,selectedItem:e=>`${e.item} selecionado.`};var Wt={};Wt={deselectedItem:e=>`${e.item} neselectat.`,longPressToSelect:"Apăsați lung pentru a intra în modul de selectare.",select:"Selectare",selectedAll:"Toate elementele selectate.",selectedCount:(e,t)=>`${t.plural(e.count,{"=0":"Niciun element selectat",one:()=>`${t.number(e.count)} element selectat`,other:()=>`${t.number(e.count)} elemente selectate`})}.`,selectedItem:e=>`${e.item} selectat.`};var Gt={};Gt={deselectedItem:e=>`${e.item} не выбрано.`,longPressToSelect:"Нажмите и удерживайте для входа в режим выбора.",select:"Выбрать",selectedAll:"Выбраны все элементы.",selectedCount:(e,t)=>`${t.plural(e.count,{"=0":"Нет выбранных элементов",one:()=>`${t.number(e.count)} элемент выбран`,other:()=>`${t.number(e.count)} элементов выбрано`})}.`,selectedItem:e=>`${e.item} выбрано.`};var Yt={};Yt={deselectedItem:e=>`Nevybraté položky: ${e.item}.`,longPressToSelect:"Dlhším stlačením prejdite do režimu výberu.",select:"Vybrať",selectedAll:"Všetky vybraté položky.",selectedCount:(e,t)=>`${t.plural(e.count,{"=0":"Žiadne vybraté položky",one:()=>`${t.number(e.count)} vybratá položka`,other:()=>`Počet vybratých položiek:${t.number(e.count)}`})}.`,selectedItem:e=>`Vybraté položky: ${e.item}.`};var Zt={};Zt={deselectedItem:e=>`Element ${e.item} ni izbran.`,longPressToSelect:"Za izbirni način pritisnite in dlje časa držite.",select:"Izberite",selectedAll:"Vsi elementi so izbrani.",selectedCount:(e,t)=>`${t.plural(e.count,{"=0":"Noben element ni izbran",one:()=>`${t.number(e.count)} element je izbran`,other:()=>`${t.number(e.count)} elementov je izbranih`})}.`,selectedItem:e=>`Element ${e.item} je izbran.`};var _t={};_t={deselectedItem:e=>`${e.item} nije izabrano.`,longPressToSelect:"Dugo pritisnite za ulazak u režim biranja.",select:"Izaberite",selectedAll:"Izabrane su sve stavke.",selectedCount:(e,t)=>`${t.plural(e.count,{"=0":"Nije izabrana nijedna stavka",one:()=>`Izabrana je ${t.number(e.count)} stavka`,other:()=>`Izabrano je ${t.number(e.count)} stavki`})}.`,selectedItem:e=>`${e.item} je izabrano.`};var qt={};qt={deselectedItem:e=>`${e.item} ej markerat.`,longPressToSelect:"Tryck länge när du vill öppna väljarläge.",select:"Markera",selectedAll:"Alla markerade objekt.",selectedCount:(e,t)=>`${t.plural(e.count,{"=0":"Inga markerade objekt",one:()=>`${t.number(e.count)} markerat objekt`,other:()=>`${t.number(e.count)} markerade objekt`})}.`,selectedItem:e=>`${e.item} markerat.`};var Jt={};Jt={deselectedItem:e=>`${e.item} seçilmedi.`,longPressToSelect:"Seçim moduna girmek için uzun basın.",select:"Seç",selectedAll:"Tüm ögeler seçildi.",selectedCount:(e,t)=>`${t.plural(e.count,{"=0":"Hiçbir öge seçilmedi",one:()=>`${t.number(e.count)} öge seçildi`,other:()=>`${t.number(e.count)} öge seçildi`})}.`,selectedItem:e=>`${e.item} seçildi.`};var Xt={};Xt={deselectedItem:e=>`${e.item} не вибрано.`,longPressToSelect:"Виконайте довге натиснення, щоб перейти в режим вибору.",select:"Вибрати",selectedAll:"Усі елементи вибрано.",selectedCount:(e,t)=>`${t.plural(e.count,{"=0":"Жодних елементів не вибрано",one:()=>`${t.number(e.count)} елемент вибрано`,other:()=>`Вибрано елементів: ${t.number(e.count)}`})}.`,selectedItem:e=>`${e.item} вибрано.`};var Qt={};Qt={deselectedItem:e=>`未选择 ${e.item}。`,longPressToSelect:"长按以进入选择模式。",select:"选择",selectedAll:"已选择所有项目。",selectedCount:(e,t)=>`${t.plural(e.count,{"=0":"未选择项目",one:()=>`已选择 ${t.number(e.count)} 个项目`,other:()=>`已选择 ${t.number(e.count)} 个项目`})}。`,selectedItem:e=>`已选择 ${e.item}。`};var el={};el={deselectedItem:e=>`未選取「${e.item}」。`,longPressToSelect:"長按以進入選擇模式。",select:"選取",selectedAll:"已選取所有項目。",selectedCount:(e,t)=>`${t.plural(e.count,{"=0":"未選取任何項目",one:()=>`已選取 ${t.number(e.count)} 個項目`,other:()=>`已選取 ${t.number(e.count)} 個項目`})}。`,selectedItem:e=>`已選取「${e.item}」。`};var oe={};oe={"ar-AE":xt,"bg-BG":Ct,"cs-CZ":Dt,"da-DK":Bt,"de-DE":kt,"el-GR":Et,"en-US":St,"es-ES":At,"et-EE":wt,"fi-FI":Nt,"fr-FR":zt,"he-IL":Ft,"hr-HR":Pt,"hu-HU":Kt,"it-IT":It,"ja-JP":jt,"ko-KR":Mt,"lt-LT":Tt,"lv-LV":Rt,"nb-NO":Vt,"nl-NL":Ot,"pl-PL":Ht,"pt-BR":Lt,"pt-PT":Ut,"ro-RO":Wt,"ru-RU":Gt,"sk-SK":Yt,"sl-SI":Zt,"sr-SP":_t,"sv-SE":qt,"tr-TR":Jt,"uk-UA":Xt,"zh-CN":Qt,"zh-TW":el};const tl=7e3;let V=null;function ll(e,t="assertive",l=tl){V?V.announce(e,t,l):(V=new mu,(typeof IS_REACT_ACT_ENVIRONMENT=="boolean"?IS_REACT_ACT_ENVIRONMENT:typeof jest<"u")?V.announce(e,t,l):setTimeout(()=>{V?.isAttached()&&V?.announce(e,t,l)},100))}class mu{isAttached(){var t;return(t=this.node)===null||t===void 0?void 0:t.isConnected}createLog(t){let l=document.createElement("div");return l.setAttribute("role","log"),l.setAttribute("aria-live",t),l.setAttribute("aria-relevant","additions"),l}destroy(){this.node&&(document.body.removeChild(this.node),this.node=null)}announce(t,l="assertive",u=tl){var o,n;if(!this.node)return;let i=document.createElement("div");typeof t=="object"?(i.setAttribute("role","img"),i.setAttribute("aria-labelledby",t["aria-labelledby"])):i.textContent=t,l==="assertive"?(o=this.assertiveLog)===null||o===void 0||o.appendChild(i):(n=this.politeLog)===null||n===void 0||n.appendChild(i),t!==""&&setTimeout(()=>{i.remove()},u)}clear(t){this.node&&((!t||t==="assertive")&&this.assertiveLog&&(this.assertiveLog.innerHTML=""),(!t||t==="polite")&&this.politeLog&&(this.politeLog.innerHTML=""))}constructor(){this.node=null,this.assertiveLog=null,this.politeLog=null,typeof document<"u"&&(this.node=document.createElement("div"),this.node.dataset.liveAnnouncer="true",Object.assign(this.node.style,{border:0,clip:"rect(0 0 0 0)",clipPath:"inset(50%)",height:"1px",margin:"-1px",overflow:"hidden",padding:0,position:"absolute",width:"1px",whiteSpace:"nowrap"}),this.assertiveLog=this.createLog("assertive"),this.node.appendChild(this.assertiveLog),this.politeLog=this.createLog("polite"),this.node.appendChild(this.politeLog),document.body.prepend(this.node))}}function pu(e){return e&&e.__esModule?e.default:e}function bu(e,t){let{getRowText:l=a=>{var m,c,d,r;return(r=(m=(c=t.collection).getTextValue)===null||m===void 0?void 0:m.call(c,a))!==null&&r!==void 0?r:(d=t.collection.getItem(a))===null||d===void 0?void 0:d.textValue}}=e,u=_(pu(oe),"@react-aria/grid"),o=t.selectionManager.rawSelection,n=B.useRef(o),i=Rl(()=>{var a;if(!t.selectionManager.isFocused||o===n.current){n.current=o;return}let m=Ee(o,n.current),c=Ee(n.current,o),d=t.selectionManager.selectionBehavior==="replace",r=[];if(t.selectionManager.selectedKeys.size===1&&d){let p=t.selectionManager.selectedKeys.keys().next().value;if(p!=null&&t.collection.getItem(p)){let s=l(p);s&&r.push(u.format("selectedItem",{item:s}))}}else if(m.size===1&&c.size===0){let p=m.keys().next().value;if(p!=null){let s=l(p);s&&r.push(u.format("selectedItem",{item:s}))}}else if(c.size===1&&m.size===0){let p=c.keys().next().value;if(p!=null&&t.collection.getItem(p)){let s=l(p);s&&r.push(u.format("deselectedItem",{item:s}))}}t.selectionManager.selectionMode==="multiple"&&(r.length===0||o==="all"||o.size>1||n.current==="all"||((a=n.current)===null||a===void 0?void 0:a.size)>1)&&r.push(o==="all"?u.format("selectedAll"):u.format("selectedCount",{count:o.size})),r.length>0&&ll(r.join(" ")),n.current=o});Me(()=>{if(t.selectionManager.isFocused)i();else{let a=requestAnimationFrame(i);return()=>cancelAnimationFrame(a)}},[o,t.selectionManager.isFocused])}function Ee(e,t){let l=new Set;if(e==="all"||t==="all")return l;for(let u of e.keys())t.has(u)||l.add(u);return l}function fu(e){return e&&e.__esModule?e.default:e}function hu(e){let t=_(fu(oe),"@react-aria/grid"),l=Vl(),u=(l==="pointer"||l==="virtual"||l==null)&&typeof window<"u"&&"ontouchstart"in window,o=B.useMemo(()=>{let i=e.selectionManager.selectionMode,a=e.selectionManager.selectionBehavior,m;return u&&(m=t.format("longPressToSelect")),a==="replace"&&i!=="none"&&e.hasItemActions?m:void 0},[e.selectionManager.selectionMode,e.selectionManager.selectionBehavior,e.hasItemActions,t,u]);return fe(o)}function vu(e,t,l){let{isVirtualized:u,disallowTypeAhead:o,keyboardDelegate:n,focusMode:i,scrollRef:a,getRowText:m,onRowAction:c,onCellAction:d,escapeKeyBehavior:r="clearSelection",shouldSelectOnPressUp:p}=e,{selectionManager:s}=t;!e["aria-label"]&&!e["aria-labelledby"]&&console.warn("An aria-label or aria-labelledby prop is required for accessibility.");let b=ze({usage:"search",sensitivity:"base"}),{direction:v}=ue(),g=t.selectionManager.disabledBehavior,x=B.useMemo(()=>n||new yt({collection:t.collection,disabledKeys:t.disabledKeys,disabledBehavior:g,ref:l,direction:v,collator:b,focusMode:i}),[n,t.collection,t.disabledKeys,g,l,v,b,i]),{collectionProps:D}=Ol({ref:l,selectionManager:s,keyboardDelegate:x,isVirtualized:u,scrollRef:a,disallowTypeAhead:o,escapeKeyBehavior:r}),y=pe(e.id);ve.set(t,{keyboardDelegate:x,actions:{onRowAction:c,onCellAction:d},shouldSelectOnPressUp:p});let $=hu({selectionManager:s,hasItemActions:!!(c||d)}),f=Hl(e,{labelable:!0}),E=B.useCallback(C=>{if(s.isFocused){C.currentTarget.contains(C.target)||s.setFocused(!1);return}C.currentTarget.contains(C.target)&&s.setFocused(!0)},[s]),S=B.useMemo(()=>({onBlur:D.onBlur,onFocus:E}),[E,D.onBlur]),A=au(l,{isDisabled:t.collection.size!==0}),k=J(f,{role:"grid",id:y,"aria-multiselectable":s.selectionMode==="multiple"?"true":void 0},t.isKeyboardNavigationDisabled?S:D,t.collection.size===0&&{tabIndex:A?-1:0}||void 0,$);return u&&(k["aria-rowcount"]=t.collection.size,k["aria-colcount"]=t.collection.columnCount),bu({getRowText:m},t),{gridProps:k}}function gu(){return{rowGroupProps:{role:"rowgroup"}}}function $u(e,t,l){var u,o;let{node:n,isVirtualized:i,shouldSelectOnPressUp:a,onAction:m}=e,{actions:c,shouldSelectOnPressUp:d}=ve.get(t),r=c.onRowAction?()=>{var g;return(g=c.onRowAction)===null||g===void 0?void 0:g.call(c,n.key)}:m,{itemProps:p,...s}=je({selectionManager:t.selectionManager,key:n.key,ref:l,isVirtualized:i,shouldSelectOnPressUp:d||a,onAction:r||!(n==null||(u=n.props)===null||u===void 0)&&u.onAction?Ll(n==null||(o=n.props)===null||o===void 0?void 0:o.onAction,r):void 0,isDisabled:t.collection.size===0}),b=t.selectionManager.isSelected(n.key),v={role:"row","aria-selected":t.selectionManager.selectionMode!=="none"?b:void 0,"aria-disabled":s.isDisabled||void 0,...p};return i&&(v["aria-rowindex"]=n.index+1),{rowProps:v,...s}}function ul(e,t,l){let{node:u,isVirtualized:o,focusMode:n="child",shouldSelectOnPressUp:i,onAction:a}=e,{direction:m}=ue(),{keyboardDelegate:c,actions:{onCellAction:d}}=ve.get(t),r=B.useRef(null),p=()=>{if(l.current){let y=ae(l.current);if(n==="child"){if(l.current.contains(document.activeElement)&&l.current!==document.activeElement)return;let $=t.selectionManager.childFocusStrategy==="last"?re(y):y.firstChild();if($){L($);return}}(r.current!=null&&u.key!==r.current||!l.current.contains(document.activeElement))&&L(l.current)}},{itemProps:s,isPressed:b}=je({selectionManager:t.selectionManager,key:u.key,ref:l,isVirtualized:o,focus:p,shouldSelectOnPressUp:i,onAction:d?()=>d(u.key):a,isDisabled:t.collection.size===0}),v=y=>{if(!y.currentTarget.contains(y.target)||t.isKeyboardNavigationDisabled||!l.current||!document.activeElement)return;let $=ae(l.current);switch($.currentNode=document.activeElement,y.key){case"ArrowLeft":{let C=m==="rtl"?$.nextNode():$.previousNode();if(n==="child"&&C===l.current&&(C=null),y.preventDefault(),y.stopPropagation(),C)L(C),Y(C,{containingElement:Z(l.current)});else{var f;if(((f=c.getKeyLeftOf)===null||f===void 0?void 0:f.call(c,u.key))!==u.key){var E;(E=l.current.parentElement)===null||E===void 0||E.dispatchEvent(new KeyboardEvent(y.nativeEvent.type,y.nativeEvent));break}n==="cell"&&m==="rtl"?(L(l.current),Y(l.current,{containingElement:Z(l.current)})):($.currentNode=l.current,C=m==="rtl"?$.firstChild():re($),C&&(L(C),Y(C,{containingElement:Z(l.current)})))}break}case"ArrowRight":{let C=m==="rtl"?$.previousNode():$.nextNode();if(n==="child"&&C===l.current&&(C=null),y.preventDefault(),y.stopPropagation(),C)L(C),Y(C,{containingElement:Z(l.current)});else{var S;if(((S=c.getKeyRightOf)===null||S===void 0?void 0:S.call(c,u.key))!==u.key){var A;(A=l.current.parentElement)===null||A===void 0||A.dispatchEvent(new KeyboardEvent(y.nativeEvent.type,y.nativeEvent));break}n==="cell"&&m==="ltr"?(L(l.current),Y(l.current,{containingElement:Z(l.current)})):($.currentNode=l.current,C=m==="rtl"?re($):$.firstChild(),C&&(L(C),Y(C,{containingElement:Z(l.current)})))}break}case"ArrowUp":case"ArrowDown":if(!y.altKey&&l.current.contains(y.target)){var k;y.stopPropagation(),y.preventDefault(),(k=l.current.parentElement)===null||k===void 0||k.dispatchEvent(new KeyboardEvent(y.nativeEvent.type,y.nativeEvent))}break}},g=y=>{if(r.current=u.key,y.target!==l.current){Ul()||t.selectionManager.setFocusedKey(u.key);return}requestAnimationFrame(()=>{n==="child"&&document.activeElement===l.current&&p()})},x=J(s,{role:"gridcell",onKeyDownCapture:v,"aria-colspan":u.colSpan,"aria-colindex":u.colIndex!=null?u.colIndex+1:void 0,colSpan:o?void 0:u.colSpan,onFocus:g});var D;return o&&(x["aria-colindex"]=((D=u.colIndex)!==null&&D!==void 0?D:u.index)+1),i&&x.tabIndex!=null&&x.onPointerDown==null&&(x.onPointerDown=y=>{let $=y.currentTarget,f=$.getAttribute("tabindex");$.removeAttribute("tabindex"),requestAnimationFrame(()=>{f!=null&&$.setAttribute("tabindex",f)})}),{gridCellProps:x,isPressed:b}}function re(e){let t=null,l=null;do l=e.lastChild(),l&&(t=l);while(l);return t}function yu(e){return e&&e.__esModule?e.default:e}function xu(e,t){let{key:l}=e,u=t.selectionManager,o=pe(),n=!t.selectionManager.canSelectItem(l),i=t.selectionManager.isSelected(l),a=()=>u.toggleSelection(l);const m=_(yu(oe),"@react-aria/grid");return{checkboxProps:{id:o,"aria-label":m.format("select"),isSelected:i,isDisabled:n,onChange:a}}}class Cu extends yt{isCell(t){return t.type==="cell"||t.type==="rowheader"||t.type==="column"}getKeyBelow(t){let l=this.collection.getItem(t);if(!l)return null;if(l.type==="column"){let u=U(z(l,this.collection));if(u)return u.key;let o=this.getFirstKey();return o==null||!this.collection.getItem(o)?null:super.getKeyForItemInRowByIndex(o,l.index)}return super.getKeyBelow(t)}getKeyAbove(t){let l=this.collection.getItem(t);if(!l)return null;if(l.type==="column"){let n=l.parentKey!=null?this.collection.getItem(l.parentKey):null;return n&&n.type==="column"?n.key:null}let u=super.getKeyAbove(t),o=u!=null?this.collection.getItem(u):null;return o&&o.type!=="headerrow"?u:this.isCell(l)?this.collection.columns[l.index].key:this.collection.columns[0].key}findNextColumnKey(t){let l=this.findNextKey(t.key,o=>o.type==="column");if(l!=null)return l;let u=this.collection.headerRows[t.level];for(let o of z(u,this.collection))if(o.type==="column")return o.key;return null}findPreviousColumnKey(t){let l=this.findPreviousKey(t.key,n=>n.type==="column");if(l!=null)return l;let u=this.collection.headerRows[t.level],o=[...z(u,this.collection)];for(let n=o.length-1;n>=0;n--){let i=o[n];if(i.type==="column")return i.key}return null}getKeyRightOf(t){let l=this.collection.getItem(t);return l?l.type==="column"?this.direction==="rtl"?this.findPreviousColumnKey(l):this.findNextColumnKey(l):super.getKeyRightOf(t):null}getKeyLeftOf(t){let l=this.collection.getItem(t);return l?l.type==="column"?this.direction==="rtl"?this.findNextColumnKey(l):this.findPreviousColumnKey(l):super.getKeyLeftOf(t):null}getKeyForSearch(t,l){if(!this.collator)return null;let u=this.collection,o=l??this.getFirstKey();if(o==null)return null;let n=u.getItem(o);var i;n?.type==="cell"&&(o=(i=n.parentKey)!==null&&i!==void 0?i:null);let a=!1;for(;o!=null;){let m=u.getItem(o);if(!m)return null;if(m.textValue){let c=m.textValue.slice(0,t.length);if(this.collator.compare(c,t)===0)return m.key}for(let c of z(m,this.collection)){let d=u.columns[c.index];if(u.rowHeaderColumnKeys.has(d.key)&&c.textValue){let r=c.textValue.slice(0,t.length);if(this.collator.compare(r,t)===0){let p=l!=null?u.getItem(l):n;return p?.type==="cell"?c.key:m.key}}}o=this.getKeyBelow(o),o==null&&!a&&(o=this.getFirstKey(),a=!0)}return null}}function Du(e){return e&&e.__esModule?e.default:e}function Bu(e,t,l){let{keyboardDelegate:u,isVirtualized:o,layoutDelegate:n,layout:i}=e,a=ze({usage:"search",sensitivity:"base"}),{direction:m}=ue(),c=t.selectionManager.disabledBehavior,d=B.useMemo(()=>u||new Cu({collection:t.collection,disabledKeys:t.disabledKeys,disabledBehavior:c,ref:l,direction:m,collator:a,layoutDelegate:n,layout:i}),[u,t.collection,t.disabledKeys,c,l,m,a,n,i]),r=pe(e.id);he.set(t,r);let{gridProps:p}=vu({...e,id:r,keyboardDelegate:d},t,l);o&&(p["aria-rowcount"]=t.collection.size+t.collection.headerRows.length),le()&&"expandedKeys"in t&&(p.role="treegrid");let{column:s,direction:b}=t.sortDescriptor||{},v=_(Du(ne),"@react-aria/table"),g=B.useMemo(()=>{var D,y;let $=(y=(D=t.collection.columns.find(f=>f.key===s))===null||D===void 0?void 0:D.textValue)!==null&&y!==void 0?y:"";return b&&s?v.format(`${b}Sort`,{columnName:$}):void 0},[b,s,t.collection.columns]),x=fe(g);return Me(()=>{g&&ll(g,"assertive",500)},[g]),{gridProps:J(p,x,{"aria-describedby":[x["aria-describedby"],p["aria-describedby"]].filter(Boolean).join(" ")})}}function ku(e){return e&&e.__esModule?e.default:e}function nl(e,t,l){var u,o;let{node:n}=e,i=n.props.allowsSorting,{gridCellProps:a}=ul({...e,focusMode:"child"},t,l),m=n.props.isSelectionCell&&t.selectionManager.selectionMode==="single",{pressProps:c}=Wl({isDisabled:!i||m,onPress(){t.sort(n.key)},ref:l}),{focusableProps:d}=Gl({},l),r,p=((u=t.sortDescriptor)===null||u===void 0?void 0:u.column)===n.key,s=(o=t.sortDescriptor)===null||o===void 0?void 0:o.direction;n.props.allowsSorting&&!Ce()&&(r=p?s:"none");let b=_(ku(ne),"@react-aria/table"),v;i&&(v=`${b.format("sortable")}`,p&&s&&Ce()&&(v=`${v}, ${b.format(s)}`));let g=fe(v),x=t.collection.size===0;return B.useEffect(()=>{x&&t.selectionManager.focusedKey===n.key&&t.selectionManager.setFocusedKey(null)},[x,t.selectionManager,n.key]),{columnHeaderProps:{...J(d,a,c,g,x?{tabIndex:-1}:null),role:"columnheader",id:cu(t,n.key),"aria-colspan":n.colSpan&&n.colSpan>1?n.colSpan:void 0,"aria-sort":r}}}const Se={expand:{ltr:"ArrowRight",rtl:"ArrowLeft"},collapse:{ltr:"ArrowLeft",rtl:"ArrowRight"}};function Eu(e,t,l){let{node:u,isVirtualized:o}=e,{rowProps:n,...i}=$u(e,t,l),{direction:a}=ue();o&&!(le()&&"expandedKeys"in t)?n["aria-rowindex"]=u.index+1+t.collection.headerRows.length:delete n["aria-rowindex"];let m={};if(le()&&"expandedKeys"in t){let f=t.keyMap.get(u.key);if(f!=null){var c,d,r,p,s,b;let E=((c=f.props)===null||c===void 0?void 0:c.UNSTABLE_childItems)||((r=f.props)===null||r===void 0||(d=r.children)===null||d===void 0?void 0:d.length)>t.userColumnCount;var v,g,x,D;m={onKeyDown:S=>{(S.key===Se.expand[a]&&t.selectionManager.focusedKey===f.key&&E&&t.expandedKeys!=="all"&&!t.expandedKeys.has(f.key)||S.key===Se.collapse[a]&&t.selectionManager.focusedKey===f.key&&E&&(t.expandedKeys==="all"||t.expandedKeys.has(f.key)))&&(t.toggleKey(f.key),S.stopPropagation())},"aria-expanded":E?t.expandedKeys==="all"||t.expandedKeys.has(u.key):void 0,"aria-level":f.level,"aria-posinset":((v=f.indexOfType)!==null&&v!==void 0?v:0)+1,"aria-setsize":f.level>1?((x=(p=W((g=(s=t.keyMap.get(f.parentKey))===null||s===void 0?void 0:s.childNodes)!==null&&g!==void 0?g:[]))===null||p===void 0?void 0:p.indexOfType)!==null&&x!==void 0?x:0)+1:((D=(b=W(t.collection.body.childNodes))===null||b===void 0?void 0:b.indexOfType)!==null&&D!==void 0?D:0)+1}}}let y=Yl(u.props),$=i.hasAction?y:{};return{rowProps:{...J(n,m,$),"aria-labelledby":Re(t,u.key)},...i}}function Su(e,t,l){let{node:u,isVirtualized:o}=e,n={role:"row"};return o&&!(le()&&"expandedKeys"in t)&&(n["aria-rowindex"]=u.index+1),{rowProps:n}}function ol(e,t,l){var u;let{gridCellProps:o,isPressed:n}=ul(e,t,l),i=(u=e.node.column)===null||u===void 0?void 0:u.key;return i!=null&&t.collection.rowHeaderColumnKeys.has(i)&&(o.role="rowheader",o.id=Te(t,e.node.parentKey,i)),{gridCellProps:o,isPressed:n}}function Au(e){return e&&e.__esModule?e.default:e}function wu(e,t){let{key:l}=e;const{checkboxProps:u}=xu(e,t);return{checkboxProps:{...u,"aria-labelledby":`${u.id} ${Re(t,l)}`}}}function Nu(e){let{isEmpty:t,isSelectAll:l,selectionMode:u}=e.selectionManager;return{checkboxProps:{"aria-label":_(Au(ne),"@react-aria/table").format(u==="single"?"select":"selectAll"),isSelected:l,isDisabled:u!=="multiple"||e.collection.size===0||e.collection.rows.length===1&&e.collection.rows[0].type==="loader",isIndeterminate:!t&&!l,onChange:()=>e.selectionManager.toggleSelectAll()}}}function ge(){return gu()}var sl=T((e,t)=>{var l,u;const{as:o,className:n,node:i,slots:a,state:m,selectionMode:c,color:d,checkboxesProps:r,disableAnimation:p,classNames:s,...b}=e,v=o||"th",g=typeof v=="string",x=M(t),{columnHeaderProps:D}=nl({node:i},m,x),{isFocusVisible:y,focusProps:$}=X(),{checkboxProps:f}=Nu(m),E=K(s?.th,n,(l=i.props)==null?void 0:l.className),S=c==="single",{onChange:A,...k}=f;return h.jsx(v,{ref:x,"data-focus-visible":w(y),...I(D,$,O(i.props,{enabled:g}),O(b,{enabled:g})),className:(u=a.th)==null?void 0:u.call(a,{class:E}),children:S?h.jsx(be,{children:f["aria-label"]}):h.jsx(Fe,{color:d,disableAnimation:p,onValueChange:A,...I(r,k)})})});sl.displayName="HeroUI.TableSelectAllCheckbox";var il=sl;function zu(e){let{collection:t,focusMode:l}=e,u=e.UNSAFE_selectionState||Zl(e),o=B.useMemo(()=>e.disabledKeys?new Set(e.disabledKeys):new Set,[e.disabledKeys]),n=u.setFocusedKey;u.setFocusedKey=(m,c)=>{if(l==="cell"&&m!=null){let b=t.getItem(m);if(b?.type==="item"){var d,r;let v=z(b,t);var p,s;c==="last"?m=(p=(d=W(v))===null||d===void 0?void 0:d.key)!==null&&p!==void 0?p:null:m=(s=(r=U(v))===null||r===void 0?void 0:r.key)!==null&&s!==void 0?s:null}}n(m,c)};let i=B.useMemo(()=>new _l(t,u),[t,u]);const a=B.useRef(null);return B.useEffect(()=>{if(u.focusedKey!=null&&a.current&&!t.getItem(u.focusedKey)){const m=a.current.getItem(u.focusedKey),c=m?.parentKey!=null&&(m.type==="cell"||m.type==="rowheader"||m.type==="column")?a.current.getItem(m.parentKey):m;if(!c){u.setFocusedKey(null);return}const d=a.current.rows,r=t.rows,p=d.length-r.length;let s=Math.min(p>1?Math.max(c.index-p+1,0):c.index,r.length-1),b=null;for(;s>=0;){if(!i.isDisabled(r[s].key)&&r[s].type!=="headerrow"){b=r[s];break}sc.index&&(s=c.index),s--)}if(b){const v=b.hasChildNodes?[...z(b,t)]:[],g=b.hasChildNodes&&c!==m&&m&&m.index{let p=this.keyMap.get(r.key);t.visitNode&&(r=t.visitNode(r)),this.keyMap.set(r.key,r);let s=new Set,b=null,v=!1;if(r.type==="item"){var g;for(let f of r.childNodes)if(((g=f.props)===null||g===void 0?void 0:g.colSpan)!==void 0){v=!0;break}}for(let f of r.childNodes){if(f.type==="cell"&&v){var x,D;f.colspan=(x=f.props)===null||x===void 0?void 0:x.colSpan,f.colSpan=(D=f.props)===null||D===void 0?void 0:D.colSpan;var y,$;f.colIndex=b?((y=b.colIndex)!==null&&y!==void 0?y:b.index)+(($=b.colSpan)!==null&&$!==void 0?$:1):f.index}f.type==="cell"&&f.parentKey==null&&(f.parentKey=r.key),s.add(f.key),b?(b.nextKey=f.key,f.prevKey=b.key):f.prevKey=null,l(f),b=f}if(b&&(b.nextKey=null),p)for(let f of p.childNodes)s.has(f.key)||u(f)},u=r=>{this.keyMap.delete(r.key);for(let p of r.childNodes)this.keyMap.get(p.key)===p&&u(p)},o=null;for(let[r,p]of t.items.entries()){var n,i,a,m,c,d;let s={...p,level:(n=p.level)!==null&&n!==void 0?n:0,key:(i=p.key)!==null&&i!==void 0?i:"row-"+r,type:(a=p.type)!==null&&a!==void 0?a:"row",value:(m=p.value)!==null&&m!==void 0?m:null,hasChildNodes:!0,childNodes:[...p.childNodes],rendered:p.rendered,textValue:(c=p.textValue)!==null&&c!==void 0?c:"",index:(d=p.index)!==null&&d!==void 0?d:r};o?(o.nextKey=s.key,s.prevKey=o.key):s.prevKey=null,this.rows.push(s),l(s),o=s}o&&(o.nextKey=null)}}const rl="row-header-column-"+Math.random().toString(36).slice(2);let de="row-header-column-"+Math.random().toString(36).slice(2);for(;rl===de;)de="row-header-column-"+Math.random().toString(36).slice(2);function Pu(e,t){if(t.length===0)return[];let l=[],u=new Map;for(let d of t){let r=d.parentKey,p=[d];for(;r;){let s=e.get(r);if(!s)break;if(u.has(s)){var o,n;(n=(o=s).colSpan)!==null&&n!==void 0||(o.colSpan=0),s.colSpan++,s.colspan=s.colSpan;let{column:b,index:v}=u.get(s);if(v>p.length)break;for(let g=v;gd.length)),a=Array(i).fill(0).map(()=>[]),m=0;for(let d of l){let r=i-1;for(let p of d){if(p){let s=a[r],b=s.reduce((v,g)=>{var x;return v+((x=g.colSpan)!==null&&x!==void 0?x:1)},0);if(b0&&(s[s.length-1].nextKey=v.key,v.prevKey=s[s.length-1].key),s.push(v)}s.length>0&&(s[s.length-1].nextKey=p.key,p.prevKey=s[s.length-1].key),p.level=r,p.colIndex=m,s.push(p)}r--}m++}let c=0;for(let d of a){let r=d.reduce((p,s)=>{var b;return p+((b=s.colSpan)!==null&&b!==void 0?b:1)},0);if(r({type:"headerrow",key:"headerrow-"+r,index:r,value:null,rendered:null,level:0,hasChildNodes:!0,childNodes:d,textValue:""}))}class Ku extends Fu{*[Symbol.iterator](){yield*this.body.childNodes}get size(){return this._size}getKeys(){return this.keyMap.keys()}getKeyBefore(t){let l=this.keyMap.get(t);var u;return(u=l?.prevKey)!==null&&u!==void 0?u:null}getKeyAfter(t){let l=this.keyMap.get(t);var u;return(u=l?.nextKey)!==null&&u!==void 0?u:null}getFirstKey(){var t,l;return(l=(t=U(this.body.childNodes))===null||t===void 0?void 0:t.key)!==null&&l!==void 0?l:null}getLastKey(){var t,l;return(l=(t=W(this.body.childNodes))===null||t===void 0?void 0:t.key)!==null&&l!==void 0?l:null}getItem(t){var l;return(l=this.keyMap.get(t))!==null&&l!==void 0?l:null}at(t){const l=[...this.getKeys()];return this.getItem(l[t])}getChildren(t){return t===this.body.key?this.body.childNodes:super.getChildren(t)}getTextValue(t){let l=this.getItem(t);if(!l)return"";if(l.textValue)return l.textValue;let u=this.rowHeaderColumnKeys;if(u){let o=[];for(let n of l.childNodes){let i=this.columns[n.index];if(u.has(i.key)&&n.textValue&&o.push(n.textValue),o.length===u.size)break}return o.join(" ")}return""}constructor(t,l,u){let o=new Set,n=null,i=[];if(u?.showSelectionCheckboxes){let r={type:"column",key:rl,value:null,textValue:"",level:0,index:u?.showDragButtons?1:0,hasChildNodes:!1,rendered:null,childNodes:[],props:{isSelectionCell:!0}};i.unshift(r)}if(u?.showDragButtons){let r={type:"column",key:de,value:null,textValue:"",level:0,index:0,hasChildNodes:!1,rendered:null,childNodes:[],props:{isDragButtonCell:!0}};i.unshift(r)}let a=[],m=new Map,c=r=>{switch(r.type){case"body":n=r;break;case"column":m.set(r.key,r),r.hasChildNodes||(i.push(r),r.props.isRowHeader&&o.add(r.key));break;case"item":a.push(r);return}for(let p of r.childNodes)c(p)};for(let r of t)c(r);let d=Pu(m,i);if(d.forEach((r,p)=>a.splice(p,0,r)),super({columnCount:i.length,items:a,visitNode:r=>(r.column=i[r.index],r)}),this._size=0,this.columns=i,this.rowHeaderColumnKeys=o,this.body=n,this.headerRows=d,this._size=[...n.childNodes].length,this.rowHeaderColumnKeys.size===0){let r=this.columns.find(p=>{var s,b;return!(!((s=p.props)===null||s===void 0)&&s.isDragButtonCell)&&!(!((b=p.props)===null||b===void 0)&&b.isSelectionCell)});r&&this.rowHeaderColumnKeys.add(r.key)}}}const Iu={ascending:"descending",descending:"ascending"};function ju(e){let[t,l]=B.useState(!1),{selectionMode:u="none",showSelectionCheckboxes:o,showDragButtons:n}=e,i=B.useMemo(()=>({showSelectionCheckboxes:o&&u!=="none",showDragButtons:n,selectionMode:u,columns:[]}),[e.children,o,u,n]),a=ql(e,B.useCallback(r=>new Ku(r,null,i),[i]),i),{disabledKeys:m,selectionManager:c}=zu({...e,collection:a,disabledBehavior:e.disabledBehavior||"selection"});var d;return{collection:a,disabledKeys:m,selectionManager:c,showSelectionCheckboxes:e.showSelectionCheckboxes||!1,sortDescriptor:(d=e.sortDescriptor)!==null&&d!==void 0?d:null,isKeyboardNavigationDisabled:a.size===0||t,setKeyboardNavigationDisabled:l,sort(r,p){var s,b;(b=e.onSortChange)===null||b===void 0||b.call(e,{column:r,direction:p??(((s=e.sortDescriptor)===null||s===void 0?void 0:s.column)===r?Iu[e.sortDescriptor.direction]:"ascending")})}}}function al(e){return null}al.getCollectionNode=function*(t,l){let{children:u,columns:o}=t;if(l.columns=[],typeof u=="function"){if(!o)throw new Error("props.children was a function but props.columns is missing");for(let n of o)yield{type:"column",value:n,renderer:u}}else{let n=[];q.Children.forEach(u,i=>{n.push({type:"column",element:i})}),yield*n}};let Mu=al;function cl(e){return null}cl.getCollectionNode=function*(t){let{children:l,items:u}=t;yield{type:"body",hasChildNodes:!0,props:t,*childNodes(){if(typeof l=="function"){if(!u)throw new Error("props.children was a function but props.items is missing");for(let o of u)yield{type:"item",value:o,renderer:l}}else{let o=[];q.Children.forEach(l,n=>{o.push({type:"item",element:n})}),yield*o}}}};let Tu=cl;function dl(e){return null}dl.getCollectionNode=function*(t,l){let{title:u,children:o,childColumns:n}=t,i=u||o,a=t.textValue||(typeof i=="string"?i:"")||t["aria-label"],m=yield{type:"column",hasChildNodes:!!n||!!u&&q.Children.count(o)>0,rendered:i,textValue:a,props:t,*childNodes(){if(n)for(let d of n)yield{type:"column",value:d};else if(u){let d=[];q.Children.forEach(o,r=>{d.push({type:"column",element:r})}),yield*d}},shouldInvalidate(d){return c(d),!1}},c=d=>{for(let r of m)r.hasChildNodes||d.columns.push(r)};c(l)};let Ru=dl;function me(e){return null}me.getCollectionNode=function*(t,l){let{children:u,textValue:o,UNSTABLE_childItems:n}=t;yield{type:"item",props:t,textValue:o,"aria-label":t["aria-label"],hasChildNodes:!0,*childNodes(){if(l.showDragButtons&&(yield{type:"cell",key:"header-drag",props:{isDragButtonCell:!0}}),l.showSelectionCheckboxes&&l.selectionMode!=="none"&&(yield{type:"cell",key:"header",props:{isSelectionCell:!0}}),typeof u=="function"){for(let i of l.columns)yield{type:"cell",element:u(i.key),key:i.key};if(n)for(let i of n)yield{type:"item",value:i}}else{let i=[],a=[],m=0;if(q.Children.forEach(u,c=>{if(c.type===me){if(i.lengtha.key!==l.columns[m].key)||i.showSelectionCheckboxes!==l.showSelectionCheckboxes||i.showDragButtons!==l.showDragButtons||i.selectionMode!==l.selectionMode}}};let Vu=me;function ml(e){return null}ml.getCollectionNode=function*(t){let{children:l}=t,u=t.textValue||(typeof l=="string"?l:"")||t["aria-label"]||"";yield{type:"cell",props:t,rendered:l,textValue:u,"aria-label":t["aria-label"],hasChildNodes:!1}};let Ou=ml;function pl(e){var t;const l=Jl(),[u,o]=Pe(e,ke.variantKeys),{ref:n,as:i,baseRef:a,children:m,className:c,classNames:d,removeWrapper:r=!1,disableAnimation:p=(t=l?.disableAnimation)!=null?t:!1,isKeyboardNavigationDisabled:s=!1,selectionMode:b="none",topContentPlacement:v="inside",bottomContentPlacement:g="inside",selectionBehavior:x=b==="none"?null:"toggle",disabledBehavior:D="selection",showSelectionCheckboxes:y=b==="multiple"&&x!=="replace",BaseComponent:$="div",checkboxesProps:f,topContent:E,bottomContent:S,sortIcon:A,onRowAction:k,onCellAction:C,...N}=u,j=i||"table",F=typeof j=="string",R=M(n),Q=M(a),G=ju({...e,children:m,showSelectionCheckboxes:y});s&&!G.isKeyboardNavigationDisabled&&G.setKeyboardNavigationDisabled(!0);const{collection:se}=G,{layout:sn,...Fl}=e,{gridProps:$e}=Bu({...Fl},G,R),ee=b!=="none",ye=b==="multiple",H=B.useMemo(()=>ke({...o,isSelectable:ee,isMultiSelectable:ye}),[Ke(o),ee,ye]),xe=K(d?.base,c),Pl=B.useMemo(()=>{var P;return{state:G,slots:H,isSelectable:ee,collection:se,classNames:d,color:e?.color,disableAnimation:p,checkboxesProps:f,isHeaderSticky:(P=e?.isHeaderSticky)!=null?P:!1,selectionMode:b,selectionBehavior:x,disabledBehavior:D,showSelectionCheckboxes:y,onRowAction:k,onCellAction:C}},[H,G,se,ee,d,b,x,f,D,p,y,e?.color,e?.isHeaderSticky,k,C]),Kl=B.useCallback(P=>({...P,ref:Q,className:H.base({class:K(xe,P?.className)})}),[xe,H]),Il=B.useCallback(P=>({...P,ref:Q,className:H.wrapper({class:K(d?.wrapper,P?.className)})}),[d?.wrapper,H]),jl=B.useCallback(P=>({...I($e,O(N,{enabled:F}),P),onKeyDownCapture:void 0,ref:R,className:H.table({class:K(d?.table,P?.className)})}),[d?.table,F,H,$e,N]);return{BaseComponent:$,Component:j,children:m,state:G,collection:se,values:Pl,topContent:E,bottomContent:S,removeWrapper:r,topContentPlacement:v,bottomContentPlacement:g,sortIcon:A,getBaseProps:Kl,getWrapperProps:Il,getTableProps:jl}}var bl=T((e,t)=>{var l,u,o;const{as:n,className:i,node:a,rowKey:m,slots:c,state:d,classNames:r,...p}=e,s=n||"td",b=typeof s=="string",v=M(t),{gridCellProps:g}=ol({node:a},d,v),x=K(r?.td,i,(l=a.props)==null?void 0:l.className),{isFocusVisible:D,focusProps:y}=X(),$=d.selectionManager.isSelected(m),f=B.useMemo(()=>{const S=typeof a.rendered;return S!=="object"&&S!=="function"?h.jsx("span",{children:a.rendered}):a.rendered},[a.rendered]),E=((u=a.column)==null?void 0:u.props)||{};return h.jsx(s,{ref:v,"data-focus-visible":w(D),"data-selected":w($),...I(g,y,O(a.props,{enabled:b}),p),className:(o=c.td)==null?void 0:o.call(c,{align:E.align,class:x}),children:f})});bl.displayName="HeroUI.TableCell";var fl=bl,hl=T((e,t)=>{var l,u;const{as:o,className:n,node:i,rowKey:a,slots:m,state:c,color:d,disableAnimation:r,checkboxesProps:p,selectionMode:s,classNames:b,...v}=e,g=o||"td",x=typeof g=="string",D=M(t),{gridCellProps:y}=ol({node:i},c,D),{isFocusVisible:$,focusProps:f}=X(),{checkboxProps:E}=wu({key:i?.parentKey||i.key},c),S=K(b?.td,n,(l=i.props)==null?void 0:l.className),A=s==="single",{onChange:k,...C}=E,N=c.selectionManager.isSelected(a);return h.jsx(g,{ref:D,"data-focus-visible":w($),"data-selected":w(N),...I(y,f,O(i.props,{enabled:x}),v),className:(u=m.td)==null?void 0:u.call(m,{class:S}),children:A?h.jsx(be,{children:E["aria-label"]}):h.jsx(Fe,{color:d,disableAnimation:r,onValueChange:k,...I(p,C)})})});hl.displayName="HeroUI.TableCheckboxCell";var vl=hl,gl=T((e,t)=>{var l,u;const{as:o,className:n,children:i,node:a,slots:m,state:c,isSelectable:d,classNames:r,...p}=e,s=o||(e?.href?"a":"tr"),b=typeof s=="string",v=M(t),{rowProps:g}=Eu({node:a},c,v),x=K(r?.tr,n,(l=a.props)==null?void 0:l.className),{isFocusVisible:D,focusProps:y}=X(),$=c.disabledKeys.has(a.key),f=c.selectionManager.isSelected(a.key),{isHovered:E,hoverProps:S}=Ie({isDisabled:$}),{isFirst:A,isLast:k,isMiddle:C,isOdd:N}=B.useMemo(()=>{const j=a.key===c.collection.getFirstKey(),F=a.key===c.collection.getLastKey(),R=!j&&!F,Q=a?.index?(a.index+1)%2===0:!1;return{isFirst:j,isLast:F,isMiddle:R,isOdd:Q}},[a,c.collection]);return h.jsx(s,{ref:v,"data-disabled":w($),"data-first":w(A),"data-focus-visible":w(D),"data-hover":w(E),"data-last":w(k),"data-middle":w(C),"data-odd":w(N),"data-selected":w(f),...I(g,y,d?S:{},O(a.props,{enabled:b}),p),className:(u=m.tr)==null?void 0:u.call(m,{class:x}),children:i})});gl.displayName="HeroUI.TableRow";var $l=gl,yl=T((e,t)=>{var l;const{as:u,className:o,slots:n,state:i,collection:a,isSelectable:m,color:c,disableAnimation:d,checkboxesProps:r,selectionMode:p,classNames:s,rowVirtualizer:b,...v}=e,g=u||"tbody",x=typeof g=="string",D=M(t),{rowGroupProps:y}=ge(),$=K(s?.tbody,o),f=a?.body.props,E=f?.isLoading||f?.loadingState==="loading"||f?.loadingState==="loadingMore",S=[...a.body.childNodes],A=b.getVirtualItems();let k,C;return a.size===0&&f.emptyContent&&(k=h.jsx("tr",{role:"row",children:h.jsx("td",{className:n?.emptyWrapper({class:s?.emptyWrapper}),colSpan:a.columnCount,role:"gridcell",children:!E&&f.emptyContent})})),E&&f.loadingContent&&(C=h.jsxs("tr",{role:"row",children:[h.jsx("td",{className:n?.loadingWrapper({class:s?.loadingWrapper}),colSpan:a.columnCount,role:"gridcell",children:f.loadingContent}),!k&&a.size===0?h.jsx("td",{className:n?.emptyWrapper({class:s?.emptyWrapper})}):null]})),h.jsxs(g,{ref:D,...I(y,O(f,{enabled:x}),v),className:(l=n.tbody)==null?void 0:l.call(n,{class:$}),"data-empty":w(a.size===0),"data-loading":w(E),children:[A.map((N,j)=>{const F=S[N.index];return F?h.jsx($l,{classNames:s,isSelectable:m,node:F,slots:n,state:i,style:{transform:`translateY(${N.start-j*N.size}px)`,height:`${N.size}px`},children:[...F.childNodes].map(R=>R.props.isSelectionCell?h.jsx(vl,{checkboxesProps:r,classNames:s,color:c,disableAnimation:d,node:R,rowKey:F.key,selectionMode:p,slots:n,state:i},String(R.key)):h.jsx(fl,{classNames:s,node:R,rowKey:F.key,slots:n,state:i},String(R.key)))},String(F.key)):null}),C,k]})});yl.displayName="HeroUI.VirtualizedTableBody";var Hu=yl,xl=T((e,t)=>{var l,u,o,n,i;const{as:a,className:m,state:c,node:d,slots:r,classNames:p,sortIcon:s,...b}=e,v=a||"th",g=typeof v=="string",x=M(t),{columnHeaderProps:D}=nl({node:d},c,x),y=K(p?.th,m,(l=d.props)==null?void 0:l.className),{isFocusVisible:$,focusProps:f}=X(),{isHovered:E,hoverProps:S}=Ie({}),{hideHeader:A,align:k,...C}=d.props,N=C.allowsSorting,j={"aria-hidden":!0,"data-direction":(u=c.sortDescriptor)==null?void 0:u.direction,"data-visible":w(((o=c.sortDescriptor)==null?void 0:o.column)===d.key),className:(n=r.sortIcon)==null?void 0:n.call(r,{class:p?.sortIcon})},F=typeof s=="function"?s(j):B.isValidElement(s)&&B.cloneElement(s,j);return h.jsxs(v,{ref:x,colSpan:d.colspan,"data-focus-visible":w($),"data-hover":w(E),"data-sortable":w(N),...I(D,f,O(C,{enabled:g}),N?S:{},b),className:(i=r.th)==null?void 0:i.call(r,{align:k,class:y}),children:[A?h.jsx(be,{children:d.rendered}):d.rendered,N&&(F||h.jsx(su,{strokeWidth:3,...j}))]})});xl.displayName="HeroUI.TableColumnHeader";var Cl=xl,Dl=T((e,t)=>{var l,u;const{as:o,className:n,children:i,node:a,slots:m,classNames:c,state:d,...r}=e,p=o||"tr",s=typeof p=="string",b=M(t),{rowProps:v}=Su({node:a},d),g=K(c?.tr,n,(l=a.props)==null?void 0:l.className);return h.jsx(p,{ref:b,...I(v,O(a.props,{enabled:s}),r),className:(u=m.tr)==null?void 0:u.call(m,{class:g}),children:i})});Dl.displayName="HeroUI.TableHeaderRow";var Bl=Dl,kl=B.forwardRef((e,t)=>{var l;const{as:u,className:o,children:n,slots:i,classNames:a,...m}=e,c=u||"thead",d=M(t),{rowGroupProps:r}=ge(),p=K(a?.thead,o);return h.jsx(c,{ref:d,className:(l=i.thead)==null?void 0:l.call(i,{class:p}),...I(r,m),children:n})});kl.displayName="HeroUI.TableRowGroup";var El=kl,Lu={px:"1px",0:"0px",.5:"0.125rem",1:"0.25rem",1.5:"0.375rem",2:"0.5rem",2.5:"0.625rem",3:"0.75rem",3.5:"0.875rem",4:"1rem",5:"1.25rem",6:"1.5rem",7:"1.75rem",8:"2rem",9:"2.25rem",10:"2.5rem",11:"2.75rem",12:"3rem",14:"3.5rem",16:"4rem",20:"5rem",24:"6rem",28:"7rem",32:"8rem",36:"9rem",40:"10rem",44:"11rem",48:"12rem",52:"13rem",56:"14rem",60:"15rem",64:"16rem",72:"18rem",80:"20rem",96:"24rem"},Ae=e=>{var t;return(t=Lu[e])!=null?t:e};function Uu(e){const[t,l]=Pe(e,Be.variantKeys),{as:u,className:o,x:n=1,y:i=1,...a}=t,m=u||"span",c=B.useMemo(()=>Be({...l,className:o}),[Ke(l),o]),d=Ae(n),r=Ae(i);return{Component:m,getSpacerProps:(s={})=>({...s,...a,"aria-hidden":w(!0),className:K(c,s.className),style:{...s.style,...a.style,marginLeft:d,marginTop:r}})}}var Sl=T((e,t)=>{const{Component:l,getSpacerProps:u}=Uu({...e});return h.jsx(l,{ref:t,...u()})});Sl.displayName="HeroUI.Spacer";var Al=Sl,wl=T((e,t)=>{const{BaseComponent:l,Component:u,collection:o,values:n,topContent:i,topContentPlacement:a,bottomContentPlacement:m,bottomContent:c,getBaseProps:d,getWrapperProps:r,getTableProps:p}=pl({...e,ref:t}),{rowHeight:s=40,maxTableHeight:b=600}=e,v=B.useCallback(({children:A})=>h.jsx(l,{...r(),ref:D,style:{height:b,display:"block"},children:A}),[r,b]),x=[...o.body.childNodes].length,D=B.useRef(null),[y,$]=B.useState(0),f=B.useRef(null);B.useLayoutEffect(()=>{f.current&&$(f.current.getBoundingClientRect().height)},[f]);const E=iu({count:x,getScrollElement:()=>D.current,estimateSize:()=>s,overscan:5}),S=p();return h.jsxs("div",{...d(),children:[a==="outside"&&i,h.jsx(v,{children:h.jsxs(h.Fragment,{children:[a==="inside"&&i,h.jsxs(u,{...S,style:{height:`calc(${E.getTotalSize()+y}px)`,...S.style},children:[h.jsxs(El,{ref:f,classNames:n.classNames,slots:n.slots,children:[o.headerRows.map(A=>h.jsx(Bl,{classNames:n.classNames,node:A,slots:n.slots,state:n.state,children:[...A.childNodes].map(k=>{var C;return(C=k?.props)!=null&&C.isSelectionCell?h.jsx(il,{checkboxesProps:n.checkboxesProps,classNames:n.classNames,color:n.color,disableAnimation:n.disableAnimation,node:k,selectionMode:n.selectionMode,slots:n.slots,state:n.state},k?.key):h.jsx(Cl,{classNames:n.classNames,node:k,slots:n.slots,state:n.state},k?.key)})},A?.key)),h.jsx(Al,{as:"tr",tabIndex:-1,y:1})]}),h.jsx(Hu,{checkboxesProps:n.checkboxesProps,classNames:n.classNames,collection:n.collection,color:n.color,disableAnimation:n.disableAnimation,isSelectable:n.isSelectable,rowVirtualizer:E,selectionMode:n.selectionMode,slots:n.slots,state:n.state})]}),m==="inside"&&c]})}),m==="outside"&&c]})});wl.displayName="HeroUI.VirtualizedTable";var Wu=wl,Nl=T((e,t)=>{var l;const{as:u,className:o,slots:n,state:i,collection:a,isSelectable:m,color:c,disableAnimation:d,checkboxesProps:r,selectionMode:p,classNames:s,...b}=e,v=u||"tbody",g=typeof v=="string",x=M(t),{rowGroupProps:D}=ge(),y=K(s?.tbody,o),$=a?.body.props,f=$?.isLoading||$?.loadingState==="loading"||$?.loadingState==="loadingMore",E=B.useMemo(()=>[...a.body.childNodes].map(k=>h.jsx($l,{classNames:s,isSelectable:m,node:k,slots:n,state:i,children:[...k.childNodes].map(C=>C.props.isSelectionCell?h.jsx(vl,{checkboxesProps:r,classNames:s,color:c,disableAnimation:d,node:C,rowKey:k.key,selectionMode:p,slots:n,state:i},C.key):h.jsx(fl,{classNames:s,node:C,rowKey:k.key,slots:n,state:i},C.key))},k.key)),[a.body.childNodes,s,m,n,i]);let S,A;return a.size===0&&$.emptyContent&&(S=h.jsx("tr",{role:"row",children:h.jsx("td",{className:n?.emptyWrapper({class:s?.emptyWrapper}),colSpan:a.columnCount,role:"gridcell",children:!f&&$.emptyContent})})),f&&$.loadingContent&&(A=h.jsxs("tr",{role:"row",children:[h.jsx("td",{className:n?.loadingWrapper({class:s?.loadingWrapper}),colSpan:a.columnCount,role:"gridcell",children:$.loadingContent}),!S&&a.size===0?h.jsx("td",{className:n?.emptyWrapper({class:s?.emptyWrapper})}):null]})),h.jsxs(v,{ref:x,...I(D,O($,{enabled:g}),b),className:(l=n.tbody)==null?void 0:l.call(n,{class:y}),"data-empty":w(a.size===0),"data-loading":w(f),children:[E,A,S]})});Nl.displayName="HeroUI.TableBody";var Gu=Nl,zl=T((e,t)=>{const{BaseComponent:l,Component:u,collection:o,values:n,topContent:i,topContentPlacement:a,bottomContentPlacement:m,bottomContent:c,removeWrapper:d,sortIcon:r,getBaseProps:p,getWrapperProps:s,getTableProps:b}=pl({...e,ref:t}),{isVirtualized:v,rowHeight:g=40,maxTableHeight:x=600}=e,D=v,y=B.useCallback(({children:$})=>d?$:h.jsx(l,{...s(),children:$}),[d,s]);return D?h.jsx(Wu,{...e,ref:t,maxTableHeight:x,rowHeight:g}):h.jsxs("div",{...p(),children:[a==="outside"&&i,h.jsx(y,{children:h.jsxs(h.Fragment,{children:[a==="inside"&&i,h.jsxs(u,{...b(),children:[h.jsxs(El,{classNames:n.classNames,slots:n.slots,children:[o.headerRows.map($=>h.jsx(Bl,{classNames:n.classNames,node:$,slots:n.slots,state:n.state,children:[...$.childNodes].map(f=>{var E;return(E=f?.props)!=null&&E.isSelectionCell?h.jsx(il,{checkboxesProps:n.checkboxesProps,classNames:n.classNames,color:n.color,disableAnimation:n.disableAnimation,node:f,selectionMode:n.selectionMode,slots:n.slots,state:n.state},f?.key):h.jsx(Cl,{classNames:n.classNames,node:f,slots:n.slots,sortIcon:r,state:n.state},f?.key)})},$?.key)),h.jsx(Al,{as:"tr",tabIndex:-1,y:1})]}),h.jsx(Gu,{checkboxesProps:n.checkboxesProps,classNames:n.classNames,collection:n.collection,color:n.color,disableAnimation:n.disableAnimation,isSelectable:n.isSelectable,selectionMode:n.selectionMode,slots:n.slots,state:n.state})]}),m==="inside"&&c]})}),m==="outside"&&c]})});zl.displayName="HeroUI.Table";var Yu=zl,Zu=Ru,_u=Zu,qu=Mu,Ju=qu,Xu=Vu,Qu=Xu,en=Tu,tn=en,ln=Ou,un=ln;const nn={n_requests:"Number Of Requests",estimated_cost:"Estimated Cost ($)"},we=["model","n_requests","prompt_tokens","completion_tokens","total_tokens","estimated_cost"];function on(e){return e.replace(/(-?)(\d*)\.?(\d*)e([+-]\d+)/,function(t,l,u,o,n){return n<0?l+"0."+Array(1-n-u.length).join("0")+o+u:l+u+o+Array(n-o.length+1).join("0")})}function mn({usage:e}){const t=Object.keys(e),{isOpen:l,onOpen:u,onClose:o}=Xl(),n=()=>{o()},i=Object.keys(e[t[0]]),a=[...we.filter(s=>s==="model"||i.includes(s)),...i.filter(s=>!we.includes(s))],m=i.reduce((s,b)=>({...s,[b]:0}),{}),c=t.reduce((s,b)=>(a.reduce((v,g)=>(g==="model"||(v[g]+=e[b][g]),v),s),s),m),d=[...a.map(s=>({key:s,label:nn[s]??De.words(s).map(De.upperFirst).join(" ")}))],r=[...t.map(s=>({model:s,...e[s]})),{model:"Total",...c}],p=h.jsxs("div",{className:"p-2",children:[h.jsxs("div",{className:"flex flex-col gap-2",children:[c.prompt_tokens!==void 0&&h.jsxs("div",{className:"flex justify-between gap-2",children:[h.jsx("span",{className:"font-semibold",children:"Prompt tokens"}),h.jsx("span",{children:c.prompt_tokens})]}),c.completion_tokens!==void 0&&h.jsxs("div",{className:"flex justify-between gap-2",children:[h.jsx("span",{className:"font-semibold",children:"Completion tokens"}),h.jsx("span",{children:c.completion_tokens})]}),c.total_tokens!==void 0&&h.jsxs("div",{className:"flex justify-between gap-2",children:[h.jsx("span",{className:"font-semibold",children:"Total tokens"}),h.jsx("span",{children:c.total_tokens})]}),c.estimated_cost!==void 0&&h.jsxs("div",{className:"flex justify-between gap-2",children:[h.jsx("span",{className:"font-semibold",children:"Estimated cost"}),h.jsxs("span",{children:[on(c.estimated_cost.toString()),"$"]})]})]}),h.jsx("p",{className:"m-auto mt-2 text-center",children:"Show detailed usage breakdown by model."})]});return h.jsxs(h.Fragment,{children:[h.jsx(Ql,{content:p,placement:"bottom",children:h.jsx(eu,{isIconOnly:!0,variant:"ghost",className:"p-0","aria-label":"Open usage details",onPress:u,children:h.jsx(tu,{icon:"heroicons:information-circle"})})}),h.jsx(lu,{isOpen:l,onOpenChange:n,size:"4xl",children:h.jsx(uu,{children:h.jsxs(h.Fragment,{children:[h.jsx(ru,{className:"text-default-900 flex flex-col gap-1",children:"Usage details"}),h.jsx(nu,{children:h.jsxs(Yu,{"aria-label":"Table with detailed usage statistics for each model used to generate the message.",fullWidth:!0,children:[h.jsx(Ju,{columns:d,children:s=>h.jsx(_u,{children:s.label},s.key)}),h.jsx(tn,{items:r,children:s=>h.jsx(Qu,{className:s.model==="Total"?"border-default-200 border-t-1":"",children:b=>h.jsx(un,{children:ou(s,b)})},s.model)})]})})]})})})]})}export{mn as default}; diff --git a/packages/ragbits-chat/src/ragbits/chat/ui-build/assets/authStore-Ur4ZGows.js b/packages/ragbits-chat/src/ragbits/chat/ui-build/assets/authStore-BmdbjFC4.js similarity index 74% rename from packages/ragbits-chat/src/ragbits/chat/ui-build/assets/authStore-Ur4ZGows.js rename to packages/ragbits-chat/src/ragbits/chat/ui-build/assets/authStore-BmdbjFC4.js index 2ac1c94e5..a90205362 100644 --- a/packages/ragbits-chat/src/ragbits/chat/ui-build/assets/authStore-Ur4ZGows.js +++ b/packages/ragbits-chat/src/ragbits/chat/ui-build/assets/authStore-BmdbjFC4.js @@ -1 +1 @@ -import{bo as u,bp as l,bq as p}from"./index-BTypXP0X.js";const c=e=>({user_id:e.user_id,email:e.email}),d=u(l(p((e,i)=>({user:null,token:null,isAuthenticated:!1,tokenExpiration:null,hasHydrated:!1,onRehydrated:()=>{const{token:t,tokenExpiration:o,logout:n}=i(),a=Date.now(),s=(o??0)-a;!t||s<=0?n():e(r=>{r.isAuthenticated=!0}),e(r=>{r.hasHydrated=!0})},login:(t,o)=>e(n=>{n.user=t,n.token=o,n.tokenExpiration=Date.now()+o.expires_in*1e3,n.isAuthenticated=!0}),logout:()=>e(t=>{t.user=null,t.token=null,t.isAuthenticated=!1})})),{name:"ragbits-auth",partialize:e=>({token:e.token,tokenExpiration:e.tokenExpiration,user:e.user?c(e.user):null}),merge:(e,i)=>({...i,...e,isAuthenticated:!1}),onRehydrateStorage:e=>()=>{e.onRehydrated()}}));export{d as a}; +import{bu as u,bv as l,bw as c}from"./index-DaG4uPnK.js";const h=e=>({user_id:e.user_id,email:e.email}),d=u(l(c((e,i)=>({user:null,token:null,isAuthenticated:!1,tokenExpiration:null,hasHydrated:!1,onRehydrated:()=>{const{token:t,tokenExpiration:o,logout:n}=i(),a=Date.now(),s=(o??0)-a;!t||s<=0?n():e(r=>{r.isAuthenticated=!0}),e(r=>{r.hasHydrated=!0})},login:(t,o)=>e(n=>{n.user=t,n.token=o,n.tokenExpiration=Date.now()+o.expires_in*1e3,n.isAuthenticated=!0}),logout:()=>e(t=>{t.user=null,t.token=null,t.isAuthenticated=!1})})),{name:"ragbits-auth",partialize:e=>({token:e.token,tokenExpiration:e.tokenExpiration,user:e.user?h(e.user):null}),merge:(e,i)=>({...i,...e,isAuthenticated:!1}),onRehydrateStorage:e=>()=>{e.onRehydrated()}}));export{d as a}; diff --git a/packages/ragbits-chat/src/ragbits/chat/ui-build/assets/chunk-IGSAU2ZA-Beuyhkep.js b/packages/ragbits-chat/src/ragbits/chat/ui-build/assets/chunk-IGSAU2ZA-Beuyhkep.js new file mode 100644 index 000000000..3a29cf44b --- /dev/null +++ b/packages/ragbits-chat/src/ragbits/chat/ui-build/assets/chunk-IGSAU2ZA-Beuyhkep.js @@ -0,0 +1 @@ +import{l as h,be as p,R as x,r as i,j as M,Z as R}from"./index-DaG4uPnK.js";var s=h((r,o)=>{const{as:t,children:d,className:l,...n}=r,{slots:c,classNames:a,headerId:m,setHeaderMounted:e}=p(),f=x(o),u=t||"header";return i.useEffect(()=>(e(!0),()=>e(!1)),[e]),M.jsx(u,{ref:f,className:c.header({class:R(a?.header,l)}),id:m,...n,children:d})});s.displayName="HeroUI.ModalHeader";var N=s;export{N as m}; diff --git a/packages/ragbits-chat/src/ragbits/chat/ui-build/assets/chunk-IGSAU2ZA-RYoue1Xd.js b/packages/ragbits-chat/src/ragbits/chat/ui-build/assets/chunk-IGSAU2ZA-RYoue1Xd.js deleted file mode 100644 index 531e980f1..000000000 --- a/packages/ragbits-chat/src/ragbits/chat/ui-build/assets/chunk-IGSAU2ZA-RYoue1Xd.js +++ /dev/null @@ -1 +0,0 @@ -import{O as h,bf as p,A as x,r as i,j as M,J as H}from"./index-BTypXP0X.js";var s=h((r,o)=>{const{as:t,children:d,className:l,...n}=r,{slots:c,classNames:a,headerId:f,setHeaderMounted:e}=p(),m=x(o),u=t||"header";return i.useEffect(()=>(e(!0),()=>e(!1)),[e]),M.jsx(u,{ref:m,className:c.header({class:H(a?.header,l)}),id:f,...n,children:d})});s.displayName="HeroUI.ModalHeader";var R=s;export{R as m}; diff --git a/packages/ragbits-chat/src/ragbits/chat/ui-build/assets/chunk-SSA7SXE4-CTW6lkmA.js b/packages/ragbits-chat/src/ragbits/chat/ui-build/assets/chunk-SSA7SXE4-CTW6lkmA.js new file mode 100644 index 000000000..288cb464d --- /dev/null +++ b/packages/ragbits-chat/src/ragbits/chat/ui-build/assets/chunk-SSA7SXE4-CTW6lkmA.js @@ -0,0 +1 @@ +import{l as y,bo as D,j as e,r as t,am as N}from"./index-DaG4uPnK.js";var E=y((B,H)=>{const{Component:L,label:u,description:r,isClearable:d,startContent:c,endContent:h,labelPlacement:O,hasHelper:x,isOutsideLeft:j,isOutsideTop:g,shouldLabelBeOutside:m,errorMessage:s,isInvalid:P,getBaseProps:w,getLabelProps:F,getInputProps:v,getInnerWrapperProps:b,getInputWrapperProps:o,getMainWrapperProps:C,getHelperWrapperProps:I,getDescriptionProps:l,getErrorMessageProps:i,getClearButtonProps:f}=D({...B,ref:H}),n=u?e.jsx("label",{...F(),children:u}):null,M=t.useMemo(()=>d?e.jsx("button",{...f(),children:h||e.jsx(N,{})}):h,[d,f]),p=t.useMemo(()=>{const W=P&&s;return!x||!(W||r)?null:e.jsx("div",{...I(),children:W?e.jsx("div",{...i(),children:s}):e.jsx("div",{...l(),children:r})})},[x,P,s,r,I,i,l]),a=t.useMemo(()=>e.jsxs("div",{...b(),children:[c,e.jsx("input",{...v()}),M]}),[c,M,v,b]),R=t.useMemo(()=>m?e.jsxs("div",{...C(),children:[e.jsxs("div",{...o(),children:[!j&&!g?n:null,a]}),p]}):e.jsxs(e.Fragment,{children:[e.jsxs("div",{...o(),children:[n,a]}),p]}),[O,p,m,n,a,s,r,C,o,i,l]);return e.jsxs(L,{...w(),children:[j||g?n:null,R]})});E.displayName="HeroUI.Input";var U=E;export{U as i}; diff --git a/packages/ragbits-chat/src/ragbits/chat/ui-build/assets/chunk-SSA7SXE4-CpT2ku66.js b/packages/ragbits-chat/src/ragbits/chat/ui-build/assets/chunk-SSA7SXE4-CpT2ku66.js deleted file mode 100644 index 0b4e42a0b..000000000 --- a/packages/ragbits-chat/src/ragbits/chat/ui-build/assets/chunk-SSA7SXE4-CpT2ku66.js +++ /dev/null @@ -1 +0,0 @@ -import{O as y,bi as z,j as e,r as t,az as D}from"./index-BTypXP0X.js";var E=y((O,B)=>{const{Component:H,label:u,description:r,isClearable:d,startContent:c,endContent:h,labelPlacement:L,hasHelper:x,isOutsideLeft:j,isOutsideTop:g,shouldLabelBeOutside:m,errorMessage:s,isInvalid:P,getBaseProps:w,getLabelProps:F,getInputProps:v,getInnerWrapperProps:b,getInputWrapperProps:o,getMainWrapperProps:C,getHelperWrapperProps:I,getDescriptionProps:i,getErrorMessageProps:l,getClearButtonProps:f}=z({...O,ref:B}),n=u?e.jsx("label",{...F(),children:u}):null,M=t.useMemo(()=>d?e.jsx("button",{...f(),children:h||e.jsx(D,{})}):h,[d,f]),p=t.useMemo(()=>{const W=P&&s;return!x||!(W||r)?null:e.jsx("div",{...I(),children:W?e.jsx("div",{...l(),children:s}):e.jsx("div",{...i(),children:r})})},[x,P,s,r,I,l,i]),a=t.useMemo(()=>e.jsxs("div",{...b(),children:[c,e.jsx("input",{...v()}),M]}),[c,M,v,b]),R=t.useMemo(()=>m?e.jsxs("div",{...C(),children:[e.jsxs("div",{...o(),children:[!j&&!g?n:null,a]}),p]}):e.jsxs(e.Fragment,{children:[e.jsxs("div",{...o(),children:[n,a]}),p]}),[L,p,m,n,a,s,r,C,o,l,i]);return e.jsxs(H,{...w(),children:[j||g?n:null,R]})});E.displayName="HeroUI.Input";var T=E;export{T as i}; diff --git a/packages/ragbits-chat/src/ragbits/chat/ui-build/assets/index-CTrBaHsz.js b/packages/ragbits-chat/src/ragbits/chat/ui-build/assets/index-CTrBaHsz.js deleted file mode 100644 index a21d53805..000000000 --- a/packages/ragbits-chat/src/ragbits/chat/ui-build/assets/index-CTrBaHsz.js +++ /dev/null @@ -1,32 +0,0 @@ -const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/index-CYQIHhg3.js","assets/index-BTypXP0X.js","assets/index-DHfXqRui.css"])))=>i.map(i=>d[i]); -import{r as H,$ as g_,k as Ur,t as oa,l as bl,n as y_,o as v_,q as b_,s as __,v as My,w as Ce,x as ua,y as la,z as nd,A as Tr,B as ky,E as $_,G as Xn,H as ca,J as Pe,K as Ly,L as ad,M as pe,N as w_,O as Kr,P as S_,j as O,Q as By,_ as P_,R as Uy,T as Ky,S as E_,U as id,V as A_,W as O_,X as sd,Y as x_,Z as C_,a0 as I_,a1 as T_,a2 as R_,a3 as q_,a4 as j_,a5 as D_,a6 as N_,a7 as ql,a8 as Rr,a9 as Vy,aa as F_,ab as M_,ac as zy,ad as k_,ae as jl,af as L_,ag as qr,ah as B_,ai as U_,aj as K_,ak as V_,al as z_,am as W_,an as H_,ao as G_,ap as od,aq as Y_,ar as J_,as as ud,at as Z_,au as X_,av as Q_,aw as e1,ax as ld,ay as t1,az as r1,aA as n1,aB as a1,aC as i1,aD as s1,aE as Vr,g as sn,aF as o1,aG as u1,aH as l1}from"./index-BTypXP0X.js";import{i as c1}from"./chunk-SSA7SXE4-CpT2ku66.js";import{$ as d1,a as f1,u as p1,C as h1}from"./index-nfbmdcVN.js";function Wy(e,t,r){let{type:n}=e,{isOpen:a}=t;H.useEffect(()=>{r&&r.current&&g_.set(r.current,t.close)});let i;n==="menu"?i=!0:n==="listbox"&&(i="listbox");let s=Ur();return{triggerProps:{"aria-haspopup":i,"aria-expanded":a,"aria-controls":a?s:void 0,onPress:t.toggle},overlayProps:{id:s}}}var cd=oa({slots:{base:["group inline-flex flex-col relative"],label:["block","absolute","z-10","origin-top-left","flex-shrink-0","rtl:origin-top-right","subpixel-antialiased","text-small","text-foreground-500","pointer-events-none","group-data-[has-label-outside=true]:pointer-events-auto"],mainWrapper:"w-full flex flex-col",trigger:"relative px-3 gap-3 w-full inline-flex flex-row items-center shadow-xs outline-hidden tap-highlight-transparent",innerWrapper:"inline-flex h-fit w-[calc(100%_-theme(spacing.6))] min-h-4 items-center gap-1.5 box-border",selectorIcon:"absolute end-3 w-4 h-4",spinner:"absolute end-3",value:["text-foreground-500","font-normal","w-full","text-start"],listboxWrapper:"scroll-py-6 w-full",listbox:"",popoverContent:"w-full p-1 overflow-hidden",clearButton:["w-4","h-4","z-10","mb-4","relative","start-auto","appearance-none","outline-none","select-none","opacity-70","hover:!opacity-100","cursor-pointer","active:!opacity-70","rounded-full",...bl],helperWrapper:"p-1 flex relative flex-col gap-1.5 group-data-[has-helper=true]:flex",description:"text-tiny text-foreground-400",errorMessage:"text-tiny text-danger",endWrapper:"flex end-18",endContent:"mb-4"},variants:{variant:{flat:{trigger:["bg-default-100","data-[hover=true]:bg-default-200","group-data-[focus=true]:bg-default-200"],clearButton:"mb-4"},faded:{trigger:["bg-default-100","border-medium","border-default-200","data-[hover=true]:border-default-400 data-[focus=true]:border-default-400 data-[open=true]:border-default-400"],value:"group-data-[has-value=true]:text-default-foreground",clearButton:"mb-4"},bordered:{trigger:["border-medium","border-default-200","data-[hover=true]:border-default-400","data-[open=true]:border-default-foreground","data-[focus=true]:border-default-foreground"],value:"group-data-[has-value=true]:text-default-foreground",clearButton:"mb-4"},underlined:{trigger:["!px-1","!pb-0","!gap-0","relative","box-border","border-b-medium","shadow-[0_1px_0px_0_rgba(0,0,0,0.05)]","border-default-200","!rounded-none","hover:border-default-300","after:content-['']","after:w-0","after:origin-center","after:bg-default-foreground","after:absolute","after:left-1/2","after:-translate-x-1/2","after:-bottom-[2px]","after:h-[2px]","data-[open=true]:after:w-full","data-[focus=true]:after:w-full"],value:"group-data-[has-value=true]:text-default-foreground",clearButton:"mb-4 me-2"}},color:{default:{},primary:{selectorIcon:"text-primary"},secondary:{selectorIcon:"text-secondary"},success:{selectorIcon:"text-success"},warning:{selectorIcon:"text-warning"},danger:{selectorIcon:"text-danger"}},size:{sm:{label:"text-tiny",trigger:"h-8 min-h-8 px-2 rounded-small",value:"text-small",clearButton:"text-medium"},md:{trigger:"h-10 min-h-10 rounded-medium",value:"text-small",clearButton:"text-large"},lg:{trigger:"h-12 min-h-12 rounded-large",value:"text-medium",clearButton:"mb-5 text-large"}},radius:{none:{trigger:"rounded-none"},sm:{trigger:"rounded-small"},md:{trigger:"rounded-medium"},lg:{trigger:"rounded-large"},full:{trigger:"rounded-full"}},labelPlacement:{outside:{base:"flex flex-col",clearButton:"mb-0"},"outside-left":{base:"flex-row items-center flex-nowrap data-[has-helper=true]:items-start",label:"relative pe-2 text-foreground",clearButton:"mb-0"},inside:{label:"text-tiny cursor-pointer",trigger:"flex-col items-start justify-center gap-0"}},fullWidth:{true:{base:"w-full"},false:{base:"min-w-40"}},isClearable:{true:{clearButton:"peer-data-[filled=true]:opacity-70 peer-data-[filled=true]:block",endContent:"ms-3"}},isDisabled:{true:{base:"opacity-disabled pointer-events-none",trigger:"pointer-events-none"}},isInvalid:{true:{label:"!text-danger",value:"!text-danger",selectorIcon:"text-danger"}},isRequired:{true:{label:"after:content-['*'] after:text-danger after:ms-0.5"}},isMultiline:{true:{label:"relative",trigger:"!h-auto"},false:{value:"truncate"}},disableAnimation:{true:{trigger:"after:transition-none",base:"transition-none",label:"transition-none",selectorIcon:"transition-none"},false:{base:"transition-background motion-reduce:transition-none !duration-150",label:["will-change-auto","origin-top-left","rtl:origin-top-right","!duration-200","!ease-out","transition-[transform,color,left,opacity,translate,scale]","motion-reduce:transition-none"],selectorIcon:"transition-transform duration-150 ease motion-reduce:transition-none",clearButton:["transition-opacity","motion-reduce:transition-none"]}},disableSelectorIconRotation:{true:{},false:{selectorIcon:"data-[open=true]:rotate-180"}}},defaultVariants:{variant:"flat",color:"default",size:"md",fullWidth:!0,isDisabled:!1,isMultiline:!1,disableSelectorIconRotation:!1},compoundVariants:[{variant:"flat",color:"default",class:{value:"group-data-[has-value=true]:text-default-foreground",trigger:["bg-default-100","data-[hover=true]:bg-default-200"]}},{variant:"flat",color:"primary",class:{trigger:["bg-primary-100","text-primary","data-[hover=true]:bg-primary-50","group-data-[focus=true]:bg-primary-50"],value:"text-primary",label:"text-primary"}},{variant:"flat",color:"secondary",class:{trigger:["bg-secondary-100","text-secondary","data-[hover=true]:bg-secondary-50","group-data-[focus=true]:bg-secondary-50"],value:"text-secondary",label:"text-secondary"}},{variant:"flat",color:"success",class:{trigger:["bg-success-100","text-success-600","dark:text-success","data-[hover=true]:bg-success-50","group-data-[focus=true]:bg-success-50"],value:"text-success-600 dark:text-success",label:"text-success-600 dark:text-success"}},{variant:"flat",color:"warning",class:{trigger:["bg-warning-100","text-warning-600","dark:text-warning","data-[hover=true]:bg-warning-50","group-data-[focus=true]:bg-warning-50"],value:"text-warning-600 dark:text-warning",label:"text-warning-600 dark:text-warning"}},{variant:"flat",color:"danger",class:{trigger:["bg-danger-100","text-danger","dark:text-danger-500","data-[hover=true]:bg-danger-50","group-data-[focus=true]:bg-danger-50"],value:"text-danger dark:text-danger-500",label:"text-danger dark:text-danger-500"}},{variant:"faded",color:"primary",class:{trigger:"data-[hover=true]:border-primary data-[focus=true]:border-primary data-[open=true]:border-primary",label:"text-primary"}},{variant:"faded",color:"secondary",class:{trigger:"data-[hover=true]:border-secondary data-[focus=true]:border-secondary data-[open=true]:border-secondary",label:"text-secondary"}},{variant:"faded",color:"success",class:{trigger:"data-[hover=true]:border-success data-[focus=true]:border-success data-[open=true]:border-success",label:"text-success"}},{variant:"faded",color:"warning",class:{trigger:"data-[hover=true]:border-warning data-[focus=true]:border-warning data-[open=true]:border-warning",label:"text-warning"}},{variant:"faded",color:"danger",class:{trigger:"data-[hover=true]:border-danger data-[focus=true]:border-danger data-[open=true]:border-danger",label:"text-danger"}},{variant:"underlined",color:"default",class:{value:"group-data-[has-value=true]:text-foreground"}},{variant:"underlined",color:"primary",class:{trigger:"after:bg-primary",label:"text-primary"}},{variant:"underlined",color:"secondary",class:{trigger:"after:bg-secondary",label:"text-secondary"}},{variant:"underlined",color:"success",class:{trigger:"after:bg-success",label:"text-success"}},{variant:"underlined",color:"warning",class:{trigger:"after:bg-warning",label:"text-warning"}},{variant:"underlined",color:"danger",class:{trigger:"after:bg-danger",label:"text-danger"}},{variant:"bordered",color:"primary",class:{trigger:["data-[open=true]:border-primary","data-[focus=true]:border-primary"],label:"text-primary"}},{variant:"bordered",color:"secondary",class:{trigger:["data-[open=true]:border-secondary","data-[focus=true]:border-secondary"],label:"text-secondary"}},{variant:"bordered",color:"success",class:{trigger:["data-[open=true]:border-success","data-[focus=true]:border-success"],label:"text-success"}},{variant:"bordered",color:"warning",class:{trigger:["data-[open=true]:border-warning","data-[focus=true]:border-warning"],label:"text-warning"}},{variant:"bordered",color:"danger",class:{trigger:["data-[open=true]:border-danger","data-[focus=true]:border-danger"],label:"text-danger"}},{labelPlacement:"inside",color:"default",class:{label:"group-data-[filled=true]:text-default-600"}},{labelPlacement:"outside",color:"default",class:{label:"group-data-[filled=true]:text-foreground"}},{radius:"full",size:["sm"],class:{trigger:"px-3"}},{radius:"full",size:"md",class:{trigger:"px-4"}},{radius:"full",size:"lg",class:{trigger:"px-5"}},{disableAnimation:!1,variant:["faded","bordered"],class:{trigger:"transition-colors motion-reduce:transition-none"}},{disableAnimation:!1,variant:"underlined",class:{trigger:"after:transition-width motion-reduce:after:transition-none"}},{variant:["flat","faded"],class:{trigger:[...bl]}},{isInvalid:!0,variant:"flat",class:{trigger:["bg-danger-50","data-[hover=true]:bg-danger-100","group-data-[focus=true]:bg-danger-50"]}},{isInvalid:!0,variant:"bordered",class:{trigger:"!border-danger group-data-[focus=true]:border-danger"}},{isInvalid:!0,variant:"underlined",class:{trigger:"after:bg-danger"}},{labelPlacement:"inside",size:"sm",class:{trigger:"h-12 min-h-12 py-1.5 px-3"}},{labelPlacement:"inside",size:"md",class:{trigger:"h-14 min-h-14 py-2"}},{labelPlacement:"inside",size:"lg",class:{label:"text-medium",trigger:"h-16 min-h-16 py-2.5 gap-0"}},{labelPlacement:"outside",isMultiline:!1,class:{base:"group relative justify-end",label:["pb-0","z-20","top-1/2","-translate-y-1/2","group-data-[filled=true]:start-0"]}},{labelPlacement:["inside"],class:{label:"group-data-[filled=true]:scale-85"}},{labelPlacement:"inside",size:["sm","md"],class:{label:"text-small"}},{labelPlacement:"inside",isMultiline:!1,size:"sm",class:{label:["group-data-[filled=true]:-translate-y-[calc(50%_+_var(--heroui-font-size-tiny)/2_-_8px)]"],innerWrapper:"group-data-[has-label=true]:pt-4"}},{labelPlacement:"inside",isMultiline:!1,size:"md",class:{label:["group-data-[filled=true]:-translate-y-[calc(50%_+_var(--heroui-font-size-small)/2_-_6px)]"],innerWrapper:"group-data-[has-label=true]:pt-4"}},{labelPlacement:"inside",isMultiline:!1,size:"lg",class:{label:["text-medium","group-data-[filled=true]:-translate-y-[calc(50%_+_var(--heroui-font-size-small)/2_-_8px)]"],innerWrapper:"group-data-[has-label=true]:pt-5"}},{labelPlacement:"inside",variant:["faded","bordered"],isMultiline:!1,size:"sm",class:{label:["group-data-[filled=true]:-translate-y-[calc(50%_+_var(--heroui-font-size-tiny)/2_-_8px_-_var(--heroui-border-width-medium))]"]}},{labelPlacement:"inside",variant:["faded","bordered"],isMultiline:!1,size:"md",class:{label:["group-data-[filled=true]:-translate-y-[calc(50%_+_var(--heroui-font-size-small)/2_-_6px_-_var(--heroui-border-width-medium))]"]}},{labelPlacement:"inside",variant:["faded","bordered"],isMultiline:!1,size:"lg",class:{label:["text-medium","group-data-[filled=true]:-translate-y-[calc(50%_+_var(--heroui-font-size-small)/2_-_8px_-_var(--heroui-border-width-medium))]"]}},{labelPlacement:"inside",variant:"underlined",isMultiline:!1,size:"sm",class:{label:["group-data-[filled=true]:-translate-y-[calc(50%_+_var(--heroui-font-size-tiny)/2_-_5px)]"]}},{labelPlacement:"inside",variant:"underlined",isMultiline:!1,size:"md",class:{label:["group-data-[filled=true]:-translate-y-[calc(50%_+_var(--heroui-font-size-small)/2_-_3.5px)]"]}},{labelPlacement:"inside",variant:"underlined",isMultiline:!1,size:"lg",class:{label:["text-medium","group-data-[filled=true]:-translate-y-[calc(50%_+_var(--heroui-font-size-small)/2_-_4px)]"]}},{labelPlacement:"outside",size:"sm",isMultiline:!1,class:{label:["start-2","text-tiny","group-data-[filled=true]:-translate-y-[calc(100%_+var(--heroui-font-size-tiny)/2_+_16px)]","group-data-[has-helper=true]:-translate-y-[calc(100%_+_var(--heroui-font-size-small)/2_+_26px)]"],base:"data-[has-label=true]:mt-[calc(var(--heroui-font-size-small)_+_8px)]"}},{labelPlacement:"outside",isMultiline:!1,size:"md",class:{label:["start-3","text-small","group-data-[filled=true]:-translate-y-[calc(100%_+_var(--heroui-font-size-small)/2_+_20px)]","group-data-[has-helper=true]:-translate-y-[calc(100%_+_var(--heroui-font-size-small)/2_+_30px)]"],base:"data-[has-label=true]:mt-[calc(var(--heroui-font-size-small)_+_10px)]"}},{labelPlacement:"outside",isMultiline:!1,size:"lg",class:{label:["start-3","text-medium","group-data-[filled=true]:-translate-y-[calc(100%_+_var(--heroui-font-size-small)/2_+_24px)]","group-data-[has-helper=true]:-translate-y-[calc(100%_+_var(--heroui-font-size-small)/2_+_34px)]"],base:"data-[has-label=true]:mt-[calc(var(--heroui-font-size-small)_+_12px)]"}},{labelPlacement:"outside-left",size:"sm",class:{label:"group-data-[has-helper=true]:pt-2"}},{labelPlacement:"outside-left",size:"md",class:{label:"group-data-[has-helper=true]:pt-3"}},{labelPlacement:"outside-left",size:"lg",class:{label:"group-data-[has-helper=true]:pt-4"}},{labelPlacement:"outside",isMultiline:!0,class:{label:"pb-1.5"}},{labelPlacement:["inside","outside"],class:{label:["pe-2","max-w-full","text-ellipsis","overflow-hidden"]}},{labelPlacement:["outside","outside-left"],isClearable:!0,class:{endContent:["mt-4"],clearButton:["group-data-[has-end-content=true]:mt-4"]}},{isClearable:!1,labelPlacement:["outside","outside-left"],class:{endContent:["mt-4"]}},{isClearable:!0,variant:["underlined"],class:{clearButton:["relative group-data-[has-end-content=true]:left-2"],endContent:["me-2"]}},{isClearable:!1,variant:["underlined"],class:{endContent:["me-2"]}},{isClearable:!0,size:"sm",class:{endContent:"ms-2"}}]}),m1=oa({slots:{base:"w-full relative flex flex-col gap-1 p-1 overflow-clip",list:"w-full flex flex-col gap-0.5 outline-hidden",emptyContent:["h-10","px-2","py-1.5","w-full","h-full","text-foreground-400","text-start"]}}),dd=oa({slots:{base:["flex","group","gap-2","items-center","justify-between","relative","px-2","py-1.5","w-full","h-full","box-border","rounded-small","subpixel-antialiased","outline-hidden","cursor-pointer","tap-highlight-transparent",...bl,"data-[focus-visible=true]:dark:ring-offset-background-content1"],wrapper:"w-full flex flex-col items-start justify-center",title:"flex-1 text-small font-normal",description:["w-full","text-tiny","text-foreground-500","group-hover:text-current"],selectedIcon:["text-inherit","w-3","h-3","shrink-0"],shortcut:["px-1","py-0.5","rounded-sm","font-sans","text-foreground-500","text-tiny","border-small","border-default-300","group-hover:border-current"]},variants:{variant:{solid:{base:""},bordered:{base:"border-medium border-transparent bg-transparent"},light:{base:"bg-transparent"},faded:{base:["border-small border-transparent hover:border-default data-[hover=true]:bg-default-100","data-[selectable=true]:focus:border-default data-[selectable=true]:focus:bg-default-100"]},flat:{base:""},shadow:{base:"data-[hover=true]:shadow-lg"}},color:{default:{},primary:{},secondary:{},success:{},warning:{},danger:{}},showDivider:{true:{base:["mb-1.5","after:content-['']","after:absolute","after:-bottom-1","after:left-0","after:right-0","after:h-divider","after:bg-divider"]},false:{}},isDisabled:{true:{base:"opacity-disabled pointer-events-none"}},disableAnimation:{true:{},false:{base:"data-[hover=true]:transition-colors"}},hasTitleTextChild:{true:{title:"truncate"}},hasDescriptionTextChild:{true:{description:"truncate"}}},defaultVariants:{variant:"solid",color:"default",showDivider:!1},compoundVariants:[{variant:"solid",color:"default",class:{base:["data-[hover=true]:bg-default","data-[hover=true]:text-default-foreground","data-[selectable=true]:focus:bg-default","data-[selectable=true]:focus:text-default-foreground"]}},{variant:"solid",color:"primary",class:{base:["data-[hover=true]:bg-primary data-[hover=true]:text-primary-foreground","data-[selectable=true]:focus:bg-primary data-[selectable=true]:focus:text-primary-foreground"]}},{variant:"solid",color:"secondary",class:{base:["data-[hover=true]:bg-secondary data-[hover=true]:text-secondary-foreground","data-[selectable=true]:focus:bg-secondary data-[selectable=true]:focus:text-secondary-foreground"]}},{variant:"solid",color:"success",class:{base:["data-[hover=true]:bg-success data-[hover=true]:text-success-foreground","data-[selectable=true]:focus:bg-success data-[selectable=true]:focus:text-success-foreground"]}},{variant:"solid",color:"warning",class:{base:["data-[hover=true]:bg-warning data-[hover=true]:text-warning-foreground","data-[selectable=true]:focus:bg-warning data-[selectable=true]:focus:text-warning-foreground"]}},{variant:"solid",color:"danger",class:{base:["data-[hover=true]:bg-danger data-[hover=true]:text-danger-foreground","data-[selectable=true]:focus:bg-danger data-[selectable=true]:focus:text-danger-foreground"]}},{variant:"shadow",color:"default",class:{base:["data-[hover=true]:shadow-default/50 data-[hover=true]:bg-default data-[hover=true]:text-default-foreground","data-[selectable=true]:focus:shadow-default/50 data-[selectable=true]:focus:bg-default data-[selectable=true]:focus:text-default-foreground"]}},{variant:"shadow",color:"primary",class:{base:["data-[hover=true]:shadow-primary/30 data-[hover=true]:bg-primary data-[hover=true]:text-primary-foreground","data-[selectable=true]:focus:shadow-primary/30 data-[selectable=true]:focus:bg-primary data-[selectable=true]:focus:text-primary-foreground"]}},{variant:"shadow",color:"secondary",class:{base:["data-[hover=true]:shadow-secondary/30 data-[hover=true]:bg-secondary data-[hover=true]:text-secondary-foreground","data-[selectable=true]:focus:shadow-secondary/30 data-[selectable=true]:focus:bg-secondary data-[selectable=true]:focus:text-secondary-foreground"]}},{variant:"shadow",color:"success",class:{base:["data-[hover=true]:shadow-success/30 data-[hover=true]:bg-success data-[hover=true]:text-success-foreground","data-[selectable=true]:focus:shadow-success/30 data-[selectable=true]:focus:bg-success data-[selectable=true]:focus:text-success-foreground"]}},{variant:"shadow",color:"warning",class:{base:["data-[hover=true]:shadow-warning/30 data-[hover=true]:bg-warning data-[hover=true]:text-warning-foreground","data-[selectable=true]:focus:shadow-warning/30 data-[selectable=true]:focus:bg-warning data-[selectable=true]:focus:text-warning-foreground"]}},{variant:"shadow",color:"danger",class:{base:["data-[hover=true]:shadow-danger/30 data-[hover=true]:bg-danger data-[hover=true]:text-danger-foreground","data-[selectable=true]:focus:shadow-danger/30 data-[selectable=true]:focus:bg-danger data-[selectable=true]:focus:text-danger-foreground"]}},{variant:"bordered",color:"default",class:{base:["data-[hover=true]:border-default","data-[selectable=true]:focus:border-default"]}},{variant:"bordered",color:"primary",class:{base:["data-[hover=true]:border-primary data-[hover=true]:text-primary","data-[selectable=true]:focus:border-primary data-[selectable=true]:focus:text-primary"]}},{variant:"bordered",color:"secondary",class:{base:["data-[hover=true]:border-secondary data-[hover=true]:text-secondary","data-[selectable=true]:focus:border-secondary data-[selectable=true]:focus:text-secondary"]}},{variant:"bordered",color:"success",class:{base:["data-[hover=true]:border-success data-[hover=true]:text-success","data-[selectable=true]:focus:border-success data-[selectable=true]:focus:text-success"]}},{variant:"bordered",color:"warning",class:{base:["data-[hover=true]:border-warning data-[hover=true]:text-warning","data-[selectable=true]:focus:border-warning data-[selectable=true]:focus:text-warning"]}},{variant:"bordered",color:"danger",class:{base:["data-[hover=true]:border-danger data-[hover=true]:text-danger","data-[selectable=true]:focus:border-danger data-[selectable=true]:focus:text-danger"]}},{variant:"flat",color:"default",class:{base:["data-[hover=true]:bg-default/40","data-[hover=true]:text-default-foreground","data-[selectable=true]:focus:bg-default/40","data-[selectable=true]:focus:text-default-foreground"]}},{variant:"flat",color:"primary",class:{base:["data-[hover=true]:bg-primary/20 data-[hover=true]:text-primary","data-[selectable=true]:focus:bg-primary/20 data-[selectable=true]:focus:text-primary"]}},{variant:"flat",color:"secondary",class:{base:["data-[hover=true]:bg-secondary/20 data-[hover=true]:text-secondary","data-[selectable=true]:focus:bg-secondary/20 data-[selectable=true]:focus:text-secondary"]}},{variant:"flat",color:"success",class:{base:["data-[hover=true]:bg-success/20 data-[hover=true]:text-success","data-[selectable=true]:focus:bg-success/20 data-[selectable=true]:focus:text-success"]}},{variant:"flat",color:"warning",class:{base:["data-[hover=true]:bg-warning/20 data-[hover=true]:text-warning","data-[selectable=true]:focus:bg-warning/20 data-[selectable=true]:focus:text-warning"]}},{variant:"flat",color:"danger",class:{base:["data-[hover=true]:bg-danger/20 data-[hover=true]:text-danger","data-[selectable=true]:focus:bg-danger/20 data-[selectable=true]:focus:text-danger"]}},{variant:"faded",color:"default",class:{base:["data-[hover=true]:text-default-foreground","data-[selectable=true]:focus:text-default-foreground"]}},{variant:"faded",color:"primary",class:{base:["data-[hover=true]:text-primary","data-[selectable=true]:focus:text-primary"]}},{variant:"faded",color:"secondary",class:{base:["data-[hover=true]:text-secondary","data-[selectable=true]:focus:text-secondary"]}},{variant:"faded",color:"success",class:{base:["data-[hover=true]:text-success","data-[selectable=true]:focus:text-success"]}},{variant:"faded",color:"warning",class:{base:["data-[hover=true]:text-warning","data-[selectable=true]:focus:text-warning"]}},{variant:"faded",color:"danger",class:{base:["data-[hover=true]:text-danger","data-[selectable=true]:focus:text-danger"]}},{variant:"light",color:"default",class:{base:["data-[hover=true]:text-default-500","data-[selectable=true]:focus:text-default-500"]}},{variant:"light",color:"primary",class:{base:["data-[hover=true]:text-primary","data-[selectable=true]:focus:text-primary"]}},{variant:"light",color:"secondary",class:{base:["data-[hover=true]:text-secondary","data-[selectable=true]:focus:text-secondary"]}},{variant:"light",color:"success",class:{base:["data-[hover=true]:text-success","data-[selectable=true]:focus:text-success"]}},{variant:"light",color:"warning",class:{base:["data-[hover=true]:text-warning","data-[selectable=true]:focus:text-warning"]}},{variant:"light",color:"danger",class:{base:["data-[hover=true]:text-danger","data-[selectable=true]:focus:text-danger"]}}]}),g1=oa({slots:{base:"relative mb-2",heading:"pl-1 text-tiny text-foreground-500",group:"data-[has-title=true]:pt-1",divider:"mt-2"}});const fd=new WeakMap;function y1(e){let t=fd.get(e);if(t!=null)return t;let r=0,n=a=>{for(let i of a)i.type==="section"?n(y_(i,e)):i.type==="item"&&r++};return n(e),fd.set(e,r),r}var hr=new WeakMap,ke=[];function v1(e,t=document.body){let r=new Set(e),n=new Set,a=u=>{for(let g of u.querySelectorAll("[data-live-announcer], [data-react-aria-top-layer]"))r.add(g);let l=g=>{if(r.has(g)||g.parentElement&&n.has(g.parentElement)&&g.parentElement.getAttribute("role")!=="row")return NodeFilter.FILTER_REJECT;for(let v of r)if(g.contains(v))return NodeFilter.FILTER_SKIP;return NodeFilter.FILTER_ACCEPT},c=document.createTreeWalker(u,NodeFilter.SHOW_ELEMENT,{acceptNode:l}),p=l(u);if(p===NodeFilter.FILTER_ACCEPT&&i(u),p!==NodeFilter.FILTER_REJECT){let g=c.nextNode();for(;g!=null;)i(g),g=c.nextNode()}},i=u=>{var l;let c=(l=hr.get(u))!=null?l:0;u.getAttribute("aria-hidden")==="true"&&c===0||(c===0&&u.setAttribute("aria-hidden","true"),n.add(u),hr.set(u,c+1))};ke.length&&ke[ke.length-1].disconnect(),a(t);let s=new MutationObserver(u=>{for(let l of u)if(!(l.type!=="childList"||l.addedNodes.length===0)&&![...r,...n].some(c=>c.contains(l.target))){for(let c of l.removedNodes)c instanceof Element&&(r.delete(c),n.delete(c));for(let c of l.addedNodes)(c instanceof HTMLElement||c instanceof SVGElement)&&(c.dataset.liveAnnouncer==="true"||c.dataset.reactAriaTopLayer==="true")?r.add(c):c instanceof Element&&a(c)}});s.observe(t,{childList:!0,subtree:!0});let o={visibleNodes:r,hiddenNodes:n,observe(){s.observe(t,{childList:!0,subtree:!0})},disconnect(){s.disconnect()}};return ke.push(o),()=>{s.disconnect();for(let u of n){let l=hr.get(u);l!=null&&(l===1?(u.removeAttribute("aria-hidden"),hr.delete(u)):hr.set(u,l-1))}o===ke[ke.length-1]?(ke.pop(),ke.length&&ke[ke.length-1].observe()):ke.splice(ke.indexOf(o),1)}}function b1(e){let t=ke[ke.length-1];if(t&&!t.visibleNodes.has(e))return t.visibleNodes.add(e),()=>{t.visibleNodes.delete(e)}}function _1(e,t){const{groupRef:r,triggerRef:n,popoverRef:a,showArrow:i,offset:s=7,crossOffset:o=0,scrollRef:u,shouldFlip:l,boundaryElement:c,isDismissable:p=!0,shouldCloseOnBlur:g=!0,shouldCloseOnScroll:v=!0,placement:b="top",containerPadding:y,shouldCloseOnInteractOutside:h,isNonModal:f,isKeyboardDismissDisabled:d,updatePositionDeps:m=[],..._}=e,$=f??!0,w=_.trigger==="SubmenuTrigger",{overlayProps:S,underlayProps:A}=v_({isOpen:t.isOpen,onClose:t.close,shouldCloseOnBlur:g,isDismissable:p||w,isKeyboardDismissDisabled:d,shouldCloseOnInteractOutside:h||(C=>{var k;return!((k=n.current)!=null&&k.contains(C))}),disableOutsideEvents:!$},a),{overlayProps:E,arrowProps:T,placement:R,updatePosition:M}=b_({..._,shouldFlip:l,crossOffset:o,targetRef:n,overlayRef:a,isOpen:t.isOpen,scrollRef:u,boundaryElement:c,containerPadding:y,placement:__(b),offset:i?s+3:s,onClose:$&&!w&&v?t.close:()=>{}});return My(()=>{m.length&&M()},m),H.useEffect(()=>{var C,k;if(t.isOpen&&a.current)return $?b1((C=r?.current)!=null?C:a.current):v1([(k=r?.current)!=null?k:a.current])},[$,t.isOpen,a,r]),{popoverProps:Ce(S,E),arrowProps:T,underlayProps:A,placement:R}}var $1="top";function w1(e){var t,r,n;const a=ua(),[i,s]=la(e,nd.variantKeys),{as:o,ref:u,children:l,state:c,triggerRef:p,scrollRef:g,defaultOpen:v,onOpenChange:b,isOpen:y,isNonModal:h=!0,shouldFlip:f=!0,containerPadding:d=12,shouldBlockScroll:m=!1,isDismissable:_=!0,shouldCloseOnBlur:$,portalContainer:w,updatePositionDeps:S,dialogProps:A,placement:E=$1,triggerType:T="dialog",showArrow:R=!1,offset:M=7,crossOffset:C=0,boundaryElement:k,isKeyboardDismissDisabled:L,shouldCloseOnInteractOutside:J,shouldCloseOnScroll:Z,motionProps:Y,className:ne,classNames:U,onClose:j,...K}=i,D=o||"div",P=Tr(u),I=H.useRef(null),N=H.useRef(!1),B=p||I,Q=(r=(t=e.disableAnimation)!=null?t:a?.disableAnimation)!=null?r:!1,V=ky({isOpen:y,defaultOpen:v,onOpenChange:_e=>{b?.(_e),_e||j?.()}}),G=c||V,{popoverProps:x,underlayProps:q,placement:F}=_1({triggerRef:B,isNonModal:h,popoverRef:P,placement:E,offset:M,scrollRef:g,isDismissable:_,shouldCloseOnBlur:$,boundaryElement:k,crossOffset:C,shouldFlip:f,containerPadding:d,updatePositionDeps:S,isKeyboardDismissDisabled:L,shouldCloseOnScroll:Z,shouldCloseOnInteractOutside:J},G),z=H.useMemo(()=>F?$_(F,E)?F:E:null,[F,E]),{triggerProps:W}=Wy({type:T},G,B),{isFocusVisible:X,isFocused:ee,focusProps:ce}=Xn(),ie=H.useMemo(()=>nd({...s}),[ca(s)]),re=Pe(U?.base,ne);Ly({isDisabled:!(m&&G.isOpen)});const de=(_e={})=>({ref:P,...Ce(x,K,_e),style:Ce(x.style,K.style,_e.style)}),se=(_e={})=>({"data-slot":"base","data-open":pe(G.isOpen),"data-focus":pe(ee),"data-arrow":pe(R),"data-focus-visible":pe(X),"data-placement":F?ad(F,E):void 0,...Ce(ce,A,_e),className:ie.base({class:Pe(re)}),style:{outline:"none"}}),oe=H.useCallback((_e={})=>({"data-slot":"content","data-open":pe(G.isOpen),"data-arrow":pe(R),"data-placement":F?ad(F,E):void 0,className:ie.content({class:Pe(U?.content,_e.className)})}),[ie,G.isOpen,R,z,E,U,F]),Oe=H.useCallback(_e=>{var xe;let Le;return _e.pointerType==="touch"&&(e?.backdrop==="blur"||e?.backdrop==="opaque")?Le=setTimeout(()=>{N.current=!0},100):N.current=!0,(xe=W.onPress)==null||xe.call(W,_e),()=>{clearTimeout(Le)}},[W?.onPress]),Te=H.useCallback((_e={},xe=null)=>{const{isDisabled:Le,...wt}=_e;return{"data-slot":"trigger",...Ce({"aria-haspopup":"dialog"},W,wt),onPress:Oe,isDisabled:Le,className:ie.trigger({class:Pe(U?.trigger,_e.className),isTriggerDisabled:Le}),ref:w_(xe,B)}},[G,W,Oe,B]),Me=H.useCallback((_e={})=>({"data-slot":"backdrop",className:ie.backdrop({class:U?.backdrop}),onClick:xe=>{if(!N.current){xe.preventDefault();return}G.close(),N.current=!1},...q,..._e}),[ie,G.isOpen,U,q]);return{state:G,Component:D,children:l,classNames:U,showArrow:R,triggerRef:B,placement:z,isNonModal:h,popoverRef:P,portalContainer:w,isOpen:G.isOpen,onClose:G.close,disableAnimation:Q,shouldBlockScroll:m,backdrop:(n=e.backdrop)!=null?n:"transparent",motionProps:Y,getBackdropProps:Me,getPopoverProps:de,getTriggerProps:Te,getDialogProps:se,getContentProps:oe}}var Hy=()=>P_(()=>import("./index-CYQIHhg3.js"),__vite__mapDeps([0,1,2])).then(e=>e.default),Gy=Kr(({children:e,motionProps:t,placement:r,disableAnimation:n,style:a={},transformOrigin:i={},...s},o)=>{let u=a;return i.originX!==void 0||i.originY!==void 0?u={...u,transformOrigin:i}:r&&(u={...u,...A_(r==="center"?"top":r)}),n?O.jsx("div",{...s,ref:o,children:e}):O.jsx(By,{features:Hy,children:O.jsx(Uy.div,{ref:o,animate:"enter",exit:"exit",initial:"initial",style:u,variants:Ky.scaleSpringOpacity,...Ce(s,t),children:e})})});Gy.displayName="HeroUI.FreeSoloPopoverWrapper";var Yy=Kr(({children:e,transformOrigin:t,disableDialogFocus:r=!1,...n},a)=>{const{Component:i,state:s,placement:o,backdrop:u,portalContainer:l,disableAnimation:c,motionProps:p,isNonModal:g,getPopoverProps:v,getBackdropProps:b,getDialogProps:y,getContentProps:h}=w1({...n,ref:a}),f=H.useRef(null),{dialogProps:d,titleProps:m}=S_({},f),_=y({...!r&&{ref:f},...d}),$=H.useMemo(()=>u==="transparent"?null:c?O.jsx("div",{...b()}):O.jsx(By,{features:Hy,children:O.jsx(Uy.div,{animate:"enter",exit:"exit",initial:"exit",variants:Ky.fade,...b()})}),[u,c,b]);return O.jsxs(E_,{portalContainer:l,children:[!g&&$,O.jsx(i,{...v(),children:O.jsxs(Gy,{disableAnimation:c,motionProps:p,placement:o,tabIndex:-1,transformOrigin:t,..._,children:[!g&&O.jsx(id,{onDismiss:s.close}),O.jsx("div",{...h(),children:typeof e=="function"?e(m):e}),O.jsx(id,{onDismiss:s.close})]})})]})});Yy.displayName="HeroUI.FreeSoloPopover";var S1=Yy,Jy={};Jy={longPressMessage:"اضغط مطولاً أو اضغط على Alt + السهم لأسفل لفتح القائمة"};var Zy={};Zy={longPressMessage:"Натиснете продължително или натиснете Alt+ стрелка надолу, за да отворите менюто"};var Xy={};Xy={longPressMessage:"Dlouhým stiskem nebo stisknutím kláves Alt + šipka dolů otevřete nabídku"};var Qy={};Qy={longPressMessage:"Langt tryk eller tryk på Alt + pil ned for at åbne menuen"};var ev={};ev={longPressMessage:"Drücken Sie lange oder drücken Sie Alt + Nach-unten, um das Menü zu öffnen"};var tv={};tv={longPressMessage:"Πιέστε παρατεταμένα ή πατήστε Alt + κάτω βέλος για να ανοίξετε το μενού"};var rv={};rv={longPressMessage:"Long press or press Alt + ArrowDown to open menu"};var nv={};nv={longPressMessage:"Mantenga pulsado o pulse Alt + flecha abajo para abrir el menú"};var av={};av={longPressMessage:"Menüü avamiseks vajutage pikalt või vajutage klahve Alt + allanool"};var iv={};iv={longPressMessage:"Avaa valikko painamalla pohjassa tai näppäinyhdistelmällä Alt + Alanuoli"};var sv={};sv={longPressMessage:"Appuyez de manière prolongée ou appuyez sur Alt + Flèche vers le bas pour ouvrir le menu."};var ov={};ov={longPressMessage:"לחץ לחיצה ארוכה או הקש Alt + ArrowDown כדי לפתוח את התפריט"};var uv={};uv={longPressMessage:"Dugo pritisnite ili pritisnite Alt + strelicu prema dolje za otvaranje izbornika"};var lv={};lv={longPressMessage:"Nyomja meg hosszan, vagy nyomja meg az Alt + lefele nyíl gombot a menü megnyitásához"};var cv={};cv={longPressMessage:"Premere a lungo o premere Alt + Freccia giù per aprire il menu"};var dv={};dv={longPressMessage:"長押しまたは Alt+下矢印キーでメニューを開く"};var fv={};fv={longPressMessage:"길게 누르거나 Alt + 아래쪽 화살표를 눌러 메뉴 열기"};var pv={};pv={longPressMessage:"Norėdami atidaryti meniu, nuspaudę palaikykite arba paspauskite „Alt + ArrowDown“."};var hv={};hv={longPressMessage:"Lai atvērtu izvēlni, turiet nospiestu vai nospiediet taustiņu kombināciju Alt + lejupvērstā bultiņa"};var mv={};mv={longPressMessage:"Langt trykk eller trykk Alt + PilNed for å åpne menyen"};var gv={};gv={longPressMessage:"Druk lang op Alt + pijl-omlaag of druk op Alt om het menu te openen"};var yv={};yv={longPressMessage:"Naciśnij i przytrzymaj lub naciśnij klawisze Alt + Strzałka w dół, aby otworzyć menu"};var vv={};vv={longPressMessage:"Pressione e segure ou pressione Alt + Seta para baixo para abrir o menu"};var bv={};bv={longPressMessage:"Prima continuamente ou prima Alt + Seta Para Baixo para abrir o menu"};var _v={};_v={longPressMessage:"Apăsați lung sau apăsați pe Alt + săgeată în jos pentru a deschide meniul"};var $v={};$v={longPressMessage:"Нажмите и удерживайте или нажмите Alt + Стрелка вниз, чтобы открыть меню"};var wv={};wv={longPressMessage:"Ponuku otvoríte dlhým stlačením alebo stlačením klávesu Alt + klávesu so šípkou nadol"};var Sv={};Sv={longPressMessage:"Za odprtje menija pritisnite in držite gumb ali pritisnite Alt+puščica navzdol"};var Pv={};Pv={longPressMessage:"Dugo pritisnite ili pritisnite Alt + strelicu prema dole da otvorite meni"};var Ev={};Ev={longPressMessage:"Håll nedtryckt eller tryck på Alt + pil nedåt för att öppna menyn"};var Av={};Av={longPressMessage:"Menüyü açmak için uzun basın veya Alt + Aşağı Ok tuşuna basın"};var Ov={};Ov={longPressMessage:"Довго або звичайно натисніть комбінацію клавіш Alt і стрілка вниз, щоб відкрити меню"};var xv={};xv={longPressMessage:"长按或按 Alt + 向下方向键以打开菜单"};var Cv={};Cv={longPressMessage:"長按或按 Alt+向下鍵以開啟功能表"};var Iv={};Iv={"ar-AE":Jy,"bg-BG":Zy,"cs-CZ":Xy,"da-DK":Qy,"de-DE":ev,"el-GR":tv,"en-US":rv,"es-ES":nv,"et-EE":av,"fi-FI":iv,"fr-FR":sv,"he-IL":ov,"hr-HR":uv,"hu-HU":lv,"it-IT":cv,"ja-JP":dv,"ko-KR":fv,"lt-LT":pv,"lv-LV":hv,"nb-NO":mv,"nl-NL":gv,"pl-PL":yv,"pt-BR":vv,"pt-PT":bv,"ro-RO":_v,"ru-RU":$v,"sk-SK":wv,"sl-SI":Sv,"sr-SP":Pv,"sv-SE":Ev,"tr-TR":Av,"uk-UA":Ov,"zh-CN":xv,"zh-TW":Cv};function P1(e){return e&&e.__esModule?e.default:e}function E1(e,t,r){let{type:n="menu",isDisabled:a,trigger:i="press"}=e,s=Ur(),{triggerProps:o,overlayProps:u}=Wy({type:n},t,r),l=v=>{if(!a&&!(i==="longPress"&&!v.altKey)&&r&&r.current)switch(v.key){case"Enter":case" ":if(i==="longPress")return;case"ArrowDown":"continuePropagation"in v||v.stopPropagation(),v.preventDefault(),t.toggle("first");break;case"ArrowUp":"continuePropagation"in v||v.stopPropagation(),v.preventDefault(),t.toggle("last");break;default:"continuePropagation"in v&&v.continuePropagation()}},c=O_(P1(Iv),"@react-aria/menu"),{longPressProps:p}=d1({isDisabled:a||i!=="longPress",accessibilityDescription:c.format("longPressMessage"),onLongPressStart(){t.close()},onLongPress(){t.open("first")}}),g={preventFocusOnPress:!0,onPressStart(v){v.pointerType!=="touch"&&v.pointerType!=="keyboard"&&!a&&(sd(v.target),t.open(v.pointerType==="virtual"?"first":null))},onPress(v){v.pointerType==="touch"&&!a&&(sd(v.target),t.toggle())}};return delete o.onPress,{menuTriggerProps:{...o,...i==="press"?g:p,id:s,onKeyDown:l},menuProps:{...u,"aria-labelledby":s,autoFocus:t.focusStrategy||!0,onClose:t.close}}}var A1=700;function O1(){return x_()||typeof window>"u"?!1:window.screen.width<=A1}function x1(e){let t=ky(e),[r,n]=H.useState(null),[a,i]=H.useState([]),s=()=>{i([]),t.close()};return{focusStrategy:r,...t,open(l=null){n(l),t.open()},toggle(l=null){n(l),t.toggle()},close(){s()},expandedKeysStack:a,openSubmenu:(l,c)=>{i(p=>c>p.length?p:[...p.slice(0,c),l])},closeSubmenu:(l,c)=>{i(p=>p[c]===l?p.slice(0,c):p)}}}class pd{*[Symbol.iterator](){yield*this.iterable}get size(){return this.keyMap.size}getKeys(){return this.keyMap.keys()}getKeyBefore(t){let r=this.keyMap.get(t);var n;return r&&(n=r.prevKey)!==null&&n!==void 0?n:null}getKeyAfter(t){let r=this.keyMap.get(t);var n;return r&&(n=r.nextKey)!==null&&n!==void 0?n:null}getFirstKey(){return this.firstKey}getLastKey(){return this.lastKey}getItem(t){var r;return(r=this.keyMap.get(t))!==null&&r!==void 0?r:null}at(t){const r=[...this.getKeys()];return this.getItem(r[t])}getChildren(t){let r=this.keyMap.get(t);return r?.childNodes||[]}constructor(t){this.keyMap=new Map,this.firstKey=null,this.lastKey=null,this.iterable=t;let r=s=>{if(this.keyMap.set(s.key,s),s.childNodes&&s.type==="section")for(let o of s.childNodes)r(o)};for(let s of t)r(s);let n=null,a=0;for(let[s,o]of this.keyMap)n?(n.nextKey=s,o.prevKey=n.key):(this.firstKey=s,o.prevKey=void 0),o.type==="item"&&(o.index=a++),n=o,n.nextKey=void 0;var i;this.lastKey=(i=n?.key)!==null&&i!==void 0?i:null}}function Tv(e){let{filter:t,layoutDelegate:r}=e,n=C_(e),a=H.useMemo(()=>e.disabledKeys?new Set(e.disabledKeys):new Set,[e.disabledKeys]),i=H.useCallback(l=>t?new pd(t(l)):new pd(l),[t]),s=H.useMemo(()=>({suppressTextValueWarning:e.suppressTextValueWarning}),[e.suppressTextValueWarning]),o=I_(e,i,s),u=H.useMemo(()=>new T_(o,n,{layoutDelegate:r}),[o,n,r]);return C1(o,u),{collection:o,disabledKeys:a,selectionManager:u}}function C1(e,t){const r=H.useRef(null);H.useEffect(()=>{if(t.focusedKey!=null&&!e.getItem(t.focusedKey)&&r.current){const c=r.current.getItem(t.focusedKey),p=[...r.current.getKeys()].map(f=>{const d=r.current.getItem(f);return d?.type==="item"?d:null}).filter(f=>f!==null),g=[...e.getKeys()].map(f=>{const d=e.getItem(f);return d?.type==="item"?d:null}).filter(f=>f!==null);var n,a;const v=((n=p?.length)!==null&&n!==void 0?n:0)-((a=g?.length)!==null&&a!==void 0?a:0);var i,s,o;let b=Math.min(v>1?Math.max(((i=c?.index)!==null&&i!==void 0?i:0)-v+1,0):(s=c?.index)!==null&&s!==void 0?s:0,((o=g?.length)!==null&&o!==void 0?o:0)-1),y=null,h=!1;for(;b>=0;){if(!t.isDisabled(g[b].key)){y=g[b];break}if(b((u=c?.index)!==null&&u!==void 0?u:0)&&(b=(l=c?.index)!==null&&l!==void 0?l:0),b--}}t.setFocusedKey(y?y.key:null)}r.current=e},[e,t])}function I1(e){const{collection:t,disabledKeys:r,selectionManager:n,selectionManager:{setSelectedKeys:a,selectedKeys:i,selectionMode:s}}=Tv(e),o=H.useMemo(()=>!e.isLoading&&i.size!==0?Array.from(i).filter(Boolean).filter(l=>!t.getItem(l)):[],[i,t]),u=i.size!==0?Array.from(i).map(l=>t.getItem(l)).filter(Boolean):null;return o.length&&console.warn(`Select: Keys "${o.join(", ")}" passed to "selectedKeys" are not present in the collection.`),{collection:t,disabledKeys:r,selectionManager:n,selectionMode:s,selectedKeys:i,setSelectedKeys:a.bind(n),selectedItems:u}}function T1({validate:e,validationBehavior:t,...r}){const[n,a]=H.useState(!1),[i,s]=H.useState(null),o=x1(r),u=I1({...r,onSelectionChange:p=>{r.onSelectionChange!=null&&(p==="all"?r.onSelectionChange(new Set(u.collection.getKeys())):r.onSelectionChange(p)),r.selectionMode==="single"&&o.close()}}),l=R_({...r,validationBehavior:t,validate:p=>{if(!e)return;const g=Array.from(p);return e(r.selectionMode==="single"?g[0]:g)},value:u.selectedKeys}),c=u.collection.size===0&&r.hideEmptyContent;return{...l,...u,...o,focusStrategy:i,close(){o.close()},open(p=null){c||(s(p),o.open())},toggle(p=null){c||(s(p),o.toggle())},isFocused:n,setFocused:a}}function R1(e,t,r){const{disallowEmptySelection:n,isDisabled:a}=e,i=q_({usage:"search",sensitivity:"base"}),s=H.useMemo(()=>new j_(t.collection,t.disabledKeys,null,i),[t.collection,t.disabledKeys,i]),{menuTriggerProps:o,menuProps:u}=E1({isDisabled:a,type:"listbox"},t,r),l=$=>{if(t.selectionMode==="single")switch($.key){case"ArrowLeft":{$.preventDefault();const w=t.selectedKeys.size>0?s.getKeyAbove(t.selectedKeys.values().next().value):s.getFirstKey();w&&t.setSelectedKeys([w]);break}case"ArrowRight":{$.preventDefault();const w=t.selectedKeys.size>0?s.getKeyBelow(t.selectedKeys.values().next().value):s.getFirstKey();w&&t.setSelectedKeys([w]);break}}},{typeSelectProps:c}=D_({keyboardDelegate:s,selectionManager:t.selectionManager,onTypeSelect($){t.setSelectedKeys([$])}}),{isInvalid:p,validationErrors:g,validationDetails:v}=t.displayValidation,{labelProps:b,fieldProps:y,descriptionProps:h,errorMessageProps:f}=N_({...e,labelElementType:"span",isInvalid:p,errorMessage:e.errorMessage||g});c.onKeyDown=c.onKeyDownCapture,delete c.onKeyDownCapture,o.onPressStart=$=>{$.pointerType!=="touch"&&$.pointerType!=="keyboard"&&!a&&t.toggle($.pointerType==="virtual"?"first":null)};const d=ql(e,{labelable:!0}),m=Rr(c,o,y),_=Ur();return{labelProps:{...b,onClick:()=>{var $;e.isDisabled||(($=r.current)==null||$.focus(),F_("keyboard"))}},triggerProps:Rr(d,{...m,onKeyDown:Vy(m.onKeyDown,l,e.onKeyDown),onKeyUp:e.onKeyUp,"aria-labelledby":[_,m["aria-labelledby"],m["aria-label"]&&!m["aria-labelledby"]?m.id:null].join(","),onFocus($){t.isFocused||(e.onFocus&&e.onFocus($),t.setFocused(!0))},onBlur($){t.isOpen||(e.onBlur&&e.onBlur($),t.setFocused(!1))}}),valueProps:{id:_},menuProps:{...u,disallowEmptySelection:n,autoFocus:t.focusStrategy||!0,shouldSelectOnPressUp:!0,shouldFocusOnHover:!0,onBlur:$=>{$.currentTarget.contains($.relatedTarget)||(e.onBlur&&e.onBlur($),t.setFocused(!1))},onFocus:u?.onFocus,"aria-labelledby":[y["aria-labelledby"],m["aria-label"]&&!y["aria-labelledby"]?m.id:null].filter(Boolean).join(" ")},descriptionProps:h,errorMessageProps:f,isInvalid:p,validationErrors:g,validationDetails:v}}var Rv=new WeakMap;function q1(e){var t,r,n,a,i,s;const o=ua(),{validationBehavior:u}=M_(B_)||{},[l,c]=la(e,cd.variantKeys),p=(r=(t=e.disableAnimation)!=null?t:o?.disableAnimation)!=null?r:!1,{ref:g,as:v,label:b,name:y,isLoading:h,selectorIcon:f,isOpen:d,defaultOpen:m,onOpenChange:_,startContent:$,endContent:w,description:S,renderValue:A,onSelectionChange:E,placeholder:T,isVirtualized:R,itemHeight:M=36,maxListboxHeight:C=256,children:k,disallowEmptySelection:L=!1,selectionMode:J="single",spinnerRef:Z,scrollRef:Y,popoverProps:ne={},scrollShadowProps:U={},listboxProps:j={},spinnerProps:K={},validationState:D,onChange:P,onClose:I,className:N,classNames:B,validationBehavior:Q=(n=u??o?.validationBehavior)!=null?n:"native",hideEmptyContent:V=!1,onClear:G,...x}=l,q=Tr(Y),F={popoverProps:Ce({placement:"bottom",triggerScaleOnOpen:!1,offset:5,disableAnimation:p},ne),scrollShadowProps:Ce({ref:q,isEnabled:(a=e.showScrollIndicators)!=null?a:!0,hideScrollBar:!0,offset:15},U),listboxProps:Ce({disableAnimation:p},j)},z=v||"button",W=typeof z=="string",X=Tr(g),ee=H.useRef(null),ce=H.useRef(null),ie=H.useRef(null);let re=T1({...l,isOpen:d,selectionMode:J,disallowEmptySelection:L,validationBehavior:Q,children:k,isRequired:e.isRequired,isDisabled:e.isDisabled,isInvalid:e.isInvalid,defaultOpen:m,hideEmptyContent:V,onOpenChange:te=>{_?.(te),te||I?.()},onSelectionChange:te=>{E?.(te),P&&typeof P=="function"&&P({target:{...X.current&&{...X.current,name:X.current.name},value:Array.from(te).join(",")}}),re.commitValidation()}});re={...re,...e.isDisabled&&{disabledKeys:new Set([...re.collection.getKeys()])}},My(()=>{var te;(te=X.current)!=null&&te.value&&re.setSelectedKeys(new Set([...re.selectedKeys,X.current.value]))},[X.current]);const{labelProps:de,triggerProps:se,valueProps:oe,menuProps:Oe,descriptionProps:Te,errorMessageProps:Me,isInvalid:_e,validationErrors:xe,validationDetails:Le}=R1({...l,disallowEmptySelection:L,isDisabled:e.isDisabled},re,ee),wt=H.useCallback(()=>{var te;re.setSelectedKeys(new Set([])),G?.(),(te=ee.current)==null||te.focus()},[G,re]),{pressProps:an}=zy({isDisabled:!!e?.isDisabled,onPress:wt}),lt=e.isInvalid||D==="invalid"||_e,{isPressed:Ye,buttonProps:et}=k_(se,ee),{focusProps:Bc,isFocused:Uc,isFocusVisible:Kc}=Xn(),{focusProps:Vc,isFocusVisible:zc}=Xn(),{isHovered:Wc,hoverProps:Hc}=jl({isDisabled:e.isDisabled}),Tt=L_({labelPlacement:e.labelPlacement,label:b}),Ua=!!T,Gc=Tt==="outside-left"||Tt==="outside",Y0=Tt==="inside",Yc=Tt==="outside-left",Jc=e.isClearable,Zc=re.isOpen||Ua||!!((i=re.selectedItems)!=null&&i.length)||!!$||!!w||!!e.isMultiline,Xc=!!((s=re.selectedItems)!=null&&s.length),Ka=!!b,Qc=Ka&&(Yc||Gc&&Ua),ed=Pe(B?.base,N),fe=H.useMemo(()=>cd({...c,isInvalid:lt,isClearable:Jc,labelPlacement:Tt,disableAnimation:p}),[ca(c),lt,Tt,p]);Ly({isDisabled:!re.isOpen});const td=typeof l.errorMessage=="function"?l.errorMessage({isInvalid:lt,validationErrors:xe,validationDetails:Le}):l.errorMessage||xe?.join(" "),Va=!!S||!!td,J0=!!w;H.useEffect(()=>{if(re.isOpen&&ie.current&&ee.current){let te=ee.current.getBoundingClientRect(),Rt=ie.current;Rt.style.width=te.width+"px"}},[re.isOpen]);const Z0=H.useCallback((te={})=>({"data-slot":"base","data-filled":pe(Zc),"data-has-value":pe(Xc),"data-has-label":pe(Ka),"data-has-helper":pe(Va),"data-has-end-content":pe(J0),"data-invalid":pe(lt),"data-has-label-outside":pe(Qc),className:fe.base({class:Pe(ed,te.className)}),...te}),[fe,Va,Xc,Ka,Qc,Zc,ed]),X0=H.useCallback((te={})=>({ref:ee,"data-slot":"trigger","data-open":pe(re.isOpen),"data-disabled":pe(e?.isDisabled),"data-focus":pe(Uc),"data-pressed":pe(Ye),"data-focus-visible":pe(Kc),"data-hover":pe(Wc),className:fe.trigger({class:B?.trigger}),...Ce(et,Bc,Hc,qr(x,{enabled:W}),qr(te))}),[fe,ee,re.isOpen,B?.trigger,e?.isDisabled,Uc,Ye,Kc,Wc,et,Bc,Hc,x,W]),Q0=H.useCallback((te={})=>({state:re,triggerRef:ee,selectRef:X,selectionMode:J,label:e?.label,name:e?.name,isRequired:e?.isRequired,autoComplete:e?.autoComplete,isDisabled:e?.isDisabled,form:e?.form,onChange:P,...te}),[re,J,e?.label,e?.autoComplete,e?.name,e?.isDisabled,ee]),e_=H.useCallback((te={})=>({"data-slot":"label",className:fe.label({class:Pe(B?.label,te.className)}),...de,...te}),[fe,B?.label,de]),t_=H.useCallback((te={})=>({"data-slot":"value",className:fe.value({class:Pe(B?.value,te.className)}),...oe,...te}),[fe,B?.value,oe]),r_=H.useCallback((te={})=>({"data-slot":"listboxWrapper",className:fe.listboxWrapper({class:Pe(B?.listboxWrapper,te?.className)}),style:{maxHeight:C??256,...te.style},...Ce(F.scrollShadowProps,te)}),[fe.listboxWrapper,B?.listboxWrapper,F.scrollShadowProps,C]),n_=(te={})=>{const Rt=R??re.collection.size>50;return{state:re,ref:ce,isVirtualized:Rt,virtualization:Rt?{maxListboxHeight:C,itemHeight:M}:void 0,"data-slot":"listbox",className:fe.listbox({class:Pe(B?.listbox,te?.className)}),scrollShadowProps:F.scrollShadowProps,...Ce(F.listboxProps,te,Oe)}},a_=H.useCallback((te={})=>{var Rt,rd;const m_=Ce(F.popoverProps,te);return{state:re,triggerRef:ee,ref:ie,"data-slot":"popover",scrollRef:ce,triggerType:"listbox",classNames:{content:fe.popoverContent({class:Pe(B?.popoverContent,te.className)})},...m_,offset:re.selectedItems&&re.selectedItems.length>0?re.selectedItems.length*1e-8+(((Rt=F.popoverProps)==null?void 0:Rt.offset)||0):(rd=F.popoverProps)==null?void 0:rd.offset}},[fe,B?.popoverContent,F.popoverProps,ee,re,re.selectedItems]),i_=H.useCallback(()=>({"data-slot":"selectorIcon","aria-hidden":pe(!0),"data-open":pe(re.isOpen),className:fe.selectorIcon({class:B?.selectorIcon})}),[fe,B?.selectorIcon,re.isOpen]),s_=H.useCallback((te={})=>({...te,"data-slot":"innerWrapper",className:fe.innerWrapper({class:Pe(B?.innerWrapper,te?.className)})}),[fe,B?.innerWrapper]),o_=H.useCallback((te={})=>({...te,"data-slot":"helperWrapper",className:fe.helperWrapper({class:Pe(B?.helperWrapper,te?.className)})}),[fe,B?.helperWrapper]),u_=H.useCallback((te={})=>({...te,...Te,"data-slot":"description",className:fe.description({class:Pe(B?.description,te?.className)})}),[fe,B?.description]),l_=H.useCallback((te={})=>({...te,"data-slot":"mainWrapper",className:fe.mainWrapper({class:Pe(B?.mainWrapper,te?.className)})}),[fe,B?.mainWrapper]),c_=H.useCallback((te={})=>({...te,"data-slot":"end-wrapper",className:fe.endWrapper({class:Pe(B?.endWrapper,te?.className)})}),[fe,B?.endWrapper]),d_=H.useCallback((te={})=>({...te,"data-slot":"end-content",className:fe.endContent({class:Pe(B?.endContent,te?.className)})}),[fe,B?.endContent]),f_=H.useCallback((te={})=>({...te,...Me,"data-slot":"error-message",className:fe.errorMessage({class:Pe(B?.errorMessage,te?.className)})}),[fe,Me,B?.errorMessage]),p_=H.useCallback((te={})=>({"aria-hidden":pe(!0),"data-slot":"spinner",color:"current",size:"sm",...K,...te,ref:Z,className:fe.spinner({class:Pe(B?.spinner,te?.className)})}),[fe,Z,K,B?.spinner]),h_=H.useCallback((te={})=>({...te,type:"button",tabIndex:-1,"aria-label":"clear selection","data-slot":"clear-button","data-focus-visible":pe(zc),className:fe.clearButton({class:Pe(B?.clearButton,te?.className)}),...Ce(an,Vc)}),[fe,zc,an,Vc,B?.clearButton]);return Rv.set(re,{isDisabled:e?.isDisabled,isRequired:e?.isRequired,name:e?.name,isInvalid:lt,validationBehavior:Q}),{Component:z,domRef:X,state:re,label:b,name:y,triggerRef:ee,isLoading:h,placeholder:T,startContent:$,endContent:w,description:S,selectorIcon:f,hasHelper:Va,labelPlacement:Tt,hasPlaceholder:Ua,renderValue:A,selectionMode:J,disableAnimation:p,isOutsideLeft:Yc,shouldLabelBeOutside:Gc,shouldLabelBeInside:Y0,isInvalid:lt,errorMessage:td,isClearable:Jc,getClearButtonProps:h_,getBaseProps:Z0,getTriggerProps:X0,getLabelProps:e_,getValueProps:t_,getListboxProps:n_,getPopoverProps:a_,getSpinnerProps:p_,getMainWrapperProps:l_,getListboxWrapperProps:r_,getHiddenSelectProps:Q0,getInnerWrapperProps:s_,getHelperWrapperProps:o_,getDescriptionProps:u_,getErrorMessageProps:f_,getSelectorIconProps:i_,getEndWrapperProps:c_,getEndContentProps:d_}}var j1=typeof document<"u"?U_.useLayoutEffect:()=>{};function D1(e){const t=H.useRef(null);return j1(()=>{t.current=e},[e]),H.useCallback((...r)=>{const n=t.current;return n?.(...r)},[])}function N1(e,t,r){let n=H.useRef(t),a=D1(()=>{r&&r(n.current)});H.useEffect(()=>{var i;let s=(i=e?.current)==null?void 0:i.form;return s?.addEventListener("reset",a),()=>{s?.removeEventListener("reset",a)}},[e,a])}function F1(e,t,r){var n;let a=Rv.get(t)||{},{autoComplete:i,name:s=a.name,isDisabled:o=a.isDisabled,selectionMode:u,onChange:l,form:c}=e,{validationBehavior:p,isRequired:g,isInvalid:v}=a,{visuallyHiddenProps:b}=K_();return N1(e.selectRef,t.selectedKeys,t.setSelectedKeys),V_({validationBehavior:p,focus:()=>{var y;return(y=r.current)==null?void 0:y.focus()}},t,e.selectRef),{containerProps:{...b,"aria-hidden":!0,"data-a11y-ignore":"aria-hidden-focus"},inputProps:{style:{display:"none"}},selectProps:{form:c,autoComplete:i,disabled:o,"aria-invalid":v||void 0,"aria-required":g&&p==="aria"||void 0,required:g&&p==="native",name:s,tabIndex:-1,value:u==="multiple"?[...t.selectedKeys].map(y=>String(y)):(n=[...t.selectedKeys][0])!=null?n:"",multiple:u==="multiple",onChange:y=>{t.setSelectedKeys(y.target.value),l?.(y)}}}}function M1(e){var t;let{state:r,triggerRef:n,selectRef:a,label:i,name:s,isDisabled:o,form:u}=e,{containerProps:l,selectProps:c}=F1({...e,selectRef:a},r,n);return r.collection.size<=300?O.jsx("div",{...l,"data-testid":"hidden-select-container",children:O.jsxs("label",{children:[i,O.jsxs("select",{...c,ref:a,children:[O.jsx("option",{}),[...r.collection.getKeys()].map(p=>{let g=r.collection.getItem(p);if(g?.type==="item")return O.jsx("option",{value:g.key,children:g.textValue},g.key)})]})]})}):s?O.jsx("input",{autoComplete:c.autoComplete,disabled:o,form:u,name:s,type:"hidden",value:(t=[...r.selectedKeys].join(","))!=null?t:""}):null}var k1=z_,L1=k1;const Dl=new WeakMap;function B1(e){return typeof e=="string"?e.replace(/\s*/g,""):""+e}function U1(e,t){let r=Dl.get(e);if(!r)throw new Error("Unknown list");return`${r.id}-option-${B1(t)}`}function K1(e,t,r){let n=ql(e,{labelable:!0}),a=e.selectionBehavior||"toggle",i=e.linkBehavior||(a==="replace"?"action":"override");a==="toggle"&&i==="action"&&(i="override");let{listProps:s}=W_({...e,ref:r,selectionManager:t.selectionManager,collection:t.collection,disabledKeys:t.disabledKeys,linkBehavior:i}),{focusWithinProps:o}=H_({onFocusWithin:e.onFocus,onBlurWithin:e.onBlur,onFocusWithinChange:e.onFocusChange}),u=Ur(e.id);Dl.set(t,{id:u,shouldUseVirtualFocus:e.shouldUseVirtualFocus,shouldSelectOnPressUp:e.shouldSelectOnPressUp,shouldFocusOnHover:e.shouldFocusOnHover,isVirtualized:e.isVirtualized,onAction:e.onAction,linkBehavior:i});let{labelProps:l,fieldProps:c}=G_({...e,id:u,labelElementType:"span"});return{labelProps:l,listBoxProps:Rr(n,o,t.selectionManager.selectionMode==="multiple"?{"aria-multiselectable":"true"}:{},{role:"listbox",...Rr(c,s)})}}function V1(e,t,r){var n,a;let{key:i}=e,s=Dl.get(t);var o;let u=(o=e.isDisabled)!==null&&o!==void 0?o:t.selectionManager.isDisabled(i);var l;let c=(l=e.isSelected)!==null&&l!==void 0?l:t.selectionManager.isSelected(i);var p;let g=(p=e.shouldSelectOnPressUp)!==null&&p!==void 0?p:s?.shouldSelectOnPressUp;var v;let b=(v=e.shouldFocusOnHover)!==null&&v!==void 0?v:s?.shouldFocusOnHover;var y;let h=(y=e.shouldUseVirtualFocus)!==null&&y!==void 0?y:s?.shouldUseVirtualFocus;var f;let d=(f=e.isVirtualized)!==null&&f!==void 0?f:s?.isVirtualized,m=od(),_=od(),$={role:"option","aria-disabled":u||void 0,"aria-selected":t.selectionManager.selectionMode!=="none"?c:void 0};Y_()&&J_()||($["aria-label"]=e["aria-label"],$["aria-labelledby"]=m,$["aria-describedby"]=_);let w=t.collection.getItem(i);if(d){let Z=Number(w?.index);$["aria-posinset"]=Number.isNaN(Z)?void 0:Z+1,$["aria-setsize"]=y1(t.collection)}let S=s?.onAction?()=>{var Z;return s==null||(Z=s.onAction)===null||Z===void 0?void 0:Z.call(s,i)}:void 0,A=U1(t,i),{itemProps:E,isPressed:T,isFocused:R,hasAction:M,allowsSelection:C}=f1({selectionManager:t.selectionManager,key:i,ref:r,shouldSelectOnPressUp:g,allowsDifferentPressOrigin:g&&b,isVirtualized:d,shouldUseVirtualFocus:h,isDisabled:u,onAction:S||!(w==null||(n=w.props)===null||n===void 0)&&n.onAction?Vy(w==null||(a=w.props)===null||a===void 0?void 0:a.onAction,S):void 0,linkBehavior:s?.linkBehavior,id:A}),{hoverProps:k}=jl({isDisabled:u||!b,onHoverStart(){ud()||(t.selectionManager.setFocused(!0),t.selectionManager.setFocusedKey(i))}}),L=ql(w?.props);delete L.id;let J=Z_(w?.props);return{optionProps:{...$,...Rr(L,E,k,J),id:A},labelProps:{id:m},descriptionProps:{id:_},isFocused:R,isFocusVisible:R&&t.selectionManager.isFocused&&ud(),isSelected:c,isDisabled:u,isPressed:T,allowsSelection:C,hasAction:M}}function z1(e){let{heading:t,"aria-label":r}=e,n=Ur();return{itemProps:{role:"presentation"},headingProps:t?{id:n,role:"presentation"}:{},groupProps:{role:"group","aria-label":r,"aria-labelledby":t?n:void 0}}}function W1(e){var t;const r=ua(),{ref:n,as:a,state:i,variant:s,color:o,onAction:u,children:l,onSelectionChange:c,disableAnimation:p=(t=r?.disableAnimation)!=null?t:!1,itemClasses:g,className:v,topContent:b,bottomContent:y,emptyContent:h="No items.",hideSelectedIcon:f=!1,hideEmptyContent:d=!1,shouldHighlightOnFocus:m=!1,classNames:_,...$}=e,w=a||"ul",S=typeof w=="string",A=Tr(n),E=Tv({...e,children:l,onSelectionChange:c}),T=i||E,{listBoxProps:R}=K1({...e,onAction:u},T,A),M=H.useMemo(()=>m1(),[]),C=Pe(_?.base,v);return{Component:w,state:T,variant:s,color:o,slots:M,classNames:_,topContent:b,bottomContent:y,emptyContent:h,hideEmptyContent:d,shouldHighlightOnFocus:m,hideSelectedIcon:f,disableAnimation:p,className:v,itemClasses:g,getBaseProps:(Z={})=>({ref:A,"data-slot":"base",className:M.base({class:C}),...qr($,{enabled:S}),...Z}),getListProps:(Z={})=>({"data-slot":"list",className:M.list({class:_?.list}),...R,...Z}),getEmptyContentProps:(Z={})=>({"data-slot":"empty-content",children:h,className:M.emptyContent({class:_?.emptyContent}),...Z})}}function H1(e){const{isSelected:t,disableAnimation:r,...n}=e;return O.jsx("svg",{"aria-hidden":"true","data-selected":t,role:"presentation",viewBox:"0 0 17 18",...n,children:O.jsx("polyline",{fill:"none",points:"1 9 7 14 15 4",stroke:"currentColor",strokeDasharray:22,strokeDashoffset:t?44:66,strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:1.5,style:r?{}:{transition:"stroke-dashoffset 200ms ease"}})})}function G1(e){var t,r;const n=ua(),[a,i]=la(e,dd.variantKeys),{as:s,item:o,state:u,description:l,startContent:c,endContent:p,isVirtualized:g,selectedIcon:v,className:b,classNames:y,autoFocus:h,onPress:f,onPressUp:d,onPressStart:m,onPressEnd:_,onPressChange:$,onClick:w,shouldHighlightOnFocus:S,hideSelectedIcon:A=!1,isReadOnly:E=!1,...T}=a,R=(r=(t=e.disableAnimation)!=null?t:n?.disableAnimation)!=null?r:!1,M=H.useRef(null),C=s||(e.href?"a":"li"),k=typeof C=="string",{rendered:L,key:J}=o,Z=u.disabledKeys.has(J)||e.isDisabled,Y=u.selectionManager.selectionMode!=="none",ne=O1(),{pressProps:U,isPressed:j}=zy({ref:M,isDisabled:Z,onClick:w,onPress:f,onPressUp:d,onPressStart:m,onPressEnd:_,onPressChange:$}),{isHovered:K,hoverProps:D}=jl({isDisabled:Z}),{isFocusVisible:P,focusProps:I}=Xn({autoFocus:h}),{isFocused:N,isSelected:B,optionProps:Q,labelProps:V,descriptionProps:G}=V1({key:J,isDisabled:Z,"aria-label":a["aria-label"],isVirtualized:g},u,M);let x=Q;const q=H.useMemo(()=>dd({...i,isDisabled:Z,disableAnimation:R,hasTitleTextChild:typeof L=="string",hasDescriptionTextChild:typeof l=="string"}),[ca(i),Z,R,L,l]),F=Pe(y?.base,b);E&&(x=X_(x));const z=S&&N||(ne?K||j:K||N&&!P),W=(re={})=>({ref:M,...Ce(x,E?{}:Ce(I,U),D,qr(T,{enabled:k}),re),"data-selectable":pe(Y),"data-focus":pe(N),"data-hover":pe(z),"data-disabled":pe(Z),"data-selected":pe(B),"data-pressed":pe(j),"data-focus-visible":pe(P),className:q.base({class:Pe(F,re.className)})}),X=(re={})=>({...Ce(V,re),"data-label":pe(!0),className:q.title({class:y?.title})}),ee=(re={})=>({...Ce(G,re),className:q.description({class:y?.description})}),ce=(re={})=>({...Ce(re),className:q.wrapper({class:y?.wrapper})}),ie=H.useCallback((re={})=>({"aria-hidden":pe(!0),"data-disabled":pe(Z),className:q.selectedIcon({class:y?.selectedIcon}),...re}),[Z,q,y]);return{Component:C,domRef:M,slots:q,classNames:y,isSelectable:Y,isSelected:B,isDisabled:Z,rendered:L,description:l,startContent:c,endContent:p,selectedIcon:v,hideSelectedIcon:A,disableAnimation:R,getItemProps:W,getLabelProps:X,getWrapperProps:ce,getDescriptionProps:ee,getSelectedIconProps:ie}}var qv=e=>{const{Component:t,rendered:r,description:n,isSelectable:a,isSelected:i,isDisabled:s,selectedIcon:o,startContent:u,endContent:l,hideSelectedIcon:c,disableAnimation:p,getItemProps:g,getLabelProps:v,getWrapperProps:b,getDescriptionProps:y,getSelectedIconProps:h}=G1(e),f=H.useMemo(()=>{const d=O.jsx(H1,{disableAnimation:p,isSelected:i});return typeof o=="function"?o({icon:d,isSelected:i,isDisabled:s}):o||d},[o,i,s,p]);return O.jsxs(t,{...g(),children:[u,n?O.jsxs("div",{...b(),children:[O.jsx("span",{...v(),children:r}),O.jsx("span",{...y(),children:n})]}):O.jsx("span",{...v(),children:r}),a&&!c&&O.jsx("span",{...h(),children:f}),l]})};qv.displayName="HeroUI.ListboxItem";var Nl=qv,jv=Kr(({item:e,state:t,as:r,variant:n,color:a,disableAnimation:i,className:s,classNames:o,hideSelectedIcon:u,showDivider:l=!1,dividerProps:c={},itemClasses:p,title:g,items:v,...b},y)=>{const h=r||"li",f=H.useMemo(()=>g1(),[]),d=Pe(o?.base,s),m=Pe(o?.divider,c?.className),{itemProps:_,headingProps:$,groupProps:w}=z1({heading:e.rendered,"aria-label":e["aria-label"]});return O.jsxs(h,{"data-slot":"base",...Ce(_,b),className:f.base({class:d}),children:[e.rendered&&O.jsx("span",{...$,className:f.heading({class:o?.heading}),"data-slot":"heading",children:e.rendered}),O.jsxs("ul",{...w,className:f.group({class:o?.group}),"data-has-title":!!e.rendered,"data-slot":"group",children:[[...e.childNodes].map(S=>{const{key:A,props:E}=S;let T=O.jsx(Nl,{classNames:p,color:a,disableAnimation:i,hideSelectedIcon:u,item:S,state:t,variant:n,...E},A);return S.wrapper&&(T=S.wrapper(T)),T}),l&&O.jsx(Q_,{as:"li",className:f.divider({class:m}),...c})]})]},e.key)});jv.displayName="HeroUI.ListboxSection";var Dv=jv;function Y1(e={}){const{domRef:t,isEnabled:r=!0,overflowCheck:n="vertical",visibility:a="auto",offset:i=0,onVisibilityChange:s,updateDeps:o=[]}=e,u=H.useRef(a);H.useEffect(()=>{const l=t?.current;if(!l||!r)return;const c=(v,b,y,h,f)=>{if(a==="auto"){const d=`${h}${t1(f)}Scroll`;b&&y?(l.dataset[d]="true",l.removeAttribute(`data-${h}-scroll`),l.removeAttribute(`data-${f}-scroll`)):(l.dataset[`${h}Scroll`]=b.toString(),l.dataset[`${f}Scroll`]=y.toString(),l.removeAttribute(`data-${h}-${f}-scroll`))}else{const d=b&&y?"both":b?h:y?f:"none";d!==u.current&&(s?.(d),u.current=d)}},p=()=>{var v,b;const y=[{type:"vertical",prefix:"top",suffix:"bottom"},{type:"horizontal",prefix:"left",suffix:"right"}],h=l.querySelector('ul[data-slot="list"]'),f=+((v=h?.getAttribute("data-virtual-scroll-height"))!=null?v:l.scrollHeight),d=+((b=h?.getAttribute("data-virtual-scroll-top"))!=null?b:l.scrollTop);for(const{type:m,prefix:_,suffix:$}of y)if(n===m||n==="both"){const w=m==="vertical"?d>i:l.scrollLeft>i,S=m==="vertical"?d+l.clientHeight+i{["top","bottom","top-bottom","left","right","left-right"].forEach(v=>{l.removeAttribute(`data-${v}-scroll`)})};return p(),l.addEventListener("scroll",p,!0),a!=="auto"&&(g(),a==="both"?(l.dataset.topBottomScroll=String(n==="vertical"),l.dataset.leftRightScroll=String(n==="horizontal")):(l.dataset.topBottomScroll="false",l.dataset.leftRightScroll="false",["top","bottom","left","right"].forEach(v=>{l.dataset[`${v}Scroll`]=String(a===v)}))),()=>{l.removeEventListener("scroll",p,!0),g()}},[...o,r,a,n,s,t])}function J1(e){var t;const[r,n]=la(e,ld.variantKeys),{ref:a,as:i,children:s,className:o,style:u,size:l=40,offset:c=0,visibility:p="auto",isEnabled:g=!0,onVisibilityChange:v,...b}=r,y=i||"div",h=Tr(a);Y1({domRef:h,offset:c,visibility:p,isEnabled:g,onVisibilityChange:v,updateDeps:[s],overflowCheck:(t=e.orientation)!=null?t:"vertical"});const f=H.useMemo(()=>ld({...n,className:o}),[ca(n),o]);return{Component:y,styles:f,domRef:h,children:s,getBaseProps:(m={})=>{var _;return{ref:h,className:f,"data-orientation":(_=e.orientation)!=null?_:"vertical",style:{"--scroll-shadow-size":`${l}px`,...u,...m.style},...b,...m}}}}var Z1=(e,t)=>{const r=[];for(const n of e)n.type==="section"?r.push(([...n.childNodes].length+1)*t):r.push(t);return r},X1=e=>{if(!e||e.scrollTop===void 0||e.clientHeight===void 0||e.scrollHeight===void 0)return{isTop:!1,isBottom:!1,isMiddle:!1};const t=e.scrollTop===0,r=Math.ceil(e.scrollTop+e.clientHeight)>=e.scrollHeight;return{isTop:t,isBottom:r,isMiddle:!t&&!r}},Q1=e=>{var t;const{Component:r,state:n,color:a,variant:i,itemClasses:s,getBaseProps:o,topContent:u,bottomContent:l,hideEmptyContent:c,hideSelectedIcon:p,shouldHighlightOnFocus:g,disableAnimation:v,getEmptyContentProps:b,getListProps:y,scrollShadowProps:h}=e,{virtualization:f}=e;if(!f||!e1(f)&&!f.maxListboxHeight&&!f.itemHeight)throw new Error("You are using a virtualized listbox. VirtualizedListbox requires 'virtualization' props with 'maxListboxHeight' and 'itemHeight' properties. This error might have originated from autocomplete components that use VirtualizedListbox. Please provide these props to use the virtualized listbox.");const{maxListboxHeight:d,itemHeight:m}=f,_=Math.min(d,m*n.collection.size),$=H.useRef(null),w=H.useMemo(()=>Z1([...n.collection],m),[n.collection,m]),S=p1({count:[...n.collection].length,getScrollElement:()=>$.current,estimateSize:L=>w[L]}),A=S.getVirtualItems(),E=S.getTotalSize(),{getBaseProps:T}=J1({...h}),R=L=>{var J;const Z=[...n.collection][L.index];if(!Z)return null;const Y={color:a,item:Z,state:n,variant:i,disableAnimation:v,hideSelectedIcon:p,...Z.props},ne={position:"absolute",top:0,left:0,width:"100%",height:`${L.size}px`,transform:`translateY(${L.start}px)`};if(Z.type==="section")return O.jsx(Dv,{...Y,itemClasses:s,style:{...ne,...Y.style}},Z.key);let U=O.jsx(Nl,{...Y,classNames:Ce(s,(J=Z.props)==null?void 0:J.classNames),shouldHighlightOnFocus:g,style:{...ne,...Y.style}},Z.key);return Z.wrapper&&(U=Z.wrapper(U)),U},[M,C]=H.useState({isTop:!1,isBottom:!0,isMiddle:!1}),k=O.jsxs(r,{...y(),"data-virtual-scroll-height":E,"data-virtual-scroll-top":(t=$?.current)==null?void 0:t.scrollTop,children:[!n.collection.size&&!c&&O.jsx("li",{children:O.jsx("div",{...b()})}),O.jsx("div",{...qr(T()),ref:$,style:{height:d,overflow:"auto"},onScroll:L=>{C(X1(L.target))},children:_>0&&m>0&&O.jsx("div",{style:{height:`${E}px`,width:"100%",position:"relative"},children:A.map(L=>R(L))})})]});return O.jsxs("div",{...o(),children:[u,k,l]})},e$=Q1,t$=Kr(function(t,r){const{isVirtualized:n,...a}=t,i=W1({...a,ref:r}),{Component:s,state:o,color:u,variant:l,itemClasses:c,getBaseProps:p,topContent:g,bottomContent:v,hideEmptyContent:b,hideSelectedIcon:y,shouldHighlightOnFocus:h,disableAnimation:f,getEmptyContentProps:d,getListProps:m}=i;if(n)return O.jsx(e$,{...t,...i});const _=O.jsxs(s,{...m(),children:[!o.collection.size&&!b&&O.jsx("li",{children:O.jsx("div",{...d()})}),[...o.collection].map($=>{var w;const S={color:u,item:$,state:o,variant:l,disableAnimation:f,hideSelectedIcon:y,...$.props};if($.type==="section")return O.jsx(Dv,{...S,itemClasses:c},$.key);let A=O.jsx(Nl,{...S,classNames:Ce(c,(w=$.props)==null?void 0:w.classNames),shouldHighlightOnFocus:h},$.key);return $.wrapper&&(A=$.wrapper(A)),A})]});return O.jsxs("div",{...p(),children:[g,_,v]})}),r$=t$,n$=Kr(function(t,r){var n;const{Component:a,state:i,label:s,hasHelper:o,isLoading:u,triggerRef:l,selectorIcon:c=O.jsx(h1,{}),description:p,errorMessage:g,isInvalid:v,startContent:b,endContent:y,placeholder:h,renderValue:f,shouldLabelBeOutside:d,disableAnimation:m,getBaseProps:_,getLabelProps:$,getTriggerProps:w,getValueProps:S,getListboxProps:A,getPopoverProps:E,getSpinnerProps:T,getMainWrapperProps:R,getInnerWrapperProps:M,getHiddenSelectProps:C,getHelperWrapperProps:k,getListboxWrapperProps:L,getDescriptionProps:J,getErrorMessageProps:Z,getSelectorIconProps:Y,isClearable:ne,getClearButtonProps:U,getEndWrapperProps:j,getEndContentProps:K}=q1({...t,ref:r}),D=s?O.jsx("label",{...$(),children:s}):null,P=H.cloneElement(c,Y()),I=H.useMemo(()=>{var x;return ne&&((x=i.selectedItems)!=null&&x.length)?O.jsx("span",{...U(),children:O.jsx(r1,{})}):null},[ne,U,(n=i.selectedItems)==null?void 0:n.length]),N=H.useMemo(()=>I?O.jsxs("div",{...j(),children:[I,y&&O.jsx("span",{...K(),children:y})]}):y&&O.jsx("span",{...K(),children:y}),[I,y,j,K]),B=H.useMemo(()=>{const x=v&&g;return!o||!(x||p)?null:O.jsx("div",{...k(),children:x?O.jsx("div",{...Z(),children:g}):O.jsx("div",{...J(),children:p})})},[o,v,g,p,k,Z,J]),Q=H.useMemo(()=>{var x;if(!((x=i.selectedItems)!=null&&x.length))return h;if(f&&typeof f=="function"){const q=[...i.selectedItems].map(F=>({key:F.key,data:F.value,type:F.type,props:F.props,textValue:F.textValue,rendered:F.rendered,"aria-label":F["aria-label"]}));return f(q)}return i.selectedItems.map(q=>q.textValue).join(", ")},[i.selectedItems,f,h]),V=H.useMemo(()=>u?O.jsx(n1,{...T()}):P,[u,P,T]),G=H.useMemo(()=>i.isOpen?O.jsx(S1,{...E(),children:O.jsx(a1,{...L(),children:O.jsx(r$,{...A()})})}):null,[i.isOpen,E,i,l,L,A]);return O.jsxs("div",{..._(),children:[O.jsx(M1,{...C()}),d?D:null,O.jsxs("div",{...R(),children:[O.jsxs(a,{...w(),children:[d?null:D,O.jsxs("div",{...M(),children:[b,O.jsx("span",{...S(),children:Q}),y&&i.selectedItems&&O.jsx(i1,{elementType:"span",children:","}),N]}),V]}),B]}),m?G:O.jsx(s1,{children:G})]})}),a$=n$;function me(e){return typeof e!="object"||e===null||typeof e.lastModified=="number"&&typeof File<"u"&&e instanceof File||typeof e.getMonth=="function"&&typeof Date<"u"&&e instanceof Date?!1:!Array.isArray(e)}function i$(e){return e.additionalItems===!0&&console.warn("additionalItems=true is currently not supported"),me(e.additionalItems)}function hd(e){if(e==="")return;if(e===null)return null;if(/\.$/.test(e)||/\.0$/.test(e)||/\.\d*0$/.test(e))return e;const t=Number(e);return typeof t=="number"&&!Number.isNaN(t)?t:e}const zr="__additional_property",_l="additionalProperties",sr="allOf",Ze="anyOf",gt="const",s$="default",da="dependencies",o$="enum",Ue="__errors",Ot="$id",u$="if",xt="items",l$="_$junk_option_schema_id$_",Hn="$name",Ke="oneOf",Ie="properties",c$="required",Qn="submitButtonOptions",Re="$ref",Fl="__rjsf_additionalProperties",Nv="__rjsf_rootSchema",d$="ui:field",Ml="ui:widget",Ar="ui:options",f$="ui:globalOptions";function he(e={},t={}){return Object.keys(e).filter(r=>r.indexOf("ui:")===0).reduce((r,n)=>{const a=e[n];return n===Ml&&me(a)?(console.error("Setting options via ui:widget object is no longer supported, use ui:options instead"),r):n===Ar&&me(a)?{...r,...a}:{...r,[n.substring(3)]:a}},{...t})}function p$(e,t={},r){if(!e.additionalProperties)return!1;const{expandable:n=!0}=he(t);return n===!1?n:e.maxProperties!==void 0&&r?Object.keys(r).length({...r,[a]:ea(n)}),t);if(Mt(e)){const r=e;return Object.keys(r).reduce((n,a)=>({...n,[a]:ea(r[a])}),t)}return t}function x$(){this.__data__=[],this.size=0}function Wr(e,t){return e===t||e!==e&&t!==t}function pa(e,t){for(var r=e.length;r--;)if(Wr(e[r][0],t))return r;return-1}var C$=Array.prototype,I$=C$.splice;function T$(e){var t=this.__data__,r=pa(t,e);if(r<0)return!1;var n=t.length-1;return r==n?t.pop():I$.call(t,r,1),--this.size,!0}function R$(e){var t=this.__data__,r=pa(t,e);return r<0?void 0:t[r][1]}function q$(e){return pa(this.__data__,e)>-1}function j$(e,t){var r=this.__data__,n=pa(r,e);return n<0?(++this.size,r.push([e,t])):r[n][1]=t,this}function _t(e){var t=-1,r=e==null?0:e.length;for(this.clear();++to))return!1;var l=i.get(e),c=i.get(t);if(l&&c)return l==t&&c==e;var p=-1,g=!0,v=r&Ew?new er:void 0;for(i.set(e,t),i.set(t,e);++p-1&&e%1==0&&e-1&&e%1==0&&e<=Xw}var Qw="[object Arguments]",eS="[object Array]",tS="[object Boolean]",rS="[object Date]",nS="[object Error]",aS="[object Function]",iS="[object Map]",sS="[object Number]",oS="[object Object]",uS="[object RegExp]",lS="[object Set]",cS="[object String]",dS="[object WeakMap]",fS="[object ArrayBuffer]",pS="[object DataView]",hS="[object Float32Array]",mS="[object Float64Array]",gS="[object Int8Array]",yS="[object Int16Array]",vS="[object Int32Array]",bS="[object Uint8Array]",_S="[object Uint8ClampedArray]",$S="[object Uint16Array]",wS="[object Uint32Array]",Ee={};Ee[hS]=Ee[mS]=Ee[gS]=Ee[yS]=Ee[vS]=Ee[bS]=Ee[_S]=Ee[$S]=Ee[wS]=!0;Ee[Qw]=Ee[eS]=Ee[fS]=Ee[tS]=Ee[pS]=Ee[rS]=Ee[nS]=Ee[aS]=Ee[iS]=Ee[sS]=Ee[oS]=Ee[uS]=Ee[lS]=Ee[cS]=Ee[dS]=!1;function SS(e){return Ge(e)&&Kl(e.length)&&!!Ee[bt(e)]}function Vl(e){return function(t){return e(t)}}var Hv=typeof exports=="object"&&exports&&!exports.nodeType&&exports,Or=Hv&&typeof module=="object"&&module&&!module.nodeType&&module,PS=Or&&Or.exports===Hv,Ha=PS&&Fv.process,rr=function(){try{var e=Or&&Or.require&&Or.require("util").types;return e||Ha&&Ha.binding&&Ha.binding("util")}catch{}}(),wd=rr&&rr.isTypedArray,Hr=wd?Vl(wd):SS,ES=Object.prototype,AS=ES.hasOwnProperty;function Gv(e,t){var r=qe(e),n=!r&&tr(e),a=!r&&!n&&Lt(e),i=!r&&!n&&!a&&Hr(e),s=r||n||a||i,o=s?Vv(e.length,String):[],u=o.length;for(var l in e)(t||AS.call(e,l))&&!(s&&(l=="length"||a&&(l=="offset"||l=="parent")||i&&(l=="buffer"||l=="byteLength"||l=="byteOffset")||ga(l,u)))&&o.push(l);return o}var OS=Object.prototype;function ya(e){var t=e&&e.constructor,r=typeof t=="function"&&t.prototype||OS;return e===r}var xS=kv(Object.keys,Object),CS=Object.prototype,IS=CS.hasOwnProperty;function Yv(e){if(!ya(e))return xS(e);var t=[];for(var r in Object(e))IS.call(e,r)&&r!="constructor"&&t.push(r);return t}function or(e){return e!=null&&Kl(e.length)&&!ha(e)}function rt(e){return or(e)?Gv(e):Yv(e)}function $l(e){return Uv(e,rt,Ul)}var TS=1,RS=Object.prototype,qS=RS.hasOwnProperty;function jS(e,t,r,n,a,i){var s=r&TS,o=$l(e),u=o.length,l=$l(t),c=l.length;if(u!=c&&!s)return!1;for(var p=u;p--;){var g=o[p];if(!(s?g in t:qS.call(t,g)))return!1}var v=i.get(e),b=i.get(t);if(v&&b)return v==t&&b==e;var y=!0;i.set(e,t),i.set(t,e);for(var h=s;++p{if(typeof r=="function"&&typeof n=="function")return!0})}var zS="[object Symbol]";function Gr(e){return typeof e=="symbol"||Ge(e)&&bt(e)==zS}var WS=/\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,HS=/^\w*$/;function zl(e,t){if(qe(e))return!1;var r=typeof e;return r=="number"||r=="symbol"||r=="boolean"||e==null||Gr(e)?!0:HS.test(e)||!WS.test(e)||t!=null&&e in Object(t)}var GS="Expected a function";function Wl(e,t){if(typeof e!="function"||t!=null&&typeof t!="function")throw new TypeError(GS);var r=function(){var n=arguments,a=t?t.apply(this,n):n[0],i=r.cache;if(i.has(a))return i.get(a);var s=e.apply(this,n);return r.cache=i.set(a,s)||i,s};return r.cache=new(Wl.Cache||$t),r}Wl.Cache=$t;var YS=500;function JS(e){var t=Wl(e,function(n){return r.size===YS&&r.clear(),n}),r=t.cache;return t}var ZS=/[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g,XS=/\\(\\)?/g,Jv=JS(function(e){var t=[];return e.charCodeAt(0)===46&&t.push(""),e.replace(ZS,function(r,n,a,i){t.push(a?i.replace(XS,"$1"):n||r)}),t});function ba(e,t){for(var r=-1,n=e==null?0:e.length,a=Array(n);++rb,typeof l[g]>"u"&&(Array.isArray(l)&&g==="-"&&(g=l.length),v&&(c[b]!==""&&c[b]<1/0||c[b]==="-"?l[g]=[]:l[g]={})),!v)break;l=l[g]}var h=l[g];return p===void 0?delete l[g]:l[g]=p,h}function i(l){if(typeof l=="string"){if(l=l.split("/"),l[0]==="")return l;throw new Error("Invalid JSON pointer.")}else if(Array.isArray(l)){for(const c of l)if(typeof c!="string"&&typeof c!="number")throw new Error("Invalid JSON pointer. Must be of type string or number.");return l}throw new Error("Invalid JSON pointer.")}function s(l,c){if(typeof l!="object")throw new Error("Invalid input object.");c=i(c);var p=c.length;if(p===1)return l;for(var g=1;ga?0:a+t),r=r>a?a:r,r<0&&(r+=a),a=t>r?0:r-t>>>0,t>>>=0;for(var i=Array(a);++n0&&r(o)?t>1?Jr(o,t-1,r,n,a):Bl(a,o):n||(a[a.length]=o)}return a}function xE(e){var t=e==null?0:e.length;return t?Jr(e,1):[]}function CE(e,t,r){switch(r.length){case 0:return e.call(t);case 1:return e.call(t,r[0]);case 2:return e.call(t,r[0],r[1]);case 3:return e.call(t,r[0],r[1],r[2])}return e.apply(t,r)}var Kd=Math.max;function lb(e,t,r){return t=Kd(t===void 0?e.length-1:t,0),function(){for(var n=arguments,a=-1,i=Kd(n.length-t,0),s=Array(i);++a0){if(++t>=RE)return arguments[0]}else t=0;return e.apply(void 0,arguments)}}var cb=DE(TE);function db(e){return cb(lb(e,void 0,xE),e+"")}var NE=1,FE=2,ME=4,na=db(function(e,t){var r={};if(e==null)return r;var n=!1;t=ba(t,function(i){return i=ur(i,e),n||(n=i.length>1),i}),lr(e,Zl(e),r),n&&(r=xr(r,NE|FE|ME,AE));for(var a=t.length;a--;)ub(r,t[a]);return r});function Ql(e,t){const r=t[e];return[na(t,[e]),r]}function fb(e,t={},r=[]){const n=e||"";let a;if(n.startsWith("#"))a=decodeURIComponent(n.substring(1));else throw new Error(`Could not find a definition for ${e}.`);const i=iP.get(t,a);if(i===void 0)throw new Error(`Could not find a definition for ${e}.`);const s=i[Re];if(s){if(r.includes(s)){if(r.length===1)throw new Error(`Definition for ${e} is a circular reference`);const[c,...p]=r,g=[...p,n,c].join(" -> ");throw new Error(`Definition for ${c} contains a circular reference through ${g}`)}const[o,u]=Ql(Re,i),l=fb(u,t,[...r,n]);return Object.keys(o).length>0?{...o,...l}:l}return i}function pb(e,t={}){return fb(e,t,[])}var kE=Object.prototype,LE=kE.hasOwnProperty;function BE(e,t){return e!=null&&LE.call(e,t)}function hb(e,t,r){t=ur(t,e);for(var n=-1,a=t.length,i=!1;++nbA)return[];var r=Ga,n=_A(e,Ga);t=wb(t),e-=Ga;for(var a=Vv(n,t);++r({required:[c]}))};let l;if(o.anyOf){const{...c}=o;c.allOf?c.allOf=c.allOf.slice():c.allOf=[],c.allOf.push(u),l=c}else l=Object.assign({},o,u);if(delete l.required,e.isValid(l,t,n))return s}else if(e.isValid(o,t,n))return s}return 0}function tc(e,t,r,n,a){return Eb(e,t,r,n,a)}function rc(e,t,r,n){if(!Se(e))return e;t=ur(t,e);for(var a=-1,i=t.length,s=i-1,o=e;o!=null&&++a1?r[a-1]:void 0,s=a>2?r[2]:void 0;for(i=e.length>3&&typeof i=="function"?(a--,i):void 0,s&&PA(r[0],r[1],s)&&(i=a<3?void 0:i,a=1),t=Object(t);++n-1}function qA(){}var jA=1/0,DA=Qt&&1/Ll(new Qt([,-0]))[1]==jA?function(e){return new Qt(e)}:qA,NA=200;function xb(e,t,r){var n=-1,a=Ob,i=e.length,s=!0,o=[],u=o;if(i>=NA){var l=DA(e);if(l)return Ll(l);s=!1,a=kl,u=new er}else u=o;e:for(;++n-1}return ei=t,ei}var ti,Xd;function UA(){if(Xd)return ti;Xd=1;var e=Sa();function t(r,n){var a=this.__data__,i=e(a,r);return i<0?(++this.size,a.push([r,n])):a[i][1]=n,this}return ti=t,ti}var ri,Qd;function Pa(){if(Qd)return ri;Qd=1;var e=MA(),t=kA(),r=LA(),n=BA(),a=UA();function i(s){var o=-1,u=s==null?0:s.length;for(this.clear();++o-1&&n%1==0&&n-1&&r%1==0&&r<=e}return Zi=t,Zi}var Xi,Zf;function mO(){if(Zf)return Xi;Zf=1;var e=Vt(),t=lc(),r=ut(),n="[object Arguments]",a="[object Array]",i="[object Boolean]",s="[object Date]",o="[object Error]",u="[object Function]",l="[object Map]",c="[object Number]",p="[object Object]",g="[object RegExp]",v="[object Set]",b="[object String]",y="[object WeakMap]",h="[object ArrayBuffer]",f="[object DataView]",d="[object Float32Array]",m="[object Float64Array]",_="[object Int8Array]",$="[object Int16Array]",w="[object Int32Array]",S="[object Uint8Array]",A="[object Uint8ClampedArray]",E="[object Uint16Array]",T="[object Uint32Array]",R={};R[d]=R[m]=R[_]=R[$]=R[w]=R[S]=R[A]=R[E]=R[T]=!0,R[n]=R[a]=R[h]=R[i]=R[f]=R[s]=R[o]=R[u]=R[l]=R[c]=R[p]=R[g]=R[v]=R[b]=R[y]=!1;function M(C){return r(C)&&t(C.length)&&!!R[e(C)]}return Xi=M,Xi}var Qi,Xf;function Wt(){if(Xf)return Qi;Xf=1;function e(t){return function(r){return t(r)}}return Qi=e,Qi}var Pr={exports:{}};Pr.exports;var Qf;function cc(){return Qf||(Qf=1,function(e,t){var r=Cb(),n=t&&!t.nodeType&&t,a=n&&!0&&e&&!e.nodeType&&e,i=a&&a.exports===n,s=i&&r.process,o=function(){try{var u=a&&a.require&&a.require("util").types;return u||s&&s.binding&&s.binding("util")}catch{}}();e.exports=o}(Pr,Pr.exports)),Pr.exports}var es,ep;function dc(){if(ep)return es;ep=1;var e=mO(),t=Wt(),r=cc(),n=r&&r.isTypedArray,a=n?t(n):e;return es=a,es}var ts,tp;function jb(){if(tp)return ts;tp=1;var e=fO(),t=xa(),r=ze(),n=Ca(),a=uc(),i=dc(),s=Object.prototype,o=s.hasOwnProperty;function u(l,c){var p=r(l),g=!p&&t(l),v=!p&&!g&&n(l),b=!p&&!g&&!v&&i(l),y=p||g||v||b,h=y?e(l.length,String):[],f=h.length;for(var d in l)(c||o.call(l,d))&&!(y&&(d=="length"||v&&(d=="offset"||d=="parent")||b&&(d=="buffer"||d=="byteLength"||d=="byteOffset")||a(d,f)))&&h.push(d);return h}return ts=u,ts}var rs,rp;function fc(){if(rp)return rs;rp=1;var e=Object.prototype;function t(r){var n=r&&r.constructor,a=typeof n=="function"&&n.prototype||e;return r===a}return rs=t,rs}var ns,np;function Db(){if(np)return ns;np=1;function e(t,r){return function(n){return t(r(n))}}return ns=e,ns}var as,ap;function gO(){if(ap)return as;ap=1;var e=Db(),t=e(Object.keys,Object);return as=t,as}var is,ip;function yO(){if(ip)return is;ip=1;var e=fc(),t=gO(),r=Object.prototype,n=r.hasOwnProperty;function a(i){if(!e(i))return t(i);var s=[];for(var o in Object(i))n.call(i,o)&&o!="constructor"&&s.push(o);return s}return is=a,is}var ss,sp;function fr(){if(sp)return ss;sp=1;var e=ac(),t=lc();function r(n){return n!=null&&t(n.length)&&!e(n)}return ss=r,ss}var os,op;function Xr(){if(op)return os;op=1;var e=jb(),t=yO(),r=fr();function n(a){return r(a)?e(a):t(a)}return os=n,os}var us,up;function vO(){if(up)return us;up=1;var e=Zr(),t=Xr();function r(n,a){return n&&e(a,t(a),n)}return us=r,us}var ls,lp;function bO(){if(lp)return ls;lp=1;function e(t){var r=[];if(t!=null)for(var n in Object(t))r.push(n);return r}return ls=e,ls}var cs,cp;function _O(){if(cp)return cs;cp=1;var e=ot(),t=fc(),r=bO(),n=Object.prototype,a=n.hasOwnProperty;function i(s){if(!e(s))return r(s);var o=t(s),u=[];for(var l in s)l=="constructor"&&(o||!a.call(s,l))||u.push(l);return u}return cs=i,cs}var ds,dp;function pr(){if(dp)return ds;dp=1;var e=jb(),t=_O(),r=fr();function n(a){return r(a)?e(a,!0):t(a)}return ds=n,ds}var fs,fp;function $O(){if(fp)return fs;fp=1;var e=Zr(),t=pr();function r(n,a){return n&&e(a,t(a),n)}return fs=r,fs}var Er={exports:{}};Er.exports;var pp;function Nb(){return pp||(pp=1,function(e,t){var r=st(),n=t&&!t.nodeType&&t,a=n&&!0&&e&&!e.nodeType&&e,i=a&&a.exports===n,s=i?r.Buffer:void 0,o=s?s.allocUnsafe:void 0;function u(l,c){if(c)return l.slice();var p=l.length,g=o?o(p):new l.constructor(p);return l.copy(g),g}e.exports=u}(Er,Er.exports)),Er.exports}var ps,hp;function pc(){if(hp)return ps;hp=1;function e(t,r){var n=-1,a=t.length;for(r||(r=Array(a));++nv))return!1;var y=p.get(s),h=p.get(o);if(y&&h)return y==o&&h==s;var f=-1,d=!0,m=u&a?new e:void 0;for(p.set(s,o),p.set(o,s);++f0&&i(c)?a>1?r(c,a-1,i,s,o):e(o,c):s||(o[o.length]=c)}return o}return so=r,so}var oo,uh;function Ht(){if(uh)return oo;uh=1;function e(t,r){for(var n=-1,a=t==null?0:t.length,i=Array(a);++nn||o&&u&&c&&!l&&!p||i&&u&&c||!a&&c||!s)return 1;if(!i&&!o&&!p&&r=l)return c;var p=a[i];return c*(p=="desc"?-1:1)}}return r.index-n.index}return Uo=t,Uo}var Ko,Kh;function bx(){if(Kh)return Ko;Kh=1;var e=Ht(),t=wc(),r=dx(),n=mx(),a=gx(),i=Wt(),s=vx(),o=Qr(),u=ze();function l(c,p,g){p.length?p=e(p,function(y){return u(y)?function(h){return t(h,y.length===1?y[0]:y)}:y}):p=[o];var v=-1;p=e(p,i(r));var b=n(c,function(y,h,f){var d=e(p,function(m){return m(y)});return{criteria:d,index:++v,value:y}});return a(b,function(y,h){return s(y,h,g)})}return Ko=l,Ko}var Vo,Vh;function Xb(){if(Vh)return Vo;Vh=1;function e(t,r,n){switch(n.length){case 0:return t.call(r);case 1:return t.call(r,n[0]);case 2:return t.call(r,n[0],n[1]);case 3:return t.call(r,n[0],n[1],n[2])}return t.apply(r,n)}return Vo=e,Vo}var zo,zh;function _x(){if(zh)return zo;zh=1;var e=Xb(),t=Math.max;function r(n,a,i){return a=t(a===void 0?n.length-1:a,0),function(){for(var s=arguments,o=-1,u=t(s.length-a,0),l=Array(u);++o0){if(++i>=e)return arguments[0]}else i=0;return a.apply(void 0,arguments)}}return Go=n,Go}var Yo,Yh;function Px(){if(Yh)return Yo;Yh=1;var e=wx(),t=Sx(),r=t(e);return Yo=r,Yo}var Jo,Jh;function Gt(){if(Jh)return Jo;Jh=1;var e=Qr(),t=_x(),r=Px();function n(a,i){return r(t(a,i,e),a+"")}return Jo=n,Jo}var Zo,Zh;function Sc(){if(Zh)return Zo;Zh=1;var e=cr(),t=fr(),r=uc(),n=ot();function a(i,s,o){if(!n(o))return!1;var u=typeof s;return(u=="number"?t(o)&&r(s,o.length):u=="string"&&s in o)?e(o[s],i):!1}return Zo=a,Zo}var Xo,Xh;function Qb(){if(Xh)return Xo;Xh=1;var e=_c(),t=bx(),r=Gt(),n=Sc(),a=r(function(i,s){if(i==null)return[];var o=s.length;return o>1&&n(i,s[0],s[1])?s=[]:o>2&&n(s[0],s[1],s[2])&&(s=[s[0]]),t(i,e(s,1),[])});return Xo=a,Xo}var Qo,Qh;function Ex(){if(Qh)return Qo;Qh=1;function e(t,r,n,a){for(var i=t.length,s=n+(a?1:-1);a?s--:++s-1}return nu=t,nu}var au,am;function Ec(){if(am)return au;am=1;function e(t,r,n){for(var a=-1,i=t==null?0:t.length;++a=s){var f=l?null:a(u);if(f)return i(f);b=!1,g=n,h=new e}else h=l?[]:y;e:for(;++p2?u[2]:void 0;for(p&&r(u[0],u[1],p)&&(c=1);++l=120&&d.length>=120)?new e(b&&d):void 0}d=u[0];var m=-1,_=y[0];e:for(;++mArray.isArray(C)?C:[C],l=C=>C===void 0,c=C=>s(C)||Array.isArray(C)?Object.keys(C):[],p=(C,k)=>C.hasOwnProperty(k),g=C=>t(r(C)),v=C=>l(C)||Array.isArray(C)&&C.length===0,b=(C,k,L,J)=>k&&p(k,L)&&C&&p(C,L)&&J(C[L],k[L]),y=(C,k)=>l(C)&&k===0||l(k)&&C===0||e(C,k),h=(C,k)=>l(C)&&k===!1||l(k)&&C===!1||e(C,k),f=C=>l(C)||e(C,{})||C===!0,d=C=>l(C)||e(C,{}),m=C=>l(C)||s(C)||C===!0||C===!1;function _(C,k){return v(C)&&v(k)?!0:e(g(C),g(k))}function $(C,k){return C=u(C),k=u(k),e(g(C),g(k))}function w(C,k,L,J){var Z=r(c(C).concat(c(k)));return d(C)&&d(k)?!0:d(C)&&c(k).length||d(k)&&c(C).length?!1:Z.every(function(Y){var ne=C[Y],U=k[Y];return Array.isArray(ne)&&Array.isArray(U)?e(g(C),g(k)):Array.isArray(ne)&&!Array.isArray(U)||Array.isArray(U)&&!Array.isArray(ne)?!1:b(C,k,Y,J)})}function S(C,k,L,J){return s(C)&&s(k)?J(C,k):Array.isArray(C)&&Array.isArray(k)?w(C,k,L,J):e(C,k)}function A(C,k,L,J){var Z=n(C,J),Y=n(k,J),ne=i(Z,Y,J);return ne.length===Math.max(Z.length,Y.length)}var E={title:e,uniqueItems:h,minLength:y,minItems:y,minProperties:y,required:_,enum:_,type:$,items:S,anyOf:A,allOf:A,oneOf:A,properties:w,patternProperties:w,dependencies:w},T=["properties","patternProperties","dependencies","uniqueItems","minLength","minItems","minProperties","required"],R=["additionalProperties","additionalItems","contains","propertyNames","not"];function M(C,k,L){if(L=a(L,{ignore:[]}),f(C)&&f(k))return!0;if(!m(C)||!m(k))throw new Error("Either of the values are not a JSON schema.");if(C===k)return!0;if(o(C)&&o(k))return C===k;if(C===void 0&&k===!1||k===void 0&&C===!1||l(C)&&!l(k)||!l(C)&&l(k))return!1;var J=r(Object.keys(C).concat(Object.keys(k)));if(L.ignore.length&&(J=J.filter(Y=>L.ignore.indexOf(Y)===-1)),!J.length)return!0;function Z(Y,ne){return M(Y,ne,L)}return J.every(function(Y){var ne=C[Y],U=k[Y];if(R.indexOf(Y)!==-1)return M(ne,U,L);var j=E[Y];if(j||(j=e),e(ne,U))return!0;if(T.indexOf(Y)===-1&&(!p(C,Y)&&p(k,Y)||p(C,Y)&&!p(k,Y)))return ne===U;var K=j(ne,U,Y,Z);if(!o(K))throw new Error("Comparer must return true or false");return K})}return vu=M,vu}var bu,bm;function Ic(){if(bm)return bu;bm=1;function e(t){return Object.prototype.toString.call(t)==="[object Array]"}return bu=Array.isArray||e,bu}var _u,_m;function qx(){if(_m)return _u;_m=1;function e(t){return(typeof t=="number"||Object.prototype.toString.call(t)==="[object Number]")&&t.valueOf()===t.valueOf()}return _u=e,_u}var $u,$m;function jx(){if($m)return $u;$m=1;var e=qx();function t(r){return e(r)&&r%1===0}return $u=t,$u}var wu,wm;function i0(){if(wm)return wu;wm=1;var e=Ic(),t=jx();function r(n){var a;if(!e(n)||(a=n.length,!a))return!1;for(var i=0;iu&&(c=u,u=o,o=c),u=u-o}return l*o}function i(o,u){var l=0,c;if(o===0)return u;if(u===0)return o;for(;(o&1)===0&&(u&1)===0;)o>>>=1,u>>>=1,l++;for(;(o&1)===0;)o>>>=1;for(;u;){for(;(u&1)===0;)u>>>=1;o>u&&(c=u,u=o,o=c),u=u-o}return o<1){if(c=u[0],l=u[1],!r(l))throw new TypeError("gcd()::invalid input argument. Accessor must be a function. Value: `"+l+"`.")}else c=u[0];else throw new TypeError("gcd()::invalid input argument. Must provide an array of integers. Value: `"+u[0]+"`.");if(p=c.length,p<2)return null;if(l){for(g=new Array(p),b=0;b1){if(u=s[0],o=s[1],!n(o))throw new TypeError("lcm()::invalid input argument. Accessor must be a function. Value: `"+o+"`.")}else u=s[0];else throw new TypeError("lcm()::invalid input argument. Must provide an array of integers. Value: `"+s[0]+"`.");if(l=u.length,l<2)return null;if(o){for(c=new Array(l),g=0;g1?i[o-1]:void 0,l=o>2?i[2]:void 0;for(u=n.length>3&&typeof u=="function"?(o--,u):void 0,l&&t(i[0],i[1],l)&&(u=o<3?void 0:u,o=1),a=Object(a);++s-1;)y!==u&&s.call(y,h,1),s.call(u,h,1);return u}return ku=o,ku}var Lu,Lm;function Wx(){if(Lm)return Lu;Lm=1;var e=zx();function t(r,n){return r&&r.length&&n&&n.length?e(r,n):r}return Lu=t,Lu}var Bu,Bm;function Hx(){if(Bm)return Bu;Bm=1;var e=Qr();function t(r){return typeof r=="function"?r:e}return Bu=t,Bu}var Uu,Um;function f0(){if(Um)return Uu;Um=1;var e=Tb(),t=Zb(),r=Hx(),n=ze();function a(i,s){var o=n(i)?e:t;return o(i,r(s))}return Uu=a,Uu}var Ku,Km;function Gx(){if(Km)return Ku;Km=1;var e=Ta(),t=Pc(),r=Ec(),n=Ht(),a=Wt(),i=Ra(),s=200;function o(u,l,c,p){var g=-1,v=t,b=!0,y=u.length,h=[],f=l.length;if(!y)return h;c&&(l=n(l,a(c))),p?(v=r,b=!1):l.length>=s&&(v=i,b=!1,l=new e(l));e:for(;++gn(t(y.map(c))),u=(y,h)=>y.map(f=>f&&f[h]),l=(y,h)=>Object.prototype.hasOwnProperty.call(y,h),c=y=>r(y)||Array.isArray(y)?Object.keys(y):[],p=y=>y!==void 0,g=y=>r(y)||y===!0||y===!1,v=y=>!c(y).length&&y!==!1&&y!==!0;return zu={allUniqueKeys:o,deleteUndefinedProps:s,getValues:u,has:l,isEmptySchema:v,isSchema:g,keys:c,notUndefined:p,uniqWith:a,withoutArr:(y,...h)=>i.apply(null,[y].concat(e(h)))},zu}var Wu,Wm;function Jx(){if(Wm)return Wu;Wm=1;const e=Cc(),t=f0(),{allUniqueKeys:r,deleteUndefinedProps:n,getValues:a,keys:i,notUndefined:s,uniqWith:o,withoutArr:u}=p0();function l(p){t(p,function(g,v){g===!1&&delete p[v]})}function c(p,g){return r(p).reduce(function(b,y){const h=a(p,y),f=o(h.filter(s),e);return b[y]=g(f,y),b},{})}return Wu={keywords:["properties","patternProperties","additionalProperties"],resolver(p,g,v,b){b.ignoreAdditionalProperties||(p.forEach(function(h){const f=p.filter($=>$!==h),d=i(h.properties),_=i(h.patternProperties).map($=>new RegExp($));f.forEach(function($){const w=i($.properties),S=w.filter(E=>_.some(T=>T.test(E)));u(w,d,S).forEach(function(E){$.properties[E]=v.properties([$.properties[E],h.additionalProperties],E)})})}),p.forEach(function(h){const f=p.filter(m=>m!==h),d=i(h.patternProperties);h.additionalProperties===!1&&f.forEach(function(m){const _=i(m.patternProperties);u(_,d).forEach(w=>delete m.patternProperties[w])})}));const y={additionalProperties:v.additionalProperties(p.map(h=>h.additionalProperties)),patternProperties:c(p.map(h=>h.patternProperties),v.patternProperties),properties:c(p.map(h=>h.properties),v.properties)};return y.additionalProperties===!1&&l(y.properties),n(y)}},Wu}var Hu,Hm;function Zx(){if(Hm)return Hu;Hm=1;const e=Cc(),t=f0(),{allUniqueKeys:r,deleteUndefinedProps:n,has:a,isSchema:i,notUndefined:s,uniqWith:o}=p0();function u(g){t(g,function(v,b){v===!1&&g.splice(b,1)})}function l(g,v){return g.map(function(b){if(b)if(Array.isArray(b.items)){const y=b.items[v];if(i(y))return y;if(a(b,"additionalItems"))return b.additionalItems}else return b.items})}function c(g){return g.map(function(v){if(v)return Array.isArray(v.items)?v.additionalItems:v.items})}function p(g,v,b){return r(b).reduce(function(h,f){const d=l(g,f),m=o(d.filter(s),e);return h[f]=v(m,f),h},[])}return Hu={keywords:["items","additionalItems"],resolver(g,v,b){const y=g.map(m=>m.items),h=y.filter(s),f={};h.every(i)?f.items=b.items(y):f.items=p(g,b.items,y);let d;return h.every(Array.isArray)?d=g.map(m=>m.additionalItems):h.some(Array.isArray)&&(d=c(g)),d&&(f.additionalItems=b.additionalItems(d)),f.additionalItems===!1&&Array.isArray(f.items)&&u(f.items),n(f)}},Hu}var Gu,Gm;function Xx(){if(Gm)return Gu;Gm=1;const e=LO(),t=Cc(),r=Nx(),n=Ux(),a=c0(),i=d0(),s=Kx(),o=a0(),u=Wb(),l=Da(),c=Wx(),p=Qb(),g=Ac(),v=Oc(),b=Jx(),y=Zx(),h=(V,G)=>V.indexOf(G)!==-1,f=V=>l(V)||V===!0||V===!1,d=V=>V===!1,m=V=>V===!0,_=(V,G,x)=>x(V),$=V=>p(g(i(V))),w=V=>V!==void 0,S=V=>g(i(V.map(Y))),A=V=>V[0],E=V=>$(V),T=V=>Math.max.apply(Math,V),R=V=>Math.min.apply(Math,V),M=V=>V.some(m),C=V=>v(a(V),u);function k(V){return function(G,x){return t({[V]:G},{[V]:x})}}function L(V){let{allOf:G=[],...x}=V;return x=l(V)?x:V,[x,...G.map(L)]}function J(V,G){return V.map(x=>x&&x[G])}function Z(V,G){return V.map(function(x,q){try{return G(x,q)}catch{return}}).filter(w)}function Y(V){return l(V)||Array.isArray(V)?Object.keys(V):[]}function ne(V,G){if(G=G||[],!V.length)return G;const x=V.slice(0).shift(),q=V.slice(1);return G.length?ne(q,a(G.map(F=>x.map(z=>[z].concat(F))))):ne(q,x.map(F=>F))}function U(V,G){let x;try{x=V.map(function(q){return JSON.stringify(q,null,2)}).join(` -`)}catch{x=V.join(", ")}throw new Error('Could not resolve values for path:"'+G.join(".")+`". They are probably incompatible. Values: -`+x)}function j(V,G,x,q,F,z){if(V.length){const W=F.complexResolvers[G];if(!W||!W.resolver)throw new Error("No resolver found for "+G);const X=x.map(re=>V.reduce((de,se)=>(re[se]!==void 0&&(de[se]=re[se]),de),{})),ee=v(X,t),ce=W.keywords.reduce((re,de)=>({...re,[de]:(se,oe=[])=>q(se,null,z.concat(de,oe))}),{}),ie=W.resolver(ee,z.concat(G),ce,F);return l(ie)||U(ee,z.concat(G)),ie}}function K(V){return{required:V}}const D=["properties","patternProperties","definitions","dependencies"],P=["anyOf","oneOf"],I=["additionalProperties","additionalItems","contains","propertyNames","not","items"],N={type(V){if(V.some(Array.isArray)){const G=V.map(function(q){return Array.isArray(q)?q:[q]}),x=s.apply(null,G);if(x.length===1)return x[0];if(x.length>1)return g(x)}},dependencies(V,G,x){return S(V).reduce(function(F,z){const W=J(V,z);let X=v(W.filter(w),u);const ee=X.filter(Array.isArray);if(ee.length){if(ee.length===X.length)F[z]=$(X);else{const ce=X.filter(f),ie=ee.map(K);F[z]=x(ce.concat(ie),z)}return F}return X=v(X,t),F[z]=x(X,z),F},{})},oneOf(V,G,x){const q=ne(e(V)),F=Z(q,x),z=v(F,t);if(z.length)return z},not(V){return{anyOf:V}},pattern(V){return V.map(G=>"(?="+G+")").join("")},multipleOf(V){let G=V.slice(0),x=1;for(;G.some(q=>!Number.isInteger(q));)G=G.map(q=>q*10),x=x*10;return r(G)/x},enum(V){const G=o.apply(null,V.concat(u));if(G.length)return p(G)}};N.$id=A,N.$ref=A,N.$schema=A,N.additionalItems=_,N.additionalProperties=_,N.anyOf=N.oneOf,N.contains=_,N.default=A,N.definitions=N.dependencies,N.description=A,N.examples=C,N.exclusiveMaximum=R,N.exclusiveMinimum=T,N.items=y,N.maximum=R,N.maxItems=R,N.maxLength=R,N.maxProperties=R,N.minimum=T,N.minItems=T,N.minLength=T,N.minProperties=T,N.properties=b,N.propertyNames=_,N.required=E,N.title=A,N.uniqueItems=M;const B={properties:b,items:y};function Q(V,G,x){G=n(G,{ignoreAdditionalProperties:!1,resolvers:N,complexResolvers:B,deep:!0});const q=Object.entries(G.complexResolvers);function F(X,ee,ce){X=e(X.filter(w)),ce=ce||[];const ie=l(ee)?ee:{};if(!X.length)return;if(X.some(d))return!1;if(X.every(m))return!0;X=X.filter(l);const re=S(X);if(G.deep&&h(re,"allOf"))return Q({allOf:X},G);const de=q.map(([se,oe])=>re.filter(Oe=>oe.keywords.includes(Oe)));return de.forEach(se=>c(re,se)),re.forEach(function(se){const oe=J(X,se),Oe=v(oe.filter(w),k(se));if(Oe.length===1&&h(P,se))ie[se]=Oe[0].map(Te=>F([Te],Te));else if(Oe.length===1&&!h(D,se)&&!h(I,se))ie[se]=Oe[0];else{const Te=G.resolvers[se]||G.resolvers.defaultResolver;if(!Te)throw new Error("No resolver found for key "+se+". You can provide a resolver for this keyword in the options, or provide a default resolver.");const Me=(_e,xe=[])=>F(_e,null,ce.concat(se,xe));ie[se]=Te(Oe,ce.concat(se),Me,G),ie[se]===void 0?U(Oe,ce.concat(se)):ie[se]===void 0&&delete ie[se]}}),q.reduce((se,[oe,Oe],Te)=>({...se,...j(de[Te],oe,X,F,G,ce)}),ie)}const z=i(L(V));return F(z)}return Q.options={resolvers:N},Gu=Q,Gu}var Qx=Xx();const eC=Vr(Qx);function ar(e){let t;const r=ae(e,"discriminator.propertyName",void 0);return wa(r)?t=r:r!==void 0&&console.warn(`Expecting discriminator to be a string, got "${typeof r}" instead`),t}function Nr(e){return Array.isArray(e)?"array":typeof e=="string"?"string":e==null?"null":typeof e=="boolean"?"boolean":isNaN(e)?typeof e=="object"?"object":"string":"number"}var tC=nc(function(e){return xb(Jr(e,1,aa,!0))});function yt(e){let{type:t}=e;return!t&&e.const?Nr(e.const):!t&&e.enum?"string":!t&&(e.properties||e.additionalProperties)?"object":(Array.isArray(t)&&(t.length===2&&t.includes("null")?t=t.find(r=>r!=="null"):t=t[0]),t)}function vt(e,t){const r=Object.assign({},e);return Object.keys(t).reduce((n,a)=>{const i=e?e[a]:{},s=t[a];return e&&a in e&&me(s)?n[a]=vt(i,s):e&&t&&(yt(e)==="object"||yt(t)==="object")&&a===c$&&Array.isArray(i)&&Array.isArray(s)?n[a]=tC(i,s):n[a]=s,n},r)}function Ve(e,t,r={},n,a){return nt(e,t,r,n,void 0,void 0,a)[0]}function rC(e,t,r,n,a,i,s){const{if:o,then:u,else:l,...c}=t,p=e.isValid(o,i||{},r);let g=[c],v=[];if(n)u&&typeof u!="boolean"&&(v=v.concat(nt(e,u,r,i,n,a,s))),l&&typeof l!="boolean"&&(v=v.concat(nt(e,l,r,i,n,a,s)));else{const b=p?u:l;b&&typeof b!="boolean"&&(v=v.concat(nt(e,b,r,i,n,a,s)))}return v.length&&(g=v.map(b=>vt(c,b))),g.flatMap(b=>nt(e,b,r,i,n,a,s))}function h0(e){return e.reduce((r,n)=>n.length>1?n.flatMap(a=>Sb(r.length,i=>[...r[i]].concat(a))):(r.forEach(a=>a.push(n[0])),r),[[]])}function nC(e,t,r,n,a,i,s){const o=m0(e,t,r,n,a,i);if(o.length>1||o[0]!==t)return o;if(da in t)return g0(e,t,r,n,a,i).flatMap(l=>nt(e,l,r,i,n,a,s));if(sr in t&&Array.isArray(t.allOf)){const u=t.allOf.map(c=>nt(e,c,r,i,n,a,s));return h0(u).map(c=>({...t,allOf:c}))}return[t]}function m0(e,t,r,n,a,i,s){const o=Fr(t,r,a);return o!==t?nt(e,o,r,i,n,a,s):[t]}function Fr(e,t,r){if(!me(e))return e;let n=e;if(Re in n){const{$ref:a,...i}=n;if(r.includes(a))return n;r.push(a),n={...pb(a,t),...i}}if(Ie in n){const a=[],i=$A(n[Ie],(s,o,u)=>{const l=[...r];s[u]=Fr(o,t,l),a.push(l)},{});AA(r,FA(xA(a))),n={...n,[Ie]:i}}return xt in n&&!Array.isArray(n.items)&&typeof n.items!="boolean"&&(n={...n,items:Fr(n.items,t,r)}),Ae(e,n)?e:n}function aC(e,t,r,n,a){const i={...t,properties:{...t.properties}},s=n&&me(n)?n:{};return Object.keys(s).forEach(o=>{if(o in i.properties)return;let u={};typeof i.additionalProperties!="boolean"?Re in i.additionalProperties?u=Ve(e,{$ref:ae(i.additionalProperties,[Re])},r,s,a):"type"in i.additionalProperties?u={...i.additionalProperties}:Ze in i.additionalProperties||Ke in i.additionalProperties?u={type:"object",...i.additionalProperties}:u={type:Nr(ae(s,[o]))}:u={type:Nr(ae(s,[o]))},i.properties[o]=u,De(i.properties,[o,zr],!0)}),i}function nt(e,t,r,n,a=!1,i=[],s){return me(t)?nC(e,t,r,a,i,n,s).flatMap(u=>{var l;let c=u;if(u$ in c)return rC(e,c,r,a,i,n,s);if(sr in c){if(a){const{allOf:g,...v}=c;return[...g,v]}try{const g=[],v=[];(l=c.allOf)===null||l===void 0||l.forEach(b=>{typeof b=="object"&&b.contains?g.push(b):v.push(b)}),g.length&&(c={...c,allOf:v}),c=s?s(c):eC(c,{deep:!1}),g.length&&(c.allOf=g)}catch(g){console.warn(`could not merge subschemas in allOf: -`,g);const{allOf:v,...b}=c;return b}}return _l in c&&c.additionalProperties!==!1?aC(e,c,r,n,s):c}):[{}]}function iC(e,t,r,n,a){let i;const{oneOf:s,anyOf:o,...u}=t;if(Array.isArray(s)?i=s:Array.isArray(o)&&(i=o),i){const l=a===void 0&&n?{}:a,c=ar(t);i=i.map(g=>Fr(g,r,[]));const p=tc(e,l,i,r,c);if(n)return i.map(g=>vt(u,g));t=vt(u,i[p])}return[t]}function g0(e,t,r,n,a,i,s){const{dependencies:o,...u}=t;return iC(e,u,r,n,i).flatMap(c=>y0(e,o,c,r,n,a,i,s))}function y0(e,t,r,n,a,i,s,o){let u=[r];for(const l in t){if(!a&&ae(s,[l])===void 0||r.properties&&!(l in r.properties))continue;const[c,p]=Ql(l,t);return Array.isArray(p)?u[0]=sC(r,p):me(p)&&(u=oC(e,r,n,l,p,a,i,s,o)),u.flatMap(g=>y0(e,c,g,n,a,i,s,o))}return u}function sC(e,t){if(!t)return e;const r=Array.isArray(e.required)?Array.from(new Set([...e.required,...t])):t;return{...e,required:r}}function oC(e,t,r,n,a,i,s,o,u){return nt(e,a,r,o,i,s,u).flatMap(c=>{const{oneOf:p,...g}=c;if(t=vt(t,g),p===void 0)return t;const v=p.map(y=>typeof y=="boolean"||!(Re in y)?[y]:m0(e,y,r,i,s,o));return h0(v).flatMap(y=>uC(e,t,r,n,y,i,s,o,u))})}function uC(e,t,r,n,a,i,s,o,u){const l=a.filter(c=>{if(typeof c=="boolean"||!c||!c.properties)return!1;const{[n]:p}=c.properties;if(p){const g={type:"object",properties:{[n]:p}};return e.isValid(g,o,r)||i}return!1});return!i&&l.length!==1?(console.warn("ignoring oneOf in dependencies because there isn't exactly one subschema that is valid"),[t]):l.flatMap(c=>{const p=c,[g]=Ql(n,p.properties),v={...p,properties:g};return nt(e,v,r,o,i,s,u).map(y=>vt(t,y))})}const lC={type:"object",$id:l$,properties:{__not_really_there__:{type:"number"}}};function Ol(e,t,r,n,a){let i=0;return r&&(Se(r.properties)?i+=sA(r.properties,(s,o,u)=>{const l=ae(n,u);if(typeof o=="boolean")return s;if(Fe(o,Re)){const c=Ve(e,o,t,l,a);return s+Ol(e,t,c,l||{},a)}if((Fe(o,Ke)||Fe(o,Ze))&&l){const c=Fe(o,Ke)?Ke:Ze,p=ar(o);return s+Mr(e,t,l,ae(o,c),-1,p,a)}if(o.type==="object")return Se(l)&&(s+=1),s+Ol(e,t,o,l,a);if(o.type===Nr(l)){let c=s+1;return o.default?c+=l===o.default?1:-1:o.const&&(c+=l===o.const?1:-1),c}return s},0):wa(r.type)&&r.type===Nr(n)&&(i+=1)),i}function Mr(e,t,r,n,a=-1,i,s){const o=n.map(g=>Fr(g,t,[])),u=Pb(r,n,i);if(mb(u))return u;const l=o.reduce((g,v,b)=>(tc(e,r,[lC,v],t,i)===1&&g.push(b),g),[]);if(l.length===1)return l[0];l.length||Sb(o.length,g=>l.push(g));const c=new Set,{bestIndex:p}=l.reduce((g,v)=>{const{bestScore:b}=g,y=o[v],h=Ol(e,t,y,r,s);return c.add(h),h>b?{bestIndex:v,bestScore:h}:g},{bestIndex:a,bestScore:0});return c.size===1&&a>=0?a:p}function xl(e){return Array.isArray(e.items)&&e.items.length>0&&e.items.every(t=>me(t))}function Cr(e){return e==null}function kr(e,t,r=!1,n=!1,a=!1){if(Array.isArray(t)){const i=Array.isArray(e)?e:[],s=a?i:t,o=a?t:i,u=s.map((l,c)=>o[c]!==void 0?kr(i[c],t[c],r,n,a):l);return(r||a)&&u.length{const u=ae(t,o),l=me(e)&&o in e,c=o in t;return s[o]=kr(e?ae(e,o):{},u,r,n,a&&(l||!c)),s},i)}return n&&(!Cr(e)&&Cr(t)||typeof t=="number"&&isNaN(t))||a&&!Cr(t)?e:t}function ht(e,t,r=!1){return Object.keys(t).reduce((n,a)=>{const i=e?e[a]:{},s=t[a];if(e&&a in e&&me(s))n[a]=ht(i,s,r);else if(r&&Array.isArray(i)&&Array.isArray(s)){let o=s;r==="preventDuplicates"&&(o=s.reduce((u,l)=>(i.includes(l)||u.push(l),u),[])),n[a]=i.concat(o)}else n[a]=s;return n},Object.assign({},e))}function v0(e){return Array.isArray(e.enum)&&e.enum.length===1||gt in e}function Tc(e,t,r={},n){const a=Ve(e,t,r,void 0,n),i=a.oneOf||a.anyOf;return Array.isArray(a.enum)?!0:Array.isArray(i)?i.every(s=>typeof s!="boolean"&&v0(s)):!1}function Rc(e,t,r,n){return!t.uniqueItems||!t.items||typeof t.items=="boolean"?!1:Tc(e,t.items,r,n)}function b0(e){const t=e[gt],r=yt(e);return me(t)&&wa(t?.$data)&&r!=="object"&&r!=="array"}function cC(e){if(o$ in e&&Array.isArray(e.enum)&&e.enum.length===1)return e.enum[0];if(gt in e)return e.const;throw new Error("schema cannot be inferred as a constant")}function Lr(e,t){const r=e;if(e.enum){let i;if(t){const{enumNames:s}=he(t);i=s}return!i&&r.enumNames&&(i=r.enumNames),e.enum.map((s,o)=>({label:i?.[o]||String(s),value:s}))}let n,a;return e.anyOf?(n=e.anyOf,a=t?.anyOf):e.oneOf&&(n=e.oneOf,a=t?.oneOf),n&&n.map((i,s)=>{const{title:o}=he(a?.[s]),u=i,l=cC(u),c=o||u.title||String(l);return{schema:u,label:c,value:l}})}const dC=["string","number","integer","boolean","null"];var ir;(function(e){e[e.Ignore=0]="Ignore",e[e.Invert=1]="Invert",e[e.Fallback=2]="Fallback"})(ir||(ir={}));function Yu(e,t=ir.Ignore,r=-1){if(r>=0){if(Array.isArray(e.items)&&rCt(e,_,{rootSchema:i,includeUndefinedValues:s,_recurseList:o,experimental_defaultFormStateBehavior:u,experimental_customMergeAllOf:l,parentDefaults:Array.isArray(n)?n[$]:void 0,rawFormData:g,required:c,shouldMergeDefaultsIntoFormData:p}));else if(Ke in v){const{oneOf:_,...$}=v;if(_.length===0)return;const w=ar(v),{type:S="null"}=$;!Array.isArray(S)&&dC.includes(S)&&h?.constAsDefaults==="skipOneOf"&&(h={...h,constAsDefaults:"never"}),y=_[Mr(e,i,a??v.default,_,0,w,l)],y=vt($,y)}else if(Ze in v){const{anyOf:_,...$}=v;if(_.length===0)return;const w=ar(v);y=_[Mr(e,i,a??v.default,_,0,w,l)],y=vt($,y)}if(y)return Ct(e,y,{rootSchema:i,includeUndefinedValues:s,_recurseList:f,experimental_defaultFormStateBehavior:h,experimental_customMergeAllOf:l,parentDefaults:b,rawFormData:a??g,required:c,shouldMergeDefaultsIntoFormData:p});b===void 0&&(b=v.default);const d=Jm(e,v,r,b);let m=d??b;if(p){const{arrayMinItems:_={}}=u||{},{mergeExtraDefaults:$}=_,w=fC(e,v,i,a,u,l);(!me(a)||sr in v)&&(m=kr(m,w,$,!0))}return m}function fC(e,t,r,n,a,i){const s=!v0(t)&&Tc(e,t,r,i);let o=n;if(s){const l=Lr(t);o=l?.some(p=>Ae(p.value,n))?n:void 0}return t[gt]&&a?.constAsDefaults==="always"&&(o=t.const),o}function pC(e,t,{rawFormData:r,rootSchema:n={},includeUndefinedValues:a=!1,_recurseList:i=[],experimental_defaultFormStateBehavior:s=void 0,experimental_customMergeAllOf:o=void 0,required:u,shouldMergeDefaultsIntoFormData:l}={},c){{const p=me(r)?r:{},g=t,v=s?.allOf==="populateDefaults"&&sr in g?Ve(e,g,n,p,o):g,b=v[gt],y=Object.keys(v.properties||{}).reduce((h,f)=>{var d;const m=ae(v,[Ie,f]),_=me(b)&&b[f]!==void 0,$=(me(m)&> in m||_)&&s?.constAsDefaults!=="never"&&!b0(m),w=Ct(e,m,{rootSchema:n,_recurseList:i,experimental_defaultFormStateBehavior:s,experimental_customMergeAllOf:o,includeUndefinedValues:a===!0,parentDefaults:ae(c,[f]),rawFormData:ae(p,[f]),required:(d=v.required)===null||d===void 0?void 0:d.includes(f),shouldMergeDefaultsIntoFormData:l});return Ym(h,f,w,a,u,v.required,s,$),h},{});if(v.additionalProperties){const h=me(v.additionalProperties)?v.additionalProperties:{},f=new Set;me(c)&&Object.keys(c).filter(m=>!v.properties||!v.properties[m]).forEach(m=>f.add(m));const d=[];Object.keys(p).filter(m=>!v.properties||!v.properties[m]).forEach(m=>{f.add(m),d.push(m)}),f.forEach(m=>{var _;const $=Ct(e,h,{rootSchema:n,_recurseList:i,experimental_defaultFormStateBehavior:s,experimental_customMergeAllOf:o,includeUndefinedValues:a===!0,parentDefaults:ae(c,[m]),rawFormData:ae(p,[m]),required:(_=v.required)===null||_===void 0?void 0:_.includes(m),shouldMergeDefaultsIntoFormData:l});Ym(y,m,$,a,u,d)})}return y}}function hC(e,t,{rawFormData:r,rootSchema:n={},_recurseList:a=[],experimental_defaultFormStateBehavior:i=void 0,experimental_customMergeAllOf:s=void 0,required:o,shouldMergeDefaultsIntoFormData:u}={},l){var c,p;const g=t,v=(c=i?.arrayMinItems)!==null&&c!==void 0?c:{},{populate:b,mergeExtraDefaults:y}=v,h=b==="never",f=b==="requiredOnly",d=b==="all"||!h&&!f,m=(p=v?.computeSkipPopulate)!==null&&p!==void 0?p:()=>!1,$=i?.emptyObjectFields==="skipEmptyDefaults"?void 0:[];if(Array.isArray(l)&&(l=l.map((M,C)=>{const k=Yu(g,ir.Fallback,C);return Ct(e,k,{rootSchema:n,_recurseList:a,experimental_defaultFormStateBehavior:i,experimental_customMergeAllOf:s,parentDefaults:M,required:o,shouldMergeDefaultsIntoFormData:u})})),Array.isArray(r)){const M=Yu(g);if(h)l=r;else{const C=r.map((L,J)=>Ct(e,M,{rootSchema:n,_recurseList:a,experimental_defaultFormStateBehavior:i,experimental_customMergeAllOf:s,rawFormData:L,parentDefaults:ae(l,[J]),required:o,shouldMergeDefaultsIntoFormData:u}));l=kr(l,C,(f&&o||d)&&y)}}if((me(g)&> in g&&i?.constAsDefaults!=="never")===!1){if(h)return l??$;if(f&&!o)return l||void 0}const S=Array.isArray(l)?l.length:0;if(!g.minItems||Rc(e,g,n,s)||m(e,g,n)||g.minItems<=S)return l||$;const A=l||[],E=Yu(g,ir.Invert),T=E.default,R=new Array(g.minItems-S).fill(Ct(e,E,{parentDefaults:T,rootSchema:n,_recurseList:a,experimental_defaultFormStateBehavior:i,experimental_customMergeAllOf:s,required:o,shouldMergeDefaultsIntoFormData:u}));return A.concat(R)}function Jm(e,t,r={},n){switch(yt(t)){case"object":return pC(e,t,r,n);case"array":return hC(e,t,r,n)}}function _0(e,t,r,n,a=!1,i,s){if(!me(t))throw new Error("Invalid schema: "+t);const o=Ve(e,t,n,r,s),u=Ct(e,o,{rootSchema:n,includeUndefinedValues:a,experimental_defaultFormStateBehavior:i,experimental_customMergeAllOf:s,rawFormData:r,shouldMergeDefaultsIntoFormData:!0});if(me(r)||Array.isArray(r)){const{mergeDefaultsIntoFormData:l}=i||{};return kr(u,r,!0,l==="useDefaultIfFormDataUndefined",!0)}return u}function $0(e={}){return"widget"in he(e)&&he(e).widget!=="hidden"}function w0(e,t,r={},n,a){if(r[Ml]==="files")return!0;if(t.items){const i=Ve(e,t.items,n,void 0,a);return i.type==="string"&&i.format==="data-url"}return!1}function mC(e,t,r={},n,a,i){const s=he(r,a),{label:o=!0}=s;let u=!!o;const l=yt(t);return l==="array"&&(u=Rc(e,t,n,i)||w0(e,t,r,n,i)||$0(r)),l==="object"&&(u=!1),l==="boolean"&&!r[Ml]&&(u=!1),r[d$]&&(u=!1),u}function gC(e,t,r){if(!r)return t;const{errors:n,errorSchema:a}=t;let i=e.toErrorList(r),s=r;return nr(a)||(s=ht(a,r,!0),i=[...n].concat(i)),{errorSchema:s,errors:i}}const Jt=Symbol("no Value");function Cl(e,t,r,n,a={},i){let s;if(Fe(r,Ie)){const o={};if(Fe(n,Ie)){const c=ae(n,Ie,{});Object.keys(c).forEach(p=>{Fe(a,p)&&(o[p]=void 0)})}const u=Object.keys(ae(r,Ie,{})),l={};u.forEach(c=>{const p=ae(a,c);let g=ae(n,[Ie,c],{}),v=ae(r,[Ie,c],{});Fe(g,Re)&&(g=Ve(e,g,t,p,i)),Fe(v,Re)&&(v=Ve(e,v,t,p,i));const b=ae(g,"type"),y=ae(v,"type");if(!b||b===y)if(Fe(o,c)&&delete o[c],y==="object"||y==="array"&&Array.isArray(p)){const h=Cl(e,t,v,g,p,i);(h!==void 0||y==="array")&&(l[c]=h)}else{const h=ae(v,"default",Jt),f=ae(g,"default",Jt);h!==Jt&&h!==p&&(f===p?o[c]=h:ae(v,"readOnly")===!0&&(o[c]=void 0));const d=ae(v,"const",Jt),m=ae(g,"const",Jt);d!==Jt&&d!==p&&(o[c]=m===p?d:void 0)}}),s={...typeof a=="string"||Array.isArray(a)?void 0:a,...o,...l}}else if(ae(n,"type")==="array"&&ae(r,"type")==="array"&&Array.isArray(a)){let o=ae(n,"items"),u=ae(r,"items");if(typeof o=="object"&&typeof u=="object"&&!Array.isArray(o)&&!Array.isArray(u)){Fe(o,Re)&&(o=Ve(e,o,t,a,i)),Fe(u,Re)&&(u=Ve(e,u,t,a,i));const l=ae(o,"type"),c=ae(u,"type");if(!l||l===c){const p=ae(r,"maxItems",-1);c==="object"?s=a.reduce((g,v)=>{const b=Cl(e,t,u,o,v,i);return b!==void 0&&(p<0||g.length0&&a.length>p?a.slice(0,p):a}}else typeof o=="boolean"&&typeof u=="boolean"&&o===u&&(s=a)}return s}function Gn(e,t,r,n,a,i,s,o=[],u){if(Re in t||da in t||sr in t){const p=Ve(e,t,i,s,u);if(o.findIndex(v=>Ae(v,p))===-1)return Gn(e,p,r,n,a,i,s,o.concat(p),u)}if(xt in t&&!ae(t,[xt,Re]))return Gn(e,ae(t,xt),r,n,a,i,s,o,u);const c={$id:a||r};if(yt(t)==="object"&&Ie in t)for(const p in t.properties){const g=ae(t,[Ie,p]),v=c[Ot]+n+p;c[p]=Gn(e,me(g)?g:{},r,n,v,i,ae(s,[p]),o,u)}return c}function yC(e,t,r,n,a,i="root",s="_",o){return Gn(e,t,i,s,r,n,a,void 0,o)}function Nt(e,t,r,n,a,i=[],s){if(Re in t||da in t||sr in t){const u=Ve(e,t,n,a,s);if(i.findIndex(c=>Ae(c,u))===-1)return Nt(e,u,r,n,a,i.concat(u),s)}let o={[Hn]:r.replace(/^\./,"")};if(Ke in t||Ze in t){const u=Ke in t?t.oneOf:t.anyOf,l=ar(t),c=Mr(e,n,a,u,0,l,s),p=u[c];o={...o,...Nt(e,p,r,n,a,i,s)}}if(_l in t&&t[_l]!==!1&&De(o,Fl,!0),xt in t&&Array.isArray(a)){const{items:u,additionalItems:l}=t;Array.isArray(u)?a.forEach((c,p)=>{u[p]?o[p]=Nt(e,u[p],`${r}.${p}`,n,c,i,s):l?o[p]=Nt(e,l,`${r}.${p}`,n,c,i,s):console.warn(`Unable to generate path schema for "${r}.${p}". No schema defined for it`)}):a.forEach((c,p)=>{o[p]=Nt(e,u,`${r}.${p}`,n,c,i,s)})}else if(Ie in t)for(const u in t.properties){const l=ae(t,[Ie,u]);o[u]=Nt(e,l,`${r}.${u}`,n,ae(a,[u]),i,s)}return o}function vC(e,t,r="",n,a,i){return Nt(e,t,r,n,a,void 0,i)}class bC{constructor(t,r,n,a){this.rootSchema=r,this.validator=t,this.experimental_defaultFormStateBehavior=n,this.experimental_customMergeAllOf=a}getValidator(){return this.validator}doesSchemaUtilsDiffer(t,r,n={},a){return!t||!r?!1:this.validator!==t||!Ae(this.rootSchema,r)||!Ae(this.experimental_defaultFormStateBehavior,n)||this.experimental_customMergeAllOf!==a}getDefaultFormState(t,r,n=!1){return _0(this.validator,t,r,this.rootSchema,n,this.experimental_defaultFormStateBehavior,this.experimental_customMergeAllOf)}getDisplayLabel(t,r,n){return mC(this.validator,t,r,this.rootSchema,n,this.experimental_customMergeAllOf)}getClosestMatchingOption(t,r,n,a){return Mr(this.validator,this.rootSchema,t,r,n,a,this.experimental_customMergeAllOf)}getFirstMatchingOption(t,r,n){return tc(this.validator,t,r,this.rootSchema,n)}getMatchingOption(t,r,n){return Eb(this.validator,t,r,this.rootSchema,n)}isFilesArray(t,r){return w0(this.validator,t,r,this.rootSchema,this.experimental_customMergeAllOf)}isMultiSelect(t){return Rc(this.validator,t,this.rootSchema,this.experimental_customMergeAllOf)}isSelect(t){return Tc(this.validator,t,this.rootSchema,this.experimental_customMergeAllOf)}mergeValidationData(t,r){return gC(this.validator,t,r)}retrieveSchema(t,r){return Ve(this.validator,t,this.rootSchema,r,this.experimental_customMergeAllOf)}sanitizeDataForNewSchema(t,r,n){return Cl(this.validator,this.rootSchema,t,r,n,this.experimental_customMergeAllOf)}toIdSchema(t,r,n,a="root",i="_"){return yC(this.validator,t,r,this.rootSchema,n,a,i,this.experimental_customMergeAllOf)}toPathSchema(t,r,n){return vC(this.validator,t,r,this.rootSchema,n,this.experimental_customMergeAllOf)}}function _C(e,t,r={},n){return new bC(e,t,r,n)}function $C(e){var t;if(e.indexOf("data:")===-1)throw new Error("File is invalid: URI must be a dataURI");const n=e.slice(5).split(";base64,");if(n.length!==2)throw new Error("File is invalid: dataURI must be base64");const[a,i]=n,[s,...o]=a.split(";"),u=s||"",l=decodeURI(((t=o.map(c=>c.split("=")).find(([c])=>c==="name"))===null||t===void 0?void 0:t[1])||"unknown");try{const c=atob(i),p=new Array(c.length);for(let v=0;v 0, got one of each`);if(e>t)return S0(t,e).reverse();const r=[];for(let n=e;n<=t;n++)r.push({value:n,label:At(n,2)});return r}function wC(e,t){let r=e;if(Array.isArray(t)){const n=r.split(/(%\d)/);t.forEach((a,i)=>{const s=n.findIndex(o=>o===`%${i+1}`);s>=0&&(n[s]=a)}),r=n.join("")}return r}function SC(e,t){return wC(e,t)}function at(e,t=[],r){if(Array.isArray(e))return e.map(i=>at(i,t)).filter(i=>i!==r);const n=e===""||e===null?-1:Number(e),a=t[n];return a?a.value:r}function PC(e,t,r=[]){const n=at(e,r);return Array.isArray(t)?t.filter(a=>!Ae(a,n)):Ae(n,t)?void 0:t}function qc(e,t){return Array.isArray(t)?t.some(r=>Ae(r,e)):Ae(t,e)}function EC(e,t=[],r=!1){const n=t.map((a,i)=>qc(a.value,e)?String(i):void 0).filter(a=>typeof a<"u");return r?n:n[0]}function AC(e,t,r=[]){const n=at(e,r);if(!Cr(n)){const a=r.findIndex(o=>n===o.value),i=r.map(({value:o})=>o);return t.slice(0,a).concat(n,t.slice(a)).sort((o,u)=>+(i.indexOf(o)>i.indexOf(u)))}return t}var OC=1,xC=4;function P0(e){return xr(e,OC|xC)}function CC(e,t,r,n){return n=typeof n=="function"?n:void 0,e==null?e:rc(e,t,r,n)}class IC{constructor(t){this.errorSchema={},this.resetAllErrors(t)}get ErrorSchema(){return this.errorSchema}getOrCreateErrorBlock(t){let n=Array.isArray(t)&&t.length>0||typeof t=="string"?ae(this.errorSchema,t):this.errorSchema;return!n&&t&&(n={},CC(this.errorSchema,t,n,Object)),n}resetAllErrors(t){return this.errorSchema=t?P0(t):{},this}addErrors(t,r){const n=this.getOrCreateErrorBlock(r);let a=ae(n,Ue);return Array.isArray(a)||(a=[],n[Ue]=a),Array.isArray(t)?De(n,Ue,[...new Set([...a,...t])]):De(n,Ue,[...new Set([...a,t])]),this}setErrors(t,r){const n=this.getOrCreateErrorBlock(r),a=Array.isArray(t)?[...new Set([...t])]:[t];return De(n,Ue,a),this}clearErrors(t){const r=this.getOrCreateErrorBlock(t);return De(r,Ue,[]),this}}function TC(e,t,r=[1900,new Date().getFullYear()+2],n="YMD"){const{day:a,month:i,year:s,hour:o,minute:u,second:l}=e,c={type:"day",range:[1,31],value:a},p={type:"month",range:[1,12],value:i},g={type:"year",range:r,value:s},v=[];switch(n){case"MDY":v.push(p,c,g);break;case"DMY":v.push(c,p,g);break;case"YMD":default:v.push(g,p,c)}return t&&v.push({type:"hour",range:[0,23],value:o},{type:"minute",range:[0,59],value:u},{type:"second",range:[0,59],value:l}),v}function RC(e){const t={};return e.multipleOf&&(t.step=e.multipleOf),(e.minimum||e.minimum===0)&&(t.min=e.minimum),(e.maximum||e.maximum===0)&&(t.max=e.maximum),t}function E0(e,t,r={},n=!0){const a={type:t||"text",...RC(e)};return r.inputType?a.type=r.inputType:t||(e.type==="number"?(a.type="number",n&&a.step===void 0&&(a.step="any")):e.type==="integer"&&(a.type="number",a.step===void 0&&(a.step=1))),r.autocomplete&&(a.autoComplete=r.autocomplete),r.accept&&(a.accept=r.accept),a}const Zm={props:{disabled:!1},submitText:"Submit",norender:!1};function qC(e={}){const t=he(e);if(t&&t[Qn]){const r=t[Qn];return{...Zm,...r}}return Zm}function ve(e,t,r={}){const{templates:n}=t;return e==="ButtonTemplates"?n[e]:r[e]||n[e]}var Ju={exports:{}},ye={};/** - * @license React - * react-is.production.min.js - * - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - */var Xm;function jC(){if(Xm)return ye;Xm=1;var e=Symbol.for("react.element"),t=Symbol.for("react.portal"),r=Symbol.for("react.fragment"),n=Symbol.for("react.strict_mode"),a=Symbol.for("react.profiler"),i=Symbol.for("react.provider"),s=Symbol.for("react.context"),o=Symbol.for("react.server_context"),u=Symbol.for("react.forward_ref"),l=Symbol.for("react.suspense"),c=Symbol.for("react.suspense_list"),p=Symbol.for("react.memo"),g=Symbol.for("react.lazy"),v=Symbol.for("react.offscreen"),b;b=Symbol.for("react.module.reference");function y(h){if(typeof h=="object"&&h!==null){var f=h.$$typeof;switch(f){case e:switch(h=h.type,h){case r:case a:case n:case l:case c:return h;default:switch(h=h&&h.$$typeof,h){case o:case s:case u:case g:case p:case i:return h;default:return f}}case t:return f}}}return ye.ContextConsumer=s,ye.ContextProvider=i,ye.Element=e,ye.ForwardRef=u,ye.Fragment=r,ye.Lazy=g,ye.Memo=p,ye.Portal=t,ye.Profiler=a,ye.StrictMode=n,ye.Suspense=l,ye.SuspenseList=c,ye.isAsyncMode=function(){return!1},ye.isConcurrentMode=function(){return!1},ye.isContextConsumer=function(h){return y(h)===s},ye.isContextProvider=function(h){return y(h)===i},ye.isElement=function(h){return typeof h=="object"&&h!==null&&h.$$typeof===e},ye.isForwardRef=function(h){return y(h)===u},ye.isFragment=function(h){return y(h)===r},ye.isLazy=function(h){return y(h)===g},ye.isMemo=function(h){return y(h)===p},ye.isPortal=function(h){return y(h)===t},ye.isProfiler=function(h){return y(h)===a},ye.isStrictMode=function(h){return y(h)===n},ye.isSuspense=function(h){return y(h)===l},ye.isSuspenseList=function(h){return y(h)===c},ye.isValidElementType=function(h){return typeof h=="string"||typeof h=="function"||h===r||h===a||h===n||h===l||h===c||h===v||typeof h=="object"&&h!==null&&(h.$$typeof===g||h.$$typeof===p||h.$$typeof===i||h.$$typeof===s||h.$$typeof===u||h.$$typeof===b||h.getModuleId!==void 0)},ye.typeOf=y,ye}var Qm;function DC(){return Qm||(Qm=1,Ju.exports=jC()),Ju.exports}var NC=DC();const eg=Vr(NC),Zu={boolean:{checkbox:"CheckboxWidget",radio:"RadioWidget",select:"SelectWidget",hidden:"HiddenWidget"},string:{text:"TextWidget",password:"PasswordWidget",email:"EmailWidget",hostname:"TextWidget",ipv4:"TextWidget",ipv6:"TextWidget",uri:"URLWidget","data-url":"FileWidget",radio:"RadioWidget",select:"SelectWidget",textarea:"TextareaWidget",hidden:"HiddenWidget",date:"DateWidget",datetime:"DateTimeWidget","date-time":"DateTimeWidget","alt-date":"AltDateWidget","alt-datetime":"AltDateTimeWidget",time:"TimeWidget",color:"ColorWidget",file:"FileWidget"},number:{text:"TextWidget",select:"SelectWidget",updown:"UpDownWidget",range:"RangeWidget",radio:"RadioWidget",hidden:"HiddenWidget"},integer:{text:"TextWidget",select:"SelectWidget",updown:"UpDownWidget",range:"RangeWidget",radio:"RadioWidget",hidden:"HiddenWidget"},array:{select:"SelectWidget",checkboxes:"CheckboxesWidget",files:"FileWidget",hidden:"HiddenWidget"}};function FC(e){let t=ae(e,"MergedWidget");if(!t){const r=e.defaultProps&&e.defaultProps.options||{};t=({options:n,...a})=>O.jsx(e,{options:{...r,...n},...a}),De(e,"MergedWidget",t)}return t}function mt(e,t,r={}){const n=yt(e);if(typeof t=="function"||t&&eg.isForwardRef(H.createElement(t))||eg.isMemo(t))return FC(t);if(typeof t!="string")throw new Error(`Unsupported widget definition: ${typeof t}`);if(t in r){const a=r[t];return mt(e,a,r)}if(typeof n=="string"){if(!(n in Zu))throw new Error(`No widget for type '${n}'`);if(t in Zu[n]){const a=r[Zu[n][t]];return mt(e,a,r)}}throw new Error(`No widget '${t}' for type '${n}'`)}function MC(e){let t=0;for(let r=0;r(t.add(r),n)),MC(JSON.stringify(e,Array.from(t).sort()))}function LC(e,t,r={}){try{return mt(e,t,r),!0}catch(n){const a=n;if(a.message&&(a.message.startsWith("No widget")||a.message.startsWith("Unsupported widget")))return!1;throw n}}function en(e,t){return`${wa(e)?e:e[Ot]}__${t}`}function tn(e){return en(e,"description")}function A0(e){return en(e,"error")}function Il(e){return en(e,"examples")}function O0(e){return en(e,"help")}function x0(e){return en(e,"title")}function Yt(e,t=!1){const r=t?` ${Il(e)}`:"";return`${A0(e)} ${tn(e)} ${O0(e)}${r}`}function C0(e,t){return`${e}-${t}`}function BC(e,t,r){return t?r:e}function UC(e){return e?new Date(e).toJSON():void 0}function KC(e,t){if(!Array.isArray(t))return e;const r=c=>c.reduce((p,g)=>(p[g]=!0,p),{}),n=c=>c.length>1?`properties '${c.join("', '")}'`:`property '${c[0]}'`,a=r(e),i=t.filter(c=>c==="*"||a[c]),s=r(i),o=e.filter(c=>!s[c]),u=i.indexOf("*");if(u===-1){if(o.length)throw new Error(`uiSchema order list does not contain ${n(o)}`);return i}if(u!==i.lastIndexOf("*"))throw new Error("uiSchema order list contains more than one wildcard item");const l=[...i];return l.splice(u,1,...o),l}function Xu(e,t=!0){if(!e)return{year:-1,month:-1,day:-1,hour:t?-1:0,minute:t?-1:0,second:t?-1:0};const r=new Date(e);if(Number.isNaN(r.getTime()))throw new Error("Unable to parse date "+e);return{year:r.getUTCFullYear(),month:r.getUTCMonth()+1,day:r.getUTCDate(),hour:t?r.getUTCHours():0,minute:t?r.getUTCMinutes():0,second:t?r.getUTCSeconds():0}}function Yn(e){if(e.const||e.enum&&e.enum.length===1&&e.enum[0]===!0)return!0;if(e.anyOf&&e.anyOf.length===1)return Yn(e.anyOf[0]);if(e.oneOf&&e.oneOf.length===1)return Yn(e.oneOf[0]);if(e.allOf){const t=r=>Yn(r);return e.allOf.some(t)}return!1}function VC(e,t,r){const{props:n,state:a}=e;return!Ae(n,t)||!Ae(a,r)}function tg(e,t=!0){const{year:r,month:n,day:a,hour:i=0,minute:s=0,second:o=0}=e,u=Date.UTC(r,n-1,a,i,s,o),l=new Date(u).toJSON();return t?l:l.slice(0,10)}function Br(e,t=[]){if(!e)return[];let r=[];return Ue in e&&(r=r.concat(e[Ue].map(n=>{const a=`.${t.join(".")}`;return{property:a,message:n,stack:`${a} ${n}`}}))),Object.keys(e).reduce((n,a)=>{if(a!==Ue){const i=e[a];Mt(i)&&(n=n.concat(Br(i,[...t,a])))}return n},r)}function I0(e){return qe(e)?ba(e,Kt):Gr(e)?[e]:Jl(Jv(Xv(e)))}function zC(e){const t=new IC;return e.length&&e.forEach(r=>{const{property:n,message:a}=r,i=n==="."?[]:I0(n);i.length>0&&i[0]===""&&i.splice(0,1),a&&t.addErrors(a,i)}),t.ErrorSchema}function jc(e){return Object.keys(e).reduce((t,r)=>{if(r==="addError")return t;{const n=e[r];return Mt(n)?{...t,[r]:jc(n)}:{...t,[r]:n}}},{})}function WC(e){if(!e)return"";const t=new Date(e),r=At(t.getFullYear(),4),n=At(t.getMonth()+1,2),a=At(t.getDate(),2),i=At(t.getHours(),2),s=At(t.getMinutes(),2),o=At(t.getSeconds(),2),u=At(t.getMilliseconds(),3);return`${r}-${n}-${a}T${i}:${s}:${o}.${u}`}function Jn(e,t){if(!t)return e;const{errors:r,errorSchema:n}=e;let a=Br(t),i=t;return nr(n)||(i=ht(n,t,!0),a=[...r].concat(a)),{errorSchema:i,errors:a}}function HC(e){for(const t in e){const r=e,n=r[t];t===Re&&typeof n=="string"&&n.startsWith("#")?r[t]=Nv+n:r[t]=Dc(n)}return e}function GC(e){for(let t=0;t=JC&&(i=kl,s=!1,t=new er(t));e:for(;++a!Ae(s,ae(t,o)))),i=XC(rt(t),rt(e));return[...a,...i]}}var $e;(function(e){e.ArrayItemTitle="Item",e.MissingItems="Missing items definition",e.YesLabel="Yes",e.NoLabel="No",e.CloseLabel="Close",e.ErrorsLabel="Errors",e.NewStringDefault="New Value",e.AddButton="Add",e.AddItemButton="Add Item",e.CopyButton="Copy",e.MoveDownButton="Move down",e.MoveUpButton="Move up",e.RemoveButton="Remove",e.NowLabel="Now",e.ClearLabel="Clear",e.AriaDateLabel="Select a date",e.PreviewLabel="Preview",e.DecrementAriaLabel="Decrease value by 1",e.IncrementAriaLabel="Increase value by 1",e.UnknownFieldType="Unknown field type %1",e.OptionPrefix="Option %1",e.TitleOptionPrefix="%1 option %2",e.KeyLabel="%1 Key",e.InvalidObjectField='Invalid "%1" object field configuration: _%2_.',e.UnsupportedField="Unsupported field schema.",e.UnsupportedFieldWithId="Unsupported field schema for field `%1`.",e.UnsupportedFieldWithReason="Unsupported field schema: _%1_.",e.UnsupportedFieldWithIdAndReason="Unsupported field schema for field `%1`: _%2_.",e.FilesInfo="**%1** (%2, %3 bytes)"})($e||($e={}));function eI(e,t){var r=qe(e)?Hl:vb;return r(e,wb(t))}function tI(e,t){return T0(e,t,function(r,n){return $b(e,n)})}var rg=db(function(e,t){return e==null?{}:tI(e,t)});let rI=(e=21)=>crypto.getRandomValues(new Uint8Array(e)).reduce((t,r)=>(r&=63,r<36?t+=r.toString(36):r<62?t+=(r-26).toString(36).toUpperCase():r>62?t+="-":t+="_",t),"");function Tl(){return rI()}function ng(e){return Array.isArray(e)?e.map(t=>({key:Tl(),item:t})):[]}function yr(e){return Array.isArray(e)?e.map(t=>t.item):[]}class nI extends H.Component{constructor(t){super(t);const{formData:r=[]}=t,n=ng(r);this.state={keyedFormData:n,updatedKeyedFormData:!1}}static getDerivedStateFromProps(t,r){if(r.updatedKeyedFormData)return{updatedKeyedFormData:!1};const n=Array.isArray(t.formData)?t.formData:[],a=r.keyedFormData||[];return{keyedFormData:n.length===a.length?a.map((s,o)=>({key:s.key,item:n[o]})):ng(n)}}get itemTitle(){const{schema:t,registry:r}=this.props,{translateString:n}=r;return ae(t,[xt,"title"],ae(t,[xt,"description"],n($e.ArrayItemTitle)))}isItemRequired(t){return Array.isArray(t.type)?!t.type.includes("null"):t.type!=="null"}canAddItem(t){const{schema:r,uiSchema:n,registry:a}=this.props;let{addable:i}=he(n,a.globalUiOptions);return i!==!1&&(r.maxItems!==void 0?i=t.length{const{schema:t,registry:r}=this.props,{schemaUtils:n}=r;let a=t.items;return xl(t)&&i$(t)&&(a=t.additionalItems),n.getDefaultFormState(a)};_handleAddClick(t,r){t&&t.preventDefault();const{onChange:n,errorSchema:a}=this.props,{keyedFormData:i}=this.state;let s;if(a){s={};for(const l in a){const c=parseInt(l);r===void 0||c=r&&De(s,[c+1],a[l])}}const o={key:Tl(),item:this._getNewFormDataRow()},u=[...i];r!==void 0?u.splice(r,0,o):u.push(o),this.setState({keyedFormData:u,updatedKeyedFormData:!0},()=>n(yr(u),s))}onAddClick=t=>{this._handleAddClick(t)};onAddIndexClick=t=>r=>{this._handleAddClick(r,t)};onCopyIndexClick=t=>r=>{r&&r.preventDefault();const{onChange:n,errorSchema:a}=this.props,{keyedFormData:i}=this.state;let s;if(a){s={};for(const l in a){const c=parseInt(l);c<=t?De(s,[c],a[l]):c>t&&De(s,[c+1],a[l])}}const o={key:Tl(),item:P0(i[t].item)},u=[...i];t!==void 0?u.splice(t+1,0,o):u.push(o),this.setState({keyedFormData:u,updatedKeyedFormData:!0},()=>n(yr(u),s))};onDropIndexClick=t=>r=>{r&&r.preventDefault();const{onChange:n,errorSchema:a}=this.props,{keyedFormData:i}=this.state;let s;if(a){s={};for(const u in a){const l=parseInt(u);lt&&De(s,[l-1],a[u])}}const o=i.filter((u,l)=>l!==t);this.setState({keyedFormData:o,updatedKeyedFormData:!0},()=>n(yr(o),s))};onReorderClick=(t,r)=>n=>{n&&(n.preventDefault(),n.currentTarget.blur());const{onChange:a,errorSchema:i}=this.props;let s;if(i){s={};for(const c in i){const p=parseInt(c);p==t?De(s,[r],i[t]):p==r?De(s,[t],i[r]):De(s,[c],i[p])}}const{keyedFormData:o}=this.state;function u(){const c=o.slice();return c.splice(t,1),c.splice(r,0,o[t]),c}const l=u();this.setState({keyedFormData:l},()=>a(yr(l),s))};onChangeForIndex=t=>(r,n,a)=>{const{formData:i,onChange:s,errorSchema:o}=this.props,l=(Array.isArray(i)?i:[]).map((c,p)=>t===p?typeof r>"u"?null:r:c);s(l,o&&o&&{...o,[t]:n},a)};onSelectChange=t=>{const{onChange:r,idSchema:n}=this.props;r(t,void 0,n&&n.$id)};render(){const{schema:t,uiSchema:r,idSchema:n,registry:a}=this.props,{schemaUtils:i,translateString:s}=a;if(!(xt in t)){const o=he(r),u=ve("UnsupportedFieldTemplate",a,o);return O.jsx(u,{schema:t,idSchema:n,reason:s($e.MissingItems),registry:a})}return i.isMultiSelect(t)?this.renderMultiSelect():$0(r)?this.renderCustomWidget():xl(t)?this.renderFixedArray():i.isFilesArray(t,r)?this.renderFiles():this.renderNormalArray()}renderNormalArray(){const{schema:t,uiSchema:r={},errorSchema:n,idSchema:a,name:i,title:s,disabled:o=!1,readonly:u=!1,autofocus:l=!1,required:c=!1,registry:p,onBlur:g,onFocus:v,idPrefix:b,idSeparator:y="_",rawErrors:h}=this.props,{keyedFormData:f}=this.state,d=t.title||s||i,{schemaUtils:m,formContext:_}=p,$=he(r),w=Se(t.items)?t.items:{},S=m.retrieveSchema(w),A=yr(this.state.keyedFormData),E=this.canAddItem(A),T={canAdd:E,items:f.map((M,C)=>{const{key:k,item:L}=M,J=L,Z=m.retrieveSchema(w,J),Y=n?n[C]:void 0,ne=a.$id+y+C,U=m.toIdSchema(Z,ne,J,b,y);return this.renderArrayFieldItem({key:k,index:C,name:i&&`${i}-${C}`,title:d?`${d}-${C+1}`:void 0,canAdd:E,canMoveUp:C>0,canMoveDown:Cw.retrieveSchema(k,n[L])),T=Se(t.additionalItems)?w.retrieveSchema(t.additionalItems,n):null;(!m||m.length{const{key:J,item:Z}=k,Y=Z,ne=L>=E.length,U=(ne&&Se(t.additionalItems)?w.retrieveSchema(t.additionalItems,Y):E[L])||{},j=o.$id+s+L,K=w.toIdSchema(U,j,Y,i,s),D=ne?r.additionalItems||{}:Array.isArray(r.items)?r.items[L]:r.items||{},P=a?a[L]:void 0;return this.renderArrayFieldItem({key:J,index:L,name:u&&`${u}-${L}`,title:_?`${_}-${L+1}`:void 0,canAdd:R,canRemove:ne,canMoveUp:L>=E.length+1,canMoveDown:ne&&Lne[U]),{children:O.jsx(L,{name:a,title:m,index:n,schema:l,uiSchema:p,formData:c,formContext:R,errorSchema:v,idPrefix:w,idSeparator:S,idSchema:g,required:this.isItemRequired(l),onChange:this.onChangeForIndex(n),onBlur:y,onFocus:h,registry:T,disabled:_,readonly:A,hideError:$,autofocus:b,rawErrors:f}),className:"array-item",disabled:_,canAdd:i,hasCopy:ne.copy,hasToolbar:ne.toolbar,hasMoveUp:ne.moveUp,hasMoveDown:ne.moveDown,hasRemove:ne.remove,index:n,totalItems:d,key:r,onAddIndexClick:this.onAddIndexClick,onCopyIndexClick:this.onCopyIndexClick,onDropIndexClick:this.onDropIndexClick,onReorderClick:this.onReorderClick,readonly:A,registry:T,schema:l,uiSchema:p}}}function aI(e){const{schema:t,name:r,uiSchema:n,idSchema:a,formData:i,registry:s,required:o,disabled:u,readonly:l,hideError:c,autofocus:p,title:g,onChange:v,onFocus:b,onBlur:y,rawErrors:h}=e,{title:f}=t,{widgets:d,formContext:m,translateString:_,globalUiOptions:$}=s,{widget:w="checkbox",title:S,label:A=!0,...E}=he(n,$),T=mt(t,w,d),R=_($e.YesLabel),M=_($e.NoLabel);let C;const k=S??f??g??r;if(Array.isArray(t.oneOf))C=Lr({oneOf:t.oneOf.map(L=>{if(Se(L))return{...L,title:L.title||(L.const===!0?R:M)}}).filter(L=>L)},n);else{const L=t,J=t.enum??[!0,!1];!L.enumNames&&J.length===2&&J.every(Z=>typeof Z=="boolean")?C=[{value:J[0],label:J[0]?R:M},{value:J[1],label:J[1]?R:M}]:C=Lr({enum:J,enumNames:L.enumNames},n)}return O.jsx(T,{options:{...E,enumOptions:C},schema:t,uiSchema:n,id:a.$id,name:r,onChange:v,onFocus:b,onBlur:y,label:k,hideLabel:!A,value:i,required:o,disabled:u,readonly:l,hideError:c,registry:s,formContext:m,autofocus:p,rawErrors:h})}class ag extends H.Component{constructor(t){super(t);const{formData:r,options:n,registry:{schemaUtils:a}}=this.props,i=n.map(s=>a.retrieveSchema(s,r));this.state={retrievedOptions:i,selectedOption:this.getMatchingOption(0,r,i)}}componentDidUpdate(t,r){const{formData:n,options:a,idSchema:i}=this.props,{selectedOption:s}=this.state;let o=this.state;if(!Ae(t.options,a)){const{registry:{schemaUtils:u}}=this.props,l=a.map(c=>u.retrieveSchema(c,n));o={selectedOption:s,retrievedOptions:l}}if(!Ae(n,t.formData)&&i.$id===t.idSchema.$id){const{retrievedOptions:u}=o,l=this.getMatchingOption(s,n,u);r&&l!==s&&(o={selectedOption:l,retrievedOptions:u})}o!==this.state&&this.setState(o)}getMatchingOption(t,r,n){const{schema:a,registry:{schemaUtils:i}}=this.props,s=ar(a);return i.getClosestMatchingOption(r,n,t,s)}onOptionChange=t=>{const{selectedOption:r,retrievedOptions:n}=this.state,{formData:a,onChange:i,registry:s}=this.props,{schemaUtils:o}=s,u=t!==void 0?parseInt(t,10):-1;if(u===r)return;const l=u>=0?n[u]:void 0,c=r>=0?n[r]:void 0;let p=o.sanitizeDataForNewSchema(l,c,a);l&&(p=o.getDefaultFormState(l,p,"excludeObjectChildren")),this.setState({selectedOption:u},()=>{i(p,void 0,this.getFieldId())})};getFieldId(){const{idSchema:t,schema:r}=this.props;return`${t.$id}${r.oneOf?"__oneof_select":"__anyof_select"}`}render(){const{name:t,disabled:r=!1,errorSchema:n={},formContext:a,onBlur:i,onFocus:s,readonly:o,registry:u,schema:l,uiSchema:c}=this.props,{widgets:p,fields:g,translateString:v,globalUiOptions:b,schemaUtils:y}=u,{SchemaField:h}=g,{selectedOption:f,retrievedOptions:d}=this.state,{widget:m="select",placeholder:_,autofocus:$,autocomplete:w,title:S=l.title,...A}=he(c,b),E=mt({type:"number"},m,p),T=ae(n,Ue,[]),R=na(n,[Ue]),M=y.getDisplayLabel(l,c,b),C=f>=0&&d[f]||null;let k;if(C){const{required:U}=l;k=U?vt({required:U},C):C}let L=[];Ke in l&&c&&Ke in c?Array.isArray(c[Ke])?L=c[Ke]:console.warn(`uiSchema.oneOf is not an array for "${S||t}"`):Ze in l&&c&&Ze in c&&(Array.isArray(c[Ze])?L=c[Ze]:console.warn(`uiSchema.anyOf is not an array for "${S||t}"`));let J=c;f>=0&&L.length>f&&(J=L[f]);const Z=S?$e.TitleOptionPrefix:$e.OptionPrefix,Y=S?[S]:[],ne=d.map((U,j)=>{const{title:K=U.title}=he(L[j]);return{label:K||v(Z,Y.concat(String(j+1))),value:j}});return O.jsxs("div",{className:"panel panel-default panel-body",children:[O.jsx("div",{className:"form-group",children:O.jsx(E,{id:this.getFieldId(),name:`${t}${l.oneOf?"__oneof_select":"__anyof_select"}`,schema:{type:"number",default:0},onChange:this.onOptionChange,onBlur:i,onFocus:s,disabled:r||nr(ne),multiple:!1,rawErrors:T,errorSchema:R,value:f>=0?f:void 0,options:{enumOptions:ne,...A},registry:u,formContext:a,placeholder:_,autocomplete:w,autofocus:$,label:S??t,hideLabel:!M,readonly:o})}),k&&k.type!=="null"&&O.jsx(h,{...this.props,schema:k,uiSchema:J})]})}}const iI=/\.([0-9]*0)*$/,sI=/[0.]0*$/;function oI(e){const{registry:t,onChange:r,formData:n,value:a}=e,[i,s]=H.useState(a),{StringField:o}=t.fields;let u=n;const l=H.useCallback((c,p,g)=>{s(c),`${c}`.charAt(0)==="."&&(c=`0${c}`);const v=typeof c=="string"&&c.match(iI)?hd(c.replace(sI,"")):hd(c);r(v,p,g)},[r]);if(typeof i=="string"&&typeof u=="number"){const c=new RegExp(`^(${String(u).replace(".","\\.")})?\\.?0*$`);i.match(c)&&(u=i)}return O.jsx(o,{...e,formData:u,onChange:l})}function Ft(){return Ft=Object.assign?Object.assign.bind():function(e){for(var t=1;t(e[t.toLowerCase()]=t,e),{class:"className",for:"htmlFor"}),sg={amp:"&",apos:"'",gt:">",lt:"<",nbsp:" ",quot:"“"},lI=["style","script"],cI=["src","href","data","formAction","srcDoc","action"],dI=/([-A-Z0-9_:]+)(?:\s*=\s*(?:(?:"((?:\\.|[^"])*)")|(?:'((?:\\.|[^'])*)')|(?:\{((?:\\.|{[^}]*?}|[^}])*)\})))?/gi,fI=/mailto:/i,pI=/\n{2,}$/,og=/^(\s*>[\s\S]*?)(?=\n\n|$)/,hI=/^ *> ?/gm,mI=/^(?:\[!([^\]]*)\]\n)?([\s\S]*)/,gI=/^ {2,}\n/,yI=/^(?:( *[-*_])){3,} *(?:\n *)+\n/,ug=/^(?: {1,3})?(`{3,}|~{3,}) *(\S+)? *([^\n]*?)?\n([\s\S]*?)(?:\1\n?|$)/,lg=/^(?: {4}[^\n]+\n*)+(?:\n *)+\n?/,vI=/^(`+)((?:\\`|(?!\1)`|[^`])+)\1/,bI=/^(?:\n *)*\n/,_I=/\r\n?/g,$I=/^\[\^([^\]]+)](:(.*)((\n+ {4,}.*)|(\n(?!\[\^).+))*)/,wI=/^\[\^([^\]]+)]/,SI=/\f/g,PI=/^---[ \t]*\n(.|\n)*\n---[ \t]*\n/,EI=/^\s*?\[(x|\s)\]/,cg=/^ *(#{1,6}) *([^\n]+?)(?: +#*)?(?:\n *)*(?:\n|$)/,dg=/^ *(#{1,6}) +([^\n]+?)(?: +#*)?(?:\n *)*(?:\n|$)/,fg=/^([^\n]+)\n *(=|-){3,} *\n/,Qu=/^ *(?!<[a-z][^ >/]* ?\/>)<([a-z][^ >/]*) ?((?:[^>]*[^/])?)>\n?(\s*(?:<\1[^>]*?>[\s\S]*?<\/\1>|(?!<\1\b)[\s\S])*?)<\/\1>(?!<\/\1>)\n*/i,AI=/&([a-z0-9]+|#[0-9]{1,6}|#x[0-9a-fA-F]{1,6});/gi,pg=/^)/,OI=/^(data|aria|x)-[a-z_][a-z\d_.-]*$/,el=/^ *<([a-z][a-z0-9:]*)(?:\s+((?:<.*?>|[^>])*))?\/?>(?!<\/\1>)(\s*\n)?/i,xI=/^\{.*\}$/,CI=/^(https?:\/\/[^\s<]+[^<.,:;"')\]\s])/,II=/^<([^ >]+@[^ >]+)>/,TI=/^<([^ >]+:\/[^ >]+)>/,RI=/-([a-z])?/gi,hg=/^(\|.*)\n(?: *(\|? *[-:]+ *\|[-| :]*)\n((?:.*\|.*\n)*))?\n?/,qI=/^[^\n]+(?: \n|\n{2,})/,jI=/^\[([^\]]*)\]:\s+]+)>?\s*("([^"]*)")?/,DI=/^!\[([^\]]*)\] ?\[([^\]]*)\]/,NI=/^\[([^\]]*)\] ?\[([^\]]*)\]/,FI=/(\n|^[-*]\s|^#|^ {2,}|^-{2,}|^>\s)/,MI=/\t/g,kI=/(^ *\||\| *$)/g,LI=/^ *:-+: *$/,BI=/^ *:-+ *$/,UI=/^ *-+: *$/,Na="((?:\\[.*?\\][([].*?[)\\]]|<.*?>(?:.*?<.*?>)?|`.*?`|\\\\\\1|[\\s\\S])+?)",KI=RegExp(`^([*_])\\1${Na}\\1\\1(?!\\1)`),VI=RegExp(`^([*_])${Na}\\1(?!\\1)`),zI=RegExp(`^(==)${Na}\\1`),WI=RegExp(`^(~~)${Na}\\1`),HI=/^\\([^0-9A-Za-z\s])/,mg=/\\([^0-9A-Za-z\s])/g,GI=/^[\s\S](?:(?! |[0-9]\.|http)[^=*_~\-\n<`\\\[!])*/,YI=/^\n+/,JI=/^([ \t]*)/,ZI=/\\([^\\])/g,XI=/(?:^|\n)( *)$/,Nc="(?:\\d+\\.)",Fc="(?:[*+-])";function R0(e){return"( *)("+(e===1?Nc:Fc)+") +"}const q0=R0(1),j0=R0(2);function D0(e){return RegExp("^"+(e===1?q0:j0))}const QI=D0(1),eT=D0(2);function N0(e){return RegExp("^"+(e===1?q0:j0)+"[^\\n]*(?:\\n(?!\\1"+(e===1?Nc:Fc)+" )[^\\n]*)*(\\n|$)","gm")}const tT=N0(1),rT=N0(2);function F0(e){const t=e===1?Nc:Fc;return RegExp("^( *)("+t+") [\\s\\S]+?(?:\\n{2,}(?! )(?!\\1"+t+" (?!"+t+" ))\\n*|\\s*\\n*$)")}const M0=F0(1),k0=F0(2);function gg(e,t){const r=t===1,n=r?M0:k0,a=r?tT:rT,i=r?QI:eT;return{t:s=>i.test(s),o:rn(function(s,o){const u=XI.exec(o.prevCapture);return u&&(o.list||!o.inline&&!o.simple)?n.exec(s=u[1]+s):null}),i:1,u(s,o,u){const l=r?+s[2]:void 0,c=s[0].replace(pI,` -`).match(a);let p=!1;return{items:c.map(function(g,v){const b=i.exec(g)[0].length,y=RegExp("^ {1,"+b+"}","gm"),h=g.replace(y,"").replace(i,""),f=v===c.length-1,d=h.indexOf(` - -`)!==-1||f&&p;p=d;const m=u.inline,_=u.list;let $;u.list=!0,d?(u.inline=!1,$=Ir(h)+` - -`):(u.inline=!0,$=Ir(h));const w=o($,u);return u.inline=m,u.list=_,w}),ordered:r,start:l}},l:(s,o,u)=>e(s.ordered?"ol":"ul",{key:u.key,start:s.type==="20"?s.start:void 0},s.items.map(function(l,c){return e("li",{key:c},o(l,u))}))}}const nT=RegExp(`^\\[((?:\\[[^\\]]*\\]|[^\\[\\]]|\\](?=[^\\[]*\\]))*)\\]\\(\\s*?(?:\\s+['"]([\\s\\S]*?)['"])?\\s*\\)`),aT=/^!\[(.*?)\]\( *((?:\([^)]*\)|[^() ])*) *"?([^)"]*)?"?\)/;function Ir(e){let t=e.length;for(;t>0&&e[t-1]<=" ";)t--;return e.slice(0,t)}function Rl(e,t){return e.startsWith(t)}function iT(e,t,r){if(Array.isArray(r)){for(let n=0;n{u.trim()==="|"&&(o(),n)?l!==0&&l!==c.length-1&&i.push([]):s+=u}),o(),r.inTable=a,i}function oT(e,t,r){r.inline=!0;const n=e[2]?e[2].replace(kI,"").split("|").map(sT):[],a=e[3]?function(s,o,u){return s.trim().split(` -`).map(function(l){return yg(l,o,u,!0)})}(e[3],t,r):[],i=yg(e[1],t,r,!!a.length);return r.inline=!1,a.length?{align:n,cells:a,header:i,type:"25"}:{children:i,type:"21"}}function vg(e,t){return e.align[t]==null?{}:{textAlign:e.align[t]}}function rn(e){return e.inline=1,e}function St(e){return rn(function(t,r){return r.inline?e.exec(t):null})}function Pt(e){return rn(function(t,r){return r.inline||r.simple?e.exec(t):null})}function ct(e){return function(t,r){return r.inline||r.simple?null:e.exec(t)}}function br(e){return rn(function(t){return e.exec(t)})}const uT=/(javascript|vbscript|data(?!:image)):/i;function lT(e){try{const t=decodeURIComponent(e).replace(/[^A-Za-z0-9/:]/g,"");if(uT.test(t))return null}catch{return null}return e}function bg(e){return e.replace(ZI,"$1")}function Zn(e,t,r){const n=r.inline||!1,a=r.simple||!1;r.inline=!0,r.simple=!0;const i=e(t,r);return r.inline=n,r.simple=a,i}function cT(e,t,r){const n=r.inline||!1,a=r.simple||!1;r.inline=!1,r.simple=!0;const i=e(t,r);return r.inline=n,r.simple=a,i}function dT(e,t,r){const n=r.inline||!1;r.inline=!1;const a=e(t,r);return r.inline=n,a}const tl=(e,t,r)=>({children:Zn(t,e[2],r)});function rl(){return{}}function nl(){return null}function fT(...e){return e.filter(Boolean).join(" ")}function al(e,t,r){let n=e;const a=t.split(".");for(;a.length&&(n=n[a[0]],n!==void 0);)a.shift();return n||r}function pT(e="",t={}){t.overrides=t.overrides||{},t.namedCodesToUnicode=t.namedCodesToUnicode?Ft({},sg,t.namedCodesToUnicode):sg;const r=t.slugify||vr,n=t.sanitizer||lT,a=t.createElement||H.createElement,i=[og,ug,lg,t.enforceAtxHeadings?dg:cg,fg,hg,M0,k0],s=[...i,qI,Qu,pg,el];function o(f,d,...m){const _=al(t.overrides,f+".props",{});return a(function($,w){const S=al(w,$);return S?typeof S=="function"||typeof S=="object"&&"render"in S?S:al(w,$+".component",$):$}(f,t.overrides),Ft({},d,_,{className:fT(d?.className,_.className)||void 0}),...m)}function u(f){f=f.replace(PI,"");let d=!1;t.forceInline?d=!0:t.forceBlock||(d=FI.test(f)===!1);const m=b(v(d?f:Ir(f).replace(YI,"")+` - -`,{inline:d}));for(;typeof m[m.length-1]=="string"&&!m[m.length-1].trim();)m.pop();if(t.wrapper===null)return m;const _=t.wrapper||(d?"span":"div");let $;if(m.length>1||t.forceWrapper)$=m;else{if(m.length===1)return $=m[0],typeof $=="string"?o("span",{key:"outer"},$):$;$=null}return a(_,{key:"outer"},$)}function l(f,d){if(!d||!d.trim())return null;const m=d.match(dI);return m?m.reduce(function(_,$){const w=$.indexOf("=");if(w!==-1){const S=function(R){return R.indexOf("-")!==-1&&R.match(OI)===null&&(R=R.replace(RI,function(M,C){return C.toUpperCase()})),R}($.slice(0,w)).trim(),A=function(R){const M=R[0];return(M==='"'||M==="'")&&R.length>=2&&R[R.length-1]===M?R.slice(1,-1):R}($.slice(w+1).trim()),E=ig[S]||S;if(E==="ref")return _;const T=_[E]=function(R,M,C,k){return M==="style"?function(L){const J=[];let Z="",Y=!1,ne=!1,U="";if(!L)return J;for(let K=0;K0){const N=P.slice(0,I).trim(),B=P.slice(I+1).trim();J.push([N,B])}}Z=""}}const j=Z.trim();if(j){const K=j.indexOf(":");if(K>0){const D=j.slice(0,K).trim(),P=j.slice(K+1).trim();J.push([D,P])}}return J}(C).reduce(function(L,[J,Z]){return L[J.replace(/(-[a-z])/g,Y=>Y[1].toUpperCase())]=k(Z,R,J),L},{}):cI.indexOf(M)!==-1?k(C,R,M):(C.match(xI)&&(C=C.slice(1,C.length-1)),C==="true"||C!=="false"&&C)}(f,S,A,n);typeof T=="string"&&(Qu.test(T)||el.test(T))&&(_[E]=u(T.trim()))}else $!=="style"&&(_[ig[$]||$]=!0);return _},{}):null}const c=[],p={},g={0:{t:[">"],o:ct(og),i:1,u(f,d,m){const[,_,$]=f[0].replace(hI,"").match(mI);return{alert:_,children:d($,m)}},l(f,d,m){const _={key:m.key};return f.alert&&(_.className="markdown-alert-"+r(f.alert.toLowerCase(),vr),f.children.unshift({attrs:{},children:[{type:"27",text:f.alert}],noInnerParse:!0,type:"11",tag:"header"})),o("blockquote",_,d(f.children,m))}},1:{o:br(gI),i:1,u:rl,l:(f,d,m)=>o("br",{key:m.key})},2:{t:f=>{const d=f[0];return d==="-"||d==="*"||d==="_"},o:ct(yI),i:1,u:rl,l:(f,d,m)=>o("hr",{key:m.key})},3:{t:[" "],o:ct(lg),i:0,u:f=>({lang:void 0,text:Ir(f[0].replace(/^ {4}/gm,"")).replace(mg,"$1")}),l:(f,d,m)=>o("pre",{key:m.key},o("code",Ft({},f.attrs,{className:f.lang?"lang-"+f.lang:""}),f.text))},4:{t:["```","~~~"],o:ct(ug),i:0,u:f=>({attrs:l("code",f[3]||""),lang:f[2]||void 0,text:f[4],type:"3"})},5:{t:["`"],o:Pt(vI),i:3,u:f=>({text:f[2].replace(mg,"$1")}),l:(f,d,m)=>o("code",{key:m.key},f.text)},6:{t:["[^"],o:ct($I),i:0,u:f=>(c.push({footnote:f[2],identifier:f[1]}),{}),l:nl},7:{t:["[^"],o:St(wI),i:1,u:f=>({target:"#"+r(f[1],vr),text:f[1]}),l:(f,d,m)=>o("a",{key:m.key,href:n(f.target,"a","href")},o("sup",{key:m.key},f.text))},8:{t:["[ ]","[x]"],o:St(EI),i:1,u:f=>({completed:f[1].toLowerCase()==="x"}),l:(f,d,m)=>o("input",{checked:f.completed,key:m.key,readOnly:!0,type:"checkbox"})},9:{t:["#"],o:ct(t.enforceAtxHeadings?dg:cg),i:1,u:(f,d,m)=>({children:Zn(d,f[2],m),id:r(f[2],vr),level:f[1].length}),l:(f,d,m)=>o("h"+f.level,{id:f.id,key:m.key},d(f.children,m))},10:{o:ct(fg),i:0,u:(f,d,m)=>({children:Zn(d,f[1],m),level:f[2]==="="?1:2,type:"9"})},11:{t:["<"],o:br(Qu),i:1,u(f,d,m){const[,_]=f[3].match(JI),$=RegExp("^"+_,"gm"),w=f[3].replace($,""),S=(A=w,s.some(C=>C.test(A))?dT:Zn);var A;const E=f[1].toLowerCase(),T=lI.indexOf(E)!==-1,R=(T?E:f[1]).trim(),M={attrs:l(R,f[2]),noInnerParse:T,tag:R};return m.inAnchor=m.inAnchor||E==="a",T?M.text=f[3]:M.children=S(d,w,m),m.inAnchor=!1,M},l:(f,d,m)=>o(f.tag,Ft({key:m.key},f.attrs),f.text||(f.children?d(f.children,m):""))},13:{t:["<"],o:br(el),i:1,u(f){const d=f[1].trim();return{attrs:l(d,f[2]||""),tag:d}},l:(f,d,m)=>o(f.tag,Ft({},f.attrs,{key:m.key}))},12:{t:[")/,SI=/^(data|aria|x)-[a-z_][a-z\d_.-]*$/,Wl=/^ *<([a-z][a-z0-9:]*)(?:\s+((?:<.*?>|[^>])*))?\/?>(?!<\/\1>)(\s*\n)?/i,wI=/^\{.*\}$/,PI=/^(https?:\/\/[^\s<]+[^<.,:;"')\]\s])/,OI=/^<([^ >]+@[^ >]+)>/,EI=/^<([^ >]+:\/[^ >]+)>/,AI=/-([a-z])?/gi,og=/^(\|.*)\n(?: *(\|? *[-:]+ *\|[-| :]*)\n((?:.*\|.*\n)*))?\n?/,CI=/^[^\n]+(?: \n|\n{2,})/,II=/^\[([^\]]*)\]:\s+]+)>?\s*("([^"]*)")?/,TI=/^!\[([^\]]*)\] ?\[([^\]]*)\]/,RI=/^\[([^\]]*)\] ?\[([^\]]*)\]/,xI=/(\n|^[-*]\s|^#|^ {2,}|^-{2,}|^>\s)/,qI=/\t/g,jI=/(^ *\||\| *$)/g,NI=/^ *:-+: *$/,DI=/^ *:-+ *$/,FI=/^ *-+: *$/,Ca="((?:\\[.*?\\][([].*?[)\\]]|<.*?>(?:.*?<.*?>)?|`.*?`|\\\\\\1|[\\s\\S])+?)",MI=RegExp(`^([*_])\\1${Ca}\\1\\1(?!\\1)`),kI=RegExp(`^([*_])${Ca}\\1(?!\\1)`),LI=RegExp(`^(==)${Ca}\\1`),UI=RegExp(`^(~~)${Ca}\\1`),VI=/^\\([^0-9A-Za-z\s])/,lg=/\\([^0-9A-Za-z\s])/g,KI=/^[\s\S](?:(?! |[0-9]\.|http)[^=*_~\-\n<`\\\[!])*/,BI=/^\n+/,zI=/^([ \t]*)/,WI=/\\([^\\])/g,HI=/(?:^|\n)( *)$/,xc="(?:\\d+\\.)",qc="(?:[*+-])";function Lb(e){return"( *)("+(e===1?xc:qc)+") +"}const Ub=Lb(1),Vb=Lb(2);function Kb(e){return RegExp("^"+(e===1?Ub:Vb))}const GI=Kb(1),YI=Kb(2);function Bb(e){return RegExp("^"+(e===1?Ub:Vb)+"[^\\n]*(?:\\n(?!\\1"+(e===1?xc:qc)+" )[^\\n]*)*(\\n|$)","gm")}const JI=Bb(1),XI=Bb(2);function zb(e){const t=e===1?xc:qc;return RegExp("^( *)("+t+") [\\s\\S]+?(?:\\n{2,}(?! )(?!\\1"+t+" (?!"+t+" ))\\n*|\\s*\\n*$)")}const Wb=zb(1),Hb=zb(2);function ug(e,t){const r=t===1,n=r?Wb:Hb,a=r?JI:XI,i=r?GI:YI;return{t:s=>i.test(s),o:Zr(function(s,o){const l=HI.exec(o.prevCapture);return l&&(o.list||!o.inline&&!o.simple)?n.exec(s=l[1]+s):null}),i:1,u(s,o,l){const u=r?+s[2]:void 0,c=s[0].replace(lI,` +`).match(a);let h=!1;return{items:c.map(function(g,v){const b=i.exec(g)[0].length,y=RegExp("^ {1,"+b+"}","gm"),p=g.replace(y,"").replace(i,""),f=v===c.length-1,d=p.indexOf(` + +`)!==-1||f&&h;h=d;const m=l.inline,_=l.list;let $;l.list=!0,d?(l.inline=!1,$=Cr(p)+` + +`):(l.inline=!0,$=Cr(p));const S=o($,l);return l.inline=m,l.list=_,S}),ordered:r,start:u}},l:(s,o,l)=>e(s.ordered?"ol":"ul",{key:l.key,start:s.type==="20"?s.start:void 0},s.items.map(function(u,c){return e("li",{key:c},o(u,l))}))}}const ZI=RegExp(`^\\[((?:\\[[^\\]]*\\]|[^\\[\\]]|\\](?=[^\\[]*\\]))*)\\]\\(\\s*?(?:\\s+['"]([\\s\\S]*?)['"])?\\s*\\)`),QI=/^!\[(.*?)\]\( *((?:\([^)]*\)|[^() ])*) *"?([^)"]*)?"?\)/;function Cr(e){let t=e.length;for(;t>0&&e[t-1]<=" ";)t--;return e.slice(0,t)}function Pu(e,t){return e.startsWith(t)}function eT(e,t,r){if(Array.isArray(r)){for(let n=0;n{l.trim()==="|"&&(o(),n)?u!==0&&u!==c.length-1&&i.push([]):s+=l}),o(),r.inTable=a,i}function rT(e,t,r){r.inline=!0;const n=e[2]?e[2].replace(jI,"").split("|").map(tT):[],a=e[3]?function(s,o,l){return s.trim().split(` +`).map(function(u){return cg(u,o,l,!0)})}(e[3],t,r):[],i=cg(e[1],t,r,!!a.length);return r.inline=!1,a.length?{align:n,cells:a,header:i,type:"25"}:{children:i,type:"21"}}function dg(e,t){return e.align[t]==null?{}:{textAlign:e.align[t]}}function Zr(e){return e.inline=1,e}function _t(e){return Zr(function(t,r){return r.inline?e.exec(t):null})}function $t(e){return Zr(function(t,r){return r.inline||r.simple?e.exec(t):null})}function lt(e){return function(t,r){return r.inline||r.simple?null:e.exec(t)}}function yr(e){return Zr(function(t){return e.exec(t)})}const nT=/(javascript|vbscript|data(?!:image)):/i;function aT(e){try{const t=decodeURIComponent(e).replace(/[^A-Za-z0-9/:]/g,"");if(nT.test(t))return null}catch{return null}return e}function fg(e){return e.replace(WI,"$1")}function Hn(e,t,r){const n=r.inline||!1,a=r.simple||!1;r.inline=!0,r.simple=!0;const i=e(t,r);return r.inline=n,r.simple=a,i}function iT(e,t,r){const n=r.inline||!1,a=r.simple||!1;r.inline=!1,r.simple=!0;const i=e(t,r);return r.inline=n,r.simple=a,i}function sT(e,t,r){const n=r.inline||!1;r.inline=!1;const a=e(t,r);return r.inline=n,a}const Hl=(e,t,r)=>({children:Hn(t,e[2],r)});function Gl(){return{}}function Yl(){return null}function oT(...e){return e.filter(Boolean).join(" ")}function Jl(e,t,r){let n=e;const a=t.split(".");for(;a.length&&(n=n[a[0]],n!==void 0);)a.shift();return n||r}function lT(e="",t={}){t.overrides=t.overrides||{},t.namedCodesToUnicode=t.namedCodesToUnicode?Nt({},Qm,t.namedCodesToUnicode):Qm;const r=t.slugify||gr,n=t.sanitizer||aT,a=t.createElement||H.createElement,i=[eg,tg,rg,t.enforceAtxHeadings?ag:ng,ig,og,Wb,Hb],s=[...i,CI,zl,sg,Wl];function o(f,d,...m){const _=Jl(t.overrides,f+".props",{});return a(function($,S){const w=Jl(S,$);return w?typeof w=="function"||typeof w=="object"&&"render"in w?w:Jl(S,$+".component",$):$}(f,t.overrides),Nt({},d,_,{className:oT(d?.className,_.className)||void 0}),...m)}function l(f){f=f.replace(bI,"");let d=!1;t.forceInline?d=!0:t.forceBlock||(d=xI.test(f)===!1);const m=b(v(d?f:Cr(f).replace(BI,"")+` + +`,{inline:d}));for(;typeof m[m.length-1]=="string"&&!m[m.length-1].trim();)m.pop();if(t.wrapper===null)return m;const _=t.wrapper||(d?"span":"div");let $;if(m.length>1||t.forceWrapper)$=m;else{if(m.length===1)return $=m[0],typeof $=="string"?o("span",{key:"outer"},$):$;$=null}return a(_,{key:"outer"},$)}function u(f,d){if(!d||!d.trim())return null;const m=d.match(sI);return m?m.reduce(function(_,$){const S=$.indexOf("=");if(S!==-1){const w=function(q){return q.indexOf("-")!==-1&&q.match(SI)===null&&(q=q.replace(AI,function(M,I){return I.toUpperCase()})),q}($.slice(0,S)).trim(),O=function(q){const M=q[0];return(M==='"'||M==="'")&&q.length>=2&&q[q.length-1]===M?q.slice(1,-1):q}($.slice(S+1).trim()),E=Zm[w]||w;if(E==="ref")return _;const R=_[E]=function(q,M,I,L){return M==="style"?function(k){const J=[];let X="",Y=!1,ne=!1,K="";if(!k)return J;for(let V=0;V0){const D=P.slice(0,T).trim(),U=P.slice(T+1).trim();J.push([D,U])}}X=""}}const j=X.trim();if(j){const V=j.indexOf(":");if(V>0){const N=j.slice(0,V).trim(),P=j.slice(V+1).trim();J.push([N,P])}}return J}(I).reduce(function(k,[J,X]){return k[J.replace(/(-[a-z])/g,Y=>Y[1].toUpperCase())]=L(X,q,J),k},{}):iI.indexOf(M)!==-1?L(I,q,M):(I.match(wI)&&(I=I.slice(1,I.length-1)),I==="true"||I!=="false"&&I)}(f,w,O,n);typeof R=="string"&&(zl.test(R)||Wl.test(R))&&(_[E]=l(R.trim()))}else $!=="style"&&(_[Zm[$]||$]=!0);return _},{}):null}const c=[],h={},g={0:{t:[">"],o:lt(eg),i:1,u(f,d,m){const[,_,$]=f[0].replace(uI,"").match(cI);return{alert:_,children:d($,m)}},l(f,d,m){const _={key:m.key};return f.alert&&(_.className="markdown-alert-"+r(f.alert.toLowerCase(),gr),f.children.unshift({attrs:{},children:[{type:"27",text:f.alert}],noInnerParse:!0,type:"11",tag:"header"})),o("blockquote",_,d(f.children,m))}},1:{o:yr(dI),i:1,u:Gl,l:(f,d,m)=>o("br",{key:m.key})},2:{t:f=>{const d=f[0];return d==="-"||d==="*"||d==="_"},o:lt(fI),i:1,u:Gl,l:(f,d,m)=>o("hr",{key:m.key})},3:{t:[" "],o:lt(rg),i:0,u:f=>({lang:void 0,text:Cr(f[0].replace(/^ {4}/gm,"")).replace(lg,"$1")}),l:(f,d,m)=>o("pre",{key:m.key},o("code",Nt({},f.attrs,{className:f.lang?"lang-"+f.lang:""}),f.text))},4:{t:["```","~~~"],o:lt(tg),i:0,u:f=>({attrs:u("code",f[3]||""),lang:f[2]||void 0,text:f[4],type:"3"})},5:{t:["`"],o:$t(pI),i:3,u:f=>({text:f[2].replace(lg,"$1")}),l:(f,d,m)=>o("code",{key:m.key},f.text)},6:{t:["[^"],o:lt(gI),i:0,u:f=>(c.push({footnote:f[2],identifier:f[1]}),{}),l:Yl},7:{t:["[^"],o:_t(yI),i:1,u:f=>({target:"#"+r(f[1],gr),text:f[1]}),l:(f,d,m)=>o("a",{key:m.key,href:n(f.target,"a","href")},o("sup",{key:m.key},f.text))},8:{t:["[ ]","[x]"],o:_t(_I),i:1,u:f=>({completed:f[1].toLowerCase()==="x"}),l:(f,d,m)=>o("input",{checked:f.completed,key:m.key,readOnly:!0,type:"checkbox"})},9:{t:["#"],o:lt(t.enforceAtxHeadings?ag:ng),i:1,u:(f,d,m)=>({children:Hn(d,f[2],m),id:r(f[2],gr),level:f[1].length}),l:(f,d,m)=>o("h"+f.level,{id:f.id,key:m.key},d(f.children,m))},10:{o:lt(ig),i:0,u:(f,d,m)=>({children:Hn(d,f[1],m),level:f[2]==="="?1:2,type:"9"})},11:{t:["<"],o:yr(zl),i:1,u(f,d,m){const[,_]=f[3].match(zI),$=RegExp("^"+_,"gm"),S=f[3].replace($,""),w=(O=S,s.some(I=>I.test(O))?sT:Hn);var O;const E=f[1].toLowerCase(),R=aI.indexOf(E)!==-1,q=(R?E:f[1]).trim(),M={attrs:u(q,f[2]),noInnerParse:R,tag:q};return m.inAnchor=m.inAnchor||E==="a",R?M.text=f[3]:M.children=w(d,S,m),m.inAnchor=!1,M},l:(f,d,m)=>o(f.tag,Nt({key:m.key},f.attrs),f.text||(f.children?d(f.children,m):""))},13:{t:["<"],o:yr(Wl),i:1,u(f){const d=f[1].trim();return{attrs:u(d,f[2]||""),tag:d}},l:(f,d,m)=>o(f.tag,Nt({},f.attrs,{key:m.key}))},12:{t:["