feat: Docling components (#8394)

* initial DoclingComponent

Signed-off-by: Michele Dolfi <dol@zurich.ibm.com>

* Correct Docling icon style properties.

Signed-off-by: DKL <dkl@zurich.ibm.com>

* add file_path

Signed-off-by: Michele Dolfi <dol@zurich.ibm.com>

* add load from json and export to various formats

Signed-off-by: Michele Dolfi <dol@zurich.ibm.com>

* add chunking component

Signed-off-by: Michele Dolfi <dol@zurich.ibm.com>

* Update src/backend/base/langflow/components/docling/docling_inline.py

Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>

* add Docling Serve component

Signed-off-by: Michele Dolfi <dol@zurich.ibm.com>

* apply some suggestions

Signed-off-by: Michele Dolfi <dol@zurich.ibm.com>

* Update src/backend/base/langflow/components/docling/_utils.py

Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>

* Update src/backend/base/langflow/components/docling/docling_remote.py

Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>

* add check for DoclingDocument in list

Signed-off-by: Michele Dolfi <dol@zurich.ibm.com>

* fix import

Signed-off-by: Michele Dolfi <dol@zurich.ibm.com>

* add maximum poll timeout and better checks for the retry logic

Signed-off-by: Michele Dolfi <dol@zurich.ibm.com>

* add updated starter_projects

Signed-off-by: Michele Dolfi <dol@zurich.ibm.com>

* refactor _get_converter

Signed-off-by: Michele Dolfi <dol@zurich.ibm.com>

* return only DataFrame

Signed-off-by: Michele Dolfi <dol@zurich.ibm.com>

* remove LoadDoclingDocument

Signed-off-by: Michele Dolfi <dol@zurich.ibm.com>

* more options in the chunk component

Signed-off-by: Michele Dolfi <dol@zurich.ibm.com>

* move docling imports

Signed-off-by: Michele Dolfi <dol@zurich.ibm.com>

* [autofix.ci] apply automated fixes

* move utils to langflow.base

Signed-off-by: Michele Dolfi <dol@zurich.ibm.com>

---------

Signed-off-by: Michele Dolfi <dol@zurich.ibm.com>
Signed-off-by: DKL <dkl@zurich.ibm.com>
Co-authored-by: DKL <dkl@zurich.ibm.com>
Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
This commit is contained in:
Michele Dolfi 2025-06-24 12:54:55 -05:00 committed by GitHub
commit 6631de2aae
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
15 changed files with 1837 additions and 151 deletions

View file

@ -0,0 +1,47 @@
from docling_core.types.doc import DoclingDocument
from langflow.schema.data import Data
from langflow.schema.dataframe import DataFrame
def extract_docling_documents(data_inputs: Data | list[Data] | DataFrame, doc_key: str) -> list[DoclingDocument]:
documents: list[DoclingDocument] = []
if isinstance(data_inputs, DataFrame):
if not len(data_inputs):
msg = "DataFrame is empty"
raise TypeError(msg)
if doc_key not in data_inputs.columns:
msg = f"Column '{doc_key}' not found in DataFrame"
raise TypeError(msg)
try:
documents = data_inputs[doc_key].tolist()
except Exception as e:
msg = f"Error extracting DoclingDocument from DataFrame: {e}"
raise TypeError(msg) from e
else:
if not data_inputs:
msg = "No data inputs provided"
raise TypeError(msg)
if isinstance(data_inputs, Data):
if doc_key not in data_inputs.data:
msg = f"{doc_key} field not available in the input Data"
raise TypeError(msg)
documents = [data_inputs.data[doc_key]]
else:
try:
documents = [
input_.data[doc_key]
for input_ in data_inputs
if isinstance(input_, Data)
and doc_key in input_.data
and isinstance(input_.data[doc_key], DoclingDocument)
]
if not documents:
msg = f"No valid Data inputs found in {type(data_inputs)}"
raise TypeError(msg)
except AttributeError as e:
msg = f"Invalid input type in collection: {e}"
raise TypeError(msg) from e
return documents

View file

@ -0,0 +1,11 @@
from .chunk_docling_document import ChunkDoclingDocumentComponent
from .docling_inline import DoclingInlineComponent
from .docling_remote import DoclingRemoteComponent
from .export_docling_document import ExportDoclingDocumentComponent
__all__ = [
"ChunkDoclingDocumentComponent",
"DoclingInlineComponent",
"DoclingRemoteComponent",
"ExportDoclingDocumentComponent",
]

View file

@ -0,0 +1,164 @@
import json
import tiktoken
from docling_core.transforms.chunker import BaseChunker, DocMeta
from docling_core.transforms.chunker.hierarchical_chunker import HierarchicalChunker
from docling_core.transforms.chunker.hybrid_chunker import HybridChunker
from docling_core.transforms.chunker.tokenizer.huggingface import HuggingFaceTokenizer
from docling_core.transforms.chunker.tokenizer.openai import OpenAITokenizer
from langflow.base.data.docling_utils import extract_docling_documents
from langflow.custom import Component
from langflow.io import DropdownInput, HandleInput, IntInput, MessageTextInput, Output, StrInput
from langflow.schema import Data, DataFrame
class ChunkDoclingDocumentComponent(Component):
display_name: str = "Chunk DoclingDocument"
description: str = "Use the DocumentDocument chunkers to split the document into chunks."
documentation = "https://docling-project.github.io/docling/concepts/chunking/"
icon = "Docling"
name = "ChunkDoclingDocument"
inputs = [
HandleInput(
name="data_inputs",
display_name="Data or DataFrame",
info="The data with documents to split in chunks.",
input_types=["Data", "DataFrame"],
required=True,
),
DropdownInput(
name="chunker",
display_name="Chunker",
options=["HybridChunker", "HierarchicalChunker"],
info=("Which chunker to use."),
value="HybridChunker",
real_time_refresh=True,
),
DropdownInput(
name="provider",
display_name="Provider",
options=["Hugging Face", "OpenAI"],
info=("Which tokenizer provider."),
value="Hugging Face",
show=True,
real_time_refresh=True,
advanced=True,
dynamic=True,
),
StrInput(
name="hf_model_name",
display_name="HF model name",
info=(
"Model name of the tokenizer to use with the HybridChunker when Hugging Face is chosen as a tokenizer."
),
value="sentence-transformers/all-MiniLM-L6-v2",
show=True,
advanced=True,
dynamic=True,
),
StrInput(
name="openai_model_name",
display_name="OpenAI model name",
info=("Model name of the tokenizer to use with the HybridChunker when OpenAI is chosen as a tokenizer."),
value="gpt-4o",
show=False,
advanced=True,
dynamic=True,
),
IntInput(
name="max_tokens",
display_name="Maximum tokens",
info=("Maximum number of tokens for the HybridChunker."),
show=True,
required=False,
advanced=True,
dynamic=True,
),
MessageTextInput(
name="doc_key",
display_name="Doc Key",
info="The key to use for the DoclingDocument column.",
value="doc",
advanced=True,
),
]
outputs = [
Output(display_name="DataFrame", name="dataframe", method="chunk_documents"),
]
def update_build_config(self, build_config: dict, field_value: str, field_name: str | None = None) -> dict:
if field_name == "chunker":
provider_type = build_config["provider"]["value"]
is_hf = provider_type == "Hugging Face"
is_openai = provider_type == "OpenAI"
if field_value == "HybridChunker":
build_config["provider"]["show"] = True
build_config["hf_model_name"]["show"] = is_hf
build_config["openai_model_name"]["show"] = is_openai
build_config["max_tokens"]["show"] = True
else:
build_config["provider"]["show"] = False
build_config["hf_model_name"]["show"] = False
build_config["openai_model_name"]["show"] = False
build_config["max_tokens"]["show"] = False
elif field_name == "provider" and build_config["chunker"]["value"] == "HybridChunker":
if field_value == "Hugging Face":
build_config["hf_model_name"]["show"] = True
build_config["openai_model_name"]["show"] = False
elif field_value == "OpenAI":
build_config["hf_model_name"]["show"] = False
build_config["openai_model_name"]["show"] = True
return build_config
def _docs_to_data(self, docs) -> list[Data]:
return [Data(text=doc.page_content, data=doc.metadata) for doc in docs]
def chunk_documents(self) -> DataFrame:
documents = extract_docling_documents(self.data_inputs, self.doc_key)
chunker: BaseChunker
if self.chunker == "HybridChunker":
max_tokens: int | None = self.max_tokens if self.max_tokens else None
if self.provider == "Hugging Face":
tokenizer = HuggingFaceTokenizer.from_pretrained(
model_name=self.hf_model_name,
max_tokens=max_tokens,
)
elif self.provider == "OpenAI":
if max_tokens is None:
max_tokens = 128 * 1024 # context window length required for OpenAI tokenizers
tokenizer = OpenAITokenizer(
tokenizer=tiktoken.encoding_for_model(self.openai_model_name), max_tokens=max_tokens
)
chunker = HybridChunker(
tokenizer=tokenizer,
)
elif self.chunker == "HierarchicalChunker":
chunker = HierarchicalChunker()
results: list[Data] = []
try:
for doc in documents:
for chunk in chunker.chunk(dl_doc=doc):
enriched_text = chunker.contextualize(chunk=chunk)
meta = DocMeta.model_validate(chunk.meta)
results.append(
Data(
data={
"text": enriched_text,
"document_id": f"{doc.origin.binary_hash}",
"doc_items": json.dumps([item.self_ref for item in meta.doc_items]),
}
)
)
except Exception as e:
msg = f"Error splitting text: {e}"
raise TypeError(msg) from e
return DataFrame(results)

View file

@ -0,0 +1,134 @@
from docling.datamodel.base_models import ConversionStatus, InputFormat
from docling.datamodel.pipeline_options import (
OcrOptions,
PdfPipelineOptions,
VlmPipelineOptions,
)
from docling.document_converter import DocumentConverter, FormatOption, PdfFormatOption
from docling.models.factories import get_ocr_factory
from docling.pipeline.vlm_pipeline import VlmPipeline
from langflow.base.data import BaseFileComponent
from langflow.inputs import DropdownInput
from langflow.schema import Data
class DoclingInlineComponent(BaseFileComponent):
display_name = "Docling"
description = "Uses Docling to process input documents running the Docling models locally."
documentation = "https://docling-project.github.io/docling/"
trace_type = "tool"
icon = "Docling"
name = "DoclingInline"
# https://docling-project.github.io/docling/usage/supported_formats/
VALID_EXTENSIONS = [
"adoc",
"asciidoc",
"asc",
"bmp",
"csv",
"dotx",
"dotm",
"docm",
"docx",
"htm",
"html",
"jpeg",
"json",
"md",
"pdf",
"png",
"potx",
"ppsx",
"pptm",
"potm",
"ppsm",
"pptx",
"tiff",
"txt",
"xls",
"xlsx",
"xhtml",
"xml",
"webp",
]
inputs = [
*BaseFileComponent._base_inputs,
DropdownInput(
name="pipeline",
display_name="Pipeline",
info="Docling pipeline to use",
options=["standard", "vlm"],
real_time_refresh=False,
value="standard",
),
DropdownInput(
name="ocr_engine",
display_name="Ocr",
info="OCR engine to use",
options=["", "easyocr", "tesserocr", "rapidocr", "ocrmac"],
real_time_refresh=False,
value="",
),
# TODO: expose more Docling options
]
outputs = [
*BaseFileComponent._base_outputs,
]
def process_files(self, file_list: list[BaseFileComponent.BaseFile]) -> list[BaseFileComponent.BaseFile]:
# Configure the standard PDF pipeline
def _get_standard_opts() -> PdfPipelineOptions:
pipeline_options = PdfPipelineOptions()
pipeline_options.do_ocr = self.ocr_engine != ""
if pipeline_options.do_ocr:
ocr_factory = get_ocr_factory(
allow_external_plugins=False,
)
ocr_options: OcrOptions = ocr_factory.create_options(
kind=self.ocr_engine,
)
pipeline_options.ocr_options = ocr_options
return pipeline_options
# Configure the VLM pipeline
def _get_vlm_opts() -> VlmPipelineOptions:
return VlmPipelineOptions()
# Configure the main format options and create the DocumentConverter()
def _get_converter() -> DocumentConverter:
if self.pipeline == "standard":
pdf_format_option = PdfFormatOption(
pipeline_options=_get_standard_opts(),
)
elif self.pipeline == "vlm":
pdf_format_option = PdfFormatOption(pipeline_cls=VlmPipeline, pipeline_options=_get_vlm_opts())
format_options: dict[InputFormat, FormatOption] = {
InputFormat.PDF: pdf_format_option,
InputFormat.IMAGE: pdf_format_option,
}
return DocumentConverter(format_options=format_options)
file_paths = [file.path for file in file_list if file.path]
if not file_paths:
self.log("No files to process.")
return file_list
converter = _get_converter()
results = converter.convert_all(file_paths)
processed_data: list[Data | None] = [
Data(data={"doc": res.document, "file_path": str(res.input.file)})
if res.status == ConversionStatus.SUCCESS
else None
for res in results
]
return self.rollup_data(file_list, processed_data)

View file

@ -0,0 +1,193 @@
import base64
import time
from concurrent.futures import Future, ThreadPoolExecutor
from pathlib import Path
from typing import Any
import httpx
from docling_core.types.doc import DoclingDocument
from pydantic import ValidationError
from langflow.base.data import BaseFileComponent
from langflow.inputs import IntInput, NestedDictInput, StrInput
from langflow.inputs.inputs import FloatInput
from langflow.schema import Data
class DoclingRemoteComponent(BaseFileComponent):
display_name = "Docling Serve"
description = "Uses Docling to process input documents connecting to your instance of Docling Serve."
documentation = "https://docling-project.github.io/docling/"
trace_type = "tool"
icon = "Docling"
name = "DoclingRemote"
MAX_500_RETRIES = 5
# https://docling-project.github.io/docling/usage/supported_formats/
VALID_EXTENSIONS = [
"adoc",
"asciidoc",
"asc",
"bmp",
"csv",
"dotx",
"dotm",
"docm",
"docx",
"htm",
"html",
"jpeg",
"json",
"md",
"pdf",
"png",
"potx",
"ppsx",
"pptm",
"potm",
"ppsm",
"pptx",
"tiff",
"txt",
"xls",
"xlsx",
"xhtml",
"xml",
"webp",
]
inputs = [
*BaseFileComponent._base_inputs,
StrInput(
name="api_url",
display_name="Server address",
info="URL of the Docling Serve instance.",
required=True,
),
IntInput(
name="max_concurrency",
display_name="Concurrency",
info="Maximum number of concurrent requests for the server.",
advanced=True,
value=2,
),
FloatInput(
name="max_poll_timeout",
display_name="Maximum poll time",
info="Maximum waiting time for the document conversion to complete.",
advanced=True,
value=3600,
),
NestedDictInput(
name="api_headers",
display_name="HTTP headers",
advanced=True,
required=False,
info=("Optional dictionary of additional headers required for connecting to Docling Serve."),
),
NestedDictInput(
name="docling_serve_opts",
display_name="Docling options",
advanced=True,
required=False,
info=(
"Optional dictionary of additional options. "
"See https://github.com/docling-project/docling-serve/blob/main/docs/usage.md for more information."
),
),
]
outputs = [
*BaseFileComponent._base_outputs,
]
def process_files(self, file_list: list[BaseFileComponent.BaseFile]) -> list[BaseFileComponent.BaseFile]:
base_url = f"{self.api_url}/v1alpha"
def _convert_document(client: httpx.Client, file_path: Path, options: dict[str, Any]) -> Data | None:
encoded_doc = base64.b64encode(file_path.read_bytes()).decode()
payload = {
"options": options,
"file_sources": [{"base64_string": encoded_doc, "filename": file_path.name}],
}
response = client.post(f"{base_url}/convert/source/async", json=payload)
response.raise_for_status()
task = response.json()
http_failures = 0
retry_status_start = 500
retry_status_end = 600
start_wait_time = time.monotonic()
while task["task_status"] not in ("success", "failure"):
# Check if processing exceeds the maximum poll timeout
processing_time = time.monotonic() - start_wait_time
if processing_time >= self.max_poll_timeout:
msg = (
f"Processing time {processing_time=} exceeds the maximum poll timeout {self.max_poll_timeout=}."
"Please increase the max_poll_timeout parameter or review why the processing "
"takes long on the server."
)
self.log(msg)
raise RuntimeError(msg)
# Call for a new status update
time.sleep(2)
response = client.get(f"{base_url}/status/poll/{task['task_id']}")
# Check if the status call gets into 5xx errors and retry
if retry_status_start <= response.status_code < retry_status_end:
http_failures += 1
if http_failures > self.MAX_500_RETRIES:
self.log(f"The status requests got a http response {response.status_code} too many times.")
return None
continue
# Update task status
task = response.json()
result_resp = client.get(f"{base_url}/result/{task['task_id']}")
result_resp.raise_for_status()
result = result_resp.json()
if "json_content" not in result["document"] or result["document"]["json_content"] is None:
self.log("No JSON DoclingDocument found in the result.")
return None
try:
doc = DoclingDocument.model_validate(result["document"]["json_content"])
return Data(data={"doc": doc, "file_path": str(file_path)})
except ValidationError as e:
self.log(f"Error validating the document. {e}")
return None
docling_options = {
"to_formats": ["json"],
"image_export_mode": "placeholder",
"return_as_file": False,
**(self.docling_serve_opts or {}),
}
processed_data: list[Data | None] = []
with (
httpx.Client(headers=self.api_headers) as client,
ThreadPoolExecutor(max_workers=self.max_concurrency) as executor,
):
futures: list[tuple[int, Future]] = []
for i, file in enumerate(file_list):
if file.path is None:
processed_data.append(None)
continue
futures.append((i, executor.submit(_convert_document, client, file.path, docling_options)))
for _index, future in futures:
try:
result_data = future.result()
processed_data.append(result_data)
except (httpx.HTTPStatusError, httpx.RequestError, KeyError, ValueError) as exc:
self.log(f"Docling remote processing failed: {exc}")
raise
return self.rollup_data(file_list, processed_data)

View file

@ -0,0 +1,98 @@
from docling_core.types.doc import ImageRefMode
from langflow.base.data.docling_utils import extract_docling_documents
from langflow.custom import Component
from langflow.io import DropdownInput, HandleInput, MessageTextInput, Output, StrInput
from langflow.schema import Data, DataFrame
class ExportDoclingDocumentComponent(Component):
display_name: str = "Export DoclingDocument"
description: str = "Export DoclingDocument to markdown, html or other formats."
documentation = "https://docling-project.github.io/docling/"
icon = "Docling"
name = "ExportDoclingDocument"
inputs = [
HandleInput(
name="data_inputs",
display_name="Data or DataFrame",
info="The data with documents to export.",
input_types=["Data", "DataFrame"],
required=True,
),
DropdownInput(
name="export_format",
display_name="Export format",
options=["Markdown", "HTML", "Plaintext", "DocTags"],
info="Select the export format to convert the input.",
value="Markdown",
),
DropdownInput(
name="image_mode",
display_name="Image export mode",
options=["placeholder", "embedded"],
info=(
"Specify how images are exported in the output. Placeholder will replace the images with a string, "
"whereas Embedded will include them as base64 encoded images."
),
value="placeholder",
),
StrInput(
name="md_image_placeholder",
display_name="Image placeholder",
info="Specify the image placeholder for markdown exports.",
value="<!-- image -->",
advanced=True,
),
StrInput(
name="md_page_break_placeholder",
display_name="Page break placeholder",
info="Add this placeholder betweek pages in the markdown output.",
value="",
advanced=True,
),
MessageTextInput(
name="doc_key",
display_name="Doc Key",
info="The key to use for the DoclingDocument column.",
value="doc",
advanced=True,
),
]
outputs = [
Output(display_name="Exported data", name="data", method="export_document"),
Output(display_name="DataFrame", name="dataframe", method="as_dataframe"),
]
def export_document(self) -> list[Data]:
documents = extract_docling_documents(self.data_inputs, self.doc_key)
results: list[Data] = []
try:
image_mode = ImageRefMode(self.image_mode)
for doc in documents:
content = ""
if self.export_format == "Markdown":
content = doc.export_to_markdown(
image_mode=image_mode,
image_placeholder=self.md_image_placeholder,
page_break_placeholder=self.md_page_break_placeholder,
)
elif self.export_format == "HTML":
content = doc.export_to_html(image_mode=image_mode)
elif self.export_format == "Plaintext":
content = doc.export_to_text()
elif self.export_format == "DocTags":
content = doc.export_to_doctags()
results.append(Data(text=content))
except Exception as e:
msg = f"Error splitting text: {e}"
raise TypeError(msg) from e
return results
def as_dataframe(self) -> DataFrame:
return DataFrame(self.export_document())

View file

@ -360,13 +360,13 @@
}
},
"node_modules/@babel/helpers": {
"version": "7.27.4",
"resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.27.4.tgz",
"integrity": "sha512-Y+bO6U+I7ZKaM5G5rDUZiYfUvQPUibYmAFe7EnKdnKBbVXDZxvp+MWOH5gYciY0EPk4EScsuFMQBbEfpdRKSCQ==",
"version": "7.27.6",
"resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.27.6.tgz",
"integrity": "sha512-muE8Tt8M22638HU31A3CgfSUciwz1fhATfoVai05aPXGor//CdWDCbnlY1yvBPo07njuVOCNGCSp/GTt12lIug==",
"license": "MIT",
"dependencies": {
"@babel/template": "^7.27.2",
"@babel/types": "^7.27.3"
"@babel/types": "^7.27.6"
},
"engines": {
"node": ">=6.9.0"
@ -388,9 +388,9 @@
}
},
"node_modules/@babel/runtime": {
"version": "7.27.4",
"resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.27.4.tgz",
"integrity": "sha512-t3yaEOuGu9NlIZ+hIeGbBjFtZT7j2cb2tg0fuaJKeGotchRjjLfrBA9Kwf8quhpP1EUuxModQg04q/mBwyg8uA==",
"version": "7.27.6",
"resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.27.6.tgz",
"integrity": "sha512-vbavdySgbTTrmFE+EsiqUTzlOr5bzlnJtUv9PynGCAKvfQqjIXbvFdumPM/GxMDfyuGMJaJAU6TO4zc1Jf1i8Q==",
"license": "MIT",
"engines": {
"node": ">=6.9.0"
@ -429,9 +429,9 @@
}
},
"node_modules/@babel/types": {
"version": "7.27.3",
"resolved": "https://registry.npmjs.org/@babel/types/-/types-7.27.3.tgz",
"integrity": "sha512-Y1GkI4ktrtvmawoSq+4FCVHNryea6uR+qUQy0AGxLSsjCX0nVmkYQMBLHDkXZuo5hGx7eYdnIaslsdBFm7zbUw==",
"version": "7.27.6",
"resolved": "https://registry.npmjs.org/@babel/types/-/types-7.27.6.tgz",
"integrity": "sha512-ETyHEk2VHHvl9b9jZP5IHPavHYk57EhanlRRuae9XCpb/j5bDCbPPMOBfCWhnl/7EDJz0jEMCi/RhccCE8r1+Q==",
"license": "MIT",
"dependencies": {
"@babel/helper-string-parser": "^7.27.1",
@ -4096,14 +4096,14 @@
"license": "MIT"
},
"node_modules/@react-aria/focus": {
"version": "3.20.3",
"resolved": "https://registry.npmjs.org/@react-aria/focus/-/focus-3.20.3.tgz",
"integrity": "sha512-rR5uZUMSY4xLHmpK/I8bP1V6vUNHFo33gTvrvNUsAKKqvMfa7R2nu5A6v97dr5g6tVH6xzpdkPsOJCWh90H2cw==",
"version": "3.20.4",
"resolved": "https://registry.npmjs.org/@react-aria/focus/-/focus-3.20.4.tgz",
"integrity": "sha512-E9M/kPYvF1fBZpkRXsKqMhvBVEyTY7vmkHeXLJo6tInKQOjYyYs0VeWlnGnxBjQIAH7J7ZKAORfTFQQHyhoueQ==",
"license": "Apache-2.0",
"dependencies": {
"@react-aria/interactions": "^3.25.1",
"@react-aria/utils": "^3.29.0",
"@react-types/shared": "^3.29.1",
"@react-aria/interactions": "^3.25.2",
"@react-aria/utils": "^3.29.1",
"@react-types/shared": "^3.30.0",
"@swc/helpers": "^0.5.0",
"clsx": "^2.0.0"
},
@ -4113,15 +4113,15 @@
}
},
"node_modules/@react-aria/interactions": {
"version": "3.25.1",
"resolved": "https://registry.npmjs.org/@react-aria/interactions/-/interactions-3.25.1.tgz",
"integrity": "sha512-ntLrlgqkmZupbbjekz3fE/n3eQH2vhncx8gUp0+N+GttKWevx7jos11JUBjnJwb1RSOPgRUFcrluOqBp0VgcfQ==",
"version": "3.25.2",
"resolved": "https://registry.npmjs.org/@react-aria/interactions/-/interactions-3.25.2.tgz",
"integrity": "sha512-BWyZXBT4P17b9C9HfOIT2glDFMH9nUCfQF7vZ5FEeXNBudH/8OcSbzyBUG4Dg3XPtkOem5LP59ocaizkl32Tvg==",
"license": "Apache-2.0",
"dependencies": {
"@react-aria/ssr": "^3.9.8",
"@react-aria/utils": "^3.29.0",
"@react-stately/flags": "^3.1.1",
"@react-types/shared": "^3.29.1",
"@react-aria/ssr": "^3.9.9",
"@react-aria/utils": "^3.29.1",
"@react-stately/flags": "^3.1.2",
"@react-types/shared": "^3.30.0",
"@swc/helpers": "^0.5.0"
},
"peerDependencies": {
@ -4130,9 +4130,9 @@
}
},
"node_modules/@react-aria/ssr": {
"version": "3.9.8",
"resolved": "https://registry.npmjs.org/@react-aria/ssr/-/ssr-3.9.8.tgz",
"integrity": "sha512-lQDE/c9uTfBSDOjaZUJS8xP2jCKVk4zjQeIlCH90xaLhHDgbpCdns3xvFpJJujfj3nI4Ll9K7A+ONUBDCASOuw==",
"version": "3.9.9",
"resolved": "https://registry.npmjs.org/@react-aria/ssr/-/ssr-3.9.9.tgz",
"integrity": "sha512-2P5thfjfPy/np18e5wD4WPt8ydNXhij1jwA8oehxZTFqlgVMGXzcWKxTb4RtJrLFsqPO7RUQTiY8QJk0M4Vy2g==",
"license": "Apache-2.0",
"dependencies": {
"@swc/helpers": "^0.5.0"
@ -4145,15 +4145,15 @@
}
},
"node_modules/@react-aria/utils": {
"version": "3.29.0",
"resolved": "https://registry.npmjs.org/@react-aria/utils/-/utils-3.29.0.tgz",
"integrity": "sha512-jSOrZimCuT1iKNVlhjIxDkAhgF7HSp3pqyT6qjg/ZoA0wfqCi/okmrMPiWSAKBnkgX93N8GYTLT3CIEO6WZe9Q==",
"version": "3.29.1",
"resolved": "https://registry.npmjs.org/@react-aria/utils/-/utils-3.29.1.tgz",
"integrity": "sha512-yXMFVJ73rbQ/yYE/49n5Uidjw7kh192WNN9PNQGV0Xoc7EJUlSOxqhnpHmYTyO0EotJ8fdM1fMH8durHjUSI8g==",
"license": "Apache-2.0",
"dependencies": {
"@react-aria/ssr": "^3.9.8",
"@react-stately/flags": "^3.1.1",
"@react-stately/utils": "^3.10.6",
"@react-types/shared": "^3.29.1",
"@react-aria/ssr": "^3.9.9",
"@react-stately/flags": "^3.1.2",
"@react-stately/utils": "^3.10.7",
"@react-types/shared": "^3.30.0",
"@swc/helpers": "^0.5.0",
"clsx": "^2.0.0"
},
@ -4163,18 +4163,18 @@
}
},
"node_modules/@react-stately/flags": {
"version": "3.1.1",
"resolved": "https://registry.npmjs.org/@react-stately/flags/-/flags-3.1.1.tgz",
"integrity": "sha512-XPR5gi5LfrPdhxZzdIlJDz/B5cBf63l4q6/AzNqVWFKgd0QqY5LvWJftXkklaIUpKSJkIKQb8dphuZXDtkWNqg==",
"version": "3.1.2",
"resolved": "https://registry.npmjs.org/@react-stately/flags/-/flags-3.1.2.tgz",
"integrity": "sha512-2HjFcZx1MyQXoPqcBGALwWWmgFVUk2TuKVIQxCbRq7fPyWXIl6VHcakCLurdtYC2Iks7zizvz0Idv48MQ38DWg==",
"license": "Apache-2.0",
"dependencies": {
"@swc/helpers": "^0.5.0"
}
},
"node_modules/@react-stately/utils": {
"version": "3.10.6",
"resolved": "https://registry.npmjs.org/@react-stately/utils/-/utils-3.10.6.tgz",
"integrity": "sha512-O76ip4InfTTzAJrg8OaZxKU4vvjMDOpfA/PGNOytiXwBbkct2ZeZwaimJ8Bt9W1bj5VsZ81/o/tW4BacbdDOMA==",
"version": "3.10.7",
"resolved": "https://registry.npmjs.org/@react-stately/utils/-/utils-3.10.7.tgz",
"integrity": "sha512-cWvjGAocvy4abO9zbr6PW6taHgF24Mwy/LbQ4TC4Aq3tKdKDntxyD+sh7AkSRfJRT2ccMVaHVv2+FfHThd3PKQ==",
"license": "Apache-2.0",
"dependencies": {
"@swc/helpers": "^0.5.0"
@ -4184,9 +4184,9 @@
}
},
"node_modules/@react-types/shared": {
"version": "3.29.1",
"resolved": "https://registry.npmjs.org/@react-types/shared/-/shared-3.29.1.tgz",
"integrity": "sha512-KtM+cDf2CXoUX439rfEhbnEdAgFZX20UP2A35ypNIawR7/PFFPjQDWyA2EnClCcW/dLWJDEPX2U8+EJff8xqmQ==",
"version": "3.30.0",
"resolved": "https://registry.npmjs.org/@react-types/shared/-/shared-3.30.0.tgz",
"integrity": "sha512-COIazDAx1ncDg046cTJ8SFYsX8aS3lB/08LDnbkH/SkdYrFPWDlXMrO/sUam8j1WWM+PJ+4d1mj7tODIKNiFog==",
"license": "Apache-2.0",
"peerDependencies": {
"react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
@ -4975,9 +4975,9 @@
}
},
"node_modules/@swc/core": {
"version": "1.11.29",
"resolved": "https://registry.npmjs.org/@swc/core/-/core-1.11.29.tgz",
"integrity": "sha512-g4mThMIpWbNhV8G2rWp5a5/Igv8/2UFRJx2yImrLGMgrDDYZIopqZ/z0jZxDgqNA1QDx93rpwNF7jGsxVWcMlA==",
"version": "1.11.31",
"resolved": "https://registry.npmjs.org/@swc/core/-/core-1.11.31.tgz",
"integrity": "sha512-mAby9aUnKRjMEA7v8cVZS9Ah4duoRBnX7X6r5qrhTxErx+68MoY1TPrVwj/66/SWN3Bl+jijqAqoB8Qx0QE34A==",
"dev": true,
"hasInstallScript": true,
"license": "Apache-2.0",
@ -4993,16 +4993,16 @@
"url": "https://opencollective.com/swc"
},
"optionalDependencies": {
"@swc/core-darwin-arm64": "1.11.29",
"@swc/core-darwin-x64": "1.11.29",
"@swc/core-linux-arm-gnueabihf": "1.11.29",
"@swc/core-linux-arm64-gnu": "1.11.29",
"@swc/core-linux-arm64-musl": "1.11.29",
"@swc/core-linux-x64-gnu": "1.11.29",
"@swc/core-linux-x64-musl": "1.11.29",
"@swc/core-win32-arm64-msvc": "1.11.29",
"@swc/core-win32-ia32-msvc": "1.11.29",
"@swc/core-win32-x64-msvc": "1.11.29"
"@swc/core-darwin-arm64": "1.11.31",
"@swc/core-darwin-x64": "1.11.31",
"@swc/core-linux-arm-gnueabihf": "1.11.31",
"@swc/core-linux-arm64-gnu": "1.11.31",
"@swc/core-linux-arm64-musl": "1.11.31",
"@swc/core-linux-x64-gnu": "1.11.31",
"@swc/core-linux-x64-musl": "1.11.31",
"@swc/core-win32-arm64-msvc": "1.11.31",
"@swc/core-win32-ia32-msvc": "1.11.31",
"@swc/core-win32-x64-msvc": "1.11.31"
},
"peerDependencies": {
"@swc/helpers": ">=0.5.17"
@ -5014,9 +5014,9 @@
}
},
"node_modules/@swc/core-darwin-arm64": {
"version": "1.11.29",
"resolved": "https://registry.npmjs.org/@swc/core-darwin-arm64/-/core-darwin-arm64-1.11.29.tgz",
"integrity": "sha512-whsCX7URzbuS5aET58c75Dloby3Gtj/ITk2vc4WW6pSDQKSPDuONsIcZ7B2ng8oz0K6ttbi4p3H/PNPQLJ4maQ==",
"version": "1.11.31",
"resolved": "https://registry.npmjs.org/@swc/core-darwin-arm64/-/core-darwin-arm64-1.11.31.tgz",
"integrity": "sha512-NTEaYOts0OGSbJZc0O74xsji+64JrF1stmBii6D5EevWEtrY4wlZhm8SiP/qPrOB+HqtAihxWIukWkP2aSdGSQ==",
"cpu": [
"arm64"
],
@ -5031,9 +5031,9 @@
}
},
"node_modules/@swc/core-darwin-x64": {
"version": "1.11.29",
"resolved": "https://registry.npmjs.org/@swc/core-darwin-x64/-/core-darwin-x64-1.11.29.tgz",
"integrity": "sha512-S3eTo/KYFk+76cWJRgX30hylN5XkSmjYtCBnM4jPLYn7L6zWYEPajsFLmruQEiTEDUg0gBEWLMNyUeghtswouw==",
"version": "1.11.31",
"resolved": "https://registry.npmjs.org/@swc/core-darwin-x64/-/core-darwin-x64-1.11.31.tgz",
"integrity": "sha512-THSGaSwT96JwXDwuXQ6yFBbn+xDMdyw7OmBpnweAWsh5DhZmQkALEm1DgdQO3+rrE99MkmzwAfclc0UmYro/OA==",
"cpu": [
"x64"
],
@ -5048,9 +5048,9 @@
}
},
"node_modules/@swc/core-linux-arm-gnueabihf": {
"version": "1.11.29",
"resolved": "https://registry.npmjs.org/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.11.29.tgz",
"integrity": "sha512-o9gdshbzkUMG6azldHdmKklcfrcMx+a23d/2qHQHPDLUPAN+Trd+sDQUYArK5Fcm7TlpG4sczz95ghN0DMkM7g==",
"version": "1.11.31",
"resolved": "https://registry.npmjs.org/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.11.31.tgz",
"integrity": "sha512-laKtQFnW7KHgE57Hx32os2SNAogcuIDxYE+3DYIOmDMqD7/1DCfJe6Rln2N9WcOw6HuDbDpyQavIwZNfSAa8vQ==",
"cpu": [
"arm"
],
@ -5065,9 +5065,9 @@
}
},
"node_modules/@swc/core-linux-arm64-gnu": {
"version": "1.11.29",
"resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.11.29.tgz",
"integrity": "sha512-sLoaciOgUKQF1KX9T6hPGzvhOQaJn+3DHy4LOHeXhQqvBgr+7QcZ+hl4uixPKTzxk6hy6Hb0QOvQEdBAAR1gXw==",
"version": "1.11.31",
"resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.11.31.tgz",
"integrity": "sha512-T+vGw9aPE1YVyRxRr1n7NAdkbgzBzrXCCJ95xAZc/0+WUwmL77Z+js0J5v1KKTRxw4FvrslNCOXzMWrSLdwPSA==",
"cpu": [
"arm64"
],
@ -5082,9 +5082,9 @@
}
},
"node_modules/@swc/core-linux-arm64-musl": {
"version": "1.11.29",
"resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.11.29.tgz",
"integrity": "sha512-PwjB10BC0N+Ce7RU/L23eYch6lXFHz7r3NFavIcwDNa/AAqywfxyxh13OeRy+P0cg7NDpWEETWspXeI4Ek8otw==",
"version": "1.11.31",
"resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.11.31.tgz",
"integrity": "sha512-Mztp5NZkyd5MrOAG+kl+QSn0lL4Uawd4CK4J7wm97Hs44N9DHGIG5nOz7Qve1KZo407Y25lTxi/PqzPKHo61zQ==",
"cpu": [
"arm64"
],
@ -5099,9 +5099,9 @@
}
},
"node_modules/@swc/core-linux-x64-gnu": {
"version": "1.11.29",
"resolved": "https://registry.npmjs.org/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.11.29.tgz",
"integrity": "sha512-i62vBVoPaVe9A3mc6gJG07n0/e7FVeAvdD9uzZTtGLiuIfVfIBta8EMquzvf+POLycSk79Z6lRhGPZPJPYiQaA==",
"version": "1.11.31",
"resolved": "https://registry.npmjs.org/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.11.31.tgz",
"integrity": "sha512-DDVE0LZcXOWwOqFU1Xi7gdtiUg3FHA0vbGb3trjWCuI1ZtDZHEQYL4M3/2FjqKZtIwASrDvO96w91okZbXhvMg==",
"cpu": [
"x64"
],
@ -5116,9 +5116,9 @@
}
},
"node_modules/@swc/core-linux-x64-musl": {
"version": "1.11.29",
"resolved": "https://registry.npmjs.org/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.11.29.tgz",
"integrity": "sha512-YER0XU1xqFdK0hKkfSVX1YIyCvMDI7K07GIpefPvcfyNGs38AXKhb2byySDjbVxkdl4dycaxxhRyhQ2gKSlsFQ==",
"version": "1.11.31",
"resolved": "https://registry.npmjs.org/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.11.31.tgz",
"integrity": "sha512-mJA1MzPPRIfaBUHZi0xJQ4vwL09MNWDeFtxXb0r4Yzpf0v5Lue9ymumcBPmw/h6TKWms+Non4+TDquAsweuKSw==",
"cpu": [
"x64"
],
@ -5133,9 +5133,9 @@
}
},
"node_modules/@swc/core-win32-arm64-msvc": {
"version": "1.11.29",
"resolved": "https://registry.npmjs.org/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.11.29.tgz",
"integrity": "sha512-po+WHw+k9g6FAg5IJ+sMwtA/fIUL3zPQ4m/uJgONBATCVnDDkyW6dBA49uHNVtSEvjvhuD8DVWdFP847YTcITw==",
"version": "1.11.31",
"resolved": "https://registry.npmjs.org/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.11.31.tgz",
"integrity": "sha512-RdtakUkNVAb/FFIMw3LnfNdlH1/ep6KgiPDRlmyUfd0WdIQ3OACmeBegEFNFTzi7gEuzy2Yxg4LWf4IUVk8/bg==",
"cpu": [
"arm64"
],
@ -5150,9 +5150,9 @@
}
},
"node_modules/@swc/core-win32-ia32-msvc": {
"version": "1.11.29",
"resolved": "https://registry.npmjs.org/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.11.29.tgz",
"integrity": "sha512-h+NjOrbqdRBYr5ItmStmQt6x3tnhqgwbj9YxdGPepbTDamFv7vFnhZR0YfB3jz3UKJ8H3uGJ65Zw1VsC+xpFkg==",
"version": "1.11.31",
"resolved": "https://registry.npmjs.org/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.11.31.tgz",
"integrity": "sha512-hErXdCGsg7swWdG1fossuL8542I59xV+all751mYlBoZ8kOghLSKObGQTkBbuNvc0sUKWfWg1X0iBuIhAYar+w==",
"cpu": [
"ia32"
],
@ -5167,9 +5167,9 @@
}
},
"node_modules/@swc/core-win32-x64-msvc": {
"version": "1.11.29",
"resolved": "https://registry.npmjs.org/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.11.29.tgz",
"integrity": "sha512-Q8cs2BDV9wqDvqobkXOYdC+pLUSEpX/KvI0Dgfun1F+LzuLotRFuDhrvkU9ETJA6OnD2+Fn/ieHgloiKA/Mn/g==",
"version": "1.11.31",
"resolved": "https://registry.npmjs.org/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.11.31.tgz",
"integrity": "sha512-5t7SGjUBMMhF9b5j17ml/f/498kiBJNf4vZFNM421UGUEETdtjPN9jZIuQrowBkoFGJTCVL/ECM4YRtTH30u/A==",
"cpu": [
"x64"
],
@ -5200,9 +5200,9 @@
}
},
"node_modules/@swc/types": {
"version": "0.1.21",
"resolved": "https://registry.npmjs.org/@swc/types/-/types-0.1.21.tgz",
"integrity": "sha512-2YEtj5HJVbKivud9N4bpPBAyZhj4S2Ipe5LkUG94alTpr7in/GU/EARgPAd3BwU+YOmFVJC2+kjqhGRi3r0ZpQ==",
"version": "0.1.22",
"resolved": "https://registry.npmjs.org/@swc/types/-/types-0.1.22.tgz",
"integrity": "sha512-D13mY/ZA4PPEFSy6acki9eBT/3WgjMoRqNcdpIvjaYLQ44Xk5BdaL7UkDxAh6Z9UOe7tCCp67BVmZCojYp9owg==",
"dev": true,
"license": "Apache-2.0",
"dependencies": {
@ -5286,9 +5286,9 @@
}
},
"node_modules/@tanstack/query-core": {
"version": "5.80.5",
"resolved": "https://registry.npmjs.org/@tanstack/query-core/-/query-core-5.80.5.tgz",
"integrity": "sha512-kFWXdQOUcjL/Ugk3GrI9eMuG3DsKBGaLIgyOLekR2UOrRrJgkLgPUNzZ10i8FCkfi4SgLABhOtQhx1HjoB9EZQ==",
"version": "5.80.6",
"resolved": "https://registry.npmjs.org/@tanstack/query-core/-/query-core-5.80.6.tgz",
"integrity": "sha512-nl7YxT/TAU+VTf+e2zTkObGTyY8YZBMnbgeA1ee66lIVqzKlYursAII6z5t0e6rXgwUMJSV4dshBTNacNpZHbQ==",
"license": "MIT",
"funding": {
"type": "github",
@ -5296,12 +5296,12 @@
}
},
"node_modules/@tanstack/react-query": {
"version": "5.80.5",
"resolved": "https://registry.npmjs.org/@tanstack/react-query/-/react-query-5.80.5.tgz",
"integrity": "sha512-C0d+pvIahk6fJK5bXxyf36r9Ft6R9O0mwl781CjBrYGRJc76XRJcKhkVpxIo68cjMy3i47gd4O1EGooAke/OCQ==",
"version": "5.80.6",
"resolved": "https://registry.npmjs.org/@tanstack/react-query/-/react-query-5.80.6.tgz",
"integrity": "sha512-izX+5CnkpON3NQGcEm3/d7LfFQNo9ZpFtX2QsINgCYK9LT2VCIdi8D3bMaMSNhrAJCznRoAkFic76uvLroALBw==",
"license": "MIT",
"dependencies": {
"@tanstack/query-core": "5.80.5"
"@tanstack/query-core": "5.80.6"
},
"funding": {
"type": "github",
@ -5767,9 +5767,9 @@
}
},
"node_modules/@types/estree": {
"version": "1.0.7",
"resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.7.tgz",
"integrity": "sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==",
"version": "1.0.8",
"resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz",
"integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==",
"license": "MIT"
},
"node_modules/@types/geojson": {
@ -5928,12 +5928,12 @@
"license": "MIT"
},
"node_modules/@types/node": {
"version": "20.17.57",
"resolved": "https://registry.npmjs.org/@types/node/-/node-20.17.57.tgz",
"integrity": "sha512-f3T4y6VU4fVQDKVqJV4Uppy8c1p/sVvS3peyqxyWnzkqXFJLRU7Y1Bl7rMS1Qe9z0v4M6McY0Fp9yBsgHJUsWQ==",
"version": "20.19.0",
"resolved": "https://registry.npmjs.org/@types/node/-/node-20.19.0.tgz",
"integrity": "sha512-hfrc+1tud1xcdVTABC2JiomZJEklMcXYNTVtZLAeqTVWD+qL5jkHKT+1lOtqDdGxt+mB53DTtiz673vfjU8D1Q==",
"license": "MIT",
"dependencies": {
"undici-types": "~6.19.2"
"undici-types": "~6.21.0"
}
},
"node_modules/@types/parse-json": {
@ -8062,9 +8062,9 @@
"license": "MIT"
},
"node_modules/effect": {
"version": "3.16.3",
"resolved": "https://registry.npmjs.org/effect/-/effect-3.16.3.tgz",
"integrity": "sha512-SWndb1UavNWvet1+hnkU4qp3EHtnmDKhUeP14eB+7vf/2nCFlM77/oIjdDeZctveibNjE65P9H/sBBmF0NTy/w==",
"version": "3.16.4",
"resolved": "https://registry.npmjs.org/effect/-/effect-3.16.4.tgz",
"integrity": "sha512-zJo5MRPEMROLjTHyrOJs0PUeEnRLy0ABwum3+HWlP8Y9LNF+NjipIRldVAcjSVQpJ7vY/OEGBxzw0USPzTfWag==",
"license": "MIT",
"dependencies": {
"@standard-schema/spec": "^1.0.0",
@ -8514,9 +8514,9 @@
}
},
"node_modules/esrap": {
"version": "1.4.6",
"resolved": "https://registry.npmjs.org/esrap/-/esrap-1.4.6.tgz",
"integrity": "sha512-F/D2mADJ9SHY3IwksD4DAXjTt7qt7GWUf3/8RhCNWmC/67tyb55dpimHmy7EplakFaflV0R/PC+fdSPqrRHAQw==",
"version": "1.4.7",
"resolved": "https://registry.npmjs.org/esrap/-/esrap-1.4.7.tgz",
"integrity": "sha512-0ZxW6guTF/AeKeKi7he93lmgv7Hx7giD1tBrOeVqkqsZGQJd2/kfnL7LdIsr9FT/AtkBK9XeDTov+gxprBqdEg==",
"license": "MIT",
"dependencies": {
"@jridgewell/sourcemap-codec": "^1.4.15"
@ -9007,14 +9007,15 @@
}
},
"node_modules/form-data": {
"version": "4.0.2",
"resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.2.tgz",
"integrity": "sha512-hGfm/slu0ZabnNt4oaRZ6uREyfCj6P4fT/n6A1rGV+Z0VdGXjfOhVUpkn6qVQONHGIFwmveGXyDs75+nr6FM8w==",
"version": "4.0.3",
"resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.3.tgz",
"integrity": "sha512-qsITQPfmvMOSAdeyZ+12I1c+CKSstAFAwu+97zrnWAbIr5u8wfsExUzCesVLC8NgHuRUqNN4Zy6UPWUTRGslcA==",
"license": "MIT",
"dependencies": {
"asynckit": "^0.4.0",
"combined-stream": "^1.0.8",
"es-set-tostringtag": "^2.1.0",
"hasown": "^2.0.2",
"mime-types": "^2.1.12"
},
"engines": {
@ -14981,6 +14982,12 @@
"fsevents": "~2.3.2"
}
},
"node_modules/rollup/node_modules/@types/estree": {
"version": "1.0.7",
"resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.7.tgz",
"integrity": "sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==",
"license": "MIT"
},
"node_modules/rrdom": {
"version": "0.1.7",
"resolved": "https://registry.npmjs.org/rrdom/-/rrdom-0.1.7.tgz",
@ -16352,9 +16359,9 @@
}
},
"node_modules/undici-types": {
"version": "6.19.8",
"resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz",
"integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==",
"version": "6.21.0",
"resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz",
"integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==",
"license": "MIT"
},
"node_modules/unified": {
@ -17885,9 +17892,9 @@
"license": "MIT"
},
"node_modules/zod": {
"version": "3.25.51",
"resolved": "https://registry.npmjs.org/zod/-/zod-3.25.51.tgz",
"integrity": "sha512-TQSnBldh+XSGL+opiSIq0575wvDPqu09AqWe1F7JhUMKY+M91/aGlK4MhpVNO7MgYfHcVCB1ffwAUTJzllKJqg==",
"version": "3.25.55",
"resolved": "https://registry.npmjs.org/zod/-/zod-3.25.55.tgz",
"integrity": "sha512-219huNnkSLQnLsQ3uaRjXsxMrVm5C9W3OOpEVt2k5tvMKuA8nBSu38e0B//a+he9Iq2dvmk2VyYVlHqiHa4YBA==",
"license": "MIT",
"funding": {
"url": "https://github.com/sponsors/colinhacks"

View file

@ -0,0 +1,338 @@
const SvgDocling = (props) => (
<svg
width="1em"
height="1em"
viewBox="0 0 1024 1024"
style={{
fillRule: "evenodd",
clipRule: "evenodd",
strokeLinecap: "round",
strokeLinejoin: "round",
strokeMiterlimit: 1.5,
}}
{...props}
>
<g id="Docling" transform="matrix(1.07666,0,0,1.07666,-35.9018,-84.1562)">
<g id="Outline" transform="matrix(1,0,0,1,-0.429741,55.0879)">
<path
d="M394.709,69.09C417.34,35.077 467.97,30.178 478.031,55.609C486.35,55.043 494.726,54.701 503.158,54.589C533.157,45.238 560.496,47.419 584.65,60.732C800.941,96.66 966.069,284.814 966.069,511.232C966.069,763.284 761.435,967.918 509.383,967.918C433.692,967.918 362.277,949.464 299.385,916.808L242.3,931.993C203.092,943.242 187.715,928.369 208.575,891.871C208.935,891.24 216.518,879.37 223.997,867.677C119.604,783.975 52.698,655.355 52.698,511.232C52.698,298.778 198.086,120.013 394.709,69.09Z"
style={{ fill: "white" }}
/>
</g>
<g id="Color" transform="matrix(1.02317,0,0,1.02317,-11.55,-17.8333)">
<path
d="M284.8,894.232L179.735,783.955L130.222,645.203L125.538,504.726L185.211,385.816C209.006,322.738 249.951,278.973 302.281,248.028L406.684,203.333L413.483,175.767L436.637,152.428L451.408,153.312L457.726,183.183L485.164,165.379L526.92,159.699L557.014,177.545L612.652,211.018C679.009,226.066 740.505,264.146 797.138,325.26L862.813,423.477L891.583,560.826L883.273,683.32L814.268,809.924L734.431,894.384L644.495,926.906L497.146,954.121L361.064,940.647L284.8,894.232Z"
style={{ fill: "url(#_Linear1)" }}
/>
<path
d="M699.932,887.255L634.427,825.291L597.884,782.352L594.906,738.956L610.14,709.396L643.207,699.954L685,710.111L730.425,736.425L765.204,778.79L775.166,849.531L719.381,894.082L699.932,887.255Z"
style={{ fill: "url(#_Linear2)" }}
/>
<g transform="matrix(-0.765945,0,0,1,839.727,5.47434)">
<clipPath id="_clip3">
<path d="M699.932,887.255L634.427,825.291L597.884,782.352L594.906,738.956L610.14,709.396L643.207,699.954L685,710.111L730.425,736.425L765.204,778.79L775.166,849.531L719.381,894.082L699.932,887.255Z" />
</clipPath>
<g clipPath="url(#_clip3)">
<g transform="matrix(-1.18516,0,0,0.907769,1039.04,88.3496)">
<use
xlinkHref="#_Image4"
x="223.969"
y="674.21"
width="152.098px"
height="213.852px"
transform="matrix(0.994105,0,0,0.999308,0,0)"
/>
</g>
</g>
</g>
<path
d="M311.699,713.521C189.178,639.091 164.299,526.77 191.824,394.113L135.136,476.434L122.004,547.53C143.022,614.014 174.522,676.199 225.005,730.598C210.601,754.156 201.894,776.601 197.955,798.114L245.803,841.67C247.274,812.1 254.934,783.047 270.614,754.664L311.699,713.521Z"
style={{ fillOpacity: 0.22 }}
/>
<g transform="matrix(-1,0,0,1,1022.04,2.74442)">
<path
d="M311.699,713.521C189.178,639.091 164.299,526.77 191.824,394.113L135.136,476.434L122.004,547.53C143.022,614.014 174.522,676.199 225.005,730.598C210.601,754.156 201.894,776.601 197.955,798.114L245.803,841.67C247.274,812.1 254.934,783.047 270.614,754.664L311.699,713.521Z"
style={{ fillOpacity: 0.22 }}
/>
</g>
<path
style={{ fill: "url(#_Linear5)" }}
d="M354.92,650.818L420.009,663.185L493.368,666.379L554.826,665.251L620.19,658.511L658.169,651.428L671.428,644.802L673.265,627.093L659.898,611.845L625.422,609.244L599.275,591.212L568.632,556.79L542.9,534.336L515.052,528.253L480.412,532.71L455.2,552.337L428.514,578.155L405.312,599.359L374.228,612.097L355.342,614.456L340.75,630.308L341.568,645.341L354.92,650.818Z"
/>
<path
style={{ fill: "url(#_Linear6)" }}
d="M257.168,949.32L317.434,876.747L364.928,810.6L384.1,743.934L378.759,714.719L376.844,685.849L374.836,659.954L448.734,664.2L511.462,667.602L571.339,665.091L632.796,658.836L648.232,656.882L649.937,697.808L608.105,717.702L598.45,738.594L592.286,761.642L604.743,796.309L639.595,825.803L649.872,840.757L558.219,895.152L502.124,907.569L425.781,923.496L333.29,931.298L286.269,936.907L257.168,949.32Z"
/>
<g transform="matrix(1,0,0,1.30081,-1.77636e-15,-196.488)">
<path
d="M374.165,685.268C463.946,706.599 553.728,707.491 643.51,688.593L641.903,653.199C549.263,671.731 459.645,672.22 373.059,654.611L374.165,685.268Z"
style={{ fillOpacity: 0.18 }}
/>
</g>
<path
d="M459.633,571.457C476.7,536.091 530.064,535.913 553.1,568.767C520.703,551.407 489.553,552.374 459.633,571.457Z"
style={{ fill: "white" }}
/>
<g transform="matrix(1,0,0,1,0.223468,-2.61949)">
<path
d="M355.3,267.232C500.64,173.156 720.699,241.362 793.691,423.582C766.716,384.84 735.725,357.078 697.53,349.014L717.306,335.248C698.537,321.49 675.794,320.957 651.039,327.119C652.235,315.768 658.995,306.991 674.188,302.115C641.864,287.427 617.356,289.473 596.258,298.818C597.049,286.116 605.827,278.087 620.068,273.254C589.192,267.477 564.13,270.926 544.651,283.232C545.822,271.831 550.709,260.943 560.913,250.79C517.498,257.095 492.995,267.925 482.892,282.202C477.311,269.499 477.274,257.221 487.625,245.739C439.161,252.932 421.555,265.094 410.355,278.286C407.697,269.01 407.705,260.632 410.853,253.316C389.633,254.773 372.178,260.663 355.3,267.232Z"
style={{ fill: "rgb(255,213,95)" }}
/>
</g>
<path
d="M475.656,209.175C479.639,175.037 503.437,173.299 532.412,180.026C507.242,183.404 486.969,195.251 473.705,219.215L475.656,209.175Z"
style={{ fill: "rgb(255,215,101)" }}
/>
<g transform="matrix(0.114323,-0.655229,0.82741,0.144365,224.632,497.317)">
<path
d="M475.656,209.175C479.639,175.037 503.437,173.299 532.412,180.026C507.242,183.404 486.969,195.251 473.705,219.215L475.656,209.175Z"
style={{ fill: "rgb(255,215,101)" }}
/>
</g>
<g transform="matrix(1.6739,1.15217e-16,-1.15217e-16,-0.733075,-341.46,1039.77)">
<path
d="M447.449,560.911C468.179,536.963 546.237,539.305 565.638,560.831C533.166,555.541 477.296,553.494 447.449,560.911Z"
style={{ fill: "white" }}
/>
</g>
<path
d="M348.201,622.341C395.549,653.534 622.351,660.854 661.936,616.729L677.568,633.834L667.044,650.308L557.802,667.518L498.074,670.562L446.718,666.416L391.404,658.406L348.154,652.501L340.161,637.119L348.201,622.341Z"
style={{ fill: "rgb(199,68,6)" }}
/>
</g>
<g
id="Black-outline"
transform="matrix(1.02317,0,0,1.02317,-11.55,-17.8333)"
>
<path
d="M373.389,657.919C376.285,676.334 377.04,695.016 375.326,714.008"
style={{ fill: "none", stroke: "black", strokeWidth: "15.73px" }}
/>
<path
d="M645.931,654.961C646.158,669.958 647.22,684.853 648.975,699.661"
style={{ fill: "none", stroke: "black", strokeWidth: "15.73px" }}
/>
<path d="M290.084,534.662C276.554,533.535 264.892,530.024 254.279,525.175C276.732,555.341 305.316,569.76 338.631,572.029L290.084,534.662Z" />
<g transform="matrix(0.94177,0,0,0.94909,28.8868,3.79501)">
<ellipse cx="338.022" cy="510.34" rx="88.911" ry="89.412" />
</g>
<g transform="matrix(0.112099,0.0552506,-0.0673118,0.136571,455.367,509.409)">
<ellipse cx="338.022" cy="510.34" rx="88.911" ry="89.412" />
</g>
<g transform="matrix(-0.112099,0.0552506,0.0673118,0.136571,560.529,509.492)">
<ellipse cx="338.022" cy="510.34" rx="88.911" ry="89.412" />
</g>
<g transform="matrix(-1,0,0,1,1013.33,-1.15187)">
<path d="M290.084,534.662C276.554,533.535 264.892,530.024 254.279,525.175C276.732,555.341 305.316,569.76 338.631,572.029L290.084,534.662Z" />
</g>
<g transform="matrix(-0.94177,0,0,0.94909,984.44,2.64314)">
<ellipse cx="338.022" cy="510.34" rx="88.911" ry="89.412" />
</g>
<g transform="matrix(1,0,0,1,1.9047,-5.57346)">
<path
d="M277.021,489.604C279.828,554.545 355.855,583.508 405.306,537.851C354.458,599.537 263.881,560.914 277.021,489.604Z"
style={{ fill: "white" }}
/>
</g>
<g transform="matrix(-1,0,0,1,1011.43,-5.7284)">
<path
d="M277.021,489.604C279.828,554.545 355.855,583.508 405.306,537.851C354.458,599.537 263.881,560.914 277.021,489.604Z"
style={{ fill: "white" }}
/>
</g>
<g transform="matrix(0.973815,0,0,1.00246,4.71761,-0.508759)">
<path
d="M407.22,206.891C107.655,339.384 134.447,630.03 314.615,708.305"
style={{ fill: "none", stroke: "black", strokeWidth: "29.39px" }}
/>
</g>
<g transform="matrix(-0.973815,0,0,1.00246,1006.67,-1.31695)">
<path
d="M461.559,196.756C119.768,256.762 111.059,642.544 320.305,711.486"
style={{ fill: "none", stroke: "black", strokeWidth: "29.39px" }}
/>
</g>
<g id="vector-duck">
<path
d="M240.912,850.71C248.043,740.231 325.609,685.992 371.268,715.193C386.487,724.926 392.506,757.72 358.575,816.753C327.005,871.68 300.465,894.596 288.329,903.447"
style={{ fill: "none", stroke: "black", strokeWidth: "21.79px" }}
/>
<path
d="M638.382,843.426C427.991,964.695 389.022,902.942 251.512,947.641L307.759,889.573"
style={{ fill: "none", stroke: "black", strokeWidth: "15.73px" }}
/>
<path
d="M770.991,853.754C779.364,764.998 730.67,727.923 666.385,704.966C629.568,691.819 580.483,723.886 595.974,772.596C606.285,805.016 650.54,839.029 707.786,886.778"
style={{ fill: "none", stroke: "black", strokeWidth: "21.79px" }}
/>
<g transform="matrix(1,0,0,1,-1.87208,0.908099)">
<path d="M603.287,772.415C614.237,757.963 627.553,750.285 642.878,748.352C628.356,760.968 617.23,775.676 620.632,799.336C635.815,785.15 650.367,779.457 664.396,780.801C651.715,790.7 639.329,803.279 641.039,818.089C641.247,819.891 647.043,823.996 647.595,825.837C659.897,816.37 672.867,811.065 689.234,809.472C676.577,822.659 668.021,834.011 674.478,848.729L664.333,847.825L625.643,812.604L603.629,786.218L603.287,772.415Z" />
</g>
<g transform="matrix(-0.969851,0.2437,0.2437,0.969851,773.329,-138.212)">
<path d="M603.287,772.415C614.237,757.963 627.553,750.285 642.878,748.352C628.356,760.968 617.23,775.676 620.632,799.336C635.815,785.15 650.367,779.457 664.396,780.801C651.715,790.7 639.329,803.279 641.039,818.089C641.247,819.891 647.043,823.996 647.595,825.837C659.897,816.37 672.867,811.065 689.234,809.472C676.577,822.659 668.021,834.011 674.478,848.729L664.333,847.825L625.643,812.604L603.629,786.218L603.287,772.415Z" />
</g>
<path
d="M511.787,670.044C461.061,671.835 411.878,662.84 361.322,653.92C329.071,648.229 335.56,616.432 361.693,615.181C391.498,613.754 411.83,601.737 437.593,569.084C459.063,541.872 482.443,528.143 506.834,529.767"
style={{ fill: "none", stroke: "black", strokeWidth: "15.73px" }}
/>
<g transform="matrix(-1,0,0,1,1014.44,-0.213451)">
<path
d="M511.787,670.044C461.061,671.835 411.878,662.84 361.322,653.92C329.071,648.229 335.56,616.432 361.693,615.181C391.498,613.754 411.83,601.737 437.593,569.084C459.063,541.872 482.443,528.143 506.834,529.767"
style={{ fill: "none", stroke: "black", strokeWidth: "15.73px" }}
/>
</g>
</g>
<g transform="matrix(2.4586,0,0,2.5497,-444.527,-690.434)">
<ellipse
cx="312.566"
cy="450.751"
rx="10.63"
ry="10.48"
style={{ fill: "white" }}
/>
</g>
<g transform="matrix(2.4586,0,0,2.5497,-127.75,-690.991)">
<ellipse
cx="312.566"
cy="450.751"
rx="10.63"
ry="10.48"
style={{ fill: "white" }}
/>
</g>
<path
d="M505.738,698.061L578.879,713.989"
style={{ fill: "none", stroke: "black", strokeWidth: "12.1px" }}
/>
<path
d="M422.781,709.6L568.438,743.041"
style={{ fill: "none", stroke: "black", strokeWidth: "12.1px" }}
/>
<path
d="M419.941,738.409L565.688,772.989"
style={{ fill: "none", stroke: "black", strokeWidth: "12.1px" }}
/>
<path
d="M408.6,787.08L510.634,810.689"
style={{ fill: "none", stroke: "black", strokeWidth: "12.1px" }}
/>
<path
d="M397.571,815.956L500.93,840.219"
style={{ fill: "none", stroke: "black", strokeWidth: "12.1px" }}
/>
<path
d="M386.763,844.926L454.065,861.974"
style={{ fill: "none", stroke: "black", strokeWidth: "12.1px" }}
/>
<path
d="M459.169,919.169C512.194,898.262 539.171,867.298 535.241,824.402C568.052,818.31 598.499,817.058 625.84,822.165"
style={{ fill: "none", stroke: "black", strokeWidth: "16.95px" }}
/>
<path d="M366.219,241.106C389.605,229.261 413.371,220.601 438.247,217.5C416.795,202.419 418.72,174.582 444.22,162.47C442.086,178.175 447.633,193.354 464.772,207.738C468.721,167.57 530.015,162.087 545.674,184.112C526.45,189.314 513.082,197.344 504.566,207.717C522.403,208.119 540.706,207.86 556.2,210.609L566.935,168.471C536.388,146.208 495.718,142.166 464.65,166.705C467.703,133.264 419.536,128.364 404.624,178.47L366.219,241.106Z" />
<path d="M392.617,924.576C428.953,936.938 467.84,943.636 508.258,943.636C708.944,943.636 871.876,778.49 871.876,575.076C871.876,382.463 725.788,224.162 539.898,207.895L554.137,173.696L554.485,168.187C757.218,191.602 914.895,366.003 914.895,577.383C914.895,804.698 732.549,989.249 507.949,989.249C435.381,989.249 367.223,969.983 308.199,936.232L392.617,924.576ZM279.206,917.988C171.663,843.819 101.002,718.887 101.002,577.383C101.002,383.006 234.333,219.898 413.398,176.712L424.375,216.389C264.082,254.803 144.64,400.913 144.64,575.076C144.64,703.735 209.822,817.086 308.514,883.023L279.206,917.988Z" />
<path d="M714.938,895.223L647.287,836.693L616.06,855.308L549.158,889.412L459.845,919.216L390.213,928.828L429.291,950.712L535.832,960.1L586.137,952.591L662.254,931.896L714.938,895.223Z" />
<path
style={{ fill: "url(#_Linear7)" }}
d="M423.538,929.39C509.164,917.593 580.815,890.465 640.827,850.566C635.677,886.828 622.639,918.218 594.006,939.977C530.254,930.953 474.955,928.632 423.538,929.39Z"
/>
</g>
</g>
<defs>
<linearGradient
id="_Linear1"
x1="0"
y1="0"
x2="1"
y2="0"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(-52.3962,375.121,-375.121,-52.3962,471.134,384.463)"
>
<stop
offset="0"
style={{ stopColor: "rgb(255,176,44)", stopOpacity: 1 }}
/>
<stop
offset="1"
style={{ stopColor: "rgb(255,73,2)", stopOpacity: 1 }}
/>
</linearGradient>
<linearGradient
id="_Linear2"
x1="0"
y1="0"
x2="1"
y2="0"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(28.6198,-84.8913,84.8913,28.6198,647.831,831.55)"
>
<stop
offset="0"
style={{ stopColor: "rgb(255,73,2)", stopOpacity: 1 }}
/>
<stop
offset="1"
style={{ stopColor: "rgb(255,176,44)", stopOpacity: 1 }}
/>
</linearGradient>
<image
id="_Image4"
width="153px"
height="214px"
xlinkHref="data:image/jpeg;base64,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"
/>
<linearGradient
id="_Linear5"
x1="0"
y1="0"
x2="1"
y2="0"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(-39.3403,137.423,-137.423,-39.3403,545.523,573.246)"
>
<stop
offset="0"
style={{ stopColor: "rgb(255,200,41)", stopOpacity: 1 }}
/>
<stop
offset="1"
style={{ stopColor: "rgb(255,73,2)", stopOpacity: 1 }}
/>
</linearGradient>
<linearGradient
id="_Linear6"
x1="0"
y1="0"
x2="1"
y2="0"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(1.01113,-68.2054,68.2054,1.01113,482.996,741.463)"
>
<stop offset="0" style={{ stopColor: "white", stopOpacity: 1 }} />
<stop
offset="1"
style={{ stopColor: "rgb(179,179,179)", stopOpacity: 1 }}
/>
</linearGradient>
<linearGradient
id="_Linear7"
x1="0"
y1="0"
x2="1"
y2="0"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(-7.13599,-34.117,34.117,-7.13599,578.793,922.144)"
>
<stop
offset="0"
style={{ stopColor: "rgb(164,164,164)", stopOpacity: 1 }}
/>
<stop
offset="1"
style={{ stopColor: "rgb(106,106,106)", stopOpacity: 1 }}
/>
</linearGradient>
</defs>
</svg>
);
export default SvgDocling;

View file

@ -0,0 +1,116 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg width="100%" height="100%" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" xmlns:serif="http://www.serif.com/" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:1.5;">
<g id="Docling" transform="matrix(1.07666,0,0,1.07666,-35.9018,-84.1562)">
<g id="Outline" transform="matrix(1,0,0,1,-0.429741,55.0879)">
<path d="M394.709,69.09C417.34,35.077 467.97,30.178 478.031,55.609C486.35,55.043 494.726,54.701 503.158,54.589C533.157,45.238 560.496,47.419 584.65,60.732C800.941,96.66 966.069,284.814 966.069,511.232C966.069,763.284 761.435,967.918 509.383,967.918C433.692,967.918 362.277,949.464 299.385,916.808L242.3,931.993C203.092,943.242 187.715,928.369 208.575,891.871C208.935,891.24 216.518,879.37 223.997,867.677C119.604,783.975 52.698,655.355 52.698,511.232C52.698,298.778 198.086,120.013 394.709,69.09Z" style="fill:white;"/>
</g>
<g id="Color" transform="matrix(1.02317,0,0,1.02317,-11.55,-17.8333)">
<path d="M284.8,894.232L179.735,783.955L130.222,645.203L125.538,504.726L185.211,385.816C209.006,322.738 249.951,278.973 302.281,248.028L406.684,203.333L413.483,175.767L436.637,152.428L451.408,153.312L457.726,183.183L485.164,165.379L526.92,159.699L557.014,177.545L612.652,211.018C679.009,226.066 740.505,264.146 797.138,325.26L862.813,423.477L891.583,560.826L883.273,683.32L814.268,809.924L734.431,894.384L644.495,926.906L497.146,954.121L361.064,940.647L284.8,894.232Z" style="fill:url(#_Linear1);"/>
<path d="M699.932,887.255L634.427,825.291L597.884,782.352L594.906,738.956L610.14,709.396L643.207,699.954L685,710.111L730.425,736.425L765.204,778.79L775.166,849.531L719.381,894.082L699.932,887.255Z" style="fill:url(#_Linear2);"/>
<g transform="matrix(-0.765945,0,0,1,839.727,5.47434)">
<clipPath id="_clip3">
<path d="M699.932,887.255L634.427,825.291L597.884,782.352L594.906,738.956L610.14,709.396L643.207,699.954L685,710.111L730.425,736.425L765.204,778.79L775.166,849.531L719.381,894.082L699.932,887.255Z"/>
</clipPath>
<g clip-path="url(#_clip3)">
<g transform="matrix(-1.18516,0,0,0.907769,1039.04,88.3496)">
<use xlink:href="#_Image4" x="223.969" y="674.21" width="152.098px" height="213.852px" transform="matrix(0.994105,0,0,0.999308,0,0)"/>
</g>
</g>
</g>
<path d="M311.699,713.521C189.178,639.091 164.299,526.77 191.824,394.113L135.136,476.434L122.004,547.53C143.022,614.014 174.522,676.199 225.005,730.598C210.601,754.156 201.894,776.601 197.955,798.114L245.803,841.67C247.274,812.1 254.934,783.047 270.614,754.664L311.699,713.521Z" style="fill-opacity:0.22;"/>
<g transform="matrix(-1,0,0,1,1022.04,2.74442)">
<path d="M311.699,713.521C189.178,639.091 164.299,526.77 191.824,394.113L135.136,476.434L122.004,547.53C143.022,614.014 174.522,676.199 225.005,730.598C210.601,754.156 201.894,776.601 197.955,798.114L245.803,841.67C247.274,812.1 254.934,783.047 270.614,754.664L311.699,713.521Z" style="fill-opacity:0.22;"/>
</g>
<path d="M354.92,650.818L420.009,663.185L493.368,666.379L554.826,665.251L620.19,658.511L658.169,651.428L671.428,644.802L673.265,627.093L659.898,611.845L625.422,609.244L599.275,591.212L568.632,556.79L542.9,534.336L515.052,528.253L480.412,532.71L455.2,552.337L428.514,578.155L405.312,599.359L374.228,612.097L355.342,614.456L340.75,630.308L341.568,645.341L354.92,650.818Z" style="fill:url(#_Linear5);"/>
<path d="M257.168,949.32L317.434,876.747L364.928,810.6L384.1,743.934L378.759,714.719L376.844,685.849L374.836,659.954L448.734,664.2L511.462,667.602L571.339,665.091L632.796,658.836L648.232,656.882L649.937,697.808L608.105,717.702L598.45,738.594L592.286,761.642L604.743,796.309L639.595,825.803L649.872,840.757L558.219,895.152L502.124,907.569L425.781,923.496L333.29,931.298L286.269,936.907L257.168,949.32Z" style="fill:url(#_Linear6);"/>
<g transform="matrix(1,0,0,1.30081,-1.77636e-15,-196.488)">
<path d="M374.165,685.268C463.946,706.599 553.728,707.491 643.51,688.593L641.903,653.199C549.263,671.731 459.645,672.22 373.059,654.611L374.165,685.268Z" style="fill-opacity:0.18;"/>
</g>
<path d="M459.633,571.457C476.7,536.091 530.064,535.913 553.1,568.767C520.703,551.407 489.553,552.374 459.633,571.457Z" style="fill:white;"/>
<g transform="matrix(1,0,0,1,0.223468,-2.61949)">
<path d="M355.3,267.232C500.64,173.156 720.699,241.362 793.691,423.582C766.716,384.84 735.725,357.078 697.53,349.014L717.306,335.248C698.537,321.49 675.794,320.957 651.039,327.119C652.235,315.768 658.995,306.991 674.188,302.115C641.864,287.427 617.356,289.473 596.258,298.818C597.049,286.116 605.827,278.087 620.068,273.254C589.192,267.477 564.13,270.926 544.651,283.232C545.822,271.831 550.709,260.943 560.913,250.79C517.498,257.095 492.995,267.925 482.892,282.202C477.311,269.499 477.274,257.221 487.625,245.739C439.161,252.932 421.555,265.094 410.355,278.286C407.697,269.01 407.705,260.632 410.853,253.316C389.633,254.773 372.178,260.663 355.3,267.232Z" style="fill:rgb(255,213,95);"/>
</g>
<path d="M475.656,209.175C479.639,175.037 503.437,173.299 532.412,180.026C507.242,183.404 486.969,195.251 473.705,219.215L475.656,209.175Z" style="fill:rgb(255,215,101);"/>
<g transform="matrix(0.114323,-0.655229,0.82741,0.144365,224.632,497.317)">
<path d="M475.656,209.175C479.639,175.037 503.437,173.299 532.412,180.026C507.242,183.404 486.969,195.251 473.705,219.215L475.656,209.175Z" style="fill:rgb(255,215,101);"/>
</g>
<g transform="matrix(1.6739,1.15217e-16,-1.15217e-16,-0.733075,-341.46,1039.77)">
<path d="M447.449,560.911C468.179,536.963 546.237,539.305 565.638,560.831C533.166,555.541 477.296,553.494 447.449,560.911Z" style="fill:white;"/>
</g>
<path d="M348.201,622.341C395.549,653.534 622.351,660.854 661.936,616.729L677.568,633.834L667.044,650.308L557.802,667.518L498.074,670.562L446.718,666.416L391.404,658.406L348.154,652.501L340.161,637.119L348.201,622.341Z" style="fill:rgb(199,68,6);"/>
</g>
<g id="Black-outline" serif:id="Black outline" transform="matrix(1.02317,0,0,1.02317,-11.55,-17.8333)">
<path d="M373.389,657.919C376.285,676.334 377.04,695.016 375.326,714.008" style="fill:none;stroke:black;stroke-width:15.73px;"/>
<path d="M645.931,654.961C646.158,669.958 647.22,684.853 648.975,699.661" style="fill:none;stroke:black;stroke-width:15.73px;"/>
<path d="M290.084,534.662C276.554,533.535 264.892,530.024 254.279,525.175C276.732,555.341 305.316,569.76 338.631,572.029L290.084,534.662Z"/>
<g transform="matrix(0.94177,0,0,0.94909,28.8868,3.79501)">
<ellipse cx="338.022" cy="510.34" rx="88.911" ry="89.412"/>
</g>
<g transform="matrix(0.112099,0.0552506,-0.0673118,0.136571,455.367,509.409)">
<ellipse cx="338.022" cy="510.34" rx="88.911" ry="89.412"/>
</g>
<g transform="matrix(-0.112099,0.0552506,0.0673118,0.136571,560.529,509.492)">
<ellipse cx="338.022" cy="510.34" rx="88.911" ry="89.412"/>
</g>
<g transform="matrix(-1,0,0,1,1013.33,-1.15187)">
<path d="M290.084,534.662C276.554,533.535 264.892,530.024 254.279,525.175C276.732,555.341 305.316,569.76 338.631,572.029L290.084,534.662Z"/>
</g>
<g transform="matrix(-0.94177,0,0,0.94909,984.44,2.64314)">
<ellipse cx="338.022" cy="510.34" rx="88.911" ry="89.412"/>
</g>
<g transform="matrix(1,0,0,1,1.9047,-5.57346)">
<path d="M277.021,489.604C279.828,554.545 355.855,583.508 405.306,537.851C354.458,599.537 263.881,560.914 277.021,489.604Z" style="fill:white;"/>
</g>
<g transform="matrix(-1,0,0,1,1011.43,-5.7284)">
<path d="M277.021,489.604C279.828,554.545 355.855,583.508 405.306,537.851C354.458,599.537 263.881,560.914 277.021,489.604Z" style="fill:white;"/>
</g>
<g transform="matrix(0.973815,0,0,1.00246,4.71761,-0.508759)">
<path d="M407.22,206.891C107.655,339.384 134.447,630.03 314.615,708.305" style="fill:none;stroke:black;stroke-width:29.39px;"/>
</g>
<g transform="matrix(-0.973815,0,0,1.00246,1006.67,-1.31695)">
<path d="M461.559,196.756C119.768,256.762 111.059,642.544 320.305,711.486" style="fill:none;stroke:black;stroke-width:29.39px;"/>
</g>
<g id="vector-duck" serif:id="vector duck">
<path d="M240.912,850.71C248.043,740.231 325.609,685.992 371.268,715.193C386.487,724.926 392.506,757.72 358.575,816.753C327.005,871.68 300.465,894.596 288.329,903.447" style="fill:none;stroke:black;stroke-width:21.79px;"/>
<path d="M638.382,843.426C427.991,964.695 389.022,902.942 251.512,947.641L307.759,889.573" style="fill:none;stroke:black;stroke-width:15.73px;"/>
<path d="M770.991,853.754C779.364,764.998 730.67,727.923 666.385,704.966C629.568,691.819 580.483,723.886 595.974,772.596C606.285,805.016 650.54,839.029 707.786,886.778" style="fill:none;stroke:black;stroke-width:21.79px;"/>
<g transform="matrix(1,0,0,1,-1.87208,0.908099)">
<path d="M603.287,772.415C614.237,757.963 627.553,750.285 642.878,748.352C628.356,760.968 617.23,775.676 620.632,799.336C635.815,785.15 650.367,779.457 664.396,780.801C651.715,790.7 639.329,803.279 641.039,818.089C641.247,819.891 647.043,823.996 647.595,825.837C659.897,816.37 672.867,811.065 689.234,809.472C676.577,822.659 668.021,834.011 674.478,848.729L664.333,847.825L625.643,812.604L603.629,786.218L603.287,772.415Z"/>
</g>
<g transform="matrix(-0.969851,0.2437,0.2437,0.969851,773.329,-138.212)">
<path d="M603.287,772.415C614.237,757.963 627.553,750.285 642.878,748.352C628.356,760.968 617.23,775.676 620.632,799.336C635.815,785.15 650.367,779.457 664.396,780.801C651.715,790.7 639.329,803.279 641.039,818.089C641.247,819.891 647.043,823.996 647.595,825.837C659.897,816.37 672.867,811.065 689.234,809.472C676.577,822.659 668.021,834.011 674.478,848.729L664.333,847.825L625.643,812.604L603.629,786.218L603.287,772.415Z"/>
</g>
<path d="M511.787,670.044C461.061,671.835 411.878,662.84 361.322,653.92C329.071,648.229 335.56,616.432 361.693,615.181C391.498,613.754 411.83,601.737 437.593,569.084C459.063,541.872 482.443,528.143 506.834,529.767" style="fill:none;stroke:black;stroke-width:15.73px;"/>
<g transform="matrix(-1,0,0,1,1014.44,-0.213451)">
<path d="M511.787,670.044C461.061,671.835 411.878,662.84 361.322,653.92C329.071,648.229 335.56,616.432 361.693,615.181C391.498,613.754 411.83,601.737 437.593,569.084C459.063,541.872 482.443,528.143 506.834,529.767" style="fill:none;stroke:black;stroke-width:15.73px;"/>
</g>
</g>
<g transform="matrix(2.4586,0,0,2.5497,-444.527,-690.434)">
<ellipse cx="312.566" cy="450.751" rx="10.63" ry="10.48" style="fill:white;"/>
</g>
<g transform="matrix(2.4586,0,0,2.5497,-127.75,-690.991)">
<ellipse cx="312.566" cy="450.751" rx="10.63" ry="10.48" style="fill:white;"/>
</g>
<path d="M505.738,698.061L578.879,713.989" style="fill:none;stroke:black;stroke-width:12.1px;"/>
<path d="M422.781,709.6L568.438,743.041" style="fill:none;stroke:black;stroke-width:12.1px;"/>
<path d="M419.941,738.409L565.688,772.989" style="fill:none;stroke:black;stroke-width:12.1px;"/>
<path d="M408.6,787.08L510.634,810.689" style="fill:none;stroke:black;stroke-width:12.1px;"/>
<path d="M397.571,815.956L500.93,840.219" style="fill:none;stroke:black;stroke-width:12.1px;"/>
<path d="M386.763,844.926L454.065,861.974" style="fill:none;stroke:black;stroke-width:12.1px;"/>
<path d="M459.169,919.169C512.194,898.262 539.171,867.298 535.241,824.402C568.052,818.31 598.499,817.058 625.84,822.165" style="fill:none;stroke:black;stroke-width:16.95px;"/>
<path d="M366.219,241.106C389.605,229.261 413.371,220.601 438.247,217.5C416.795,202.419 418.72,174.582 444.22,162.47C442.086,178.175 447.633,193.354 464.772,207.738C468.721,167.57 530.015,162.087 545.674,184.112C526.45,189.314 513.082,197.344 504.566,207.717C522.403,208.119 540.706,207.86 556.2,210.609L566.935,168.471C536.388,146.208 495.718,142.166 464.65,166.705C467.703,133.264 419.536,128.364 404.624,178.47L366.219,241.106Z"/>
<path d="M392.617,924.576C428.953,936.938 467.84,943.636 508.258,943.636C708.944,943.636 871.876,778.49 871.876,575.076C871.876,382.463 725.788,224.162 539.898,207.895L554.137,173.696L554.485,168.187C757.218,191.602 914.895,366.003 914.895,577.383C914.895,804.698 732.549,989.249 507.949,989.249C435.381,989.249 367.223,969.983 308.199,936.232L392.617,924.576ZM279.206,917.988C171.663,843.819 101.002,718.887 101.002,577.383C101.002,383.006 234.333,219.898 413.398,176.712L424.375,216.389C264.082,254.803 144.64,400.913 144.64,575.076C144.64,703.735 209.822,817.086 308.514,883.023L279.206,917.988Z"/>
<path d="M714.938,895.223L647.287,836.693L616.06,855.308L549.158,889.412L459.845,919.216L390.213,928.828L429.291,950.712L535.832,960.1L586.137,952.591L662.254,931.896L714.938,895.223Z"/>
<path d="M423.538,929.39C509.164,917.593 580.815,890.465 640.827,850.566C635.677,886.828 622.639,918.218 594.006,939.977C530.254,930.953 474.955,928.632 423.538,929.39Z" style="fill:url(#_Linear7);"/>
</g>
</g>
<defs>
<linearGradient id="_Linear1" x1="0" y1="0" x2="1" y2="0" gradientUnits="userSpaceOnUse" gradientTransform="matrix(-52.3962,375.121,-375.121,-52.3962,471.134,384.463)"><stop offset="0" style="stop-color:rgb(255,176,44);stop-opacity:1"/><stop offset="1" style="stop-color:rgb(255,73,2);stop-opacity:1"/></linearGradient>
<linearGradient id="_Linear2" x1="0" y1="0" x2="1" y2="0" gradientUnits="userSpaceOnUse" gradientTransform="matrix(28.6198,-84.8913,84.8913,28.6198,647.831,831.55)"><stop offset="0" style="stop-color:rgb(255,73,2);stop-opacity:1"/><stop offset="1" style="stop-color:rgb(255,176,44);stop-opacity:1"/></linearGradient>
<image id="_Image4" width="153px" height="214px" xlink:href="data:image/jpeg;base64,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"/>
<linearGradient id="_Linear5" x1="0" y1="0" x2="1" y2="0" gradientUnits="userSpaceOnUse" gradientTransform="matrix(-39.3403,137.423,-137.423,-39.3403,545.523,573.246)"><stop offset="0" style="stop-color:rgb(255,200,41);stop-opacity:1"/><stop offset="1" style="stop-color:rgb(255,73,2);stop-opacity:1"/></linearGradient>
<linearGradient id="_Linear6" x1="0" y1="0" x2="1" y2="0" gradientUnits="userSpaceOnUse" gradientTransform="matrix(1.01113,-68.2054,68.2054,1.01113,482.996,741.463)"><stop offset="0" style="stop-color:white;stop-opacity:1"/><stop offset="1" style="stop-color:rgb(179,179,179);stop-opacity:1"/></linearGradient>
<linearGradient id="_Linear7" x1="0" y1="0" x2="1" y2="0" gradientUnits="userSpaceOnUse" gradientTransform="matrix(-7.13599,-34.117,34.117,-7.13599,578.793,922.144)"><stop offset="0" style="stop-color:rgb(164,164,164);stop-opacity:1"/><stop offset="1" style="stop-color:rgb(106,106,106);stop-opacity:1"/></linearGradient>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 18 KiB

View file

@ -0,0 +1,9 @@
import React, { forwardRef } from "react";
import SvgDocling from "./Docling";
export const DoclingIcon = forwardRef<
SVGSVGElement,
React.PropsWithChildren<{}>
>((props, ref) => {
return <SvgDocling ref={ref} {...props} />;
});

View file

@ -24,6 +24,7 @@ import { ConfluenceIcon } from "@/icons/Confluence";
import { CouchbaseIcon } from "@/icons/Couchbase";
import { CrewAiIcon } from "@/icons/CrewAI";
import { DeepSeekIcon } from "@/icons/DeepSeek";
import { DoclingIcon } from "@/icons/Docling";
import { DropboxIcon } from "@/icons/Dropbox";
import { DuckDuckGoIcon } from "@/icons/DuckDuckGo";
import { ElasticsearchIcon } from "@/icons/ElasticsearchStore";
@ -141,6 +142,7 @@ export const eagerIconsMapping = {
Couchbase: CouchbaseIcon,
CrewAI: CrewAiIcon,
DeepSeek: DeepSeekIcon,
Docling: DoclingIcon,
Dropbox: DropboxIcon,
DuckDuckGo: DuckDuckGoIcon,
ElasticsearchStore: ElasticsearchIcon,

View file

@ -70,6 +70,8 @@ export const lazyIconsMapping = {
import("@/icons/Cursor").then((mod) => ({ default: mod.CursorIcon })),
DeepSeek: () =>
import("@/icons/DeepSeek").then((mod) => ({ default: mod.DeepSeekIcon })),
Docling: () =>
import("@/icons/Docling").then((mod) => ({ default: mod.DoclingIcon })),
Dropbox: () =>
import("@/icons/Dropbox").then((mod) => ({ default: mod.DropboxIcon })),
DuckDuckGo: () =>

View file

@ -256,6 +256,7 @@ export const SIDEBAR_BUNDLES = [
name: "datastax",
icon: "AstraDB",
},
{ display_name: "Docling", name: "docling", icon: "Docling" },
{ display_name: "Olivya", name: "olivya", icon: "Olivya" },
{ display_name: "LangWatch", name: "langwatch", icon: "Langwatch" },
{ display_name: "Notion", name: "Notion", icon: "Notion" },