diff --git a/AGENTS.md b/AGENTS.md index 5859cd1bd9..2ef7931efc 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -14,7 +14,7 @@ The codebase is split into: - Run backend CLI commands through `uv run --project api `. -- Backend QA gate requires passing `make lint`, `make type-check`, and `uv run --project api --dev dev/pytest/pytest_unit_tests.sh` before review. +- Before submission, all backend modifications must pass local checks: `make lint`, `make type-check`, and `uv run --project api --dev dev/pytest/pytest_unit_tests.sh`. - Use Makefile targets for linting and formatting; `make lint` and `make type-check` cover the required checks. diff --git a/api/configs/feature/__init__.py b/api/configs/feature/__init__.py index 6ce72e80df..a02f8a4d49 100644 --- a/api/configs/feature/__init__.py +++ b/api/configs/feature/__init__.py @@ -548,7 +548,7 @@ class UpdateConfig(BaseSettings): class WorkflowVariableTruncationConfig(BaseSettings): WORKFLOW_VARIABLE_TRUNCATION_MAX_SIZE: PositiveInt = Field( - # 100KB + # 1000 KiB 1024_000, description="Maximum size for variable to trigger final truncation.", ) diff --git a/api/core/indexing_runner.py b/api/core/indexing_runner.py index 7822ed4268..c430fba0b9 100644 --- a/api/core/indexing_runner.py +++ b/api/core/indexing_runner.py @@ -49,62 +49,80 @@ class IndexingRunner: self.storage = storage self.model_manager = ModelManager() + def _handle_indexing_error(self, document_id: str, error: Exception) -> None: + """Handle indexing errors by updating document status.""" + logger.exception("consume document failed") + document = db.session.get(DatasetDocument, document_id) + if document: + document.indexing_status = "error" + error_message = getattr(error, "description", str(error)) + document.error = str(error_message) + document.stopped_at = naive_utc_now() + db.session.commit() + def run(self, dataset_documents: list[DatasetDocument]): """Run the indexing process.""" for dataset_document in dataset_documents: + document_id = dataset_document.id try: + # Re-query the document to ensure it's bound to the current session + requeried_document = db.session.get(DatasetDocument, document_id) + if not requeried_document: + logger.warning("Document not found, skipping document id: %s", document_id) + continue + # get dataset - dataset = db.session.query(Dataset).filter_by(id=dataset_document.dataset_id).first() + dataset = db.session.query(Dataset).filter_by(id=requeried_document.dataset_id).first() if not dataset: raise ValueError("no dataset found") # get the process rule stmt = select(DatasetProcessRule).where( - DatasetProcessRule.id == dataset_document.dataset_process_rule_id + DatasetProcessRule.id == requeried_document.dataset_process_rule_id ) processing_rule = db.session.scalar(stmt) if not processing_rule: raise ValueError("no process rule found") - index_type = dataset_document.doc_form + index_type = requeried_document.doc_form index_processor = IndexProcessorFactory(index_type).init_index_processor() # extract - text_docs = self._extract(index_processor, dataset_document, processing_rule.to_dict()) + text_docs = self._extract(index_processor, requeried_document, processing_rule.to_dict()) # transform documents = self._transform( - index_processor, dataset, text_docs, dataset_document.doc_language, processing_rule.to_dict() + index_processor, dataset, text_docs, requeried_document.doc_language, processing_rule.to_dict() ) # save segment - self._load_segments(dataset, dataset_document, documents) + self._load_segments(dataset, requeried_document, documents) # load self._load( index_processor=index_processor, dataset=dataset, - dataset_document=dataset_document, + dataset_document=requeried_document, documents=documents, ) except DocumentIsPausedError: - raise DocumentIsPausedError(f"Document paused, document id: {dataset_document.id}") + raise DocumentIsPausedError(f"Document paused, document id: {document_id}") except ProviderTokenNotInitError as e: - dataset_document.indexing_status = "error" - dataset_document.error = str(e.description) - dataset_document.stopped_at = naive_utc_now() - db.session.commit() + self._handle_indexing_error(document_id, e) except ObjectDeletedError: - logger.warning("Document deleted, document id: %s", dataset_document.id) + logger.warning("Document deleted, document id: %s", document_id) except Exception as e: - logger.exception("consume document failed") - dataset_document.indexing_status = "error" - dataset_document.error = str(e) - dataset_document.stopped_at = naive_utc_now() - db.session.commit() + self._handle_indexing_error(document_id, e) def run_in_splitting_status(self, dataset_document: DatasetDocument): """Run the indexing process when the index_status is splitting.""" + document_id = dataset_document.id try: + # Re-query the document to ensure it's bound to the current session + requeried_document = db.session.get(DatasetDocument, document_id) + if not requeried_document: + logger.warning("Document not found: %s", document_id) + return + # get dataset - dataset = db.session.query(Dataset).filter_by(id=dataset_document.dataset_id).first() + dataset = db.session.query(Dataset).filter_by(id=requeried_document.dataset_id).first() if not dataset: raise ValueError("no dataset found") @@ -112,57 +130,60 @@ class IndexingRunner: # get exist document_segment list and delete document_segments = ( db.session.query(DocumentSegment) - .filter_by(dataset_id=dataset.id, document_id=dataset_document.id) + .filter_by(dataset_id=dataset.id, document_id=requeried_document.id) .all() ) for document_segment in document_segments: db.session.delete(document_segment) - if dataset_document.doc_form == IndexType.PARENT_CHILD_INDEX: + if requeried_document.doc_form == IndexType.PARENT_CHILD_INDEX: # delete child chunks db.session.query(ChildChunk).where(ChildChunk.segment_id == document_segment.id).delete() db.session.commit() # get the process rule - stmt = select(DatasetProcessRule).where(DatasetProcessRule.id == dataset_document.dataset_process_rule_id) + stmt = select(DatasetProcessRule).where(DatasetProcessRule.id == requeried_document.dataset_process_rule_id) processing_rule = db.session.scalar(stmt) if not processing_rule: raise ValueError("no process rule found") - index_type = dataset_document.doc_form + index_type = requeried_document.doc_form index_processor = IndexProcessorFactory(index_type).init_index_processor() # extract - text_docs = self._extract(index_processor, dataset_document, processing_rule.to_dict()) + text_docs = self._extract(index_processor, requeried_document, processing_rule.to_dict()) # transform documents = self._transform( - index_processor, dataset, text_docs, dataset_document.doc_language, processing_rule.to_dict() + index_processor, dataset, text_docs, requeried_document.doc_language, processing_rule.to_dict() ) # save segment - self._load_segments(dataset, dataset_document, documents) + self._load_segments(dataset, requeried_document, documents) # load self._load( - index_processor=index_processor, dataset=dataset, dataset_document=dataset_document, documents=documents + index_processor=index_processor, + dataset=dataset, + dataset_document=requeried_document, + documents=documents, ) except DocumentIsPausedError: - raise DocumentIsPausedError(f"Document paused, document id: {dataset_document.id}") + raise DocumentIsPausedError(f"Document paused, document id: {document_id}") except ProviderTokenNotInitError as e: - dataset_document.indexing_status = "error" - dataset_document.error = str(e.description) - dataset_document.stopped_at = naive_utc_now() - db.session.commit() + self._handle_indexing_error(document_id, e) except Exception as e: - logger.exception("consume document failed") - dataset_document.indexing_status = "error" - dataset_document.error = str(e) - dataset_document.stopped_at = naive_utc_now() - db.session.commit() + self._handle_indexing_error(document_id, e) def run_in_indexing_status(self, dataset_document: DatasetDocument): """Run the indexing process when the index_status is indexing.""" + document_id = dataset_document.id try: + # Re-query the document to ensure it's bound to the current session + requeried_document = db.session.get(DatasetDocument, document_id) + if not requeried_document: + logger.warning("Document not found: %s", document_id) + return + # get dataset - dataset = db.session.query(Dataset).filter_by(id=dataset_document.dataset_id).first() + dataset = db.session.query(Dataset).filter_by(id=requeried_document.dataset_id).first() if not dataset: raise ValueError("no dataset found") @@ -170,7 +191,7 @@ class IndexingRunner: # get exist document_segment list and delete document_segments = ( db.session.query(DocumentSegment) - .filter_by(dataset_id=dataset.id, document_id=dataset_document.id) + .filter_by(dataset_id=dataset.id, document_id=requeried_document.id) .all() ) @@ -188,7 +209,7 @@ class IndexingRunner: "dataset_id": document_segment.dataset_id, }, ) - if dataset_document.doc_form == IndexType.PARENT_CHILD_INDEX: + if requeried_document.doc_form == IndexType.PARENT_CHILD_INDEX: child_chunks = document_segment.get_child_chunks() if child_chunks: child_documents = [] @@ -206,24 +227,20 @@ class IndexingRunner: document.children = child_documents documents.append(document) # build index - index_type = dataset_document.doc_form + index_type = requeried_document.doc_form index_processor = IndexProcessorFactory(index_type).init_index_processor() self._load( - index_processor=index_processor, dataset=dataset, dataset_document=dataset_document, documents=documents + index_processor=index_processor, + dataset=dataset, + dataset_document=requeried_document, + documents=documents, ) except DocumentIsPausedError: - raise DocumentIsPausedError(f"Document paused, document id: {dataset_document.id}") + raise DocumentIsPausedError(f"Document paused, document id: {document_id}") except ProviderTokenNotInitError as e: - dataset_document.indexing_status = "error" - dataset_document.error = str(e.description) - dataset_document.stopped_at = naive_utc_now() - db.session.commit() + self._handle_indexing_error(document_id, e) except Exception as e: - logger.exception("consume document failed") - dataset_document.indexing_status = "error" - dataset_document.error = str(e) - dataset_document.stopped_at = naive_utc_now() - db.session.commit() + self._handle_indexing_error(document_id, e) def indexing_estimate( self, diff --git a/api/core/llm_generator/llm_generator.py b/api/core/llm_generator/llm_generator.py index e64ac25ab1..bd893b17f1 100644 --- a/api/core/llm_generator/llm_generator.py +++ b/api/core/llm_generator/llm_generator.py @@ -100,7 +100,7 @@ class LLMGenerator: return name @classmethod - def generate_suggested_questions_after_answer(cls, tenant_id: str, histories: str): + def generate_suggested_questions_after_answer(cls, tenant_id: str, histories: str) -> Sequence[str]: output_parser = SuggestedQuestionsAfterAnswerOutputParser() format_instructions = output_parser.get_format_instructions() @@ -119,6 +119,8 @@ class LLMGenerator: prompt_messages = [UserPromptMessage(content=prompt)] + questions: Sequence[str] = [] + try: response: LLMResult = model_instance.invoke_llm( prompt_messages=list(prompt_messages), diff --git a/api/core/llm_generator/output_parser/suggested_questions_after_answer.py b/api/core/llm_generator/output_parser/suggested_questions_after_answer.py index e78859cc1a..eec771181f 100644 --- a/api/core/llm_generator/output_parser/suggested_questions_after_answer.py +++ b/api/core/llm_generator/output_parser/suggested_questions_after_answer.py @@ -1,17 +1,26 @@ import json +import logging import re +from collections.abc import Sequence from core.llm_generator.prompts import SUGGESTED_QUESTIONS_AFTER_ANSWER_INSTRUCTION_PROMPT +logger = logging.getLogger(__name__) + class SuggestedQuestionsAfterAnswerOutputParser: def get_format_instructions(self) -> str: return SUGGESTED_QUESTIONS_AFTER_ANSWER_INSTRUCTION_PROMPT - def parse(self, text: str): + def parse(self, text: str) -> Sequence[str]: action_match = re.search(r"\[.*?\]", text.strip(), re.DOTALL) + questions: list[str] = [] if action_match is not None: - json_obj = json.loads(action_match.group(0).strip()) - else: - json_obj = [] - return json_obj + try: + json_obj = json.loads(action_match.group(0).strip()) + except json.JSONDecodeError as exc: + logger.warning("Failed to decode suggested questions payload: %s", exc) + else: + if isinstance(json_obj, list): + questions = [question for question in json_obj if isinstance(question, str)] + return questions diff --git a/api/core/workflow/nodes/llm/node.py b/api/core/workflow/nodes/llm/node.py index e4637e6e95..1644f683bf 100644 --- a/api/core/workflow/nodes/llm/node.py +++ b/api/core/workflow/nodes/llm/node.py @@ -441,10 +441,14 @@ class LLMNode(Node): usage = LLMUsage.empty_usage() finish_reason = None full_text_buffer = io.StringIO() + collected_structured_output = None # Collect structured_output from streaming chunks # Consume the invoke result and handle generator exception try: for result in invoke_result: if isinstance(result, LLMResultChunkWithStructuredOutput): + # Collect structured_output from the chunk + if result.structured_output is not None: + collected_structured_output = dict(result.structured_output) yield result if isinstance(result, LLMResultChunk): contents = result.delta.message.content @@ -492,6 +496,8 @@ class LLMNode(Node): finish_reason=finish_reason, # Reasoning content for workflow variables and downstream nodes reasoning_content=reasoning_content, + # Pass structured output if collected from streaming chunks + structured_output=collected_structured_output, ) @staticmethod diff --git a/api/events/event_handlers/clean_when_dataset_deleted.py b/api/events/event_handlers/clean_when_dataset_deleted.py index 0f6aa0e778..1666e2e29f 100644 --- a/api/events/event_handlers/clean_when_dataset_deleted.py +++ b/api/events/event_handlers/clean_when_dataset_deleted.py @@ -6,8 +6,8 @@ from tasks.clean_dataset_task import clean_dataset_task @dataset_was_deleted.connect def handle(sender: Dataset, **kwargs): dataset = sender - assert dataset.doc_form - assert dataset.indexing_technique + if not dataset.doc_form or not dataset.indexing_technique: + return clean_dataset_task.delay( dataset.id, dataset.tenant_id, diff --git a/api/events/event_handlers/clean_when_document_deleted.py b/api/events/event_handlers/clean_when_document_deleted.py index bbc913b7cf..0add109b06 100644 --- a/api/events/event_handlers/clean_when_document_deleted.py +++ b/api/events/event_handlers/clean_when_document_deleted.py @@ -8,6 +8,6 @@ def handle(sender, **kwargs): dataset_id = kwargs.get("dataset_id") doc_form = kwargs.get("doc_form") file_id = kwargs.get("file_id") - assert dataset_id is not None - assert doc_form is not None + if not dataset_id or not doc_form: + return clean_document_task.delay(document_id, dataset_id, doc_form, file_id) diff --git a/api/extensions/ext_blueprints.py b/api/extensions/ext_blueprints.py index 52fef4929f..82f0542b35 100644 --- a/api/extensions/ext_blueprints.py +++ b/api/extensions/ext_blueprints.py @@ -1,7 +1,12 @@ from configs import dify_config -from constants import HEADER_NAME_APP_CODE, HEADER_NAME_CSRF_TOKEN +from constants import HEADER_NAME_APP_CODE, HEADER_NAME_CSRF_TOKEN, HEADER_NAME_PASSPORT from dify_app import DifyApp +BASE_CORS_HEADERS: tuple[str, ...] = ("Content-Type", HEADER_NAME_APP_CODE, HEADER_NAME_PASSPORT) +SERVICE_API_HEADERS: tuple[str, ...] = (*BASE_CORS_HEADERS, "Authorization") +AUTHENTICATED_HEADERS: tuple[str, ...] = (*SERVICE_API_HEADERS, HEADER_NAME_CSRF_TOKEN) +FILES_HEADERS: tuple[str, ...] = (*BASE_CORS_HEADERS, HEADER_NAME_CSRF_TOKEN) + def init_app(app: DifyApp): # register blueprint routers @@ -17,7 +22,7 @@ def init_app(app: DifyApp): CORS( service_api_bp, - allow_headers=["Content-Type", "Authorization", HEADER_NAME_APP_CODE], + allow_headers=list(SERVICE_API_HEADERS), methods=["GET", "PUT", "POST", "DELETE", "OPTIONS", "PATCH"], ) app.register_blueprint(service_api_bp) @@ -26,7 +31,7 @@ def init_app(app: DifyApp): web_bp, resources={r"/*": {"origins": dify_config.WEB_API_CORS_ALLOW_ORIGINS}}, supports_credentials=True, - allow_headers=["Content-Type", "Authorization", HEADER_NAME_APP_CODE, HEADER_NAME_CSRF_TOKEN], + allow_headers=list(AUTHENTICATED_HEADERS), methods=["GET", "PUT", "POST", "DELETE", "OPTIONS", "PATCH"], expose_headers=["X-Version", "X-Env"], ) @@ -36,7 +41,7 @@ def init_app(app: DifyApp): console_app_bp, resources={r"/*": {"origins": dify_config.CONSOLE_CORS_ALLOW_ORIGINS}}, supports_credentials=True, - allow_headers=["Content-Type", "Authorization", HEADER_NAME_CSRF_TOKEN], + allow_headers=list(AUTHENTICATED_HEADERS), methods=["GET", "PUT", "POST", "DELETE", "OPTIONS", "PATCH"], expose_headers=["X-Version", "X-Env"], ) @@ -44,7 +49,7 @@ def init_app(app: DifyApp): CORS( files_bp, - allow_headers=["Content-Type", HEADER_NAME_CSRF_TOKEN], + allow_headers=list(FILES_HEADERS), methods=["GET", "PUT", "POST", "DELETE", "OPTIONS", "PATCH"], ) app.register_blueprint(files_bp) diff --git a/api/migrations/versions/2025_10_14_1618-d98acf217d43_add_app_mode_for_messsage.py b/api/migrations/versions/2025_10_14_1618-d98acf217d43_add_app_mode_for_messsage.py index 7d6797fca0..910cf75838 100644 --- a/api/migrations/versions/2025_10_14_1618-d98acf217d43_add_app_mode_for_messsage.py +++ b/api/migrations/versions/2025_10_14_1618-d98acf217d43_add_app_mode_for_messsage.py @@ -22,55 +22,6 @@ def upgrade(): batch_op.add_column(sa.Column('app_mode', sa.String(length=255), nullable=True)) batch_op.create_index('message_app_mode_idx', ['app_mode'], unique=False) - conn = op.get_bind() - - # Strategy: Update in batches to minimize lock time - # For large tables (millions of rows), this prevents long-running transactions - batch_size = 10000 - - print("Starting backfill of app_mode from conversations...") - - # Use a more efficient UPDATE with JOIN - # This query updates messages.app_mode from conversations.mode - # Using string formatting for LIMIT since it's a constant - update_query = f""" - UPDATE messages m - SET app_mode = c.mode - FROM conversations c - WHERE m.conversation_id = c.id - AND m.app_mode IS NULL - AND m.id IN ( - SELECT id FROM messages - WHERE app_mode IS NULL - LIMIT {batch_size} - ) - """ - - # Execute batched updates - total_updated = 0 - iteration = 0 - while True: - iteration += 1 - result = conn.execute(sa.text(update_query)) - - # Check if result is None or has no rowcount - if result is None: - print("Warning: Query returned None, stopping backfill") - break - - rows_updated = result.rowcount if hasattr(result, 'rowcount') else 0 - total_updated += rows_updated - - if rows_updated == 0: - break - - print(f"Iteration {iteration}: Updated {rows_updated} messages (total: {total_updated})") - - # For very large tables, add a small delay to reduce load - # Uncomment if needed: import time; time.sleep(0.1) - - print(f"Backfill completed. Total messages updated: {total_updated}") - # ### end Alembic commands ### diff --git a/api/pyproject.toml b/api/pyproject.toml index 74e6782d83..040d9658b3 100644 --- a/api/pyproject.toml +++ b/api/pyproject.toml @@ -63,7 +63,7 @@ dependencies = [ "pycryptodome==3.19.1", "pydantic~=2.11.4", "pydantic-extra-types~=2.10.3", - "pydantic-settings~=2.9.1", + "pydantic-settings~=2.11.0", "pyjwt~=2.10.1", "pypdfium2==4.30.0", "python-docx~=1.1.0", diff --git a/api/services/message_service.py b/api/services/message_service.py index 9fdff18622..7ed56d80f2 100644 --- a/api/services/message_service.py +++ b/api/services/message_service.py @@ -288,9 +288,10 @@ class MessageService: ) with measure_time() as timer: - questions: list[str] = LLMGenerator.generate_suggested_questions_after_answer( + questions_sequence = LLMGenerator.generate_suggested_questions_after_answer( tenant_id=app_model.tenant_id, histories=histories ) + questions: list[str] = list(questions_sequence) # get tracing instance trace_manager = TraceQueueManager(app_id=app_model.id) diff --git a/api/services/variable_truncator.py b/api/services/variable_truncator.py index d02508e4f3..a8f37c31c8 100644 --- a/api/services/variable_truncator.py +++ b/api/services/variable_truncator.py @@ -79,7 +79,7 @@ class VariableTruncator: self, string_length_limit=5000, array_element_limit: int = 20, - max_size_bytes: int = 1024_000, # 100KB + max_size_bytes: int = 1024_000, # 1000 KiB ): if string_length_limit <= 3: raise ValueError("string_length_limit should be greater than 3.") diff --git a/api/tests/unit_tests/services/test_dataset_service_delete_dataset.py b/api/tests/unit_tests/services/test_dataset_service_delete_dataset.py new file mode 100644 index 0000000000..cc718c9997 --- /dev/null +++ b/api/tests/unit_tests/services/test_dataset_service_delete_dataset.py @@ -0,0 +1,216 @@ +from unittest.mock import Mock, patch + +import pytest + +from models.account import Account, TenantAccountRole +from models.dataset import Dataset +from services.dataset_service import DatasetService + + +class DatasetDeleteTestDataFactory: + """Factory class for creating test data and mock objects for dataset delete tests.""" + + @staticmethod + def create_dataset_mock( + dataset_id: str = "dataset-123", + tenant_id: str = "test-tenant-123", + created_by: str = "creator-456", + doc_form: str | None = None, + indexing_technique: str | None = "high_quality", + **kwargs, + ) -> Mock: + """Create a mock dataset with specified attributes.""" + dataset = Mock(spec=Dataset) + dataset.id = dataset_id + dataset.tenant_id = tenant_id + dataset.created_by = created_by + dataset.doc_form = doc_form + dataset.indexing_technique = indexing_technique + for key, value in kwargs.items(): + setattr(dataset, key, value) + return dataset + + @staticmethod + def create_user_mock( + user_id: str = "user-789", + tenant_id: str = "test-tenant-123", + role: TenantAccountRole = TenantAccountRole.ADMIN, + **kwargs, + ) -> Mock: + """Create a mock user with specified attributes.""" + user = Mock(spec=Account) + user.id = user_id + user.current_tenant_id = tenant_id + user.current_role = role + for key, value in kwargs.items(): + setattr(user, key, value) + return user + + +class TestDatasetServiceDeleteDataset: + """ + Comprehensive unit tests for DatasetService.delete_dataset method. + + This test suite covers all deletion scenarios including: + - Normal dataset deletion with documents + - Empty dataset deletion (no documents, doc_form is None) + - Dataset deletion with missing indexing_technique + - Permission checks + - Event handling + + This test suite provides regression protection for issue #27073. + """ + + @pytest.fixture + def mock_dataset_service_dependencies(self): + """Common mock setup for dataset service dependencies.""" + with ( + patch("services.dataset_service.DatasetService.get_dataset") as mock_get_dataset, + patch("services.dataset_service.DatasetService.check_dataset_permission") as mock_check_perm, + patch("extensions.ext_database.db.session") as mock_db, + patch("services.dataset_service.dataset_was_deleted") as mock_dataset_was_deleted, + ): + yield { + "get_dataset": mock_get_dataset, + "check_permission": mock_check_perm, + "db_session": mock_db, + "dataset_was_deleted": mock_dataset_was_deleted, + } + + def test_delete_dataset_with_documents_success(self, mock_dataset_service_dependencies): + """ + Test successful deletion of a dataset with documents. + + This test verifies: + - Dataset is retrieved correctly + - Permission check is performed + - dataset_was_deleted event is sent + - Dataset is deleted from database + - Method returns True + """ + # Arrange + dataset = DatasetDeleteTestDataFactory.create_dataset_mock( + doc_form="text_model", indexing_technique="high_quality" + ) + user = DatasetDeleteTestDataFactory.create_user_mock() + + mock_dataset_service_dependencies["get_dataset"].return_value = dataset + + # Act + result = DatasetService.delete_dataset(dataset.id, user) + + # Assert + assert result is True + mock_dataset_service_dependencies["get_dataset"].assert_called_once_with(dataset.id) + mock_dataset_service_dependencies["check_permission"].assert_called_once_with(dataset, user) + mock_dataset_service_dependencies["dataset_was_deleted"].send.assert_called_once_with(dataset) + mock_dataset_service_dependencies["db_session"].delete.assert_called_once_with(dataset) + mock_dataset_service_dependencies["db_session"].commit.assert_called_once() + + def test_delete_empty_dataset_success(self, mock_dataset_service_dependencies): + """ + Test successful deletion of an empty dataset (no documents, doc_form is None). + + This test verifies that: + - Empty datasets can be deleted without errors + - dataset_was_deleted event is sent (event handler will skip cleanup if doc_form is None) + - Dataset is deleted from database + - Method returns True + + This is the primary test for issue #27073 where deleting an empty dataset + caused internal server error due to assertion failure in event handlers. + """ + # Arrange + dataset = DatasetDeleteTestDataFactory.create_dataset_mock(doc_form=None, indexing_technique=None) + user = DatasetDeleteTestDataFactory.create_user_mock() + + mock_dataset_service_dependencies["get_dataset"].return_value = dataset + + # Act + result = DatasetService.delete_dataset(dataset.id, user) + + # Assert - Verify complete deletion flow + assert result is True + mock_dataset_service_dependencies["get_dataset"].assert_called_once_with(dataset.id) + mock_dataset_service_dependencies["check_permission"].assert_called_once_with(dataset, user) + mock_dataset_service_dependencies["dataset_was_deleted"].send.assert_called_once_with(dataset) + mock_dataset_service_dependencies["db_session"].delete.assert_called_once_with(dataset) + mock_dataset_service_dependencies["db_session"].commit.assert_called_once() + + def test_delete_dataset_with_partial_none_values(self, mock_dataset_service_dependencies): + """ + Test deletion of dataset with partial None values. + + This test verifies that datasets with partial None values (e.g., doc_form exists + but indexing_technique is None) can be deleted successfully. The event handler + will skip cleanup if any required field is None. + + Improvement based on Gemini Code Assist suggestion: Added comprehensive assertions + to verify all core deletion operations are performed, not just event sending. + """ + # Arrange + dataset = DatasetDeleteTestDataFactory.create_dataset_mock(doc_form="text_model", indexing_technique=None) + user = DatasetDeleteTestDataFactory.create_user_mock() + + mock_dataset_service_dependencies["get_dataset"].return_value = dataset + + # Act + result = DatasetService.delete_dataset(dataset.id, user) + + # Assert - Verify complete deletion flow (Gemini suggestion implemented) + assert result is True + mock_dataset_service_dependencies["get_dataset"].assert_called_once_with(dataset.id) + mock_dataset_service_dependencies["check_permission"].assert_called_once_with(dataset, user) + mock_dataset_service_dependencies["dataset_was_deleted"].send.assert_called_once_with(dataset) + mock_dataset_service_dependencies["db_session"].delete.assert_called_once_with(dataset) + mock_dataset_service_dependencies["db_session"].commit.assert_called_once() + + def test_delete_dataset_with_doc_form_none_indexing_technique_exists(self, mock_dataset_service_dependencies): + """ + Test deletion of dataset where doc_form is None but indexing_technique exists. + + This edge case can occur in certain dataset configurations and should be handled + gracefully by the event handler's conditional check. + """ + # Arrange + dataset = DatasetDeleteTestDataFactory.create_dataset_mock(doc_form=None, indexing_technique="high_quality") + user = DatasetDeleteTestDataFactory.create_user_mock() + + mock_dataset_service_dependencies["get_dataset"].return_value = dataset + + # Act + result = DatasetService.delete_dataset(dataset.id, user) + + # Assert - Verify complete deletion flow + assert result is True + mock_dataset_service_dependencies["get_dataset"].assert_called_once_with(dataset.id) + mock_dataset_service_dependencies["check_permission"].assert_called_once_with(dataset, user) + mock_dataset_service_dependencies["dataset_was_deleted"].send.assert_called_once_with(dataset) + mock_dataset_service_dependencies["db_session"].delete.assert_called_once_with(dataset) + mock_dataset_service_dependencies["db_session"].commit.assert_called_once() + + def test_delete_dataset_not_found(self, mock_dataset_service_dependencies): + """ + Test deletion attempt when dataset doesn't exist. + + This test verifies that: + - Method returns False when dataset is not found + - No deletion operations are performed + - No events are sent + """ + # Arrange + dataset_id = "non-existent-dataset" + user = DatasetDeleteTestDataFactory.create_user_mock() + + mock_dataset_service_dependencies["get_dataset"].return_value = None + + # Act + result = DatasetService.delete_dataset(dataset_id, user) + + # Assert + assert result is False + mock_dataset_service_dependencies["get_dataset"].assert_called_once_with(dataset_id) + mock_dataset_service_dependencies["check_permission"].assert_not_called() + mock_dataset_service_dependencies["dataset_was_deleted"].send.assert_not_called() + mock_dataset_service_dependencies["db_session"].delete.assert_not_called() + mock_dataset_service_dependencies["db_session"].commit.assert_not_called() diff --git a/api/uv.lock b/api/uv.lock index 8f28fa36a8..e7e51acedf 100644 --- a/api/uv.lock +++ b/api/uv.lock @@ -1545,7 +1545,7 @@ requires-dist = [ { name = "pycryptodome", specifier = "==3.19.1" }, { name = "pydantic", specifier = "~=2.11.4" }, { name = "pydantic-extra-types", specifier = "~=2.10.3" }, - { name = "pydantic-settings", specifier = "~=2.9.1" }, + { name = "pydantic-settings", specifier = "~=2.11.0" }, { name = "pyjwt", specifier = "~=2.10.1" }, { name = "pypdfium2", specifier = "==4.30.0" }, { name = "python-docx", specifier = "~=1.1.0" }, @@ -4754,16 +4754,16 @@ wheels = [ [[package]] name = "pydantic-settings" -version = "2.9.1" +version = "2.11.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "pydantic" }, { name = "python-dotenv" }, { name = "typing-inspection" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/67/1d/42628a2c33e93f8e9acbde0d5d735fa0850f3e6a2f8cb1eb6c40b9a732ac/pydantic_settings-2.9.1.tar.gz", hash = "sha256:c509bf79d27563add44e8446233359004ed85066cd096d8b510f715e6ef5d268", size = 163234, upload-time = "2025-04-18T16:44:48.265Z" } +sdist = { url = "https://files.pythonhosted.org/packages/20/c5/dbbc27b814c71676593d1c3f718e6cd7d4f00652cefa24b75f7aa3efb25e/pydantic_settings-2.11.0.tar.gz", hash = "sha256:d0e87a1c7d33593beb7194adb8470fc426e95ba02af83a0f23474a04c9a08180", size = 188394, upload-time = "2025-09-24T14:19:11.764Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/b6/5f/d6d641b490fd3ec2c4c13b4244d68deea3a1b970a97be64f34fb5504ff72/pydantic_settings-2.9.1-py3-none-any.whl", hash = "sha256:59b4f431b1defb26fe620c71a7d3968a710d719f5f4cdbbdb7926edeb770f6ef", size = 44356, upload-time = "2025-04-18T16:44:46.617Z" }, + { url = "https://files.pythonhosted.org/packages/83/d6/887a1ff844e64aa823fb4905978d882a633cfe295c32eacad582b78a7d8b/pydantic_settings-2.11.0-py3-none-any.whl", hash = "sha256:fe2cea3413b9530d10f3a5875adffb17ada5c1e1bab0b2885546d7310415207c", size = 48608, upload-time = "2025-09-24T14:19:10.015Z" }, ] [[package]] diff --git a/web/.storybook/main.ts b/web/.storybook/main.ts index fecf774e98..0605c71346 100644 --- a/web/.storybook/main.ts +++ b/web/.storybook/main.ts @@ -1,19 +1,29 @@ import type { StorybookConfig } from '@storybook/nextjs' const config: StorybookConfig = { - // stories: ['../stories/**/*.mdx', '../stories/**/*.stories.@(js|jsx|mjs|ts|tsx)'], stories: ['../app/components/**/*.stories.@(js|jsx|mjs|ts|tsx)'], addons: [ '@storybook/addon-onboarding', '@storybook/addon-links', - '@storybook/addon-essentials', + '@storybook/addon-docs', '@chromatic-com/storybook', - '@storybook/addon-interactions', ], framework: { name: '@storybook/nextjs', - options: {}, + options: { + builder: { + useSWC: true, + lazyCompilation: false, + }, + nextConfigPath: undefined, + }, }, staticDirs: ['../public'], + core: { + disableWhatsNewNotifications: true, + }, + docs: { + defaultName: 'Documentation', + }, } export default config diff --git a/web/.storybook/preview.tsx b/web/.storybook/preview.tsx index 55328602f9..1f5726de34 100644 --- a/web/.storybook/preview.tsx +++ b/web/.storybook/preview.tsx @@ -1,12 +1,21 @@ -import React from 'react' import type { Preview } from '@storybook/react' import { withThemeByDataAttribute } from '@storybook/addon-themes' -import I18nServer from '../app/components/i18n-server' +import { QueryClient, QueryClientProvider } from '@tanstack/react-query' +import I18N from '../app/components/i18n' +import { ToastProvider } from '../app/components/base/toast' import '../app/styles/globals.css' import '../app/styles/markdown.scss' import './storybook.css' +const queryClient = new QueryClient({ + defaultOptions: { + queries: { + refetchOnWindowFocus: false, + }, + }, +}) + export const decorators = [ withThemeByDataAttribute({ themes: { @@ -17,9 +26,15 @@ export const decorators = [ attributeName: 'data-theme', }), (Story) => { - return - - + return ( + + + + + + + + ) }, ] @@ -31,7 +46,11 @@ const preview: Preview = { date: /Date$/i, }, }, + docs: { + toc: true, + }, }, + tags: ['autodocs'], } export default preview diff --git a/web/__tests__/navigation-utils.test.ts b/web/__tests__/navigation-utils.test.ts index 9a388505d6..fa4986e63d 100644 --- a/web/__tests__/navigation-utils.test.ts +++ b/web/__tests__/navigation-utils.test.ts @@ -160,8 +160,7 @@ describe('Navigation Utilities', () => { page: 1, limit: '', keyword: 'test', - empty: null, - undefined, + filter: '', }) expect(path).toBe('/datasets/123/documents?page=1&keyword=test') diff --git a/web/__tests__/real-browser-flicker.test.tsx b/web/__tests__/real-browser-flicker.test.tsx index f71e8de515..0a0ea0c062 100644 --- a/web/__tests__/real-browser-flicker.test.tsx +++ b/web/__tests__/real-browser-flicker.test.tsx @@ -39,28 +39,38 @@ const setupMockEnvironment = (storedTheme: string | null, systemPrefersDark = fa const isDarkQuery = DARK_MODE_MEDIA_QUERY.test(query) const matches = isDarkQuery ? systemPrefersDark : false + const handleAddListener = (listener: (event: MediaQueryListEvent) => void) => { + listeners.add(listener) + } + + const handleRemoveListener = (listener: (event: MediaQueryListEvent) => void) => { + listeners.delete(listener) + } + + const handleAddEventListener = (_event: string, listener: EventListener) => { + if (typeof listener === 'function') + listeners.add(listener as (event: MediaQueryListEvent) => void) + } + + const handleRemoveEventListener = (_event: string, listener: EventListener) => { + if (typeof listener === 'function') + listeners.delete(listener as (event: MediaQueryListEvent) => void) + } + + const handleDispatchEvent = (event: Event) => { + listeners.forEach(listener => listener(event as MediaQueryListEvent)) + return true + } + const mediaQueryList: MediaQueryList = { matches, media: query, onchange: null, - addListener: (listener: MediaQueryListListener) => { - listeners.add(listener) - }, - removeListener: (listener: MediaQueryListListener) => { - listeners.delete(listener) - }, - addEventListener: (_event, listener: EventListener) => { - if (typeof listener === 'function') - listeners.add(listener as MediaQueryListListener) - }, - removeEventListener: (_event, listener: EventListener) => { - if (typeof listener === 'function') - listeners.delete(listener as MediaQueryListListener) - }, - dispatchEvent: (event: Event) => { - listeners.forEach(listener => listener(event as MediaQueryListEvent)) - return true - }, + addListener: handleAddListener, + removeListener: handleRemoveListener, + addEventListener: handleAddEventListener, + removeEventListener: handleRemoveEventListener, + dispatchEvent: handleDispatchEvent, } return mediaQueryList @@ -69,6 +79,121 @@ const setupMockEnvironment = (storedTheme: string | null, systemPrefersDark = fa jest.spyOn(window, 'matchMedia').mockImplementation(mockMatchMedia) } +// Helper function to create timing page component +const createTimingPageComponent = ( + timingData: Array<{ phase: string; timestamp: number; styles: { backgroundColor: string; color: string } }>, +) => { + const recordTiming = (phase: string, styles: { backgroundColor: string; color: string }) => { + timingData.push({ + phase, + timestamp: performance.now(), + styles, + }) + } + + const TimingPageComponent = () => { + const [mounted, setMounted] = useState(false) + const { theme } = useTheme() + const isDark = mounted ? theme === 'dark' : false + + const currentStyles = { + backgroundColor: isDark ? '#1f2937' : '#ffffff', + color: isDark ? '#ffffff' : '#000000', + } + + recordTiming(mounted ? 'CSR' : 'Initial', currentStyles) + + useEffect(() => { + setMounted(true) + }, []) + + return ( +
+
+ Phase: {mounted ? 'CSR' : 'Initial'} | Theme: {theme} | Visual: {isDark ? 'dark' : 'light'} +
+
+ ) + } + + return TimingPageComponent +} + +// Helper function to create CSS test component +const createCSSTestComponent = ( + cssStates: Array<{ className: string; timestamp: number }>, +) => { + const recordCSSState = (className: string) => { + cssStates.push({ + className, + timestamp: performance.now(), + }) + } + + const CSSTestComponent = () => { + const [mounted, setMounted] = useState(false) + const { theme } = useTheme() + const isDark = mounted ? theme === 'dark' : false + + const className = `min-h-screen ${isDark ? 'bg-gray-900 text-white' : 'bg-white text-black'}` + + recordCSSState(className) + + useEffect(() => { + setMounted(true) + }, []) + + return ( +
+
Classes: {className}
+
+ ) + } + + return CSSTestComponent +} + +// Helper function to create performance test component +const createPerformanceTestComponent = ( + performanceMarks: Array<{ event: string; timestamp: number }>, +) => { + const recordPerformanceMark = (event: string) => { + performanceMarks.push({ event, timestamp: performance.now() }) + } + + const PerformanceTestComponent = () => { + const [mounted, setMounted] = useState(false) + const { theme } = useTheme() + + recordPerformanceMark('component-render') + + useEffect(() => { + recordPerformanceMark('mount-start') + setMounted(true) + recordPerformanceMark('mount-complete') + }, []) + + useEffect(() => { + if (theme) + recordPerformanceMark('theme-available') + }, [theme]) + + return ( +
+ Mounted: {mounted.toString()} | Theme: {theme || 'loading'} +
+ ) + } + + return PerformanceTestComponent +} + // Simulate real page component based on Dify's actual theme usage const PageComponent = () => { const [mounted, setMounted] = useState(false) @@ -227,39 +352,7 @@ describe('Real Browser Environment Dark Mode Flicker Test', () => { setupMockEnvironment('dark') const timingData: Array<{ phase: string; timestamp: number; styles: any }> = [] - - const TimingPageComponent = () => { - const [mounted, setMounted] = useState(false) - const { theme } = useTheme() - const isDark = mounted ? theme === 'dark' : false - - // Record timing and styles for each render phase - const currentStyles = { - backgroundColor: isDark ? '#1f2937' : '#ffffff', - color: isDark ? '#ffffff' : '#000000', - } - - timingData.push({ - phase: mounted ? 'CSR' : 'Initial', - timestamp: performance.now(), - styles: currentStyles, - }) - - useEffect(() => { - setMounted(true) - }, []) - - return ( -
-
- Phase: {mounted ? 'CSR' : 'Initial'} | Theme: {theme} | Visual: {isDark ? 'dark' : 'light'} -
-
- ) - } + const TimingPageComponent = createTimingPageComponent(timingData) render( @@ -295,33 +388,7 @@ describe('Real Browser Environment Dark Mode Flicker Test', () => { setupMockEnvironment('dark') const cssStates: Array<{ className: string; timestamp: number }> = [] - - const CSSTestComponent = () => { - const [mounted, setMounted] = useState(false) - const { theme } = useTheme() - const isDark = mounted ? theme === 'dark' : false - - // Simulate Tailwind CSS class application - const className = `min-h-screen ${isDark ? 'bg-gray-900 text-white' : 'bg-white text-black'}` - - cssStates.push({ - className, - timestamp: performance.now(), - }) - - useEffect(() => { - setMounted(true) - }, []) - - return ( -
-
Classes: {className}
-
- ) - } + const CSSTestComponent = createCSSTestComponent(cssStates) render( @@ -413,34 +480,12 @@ describe('Real Browser Environment Dark Mode Flicker Test', () => { test('verifies ThemeProvider position fix reduces initialization delay', async () => { const performanceMarks: Array<{ event: string; timestamp: number }> = [] - const PerformanceTestComponent = () => { - const [mounted, setMounted] = useState(false) - const { theme } = useTheme() - - performanceMarks.push({ event: 'component-render', timestamp: performance.now() }) - - useEffect(() => { - performanceMarks.push({ event: 'mount-start', timestamp: performance.now() }) - setMounted(true) - performanceMarks.push({ event: 'mount-complete', timestamp: performance.now() }) - }, []) - - useEffect(() => { - if (theme) - performanceMarks.push({ event: 'theme-available', timestamp: performance.now() }) - }, [theme]) - - return ( -
- Mounted: {mounted.toString()} | Theme: {theme || 'loading'} -
- ) - } - setupMockEnvironment('dark') expect(window.localStorage.getItem('theme')).toBe('dark') + const PerformanceTestComponent = createPerformanceTestComponent(performanceMarks) + render( diff --git a/web/__tests__/unified-tags-logic.test.ts b/web/__tests__/unified-tags-logic.test.ts index c920e28e0a..ec73a6a268 100644 --- a/web/__tests__/unified-tags-logic.test.ts +++ b/web/__tests__/unified-tags-logic.test.ts @@ -70,14 +70,18 @@ describe('Unified Tags Editing - Pure Logic Tests', () => { }) describe('Fallback Logic (from layout-main.tsx)', () => { + type Tag = { id: string; name: string } + type AppDetail = { tags: Tag[] } + type FallbackResult = { tags?: Tag[] } | null + // no-op it('should trigger fallback when tags are missing or empty', () => { - const appDetailWithoutTags = { tags: [] } - const appDetailWithTags = { tags: [{ id: 'tag1' }] } - const appDetailWithUndefinedTags = { tags: undefined as any } + const appDetailWithoutTags: AppDetail = { tags: [] } + const appDetailWithTags: AppDetail = { tags: [{ id: 'tag1', name: 't' }] } + const appDetailWithUndefinedTags: { tags: Tag[] | undefined } = { tags: undefined } // This simulates the condition in layout-main.tsx - const shouldFallback1 = !appDetailWithoutTags.tags || appDetailWithoutTags.tags.length === 0 - const shouldFallback2 = !appDetailWithTags.tags || appDetailWithTags.tags.length === 0 + const shouldFallback1 = appDetailWithoutTags.tags.length === 0 + const shouldFallback2 = appDetailWithTags.tags.length === 0 const shouldFallback3 = !appDetailWithUndefinedTags.tags || appDetailWithUndefinedTags.tags.length === 0 expect(shouldFallback1).toBe(true) // Empty array should trigger fallback @@ -86,24 +90,26 @@ describe('Unified Tags Editing - Pure Logic Tests', () => { }) it('should preserve tags when fallback succeeds', () => { - const originalAppDetail = { tags: [] as any[] } - const fallbackResult = { tags: [{ id: 'tag1', name: 'fallback-tag' }] } + const originalAppDetail: AppDetail = { tags: [] } + const fallbackResult: { tags?: Tag[] } = { tags: [{ id: 'tag1', name: 'fallback-tag' }] } // This simulates the successful fallback in layout-main.tsx - if (fallbackResult?.tags) - originalAppDetail.tags = fallbackResult.tags + const tags = fallbackResult.tags + if (tags) + originalAppDetail.tags = tags expect(originalAppDetail.tags).toEqual(fallbackResult.tags) expect(originalAppDetail.tags.length).toBe(1) }) it('should continue with empty tags when fallback fails', () => { - const originalAppDetail: { tags: any[] } = { tags: [] } - const fallbackResult: { tags?: any[] } | null = null + const originalAppDetail: AppDetail = { tags: [] } + const fallbackResult = null as FallbackResult // This simulates fallback failure in layout-main.tsx - if (fallbackResult?.tags) - originalAppDetail.tags = fallbackResult.tags + const tags: Tag[] | undefined = fallbackResult && 'tags' in fallbackResult ? fallbackResult.tags : undefined + if (tags) + originalAppDetail.tags = tags expect(originalAppDetail.tags).toEqual([]) }) diff --git a/web/app/components/app/app-publisher/features-wrapper.tsx b/web/app/components/app/app-publisher/features-wrapper.tsx index dadd112135..409c390f4b 100644 --- a/web/app/components/app/app-publisher/features-wrapper.tsx +++ b/web/app/components/app/app-publisher/features-wrapper.tsx @@ -1,6 +1,6 @@ import React, { useCallback, useState } from 'react' import { useTranslation } from 'react-i18next' -import produce from 'immer' +import { produce } from 'immer' import type { AppPublisherProps } from '@/app/components/app/app-publisher' import Confirm from '@/app/components/base/confirm' import AppPublisher from '@/app/components/app/app-publisher' diff --git a/web/app/components/app/configuration/config-prompt/advanced-prompt-input.tsx b/web/app/components/app/configuration/config-prompt/advanced-prompt-input.tsx index e2d37bb9de..70e0334e98 100644 --- a/web/app/components/app/configuration/config-prompt/advanced-prompt-input.tsx +++ b/web/app/components/app/configuration/config-prompt/advanced-prompt-input.tsx @@ -5,7 +5,7 @@ import copy from 'copy-to-clipboard' import { useTranslation } from 'react-i18next' import { useContext } from 'use-context-selector' import { useBoolean } from 'ahooks' -import produce from 'immer' +import { produce } from 'immer' import { RiDeleteBinLine, RiErrorWarningFill, diff --git a/web/app/components/app/configuration/config-prompt/index.tsx b/web/app/components/app/configuration/config-prompt/index.tsx index 1caca47bcb..ec34588e41 100644 --- a/web/app/components/app/configuration/config-prompt/index.tsx +++ b/web/app/components/app/configuration/config-prompt/index.tsx @@ -2,7 +2,7 @@ import type { FC } from 'react' import React from 'react' import { useContext } from 'use-context-selector' -import produce from 'immer' +import { produce } from 'immer' import { RiAddLine, } from '@remixicon/react' diff --git a/web/app/components/app/configuration/config-prompt/simple-prompt-input.tsx b/web/app/components/app/configuration/config-prompt/simple-prompt-input.tsx index a7bdc550d1..169e8a14a2 100644 --- a/web/app/components/app/configuration/config-prompt/simple-prompt-input.tsx +++ b/web/app/components/app/configuration/config-prompt/simple-prompt-input.tsx @@ -3,7 +3,7 @@ import type { FC } from 'react' import React, { useState } from 'react' import { useTranslation } from 'react-i18next' import { useBoolean } from 'ahooks' -import produce from 'immer' +import { produce } from 'immer' import { useContext } from 'use-context-selector' import ConfirmAddVar from './confirm-add-var' import PromptEditorHeightResizeWrap from './prompt-editor-height-resize-wrap' diff --git a/web/app/components/app/configuration/config-var/config-modal/index.tsx b/web/app/components/app/configuration/config-var/config-modal/index.tsx index 8a02ca8caa..de7d2c9eac 100644 --- a/web/app/components/app/configuration/config-var/config-modal/index.tsx +++ b/web/app/components/app/configuration/config-var/config-modal/index.tsx @@ -3,7 +3,7 @@ import type { ChangeEvent, FC } from 'react' import React, { useCallback, useEffect, useMemo, useRef, useState } from 'react' import { useTranslation } from 'react-i18next' import { useContext } from 'use-context-selector' -import produce from 'immer' +import { produce } from 'immer' import ModalFoot from '../modal-foot' import ConfigSelect from '../config-select' import ConfigString from '../config-string' diff --git a/web/app/components/app/configuration/config-var/index.tsx b/web/app/components/app/configuration/config-var/index.tsx index b9227c6846..6726498294 100644 --- a/web/app/components/app/configuration/config-var/index.tsx +++ b/web/app/components/app/configuration/config-var/index.tsx @@ -4,7 +4,7 @@ import React, { useMemo, useState } from 'react' import { useTranslation } from 'react-i18next' import { useBoolean } from 'ahooks' import { useContext } from 'use-context-selector' -import produce from 'immer' +import { produce } from 'immer' import { ReactSortable } from 'react-sortablejs' import Panel from '../base/feature-panel' import EditModal from './config-modal' diff --git a/web/app/components/app/configuration/config-vision/index.tsx b/web/app/components/app/configuration/config-vision/index.tsx index f0904b3fd8..bbe322ee7e 100644 --- a/web/app/components/app/configuration/config-vision/index.tsx +++ b/web/app/components/app/configuration/config-vision/index.tsx @@ -2,7 +2,7 @@ import type { FC } from 'react' import React, { useCallback } from 'react' import { useTranslation } from 'react-i18next' -import produce from 'immer' +import { produce } from 'immer' import { useContext } from 'use-context-selector' import ParamConfig from './param-config' import { Vision } from '@/app/components/base/icons/src/vender/features' diff --git a/web/app/components/app/configuration/config-vision/param-config-content.tsx b/web/app/components/app/configuration/config-vision/param-config-content.tsx index f0d8122102..359f79dd57 100644 --- a/web/app/components/app/configuration/config-vision/param-config-content.tsx +++ b/web/app/components/app/configuration/config-vision/param-config-content.tsx @@ -2,7 +2,7 @@ import type { FC } from 'react' import React, { useCallback } from 'react' import { useTranslation } from 'react-i18next' -import produce from 'immer' +import { produce } from 'immer' import OptionCard from '@/app/components/workflow/nodes/_base/components/option-card' import { Resolution, TransferMethod } from '@/types/app' import ParamItem from '@/app/components/base/param-item' diff --git a/web/app/components/app/configuration/config/agent/agent-tools/index.tsx b/web/app/components/app/configuration/config/agent/agent-tools/index.tsx index b4711ea39a..f2b9c105fc 100644 --- a/web/app/components/app/configuration/config/agent/agent-tools/index.tsx +++ b/web/app/components/app/configuration/config/agent/agent-tools/index.tsx @@ -4,7 +4,7 @@ import React, { useCallback, useMemo, useState } from 'react' import { useTranslation } from 'react-i18next' import { useContext } from 'use-context-selector' import copy from 'copy-to-clipboard' -import produce from 'immer' +import { produce } from 'immer' import { RiDeleteBinLine, RiEqualizer2Line, diff --git a/web/app/components/app/configuration/config/config-audio.tsx b/web/app/components/app/configuration/config/config-audio.tsx index 5600f8cbb6..5253b7c902 100644 --- a/web/app/components/app/configuration/config/config-audio.tsx +++ b/web/app/components/app/configuration/config/config-audio.tsx @@ -2,7 +2,7 @@ import type { FC } from 'react' import React, { useCallback } from 'react' import { useTranslation } from 'react-i18next' -import produce from 'immer' +import { produce } from 'immer' import { useContext } from 'use-context-selector' import { Microphone01 } from '@/app/components/base/icons/src/vender/features' diff --git a/web/app/components/app/configuration/config/config-document.tsx b/web/app/components/app/configuration/config/config-document.tsx index 9300bbc712..c0e8cc3a2d 100644 --- a/web/app/components/app/configuration/config/config-document.tsx +++ b/web/app/components/app/configuration/config/config-document.tsx @@ -2,7 +2,7 @@ import type { FC } from 'react' import React, { useCallback } from 'react' import { useTranslation } from 'react-i18next' -import produce from 'immer' +import { produce } from 'immer' import { useContext } from 'use-context-selector' import { Document } from '@/app/components/base/icons/src/vender/features' diff --git a/web/app/components/app/configuration/config/index.tsx b/web/app/components/app/configuration/config/index.tsx index d0375c6de9..7e130a4e95 100644 --- a/web/app/components/app/configuration/config/index.tsx +++ b/web/app/components/app/configuration/config/index.tsx @@ -2,7 +2,7 @@ import type { FC } from 'react' import React from 'react' import { useContext } from 'use-context-selector' -import produce from 'immer' +import { produce } from 'immer' import { useFormattingChangedDispatcher } from '../debug/hooks' import DatasetConfig from '../dataset-config' import HistoryPanel from '../config-prompt/conversation-history/history-panel' diff --git a/web/app/components/app/configuration/dataset-config/index.tsx b/web/app/components/app/configuration/dataset-config/index.tsx index 65ef74bc27..0c1b9349ae 100644 --- a/web/app/components/app/configuration/dataset-config/index.tsx +++ b/web/app/components/app/configuration/dataset-config/index.tsx @@ -4,7 +4,7 @@ import React, { useCallback, useMemo } from 'react' import { useTranslation } from 'react-i18next' import { intersectionBy } from 'lodash-es' import { useContext } from 'use-context-selector' -import produce from 'immer' +import { produce } from 'immer' import { v4 as uuid4 } from 'uuid' import { useFormattingChangedDispatcher } from '../debug/hooks' import FeaturePanel from '../base/feature-panel' diff --git a/web/app/components/app/configuration/debug/index.tsx b/web/app/components/app/configuration/debug/index.tsx index 9a50d1b872..ac26b82525 100644 --- a/web/app/components/app/configuration/debug/index.tsx +++ b/web/app/components/app/configuration/debug/index.tsx @@ -2,7 +2,7 @@ import type { FC } from 'react' import { useTranslation } from 'react-i18next' import React, { useCallback, useEffect, useRef, useState } from 'react' -import produce, { setAutoFreeze } from 'immer' +import { produce, setAutoFreeze } from 'immer' import { useBoolean } from 'ahooks' import { RiAddLine, diff --git a/web/app/components/app/configuration/hooks/use-advanced-prompt-config.ts b/web/app/components/app/configuration/hooks/use-advanced-prompt-config.ts index 92958cc96d..0a6ac4bb2a 100644 --- a/web/app/components/app/configuration/hooks/use-advanced-prompt-config.ts +++ b/web/app/components/app/configuration/hooks/use-advanced-prompt-config.ts @@ -1,6 +1,6 @@ import { useState } from 'react' import { clone } from 'lodash-es' -import produce from 'immer' +import { produce } from 'immer' import type { ChatPromptConfig, CompletionPromptConfig, ConversationHistoriesRole, PromptItem } from '@/models/debug' import { PromptMode } from '@/models/debug' import { ModelModeType } from '@/types/app' diff --git a/web/app/components/app/configuration/index.tsx b/web/app/components/app/configuration/index.tsx index 20229c9717..a1710c8f39 100644 --- a/web/app/components/app/configuration/index.tsx +++ b/web/app/components/app/configuration/index.tsx @@ -6,7 +6,7 @@ import { basePath } from '@/utils/var' import { useTranslation } from 'react-i18next' import { useContext } from 'use-context-selector' import { usePathname } from 'next/navigation' -import produce from 'immer' +import { produce } from 'immer' import { useBoolean, useGetState } from 'ahooks' import { clone, isEqual } from 'lodash-es' import { CodeBracketIcon } from '@heroicons/react/20/solid' diff --git a/web/app/components/base/button/index.stories.tsx b/web/app/components/base/button/index.stories.tsx index c1b18f1e50..e51b928e5e 100644 --- a/web/app/components/base/button/index.stories.tsx +++ b/web/app/components/base/button/index.stories.tsx @@ -1,5 +1,4 @@ -import type { Meta, StoryObj } from '@storybook/react' -import { fn } from '@storybook/test' +import type { Meta, StoryObj } from '@storybook/nextjs' import { RocketLaunchIcon } from '@heroicons/react/20/solid' import { Button } from '.' @@ -20,8 +19,7 @@ const meta = { }, args: { variant: 'ghost', - onClick: fn(), - children: 'adsf', + children: 'Button', }, } satisfies Meta @@ -33,6 +31,9 @@ export const Default: Story = { variant: 'primary', loading: false, children: 'Primary Button', + styleCss: {}, + spinnerClassName: '', + destructive: false, }, } diff --git a/web/app/components/base/chat/chat-with-history/hooks.tsx b/web/app/components/base/chat/chat-with-history/hooks.tsx index c17ab26dfe..9b0f67e6b2 100644 --- a/web/app/components/base/chat/chat-with-history/hooks.tsx +++ b/web/app/components/base/chat/chat-with-history/hooks.tsx @@ -8,7 +8,7 @@ import { import { useTranslation } from 'react-i18next' import useSWR from 'swr' import { useLocalStorageState } from 'ahooks' -import produce from 'immer' +import { produce } from 'immer' import type { Callback, ChatConfig, diff --git a/web/app/components/base/chat/chat/answer/index.stories.tsx b/web/app/components/base/chat/chat/answer/index.stories.tsx index 18bc129994..1f45844ec4 100644 --- a/web/app/components/base/chat/chat/answer/index.stories.tsx +++ b/web/app/components/base/chat/chat/answer/index.stories.tsx @@ -1,4 +1,4 @@ -import type { Meta, StoryObj } from '@storybook/react' +import type { Meta, StoryObj } from '@storybook/nextjs' import type { ChatItem } from '../../types' import { mockedWorkflowProcess } from './__mocks__/workflowProcess' diff --git a/web/app/components/base/chat/chat/question.stories.tsx b/web/app/components/base/chat/chat/question.stories.tsx index 9c0eb8cad8..6474add9df 100644 --- a/web/app/components/base/chat/chat/question.stories.tsx +++ b/web/app/components/base/chat/chat/question.stories.tsx @@ -1,4 +1,4 @@ -import type { Meta, StoryObj } from '@storybook/react' +import type { Meta, StoryObj } from '@storybook/nextjs' import type { ChatItem } from '../types' import Question from './question' diff --git a/web/app/components/base/chat/embedded-chatbot/hooks.tsx b/web/app/components/base/chat/embedded-chatbot/hooks.tsx index 6987955b74..cfb221522c 100644 --- a/web/app/components/base/chat/embedded-chatbot/hooks.tsx +++ b/web/app/components/base/chat/embedded-chatbot/hooks.tsx @@ -8,7 +8,7 @@ import { import { useTranslation } from 'react-i18next' import useSWR from 'swr' import { useLocalStorageState } from 'ahooks' -import produce from 'immer' +import { produce } from 'immer' import type { ChatConfig, ChatItem, diff --git a/web/app/components/base/confirm/index.stories.tsx b/web/app/components/base/confirm/index.stories.tsx new file mode 100644 index 0000000000..dfbe00f293 --- /dev/null +++ b/web/app/components/base/confirm/index.stories.tsx @@ -0,0 +1,199 @@ +import type { Meta, StoryObj } from '@storybook/nextjs' +import { useState } from 'react' +import Confirm from '.' +import Button from '../button' + +const meta = { + title: 'Base/Confirm', + component: Confirm, + parameters: { + layout: 'centered', + docs: { + description: { + component: 'Confirmation dialog component that supports warning and info types, with customizable button text and behavior.', + }, + }, + }, + tags: ['autodocs'], + argTypes: { + type: { + control: 'select', + options: ['info', 'warning'], + description: 'Dialog type', + }, + isShow: { + control: 'boolean', + description: 'Whether to show the dialog', + }, + title: { + control: 'text', + description: 'Dialog title', + }, + content: { + control: 'text', + description: 'Dialog content', + }, + confirmText: { + control: 'text', + description: 'Confirm button text', + }, + cancelText: { + control: 'text', + description: 'Cancel button text', + }, + isLoading: { + control: 'boolean', + description: 'Confirm button loading state', + }, + isDisabled: { + control: 'boolean', + description: 'Confirm button disabled state', + }, + showConfirm: { + control: 'boolean', + description: 'Whether to show confirm button', + }, + showCancel: { + control: 'boolean', + description: 'Whether to show cancel button', + }, + maskClosable: { + control: 'boolean', + description: 'Whether clicking mask closes dialog', + }, + }, +} satisfies Meta + +export default meta +type Story = StoryObj + +// Interactive demo wrapper +const ConfirmDemo = (args: any) => { + const [isShow, setIsShow] = useState(false) + + return ( +
+ + { + console.log('✅ User clicked confirm') + setIsShow(false) + }} + onCancel={() => { + console.log('❌ User clicked cancel') + setIsShow(false) + }} + /> +
+ ) +} + +// Basic warning dialog - Delete action +export const WarningDialog: Story = { + render: args => , + args: { + type: 'warning', + title: 'Delete Confirmation', + content: 'Are you sure you want to delete this project? This action cannot be undone.', + }, +} + +// Info dialog +export const InfoDialog: Story = { + render: args => , + args: { + type: 'info', + title: 'Notice', + content: 'Your changes have been saved. Do you want to proceed to the next step?', + }, +} + +// Custom button text +export const CustomButtonText: Story = { + render: args => , + args: { + type: 'warning', + title: 'Exit Editor', + content: 'You have unsaved changes. Are you sure you want to exit?', + confirmText: 'Discard Changes', + cancelText: 'Continue Editing', + }, +} + +// Loading state +export const LoadingState: Story = { + render: args => , + args: { + type: 'warning', + title: 'Deleting...', + content: 'Please wait while we delete the file...', + isLoading: true, + }, +} + +// Disabled state +export const DisabledState: Story = { + render: args => , + args: { + type: 'info', + title: 'Verification Required', + content: 'Please complete email verification before proceeding.', + isDisabled: true, + }, +} + +// Alert style - Confirm button only +export const AlertStyle: Story = { + render: args => , + args: { + type: 'info', + title: 'Success', + content: 'Your settings have been updated!', + showCancel: false, + confirmText: 'Got it', + }, +} + +// Dangerous action - Long content +export const DangerousAction: Story = { + render: args => , + args: { + type: 'warning', + title: 'Permanently Delete Account', + content: 'This action will permanently delete your account and all associated data, including: all projects and files, collaboration history, and personal settings. This action cannot be reversed!', + confirmText: 'Delete My Account', + cancelText: 'Keep My Account', + }, +} + +// Non-closable mask +export const NotMaskClosable: Story = { + render: args => , + args: { + type: 'warning', + title: 'Important Action', + content: 'This action requires your explicit choice. Clicking outside will not close this dialog.', + maskClosable: false, + }, +} + +// Full feature demo - Playground +export const Playground: Story = { + render: args => , + args: { + type: 'warning', + title: 'This is a title', + content: 'This is the dialog content text...', + confirmText: undefined, + cancelText: undefined, + isLoading: false, + isDisabled: false, + showConfirm: true, + showCancel: true, + maskClosable: true, + }, +} diff --git a/web/app/components/base/features/new-feature-panel/annotation-reply/index.tsx b/web/app/components/base/features/new-feature-panel/annotation-reply/index.tsx index 34ecf23c80..140c900cb4 100644 --- a/web/app/components/base/features/new-feature-panel/annotation-reply/index.tsx +++ b/web/app/components/base/features/new-feature-panel/annotation-reply/index.tsx @@ -1,7 +1,7 @@ import React, { useCallback, useState } from 'react' import { useTranslation } from 'react-i18next' import { usePathname, useRouter } from 'next/navigation' -import produce from 'immer' +import { produce } from 'immer' import { RiEqualizer2Line, RiExternalLinkLine } from '@remixicon/react' import { MessageFast } from '@/app/components/base/icons/src/vender/features' import FeatureCard from '@/app/components/base/features/new-feature-panel/feature-card' diff --git a/web/app/components/base/features/new-feature-panel/annotation-reply/use-annotation-config.ts b/web/app/components/base/features/new-feature-panel/annotation-reply/use-annotation-config.ts index 540302cb27..14b977a4c8 100644 --- a/web/app/components/base/features/new-feature-panel/annotation-reply/use-annotation-config.ts +++ b/web/app/components/base/features/new-feature-panel/annotation-reply/use-annotation-config.ts @@ -1,5 +1,5 @@ import React, { useState } from 'react' -import produce from 'immer' +import { produce } from 'immer' import type { AnnotationReplyConfig } from '@/models/debug' import { queryAnnotationJobStatus, updateAnnotationStatus } from '@/service/annotation' import type { EmbeddingModelConfig } from '@/app/components/app/annotation/type' diff --git a/web/app/components/base/features/new-feature-panel/citation.tsx b/web/app/components/base/features/new-feature-panel/citation.tsx index 773304d6ae..fc61d1afb5 100644 --- a/web/app/components/base/features/new-feature-panel/citation.tsx +++ b/web/app/components/base/features/new-feature-panel/citation.tsx @@ -1,6 +1,6 @@ import React, { useCallback } from 'react' import { useTranslation } from 'react-i18next' -import produce from 'immer' +import { produce } from 'immer' import { Citations } from '@/app/components/base/icons/src/vender/features' import FeatureCard from '@/app/components/base/features/new-feature-panel/feature-card' import { useFeatures, useFeaturesStore } from '@/app/components/base/features/hooks' diff --git a/web/app/components/base/features/new-feature-panel/conversation-opener/index.tsx b/web/app/components/base/features/new-feature-panel/conversation-opener/index.tsx index e4075880e9..4016b9f163 100644 --- a/web/app/components/base/features/new-feature-panel/conversation-opener/index.tsx +++ b/web/app/components/base/features/new-feature-panel/conversation-opener/index.tsx @@ -1,6 +1,6 @@ import React, { useCallback, useState } from 'react' import { useTranslation } from 'react-i18next' -import produce from 'immer' +import { produce } from 'immer' import { RiEditLine } from '@remixicon/react' import { LoveMessage } from '@/app/components/base/icons/src/vender/features' import FeatureCard from '@/app/components/base/features/new-feature-panel/feature-card' diff --git a/web/app/components/base/features/new-feature-panel/conversation-opener/modal.tsx b/web/app/components/base/features/new-feature-panel/conversation-opener/modal.tsx index ec8681f37c..f0af893f0d 100644 --- a/web/app/components/base/features/new-feature-panel/conversation-opener/modal.tsx +++ b/web/app/components/base/features/new-feature-panel/conversation-opener/modal.tsx @@ -1,7 +1,7 @@ import React, { useCallback, useEffect, useState } from 'react' import { useTranslation } from 'react-i18next' import { useBoolean } from 'ahooks' -import produce from 'immer' +import { produce } from 'immer' import { ReactSortable } from 'react-sortablejs' import { RiAddLine, RiAsterisk, RiCloseLine, RiDeleteBinLine, RiDraggable } from '@remixicon/react' import Modal from '@/app/components/base/modal' diff --git a/web/app/components/base/features/new-feature-panel/file-upload/index.tsx b/web/app/components/base/features/new-feature-panel/file-upload/index.tsx index 1fc1bff511..7561936130 100644 --- a/web/app/components/base/features/new-feature-panel/file-upload/index.tsx +++ b/web/app/components/base/features/new-feature-panel/file-upload/index.tsx @@ -1,6 +1,6 @@ import React, { useCallback, useMemo, useState } from 'react' import { useTranslation } from 'react-i18next' -import produce from 'immer' +import { produce } from 'immer' import { RiEqualizer2Line } from '@remixicon/react' import { FolderUpload } from '@/app/components/base/icons/src/vender/features' import FeatureCard from '@/app/components/base/features/new-feature-panel/feature-card' diff --git a/web/app/components/base/features/new-feature-panel/file-upload/setting-content.tsx b/web/app/components/base/features/new-feature-panel/file-upload/setting-content.tsx index 5a53aa403d..cb0821bb7b 100644 --- a/web/app/components/base/features/new-feature-panel/file-upload/setting-content.tsx +++ b/web/app/components/base/features/new-feature-panel/file-upload/setting-content.tsx @@ -1,5 +1,5 @@ import React, { useCallback, useMemo, useState } from 'react' -import produce from 'immer' +import { produce } from 'immer' import { useTranslation } from 'react-i18next' import { RiCloseLine } from '@remixicon/react' import FileUploadSetting from '@/app/components/workflow/nodes/_base/components/file-upload-setting' diff --git a/web/app/components/base/features/new-feature-panel/follow-up.tsx b/web/app/components/base/features/new-feature-panel/follow-up.tsx index a81bc94894..1abea971f2 100644 --- a/web/app/components/base/features/new-feature-panel/follow-up.tsx +++ b/web/app/components/base/features/new-feature-panel/follow-up.tsx @@ -1,6 +1,6 @@ import React, { useCallback } from 'react' import { useTranslation } from 'react-i18next' -import produce from 'immer' +import { produce } from 'immer' import { VirtualAssistant } from '@/app/components/base/icons/src/vender/features' import FeatureCard from '@/app/components/base/features/new-feature-panel/feature-card' import { useFeatures, useFeaturesStore } from '@/app/components/base/features/hooks' diff --git a/web/app/components/base/features/new-feature-panel/image-upload/index.tsx b/web/app/components/base/features/new-feature-panel/image-upload/index.tsx index f09c35a01e..53c0fa9fb1 100644 --- a/web/app/components/base/features/new-feature-panel/image-upload/index.tsx +++ b/web/app/components/base/features/new-feature-panel/image-upload/index.tsx @@ -1,6 +1,6 @@ import React, { useCallback, useMemo, useState } from 'react' import { useTranslation } from 'react-i18next' -import produce from 'immer' +import { produce } from 'immer' import { RiEqualizer2Line, RiImage2Fill } from '@remixicon/react' import FeatureCard from '@/app/components/base/features/new-feature-panel/feature-card' import SettingModal from '@/app/components/base/features/new-feature-panel/file-upload/setting-modal' diff --git a/web/app/components/base/features/new-feature-panel/moderation/index.tsx b/web/app/components/base/features/new-feature-panel/moderation/index.tsx index 78f4f2d0ab..b5bcbca474 100644 --- a/web/app/components/base/features/new-feature-panel/moderation/index.tsx +++ b/web/app/components/base/features/new-feature-panel/moderation/index.tsx @@ -1,7 +1,7 @@ import React, { useCallback, useMemo, useState } from 'react' import { useTranslation } from 'react-i18next' import useSWR from 'swr' -import produce from 'immer' +import { produce } from 'immer' import { useContext } from 'use-context-selector' import { RiEqualizer2Line } from '@remixicon/react' import { ContentModeration } from '@/app/components/base/icons/src/vender/features' diff --git a/web/app/components/base/features/new-feature-panel/more-like-this.tsx b/web/app/components/base/features/new-feature-panel/more-like-this.tsx index d2e2fc64b0..20e5abff0d 100644 --- a/web/app/components/base/features/new-feature-panel/more-like-this.tsx +++ b/web/app/components/base/features/new-feature-panel/more-like-this.tsx @@ -1,6 +1,6 @@ import React, { useCallback } from 'react' import { useTranslation } from 'react-i18next' -import produce from 'immer' +import { produce } from 'immer' import { RiSparklingFill } from '@remixicon/react' import FeatureCard from '@/app/components/base/features/new-feature-panel/feature-card' import { useFeatures, useFeaturesStore } from '@/app/components/base/features/hooks' diff --git a/web/app/components/base/features/new-feature-panel/speech-to-text.tsx b/web/app/components/base/features/new-feature-panel/speech-to-text.tsx index 7905f8a43b..2c5f9d0f53 100644 --- a/web/app/components/base/features/new-feature-panel/speech-to-text.tsx +++ b/web/app/components/base/features/new-feature-panel/speech-to-text.tsx @@ -1,6 +1,6 @@ import React, { useCallback } from 'react' import { useTranslation } from 'react-i18next' -import produce from 'immer' +import { produce } from 'immer' import { Microphone01 } from '@/app/components/base/icons/src/vender/features' import FeatureCard from '@/app/components/base/features/new-feature-panel/feature-card' import { useFeatures, useFeaturesStore } from '@/app/components/base/features/hooks' diff --git a/web/app/components/base/features/new-feature-panel/text-to-speech/index.tsx b/web/app/components/base/features/new-feature-panel/text-to-speech/index.tsx index 340f9ae626..7d5d39cdb1 100644 --- a/web/app/components/base/features/new-feature-panel/text-to-speech/index.tsx +++ b/web/app/components/base/features/new-feature-panel/text-to-speech/index.tsx @@ -1,6 +1,6 @@ import React, { useCallback, useState } from 'react' import { useTranslation } from 'react-i18next' -import produce from 'immer' +import { produce } from 'immer' import { RiEqualizer2Line } from '@remixicon/react' import { TextToAudio } from '@/app/components/base/icons/src/vender/features' import FeatureCard from '@/app/components/base/features/new-feature-panel/feature-card' diff --git a/web/app/components/base/features/new-feature-panel/text-to-speech/param-config-content.tsx b/web/app/components/base/features/new-feature-panel/text-to-speech/param-config-content.tsx index 6e93c0c871..b14417e665 100644 --- a/web/app/components/base/features/new-feature-panel/text-to-speech/param-config-content.tsx +++ b/web/app/components/base/features/new-feature-panel/text-to-speech/param-config-content.tsx @@ -1,6 +1,6 @@ 'use client' import useSWR from 'swr' -import produce from 'immer' +import { produce } from 'immer' import React, { Fragment } from 'react' import { usePathname } from 'next/navigation' import { useTranslation } from 'react-i18next' diff --git a/web/app/components/base/file-uploader/hooks.ts b/web/app/components/base/file-uploader/hooks.ts index d3c79a9f45..3f4d4a6b06 100644 --- a/web/app/components/base/file-uploader/hooks.ts +++ b/web/app/components/base/file-uploader/hooks.ts @@ -4,7 +4,7 @@ import { useState, } from 'react' import { useParams } from 'next/navigation' -import produce from 'immer' +import { produce } from 'immer' import { v4 as uuid4 } from 'uuid' import { useTranslation } from 'react-i18next' import type { FileEntity } from './types' diff --git a/web/app/components/base/icons/assets/vender/line/mapsAndTravel/route.svg b/web/app/components/base/icons/assets/vender/line/mapsAndTravel/route.svg deleted file mode 100644 index b1543ccc13..0000000000 --- a/web/app/components/base/icons/assets/vender/line/mapsAndTravel/route.svg +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - - - diff --git a/web/app/components/base/icons/assets/vender/solid/mapsAndTravel/globe-06.svg b/web/app/components/base/icons/assets/vender/solid/mapsAndTravel/globe-06.svg deleted file mode 100644 index 45f3778f0b..0000000000 --- a/web/app/components/base/icons/assets/vender/solid/mapsAndTravel/globe-06.svg +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - diff --git a/web/app/components/base/icons/assets/vender/solid/mapsAndTravel/route.svg b/web/app/components/base/icons/assets/vender/solid/mapsAndTravel/route.svg deleted file mode 100644 index b647dfc753..0000000000 --- a/web/app/components/base/icons/assets/vender/solid/mapsAndTravel/route.svg +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/web/app/components/base/icons/src/vender/line/communication/AiText.json b/web/app/components/base/icons/src/vender/line/communication/AiText.json deleted file mode 100644 index 2473c64c22..0000000000 --- a/web/app/components/base/icons/src/vender/line/communication/AiText.json +++ /dev/null @@ -1,39 +0,0 @@ -{ - "icon": { - "type": "element", - "isRootNode": true, - "name": "svg", - "attributes": { - "width": "14", - "height": "14", - "viewBox": "0 0 14 14", - "fill": "none", - "xmlns": "http://www.w3.org/2000/svg" - }, - "children": [ - { - "type": "element", - "name": "g", - "attributes": { - "id": "ai-text" - }, - "children": [ - { - "type": "element", - "name": "path", - "attributes": { - "id": "Vector", - "d": "M2.33301 10.5H4.08301M2.33301 7H5.24967M2.33301 3.5H11.6663M9.91634 5.83333L10.7913 7.875L12.833 8.75L10.7913 9.625L9.91634 11.6667L9.04134 9.625L6.99967 8.75L9.04134 7.875L9.91634 5.83333Z", - "stroke": "currentColor", - "stroke-width": "1.25", - "stroke-linecap": "round", - "stroke-linejoin": "round" - }, - "children": [] - } - ] - } - ] - }, - "name": "AiText" -} diff --git a/web/app/components/base/icons/src/vender/line/communication/AiText.tsx b/web/app/components/base/icons/src/vender/line/communication/AiText.tsx deleted file mode 100644 index 7d5a860038..0000000000 --- a/web/app/components/base/icons/src/vender/line/communication/AiText.tsx +++ /dev/null @@ -1,20 +0,0 @@ -// GENERATE BY script -// DON NOT EDIT IT MANUALLY - -import * as React from 'react' -import data from './AiText.json' -import IconBase from '@/app/components/base/icons/IconBase' -import type { IconData } from '@/app/components/base/icons/IconBase' - -const Icon = ( - { - ref, - ...props - }: React.SVGProps & { - ref?: React.RefObject>; - }, -) => - -Icon.displayName = 'AiText' - -export default Icon diff --git a/web/app/components/base/icons/src/vender/line/communication/index.ts b/web/app/components/base/icons/src/vender/line/communication/index.ts index 3ab20e8bb4..27118f1dde 100644 --- a/web/app/components/base/icons/src/vender/line/communication/index.ts +++ b/web/app/components/base/icons/src/vender/line/communication/index.ts @@ -1,4 +1,3 @@ -export { default as AiText } from './AiText' export { default as ChatBotSlim } from './ChatBotSlim' export { default as ChatBot } from './ChatBot' export { default as CuteRobot } from './CuteRobot' diff --git a/web/app/components/base/icons/src/vender/line/mapsAndTravel/Route.json b/web/app/components/base/icons/src/vender/line/mapsAndTravel/Route.json deleted file mode 100644 index cb0b7f01a9..0000000000 --- a/web/app/components/base/icons/src/vender/line/mapsAndTravel/Route.json +++ /dev/null @@ -1,66 +0,0 @@ -{ - "icon": { - "type": "element", - "isRootNode": true, - "name": "svg", - "attributes": { - "width": "14", - "height": "14", - "viewBox": "0 0 14 14", - "fill": "none", - "xmlns": "http://www.w3.org/2000/svg" - }, - "children": [ - { - "type": "element", - "name": "g", - "attributes": { - "id": "route", - "clip-path": "url(#clip0_3167_28693)" - }, - "children": [ - { - "type": "element", - "name": "path", - "attributes": { - "id": "Icon", - "d": "M6.70866 2.91699H6.96206C8.73962 2.91699 9.6284 2.91699 9.96578 3.23624C10.2574 3.51221 10.3867 3.91874 10.3079 4.31245C10.2168 4.76792 9.49122 5.28116 8.03999 6.30763L5.66899 7.98468C4.21777 9.01116 3.49215 9.5244 3.40106 9.97987C3.32233 10.3736 3.45157 10.7801 3.7432 11.0561C4.08059 11.3753 4.96937 11.3753 6.74693 11.3753H7.29199M4.66699 2.91699C4.66699 3.88349 3.88349 4.66699 2.91699 4.66699C1.95049 4.66699 1.16699 3.88349 1.16699 2.91699C1.16699 1.95049 1.95049 1.16699 2.91699 1.16699C3.88349 1.16699 4.66699 1.95049 4.66699 2.91699ZM12.8337 11.0837C12.8337 12.0502 12.0502 12.8337 11.0837 12.8337C10.1172 12.8337 9.33366 12.0502 9.33366 11.0837C9.33366 10.1172 10.1172 9.33366 11.0837 9.33366C12.0502 9.33366 12.8337 10.1172 12.8337 11.0837Z", - "stroke": "currentColor", - "stroke-width": "1.25", - "stroke-linecap": "round", - "stroke-linejoin": "round" - }, - "children": [] - } - ] - }, - { - "type": "element", - "name": "defs", - "attributes": {}, - "children": [ - { - "type": "element", - "name": "clipPath", - "attributes": { - "id": "clip0_3167_28693" - }, - "children": [ - { - "type": "element", - "name": "rect", - "attributes": { - "width": "14", - "height": "14", - "fill": "white" - }, - "children": [] - } - ] - } - ] - } - ] - }, - "name": "Route" -} diff --git a/web/app/components/base/icons/src/vender/solid/communication/AiText.json b/web/app/components/base/icons/src/vender/solid/communication/AiText.json deleted file mode 100644 index 65860e58b9..0000000000 --- a/web/app/components/base/icons/src/vender/solid/communication/AiText.json +++ /dev/null @@ -1,53 +0,0 @@ -{ - "icon": { - "type": "element", - "isRootNode": true, - "name": "svg", - "attributes": { - "width": "24", - "height": "24", - "viewBox": "0 0 24 24", - "fill": "none", - "xmlns": "http://www.w3.org/2000/svg" - }, - "children": [ - { - "type": "element", - "name": "path", - "attributes": { - "d": "M4 5C3.44772 5 3 5.44772 3 6C3 6.55228 3.44772 7 4 7H20C20.5523 7 21 6.55228 21 6C21 5.44772 20.5523 5 20 5H4Z", - "fill": "currentColor" - }, - "children": [] - }, - { - "type": "element", - "name": "path", - "attributes": { - "d": "M17.9191 9.60608C17.7616 9.2384 17.4 9 17 9C16.6 9 16.2384 9.2384 16.0809 9.60608L14.7384 12.7384L11.6061 14.0809C11.2384 14.2384 11 14.6 11 15C11 15.4 11.2384 15.7616 11.6061 15.9191L14.7384 17.2616L16.0809 20.3939C16.2384 20.7616 16.6 21 17 21C17.4 21 17.7616 20.7616 17.9191 20.3939L19.2616 17.2616L22.3939 15.9191C22.7616 15.7616 23 15.4 23 15C23 14.6 22.7616 14.2384 22.3939 14.0809L19.2616 12.7384L17.9191 9.60608Z", - "fill": "currentColor" - }, - "children": [] - }, - { - "type": "element", - "name": "path", - "attributes": { - "d": "M4 11C3.44772 11 3 11.4477 3 12C3 12.5523 3.44772 13 4 13H9C9.55228 13 10 12.5523 10 12C10 11.4477 9.55228 11 9 11H4Z", - "fill": "currentColor" - }, - "children": [] - }, - { - "type": "element", - "name": "path", - "attributes": { - "d": "M4 17C3.44772 17 3 17.4477 3 18C3 18.5523 3.44772 19 4 19H7C7.55228 19 8 18.5523 8 18C8 17.4477 7.55228 17 7 17H4Z", - "fill": "currentColor" - }, - "children": [] - } - ] - }, - "name": "AiText" -} diff --git a/web/app/components/base/icons/src/vender/solid/communication/AiText.tsx b/web/app/components/base/icons/src/vender/solid/communication/AiText.tsx deleted file mode 100644 index 7d5a860038..0000000000 --- a/web/app/components/base/icons/src/vender/solid/communication/AiText.tsx +++ /dev/null @@ -1,20 +0,0 @@ -// GENERATE BY script -// DON NOT EDIT IT MANUALLY - -import * as React from 'react' -import data from './AiText.json' -import IconBase from '@/app/components/base/icons/IconBase' -import type { IconData } from '@/app/components/base/icons/IconBase' - -const Icon = ( - { - ref, - ...props - }: React.SVGProps & { - ref?: React.RefObject>; - }, -) => - -Icon.displayName = 'AiText' - -export default Icon diff --git a/web/app/components/base/icons/src/vender/solid/communication/index.ts b/web/app/components/base/icons/src/vender/solid/communication/index.ts index 7d2a3a5a95..a1659b7b18 100644 --- a/web/app/components/base/icons/src/vender/solid/communication/index.ts +++ b/web/app/components/base/icons/src/vender/solid/communication/index.ts @@ -1,4 +1,3 @@ -export { default as AiText } from './AiText' export { default as BubbleTextMod } from './BubbleTextMod' export { default as ChatBot } from './ChatBot' export { default as CuteRobot } from './CuteRobot' diff --git a/web/app/components/base/icons/src/vender/solid/mapsAndTravel/Globe06.json b/web/app/components/base/icons/src/vender/solid/mapsAndTravel/Globe06.json deleted file mode 100644 index b86197ae7e..0000000000 --- a/web/app/components/base/icons/src/vender/solid/mapsAndTravel/Globe06.json +++ /dev/null @@ -1,57 +0,0 @@ -{ - "icon": { - "type": "element", - "isRootNode": true, - "name": "svg", - "attributes": { - "width": "16", - "height": "17", - "viewBox": "0 0 16 17", - "fill": "none", - "xmlns": "http://www.w3.org/2000/svg" - }, - "children": [ - { - "type": "element", - "name": "g", - "attributes": { - "id": "Icon" - }, - "children": [ - { - "type": "element", - "name": "g", - "attributes": { - "id": "Solid" - }, - "children": [ - { - "type": "element", - "name": "path", - "attributes": { - "fill-rule": "evenodd", - "clip-rule": "evenodd", - "d": "M6.39498 2.71706C6.90587 2.57557 7.44415 2.49996 8.00008 2.49996C9.30806 2.49996 10.5183 2.91849 11.5041 3.62893C10.9796 3.97562 10.5883 4.35208 10.3171 4.75458C9.90275 5.36959 9.79654 6.00558 9.88236 6.58587C9.96571 7.1494 10.2245 7.63066 10.4965 7.98669C10.7602 8.33189 11.0838 8.6206 11.3688 8.76305C12.0863 9.12177 12.9143 9.30141 13.5334 9.39399C14.0933 9.47774 15.2805 9.75802 15.3244 8.86608C15.3304 8.74474 15.3334 8.62267 15.3334 8.49996C15.3334 4.44987 12.0502 1.16663 8.00008 1.16663C3.94999 1.16663 0.666748 4.44987 0.666748 8.49996C0.666748 12.55 3.94999 15.8333 8.00008 15.8333C8.1228 15.8333 8.24486 15.8303 8.3662 15.8243C8.73395 15.8062 9.01738 15.4934 8.99927 15.1256C8.98117 14.7579 8.66837 14.4745 8.30063 14.4926C8.20111 14.4975 8.10091 14.5 8.00008 14.5C5.6605 14.5 3.63367 13.1609 2.6442 11.2074L3.28991 10.8346L5.67171 11.2804C6.28881 11.3959 6.85846 10.9208 6.85566 10.293L6.84632 8.19093L8.06357 6.10697C8.26079 5.76932 8.24312 5.3477 8.01833 5.02774L6.39498 2.71706Z", - "fill": "currentColor" - }, - "children": [] - }, - { - "type": "element", - "name": "path", - "attributes": { - "fill-rule": "evenodd", - "clip-rule": "evenodd", - "d": "M9.29718 8.93736C9.05189 8.84432 8.77484 8.90379 8.58934 9.08929C8.40383 9.27479 8.34437 9.55184 8.43741 9.79713L10.5486 15.363C10.6461 15.6199 10.8912 15.7908 11.166 15.7932C11.4408 15.7956 11.689 15.6292 11.791 15.374L12.6714 13.1714L14.874 12.2909C15.1292 12.1889 15.2957 11.9408 15.2932 11.666C15.2908 11.3912 15.12 11.146 14.863 11.0486L9.29718 8.93736Z", - "fill": "currentColor" - }, - "children": [] - } - ] - } - ] - } - ] - }, - "name": "Globe06" -} diff --git a/web/app/components/base/icons/src/vender/solid/mapsAndTravel/Globe06.tsx b/web/app/components/base/icons/src/vender/solid/mapsAndTravel/Globe06.tsx deleted file mode 100644 index af5d2a8d52..0000000000 --- a/web/app/components/base/icons/src/vender/solid/mapsAndTravel/Globe06.tsx +++ /dev/null @@ -1,20 +0,0 @@ -// GENERATE BY script -// DON NOT EDIT IT MANUALLY - -import * as React from 'react' -import data from './Globe06.json' -import IconBase from '@/app/components/base/icons/IconBase' -import type { IconData } from '@/app/components/base/icons/IconBase' - -const Icon = ( - { - ref, - ...props - }: React.SVGProps & { - ref?: React.RefObject>; - }, -) => - -Icon.displayName = 'Globe06' - -export default Icon diff --git a/web/app/components/base/icons/src/vender/solid/mapsAndTravel/Route.json b/web/app/components/base/icons/src/vender/solid/mapsAndTravel/Route.json deleted file mode 100644 index ac94bf2109..0000000000 --- a/web/app/components/base/icons/src/vender/solid/mapsAndTravel/Route.json +++ /dev/null @@ -1,58 +0,0 @@ -{ - "icon": { - "type": "element", - "isRootNode": true, - "name": "svg", - "attributes": { - "width": "13", - "height": "12", - "viewBox": "0 0 13 12", - "fill": "none", - "xmlns": "http://www.w3.org/2000/svg" - }, - "children": [ - { - "type": "element", - "name": "g", - "attributes": { - "id": "route-sep" - }, - "children": [ - { - "type": "element", - "name": "path", - "attributes": { - "id": "Icon", - "d": "M6.08303 2.5H6.30023C7.82386 2.5 8.58567 2.5 8.87485 2.77364C9.12483 3.01018 9.23561 3.35864 9.16812 3.69611C9.09004 4.08651 8.46809 4.52643 7.22418 5.40627L5.19189 6.84373C3.94799 7.72357 3.32603 8.16349 3.24795 8.55389C3.18046 8.89136 3.29124 9.23982 3.54122 9.47636C3.8304 9.75 4.59221 9.75 6.11584 9.75H6.58303", - "stroke": "currentColor", - "stroke-linecap": "round", - "stroke-linejoin": "round" - }, - "children": [] - }, - { - "type": "element", - "name": "path", - "attributes": { - "id": "Icon_2", - "d": "M2.83301 4C3.66143 4 4.33301 3.32843 4.33301 2.5C4.33301 1.67157 3.66143 1 2.83301 1C2.00458 1 1.33301 1.67157 1.33301 2.5C1.33301 3.32843 2.00458 4 2.83301 4Z", - "fill": "currentColor" - }, - "children": [] - }, - { - "type": "element", - "name": "path", - "attributes": { - "id": "Icon_3", - "d": "M9.83301 11C10.6614 11 11.333 10.3284 11.333 9.5C11.333 8.67157 10.6614 8 9.83301 8C9.00458 8 8.33301 8.67157 8.33301 9.5C8.33301 10.3284 9.00458 11 9.83301 11Z", - "fill": "currentColor" - }, - "children": [] - } - ] - } - ] - }, - "name": "Route" -} diff --git a/web/app/components/base/icons/src/vender/solid/mapsAndTravel/Route.tsx b/web/app/components/base/icons/src/vender/solid/mapsAndTravel/Route.tsx deleted file mode 100644 index 9cbde4a15e..0000000000 --- a/web/app/components/base/icons/src/vender/solid/mapsAndTravel/Route.tsx +++ /dev/null @@ -1,20 +0,0 @@ -// GENERATE BY script -// DON NOT EDIT IT MANUALLY - -import * as React from 'react' -import data from './Route.json' -import IconBase from '@/app/components/base/icons/IconBase' -import type { IconData } from '@/app/components/base/icons/IconBase' - -const Icon = ( - { - ref, - ...props - }: React.SVGProps & { - ref?: React.RefObject>; - }, -) => - -Icon.displayName = 'Route' - -export default Icon diff --git a/web/app/components/base/icons/src/vender/solid/mapsAndTravel/index.ts b/web/app/components/base/icons/src/vender/solid/mapsAndTravel/index.ts deleted file mode 100644 index 0a0abda63c..0000000000 --- a/web/app/components/base/icons/src/vender/solid/mapsAndTravel/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export { default as Globe06 } from './Globe06' -export { default as Route } from './Route' diff --git a/web/app/components/base/icons/utils.ts b/web/app/components/base/icons/utils.ts index 632e362075..c00c201bbd 100644 --- a/web/app/components/base/icons/utils.ts +++ b/web/app/components/base/icons/utils.ts @@ -3,13 +3,13 @@ import React from 'react' export type AbstractNode = { name: string attributes: { - [key: string]: string + [key: string]: string | undefined } children?: AbstractNode[] } export type Attrs = { - [key: string]: string + [key: string]: string | undefined } export function normalizeAttrs(attrs: Attrs = {}): Attrs { @@ -24,6 +24,9 @@ export function normalizeAttrs(attrs: Attrs = {}): Attrs { return acc const val = attrs[key] + if (val === undefined) + return acc + key = key.replace(/([-]\w)/g, (g: string) => g[1].toUpperCase()) key = key.replace(/([:]\w)/g, (g: string) => g[1].toUpperCase()) diff --git a/web/app/components/datasets/create/assets/family-mod.svg b/web/app/components/datasets/create/assets/family-mod.svg deleted file mode 100644 index b1c4e6f566..0000000000 --- a/web/app/components/datasets/create/assets/family-mod.svg +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/web/app/components/datasets/create/assets/option-card-effect-orange.svg b/web/app/components/datasets/create/assets/option-card-effect-orange.svg deleted file mode 100644 index d833764f0c..0000000000 --- a/web/app/components/datasets/create/assets/option-card-effect-orange.svg +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - - - - - diff --git a/web/app/components/datasets/create/index.tsx b/web/app/components/datasets/create/index.tsx index 99b2130002..11def1a8bc 100644 --- a/web/app/components/datasets/create/index.tsx +++ b/web/app/components/datasets/create/index.tsx @@ -13,7 +13,7 @@ import { DataSourceProvider, type NotionPage } from '@/models/common' import { useModalContextSelector } from '@/context/modal-context' import { useDefaultModel } from '@/app/components/header/account-setting/model-provider-page/hooks' import { useGetDefaultDataSourceListAuth } from '@/service/use-datasource' -import produce from 'immer' +import { produce } from 'immer' import { useDatasetDetailContextWithSelector } from '@/context/dataset-detail' import Loading from '@/app/components/base/loading' diff --git a/web/app/components/datasets/create/step-two/index.tsx b/web/app/components/datasets/create/step-two/index.tsx index 4c2e129cd2..22d6837754 100644 --- a/web/app/components/datasets/create/step-two/index.tsx +++ b/web/app/components/datasets/create/step-two/index.tsx @@ -11,8 +11,8 @@ import { import Link from 'next/link' import Image from 'next/image' import SettingCog from '../assets/setting-gear-mod.svg' -import OrangeEffect from '../assets/option-card-effect-orange.svg' -import FamilyMod from '../assets/family-mod.svg' +import BlueEffect from '../assets/option-card-effect-blue.svg' +import { ParentChildChunk } from '@/app/components/base/icons/src/vender/knowledge' import Note from '../assets/note-mod.svg' import FileList from '../assets/file-list-3-fill.svg' import { indexMethodIcon } from '../icons' @@ -733,9 +733,10 @@ const StepTwo = ({ ) && } - effectImg={OrangeEffect.src} - activeHeaderClassName='bg-dataset-option-card-orange-gradient' + icon={} + effectImg={BlueEffect.src} + className='text-util-colors-blue-light-blue-light-500' + activeHeaderClassName='bg-dataset-option-card-blue-gradient' description={t('datasetCreation.stepTwo.parentChildTip')} isActive={currentDocForm === ChunkingMode.parentChild} onSwitched={() => handleChangeDocform(ChunkingMode.parentChild)} diff --git a/web/app/components/datasets/documents/create-from-pipeline/data-source/local-file/index.tsx b/web/app/components/datasets/documents/create-from-pipeline/data-source/local-file/index.tsx index ad05f0729b..da47a4664c 100644 --- a/web/app/components/datasets/documents/create-from-pipeline/data-source/local-file/index.tsx +++ b/web/app/components/datasets/documents/create-from-pipeline/data-source/local-file/index.tsx @@ -15,7 +15,7 @@ import { Theme } from '@/types/app' import useTheme from '@/hooks/use-theme' import { useFileUploadConfig } from '@/service/use-common' import { useDataSourceStore, useDataSourceStoreWithSelector } from '../store' -import produce from 'immer' +import { produce } from 'immer' import dynamic from 'next/dynamic' const SimplePieChart = dynamic(() => import('@/app/components/base/simple-pie-chart'), { ssr: false }) diff --git a/web/app/components/datasets/documents/create-from-pipeline/data-source/online-drive/index.tsx b/web/app/components/datasets/documents/create-from-pipeline/data-source/online-drive/index.tsx index f7777895e8..ed2820675c 100644 --- a/web/app/components/datasets/documents/create-from-pipeline/data-source/online-drive/index.tsx +++ b/web/app/components/datasets/documents/create-from-pipeline/data-source/online-drive/index.tsx @@ -10,7 +10,7 @@ import type { DataSourceNodeCompletedResponse, DataSourceNodeErrorResponse } fro import Toast from '@/app/components/base/toast' import { useDataSourceStore, useDataSourceStoreWithSelector } from '../store' import { convertOnlineDriveData } from './utils' -import produce from 'immer' +import { produce } from 'immer' import { useShallow } from 'zustand/react/shallow' import { useModalContextSelector } from '@/context/modal-context' import { useGetDataSourceAuth } from '@/service/use-datasource' diff --git a/web/app/components/datasets/metadata/edit-metadata-batch/modal.tsx b/web/app/components/datasets/metadata/edit-metadata-batch/modal.tsx index c80bd617bf..6681e4b67b 100644 --- a/web/app/components/datasets/metadata/edit-metadata-batch/modal.tsx +++ b/web/app/components/datasets/metadata/edit-metadata-batch/modal.tsx @@ -14,7 +14,7 @@ import SelectMetadataModal from '../metadata-dataset/select-metadata-modal' import { RiQuestionLine } from '@remixicon/react' import Divider from '@/app/components/base/divider' import AddMetadataButton from '../add-metadata-button' -import produce from 'immer' +import { produce } from 'immer' import useCheckMetadataName from '../hooks/use-check-metadata-name' import Toast from '@/app/components/base/toast' import { useCreateMetaData } from '@/service/knowledge/use-metadata' diff --git a/web/app/components/explore/app-card/index.tsx b/web/app/components/explore/app-card/index.tsx index 31d218a467..0d6a9b4ad4 100644 --- a/web/app/components/explore/app-card/index.tsx +++ b/web/app/components/explore/app-card/index.tsx @@ -32,7 +32,7 @@ const AppCard = ({ background={appBasicInfo.icon_background} imageUrl={appBasicInfo.icon_url} /> -
diff --git a/web/app/components/header/app-nav/index.tsx b/web/app/components/header/app-nav/index.tsx index b5ed5bb6d1..97e08a1166 100644 --- a/web/app/components/header/app-nav/index.tsx +++ b/web/app/components/header/app-nav/index.tsx @@ -5,7 +5,7 @@ import { useTranslation } from 'react-i18next' import { useParams } from 'next/navigation' import useSWRInfinite from 'swr/infinite' import { flatten } from 'lodash-es' -import produce from 'immer' +import { produce } from 'immer' import { RiRobot2Fill, RiRobot2Line, diff --git a/web/app/components/header/nav/nav-selector/index.tsx b/web/app/components/header/nav/nav-selector/index.tsx index f3c99b697c..6c9db287e7 100644 --- a/web/app/components/header/nav/nav-selector/index.tsx +++ b/web/app/components/header/nav/nav-selector/index.tsx @@ -11,12 +11,11 @@ import { useRouter } from 'next/navigation' import { debounce } from 'lodash-es' import cn from '@/utils/classnames' import AppIcon from '@/app/components/base/app-icon' -import { AiText, BubbleTextMod, ChatBot, CuteRobot } from '@/app/components/base/icons/src/vender/solid/communication' -import { Route } from '@/app/components/base/icons/src/vender/solid/mapsAndTravel' +import { AppTypeIcon } from '@/app/components/app/type-selector' import { useAppContext } from '@/context/app-context' import { useStore as useAppStore } from '@/app/components/app/store' import { FileArrow01, FilePlus01, FilePlus02 } from '@/app/components/base/icons/src/vender/line/files' -import type { AppIconType } from '@/types/app' +import type { AppIconType, AppMode } from '@/types/app' export type NavItem = { id: string @@ -26,7 +25,7 @@ export type NavItem = { icon: string icon_background: string | null icon_url: string | null - mode?: string + mode?: AppMode } export type INavSelectorProps = { navigationItems: NavItem[] @@ -92,25 +91,7 @@ const NavSelector = ({ curNav, navigationItems, createText, isApp, onCreate, onL imageUrl={nav.icon_url} /> {!!nav.mode && ( - - {nav.mode === 'advanced-chat' && ( - - )} - {nav.mode === 'agent-chat' && ( - - )} - {nav.mode === 'chat' && ( - - )} - {nav.mode === 'completion' && ( - - )} - {nav.mode === 'workflow' && ( - - )} - + )}
diff --git a/web/app/components/plugins/install-plugin/install-bundle/steps/install-multi.tsx b/web/app/components/plugins/install-plugin/install-bundle/steps/install-multi.tsx index 57732653e3..62bb9c07e1 100644 --- a/web/app/components/plugins/install-plugin/install-bundle/steps/install-multi.tsx +++ b/web/app/components/plugins/install-plugin/install-bundle/steps/install-multi.tsx @@ -6,7 +6,7 @@ import MarketplaceItem from '../item/marketplace-item' import GithubItem from '../item/github-item' import { useFetchPluginsInMarketPlaceByInfo } from '@/service/use-plugins' import useCheckInstalled from '@/app/components/plugins/install-plugin/hooks/use-check-installed' -import produce from 'immer' +import { produce } from 'immer' import PackageItem from '../item/package-item' import LoadingError from '../../base/loading-error' import { useGlobalPublicStore } from '@/context/global-public-context' diff --git a/web/app/components/plugins/plugin-detail-panel/tool-selector/reasoning-config-form.tsx b/web/app/components/plugins/plugin-detail-panel/tool-selector/reasoning-config-form.tsx index b0b8a45f3d..b79ee78664 100644 --- a/web/app/components/plugins/plugin-detail-panel/tool-selector/reasoning-config-form.tsx +++ b/web/app/components/plugins/plugin-detail-panel/tool-selector/reasoning-config-form.tsx @@ -1,6 +1,6 @@ import { useCallback, useState } from 'react' import { useTranslation } from 'react-i18next' -import produce from 'immer' +import { produce } from 'immer' import { RiArrowRightUpLine, RiBracesLine, diff --git a/web/app/components/plugins/plugin-page/context.tsx b/web/app/components/plugins/plugin-page/context.tsx index 52efbb263e..cdf81af396 100644 --- a/web/app/components/plugins/plugin-page/context.tsx +++ b/web/app/components/plugins/plugin-page/context.tsx @@ -1,6 +1,6 @@ 'use client' -import type { ReactNode } from 'react' +import type { ReactNode, RefObject } from 'react' import { useMemo, useRef, @@ -17,7 +17,7 @@ import { PLUGIN_PAGE_TABS_MAP, usePluginPageTabs } from '../hooks' import { useGlobalPublicStore } from '@/context/global-public-context' export type PluginPageContextValue = { - containerRef: React.RefObject + containerRef: RefObject currentPluginID: string | undefined setCurrentPluginID: (pluginID?: string) => void filters: FilterState @@ -27,8 +27,10 @@ export type PluginPageContextValue = { options: Array<{ value: string, text: string }> } +const emptyContainerRef: RefObject = { current: null } + export const PluginPageContext = createContext({ - containerRef: { current: null }, + containerRef: emptyContainerRef, currentPluginID: undefined, setCurrentPluginID: noop, filters: { @@ -53,7 +55,7 @@ export function usePluginPageContext(selector: (value: PluginPageContextValue) = export const PluginPageContextProvider = ({ children, }: PluginPageContextProviderProps) => { - const containerRef = useRef(null) + const containerRef = useRef(null) const [filters, setFilters] = useState({ categories: [], tags: [], diff --git a/web/app/components/plugins/plugin-page/use-uploader.ts b/web/app/components/plugins/plugin-page/use-uploader.ts index fb3974c448..8ccaef6a13 100644 --- a/web/app/components/plugins/plugin-page/use-uploader.ts +++ b/web/app/components/plugins/plugin-page/use-uploader.ts @@ -1,8 +1,9 @@ import { useEffect, useRef, useState } from 'react' +import type { RefObject } from 'react' type UploaderHookProps = { onFileChange: (file: File | null) => void - containerRef: React.RefObject + containerRef: RefObject enabled?: boolean } diff --git a/web/app/components/plugins/update-plugin/from-market-place.tsx b/web/app/components/plugins/update-plugin/from-market-place.tsx index fd15d923be..57c36f77d1 100644 --- a/web/app/components/plugins/update-plugin/from-market-place.tsx +++ b/web/app/components/plugins/update-plugin/from-market-place.tsx @@ -21,7 +21,7 @@ const i18nPrefix = 'plugin.upgrade' type Props = { payload: UpdateFromMarketPlacePayload - pluginId: string + pluginId?: string onSave: () => void onCancel: () => void isShowDowngradeWarningModal?: boolean @@ -113,9 +113,11 @@ const UpdatePluginModal: FC = ({ const { mutateAsync } = useRemoveAutoUpgrade() const invalidateReferenceSettings = useInvalidateReferenceSettings() const handleExcludeAndDownload = async () => { - await mutateAsync({ - plugin_id: pluginId, - }) + if (pluginId) { + await mutateAsync({ + plugin_id: pluginId, + }) + } invalidateReferenceSettings() handleConfirm() } diff --git a/web/app/components/rag-pipeline/hooks/use-nodes-sync-draft.ts b/web/app/components/rag-pipeline/hooks/use-nodes-sync-draft.ts index 51782f3cbf..d9de69716e 100644 --- a/web/app/components/rag-pipeline/hooks/use-nodes-sync-draft.ts +++ b/web/app/components/rag-pipeline/hooks/use-nodes-sync-draft.ts @@ -1,5 +1,5 @@ import { useCallback } from 'react' -import produce from 'immer' +import { produce } from 'immer' import { useStoreApi } from 'reactflow' import { useWorkflowStore, diff --git a/web/app/components/rag-pipeline/hooks/use-pipeline-run.ts b/web/app/components/rag-pipeline/hooks/use-pipeline-run.ts index cf910d411b..57d79d89bb 100644 --- a/web/app/components/rag-pipeline/hooks/use-pipeline-run.ts +++ b/web/app/components/rag-pipeline/hooks/use-pipeline-run.ts @@ -3,7 +3,7 @@ import { useReactFlow, useStoreApi, } from 'reactflow' -import produce from 'immer' +import { produce } from 'immer' import { useStore, useWorkflowStore } from '@/app/components/workflow/store' import { WorkflowRunningStatus } from '@/app/components/workflow/types' import { useWorkflowUpdate } from '@/app/components/workflow/hooks/use-workflow-interactions' @@ -145,6 +145,9 @@ export const usePipelineRun = () => { } = workflowStore.getState() setWorkflowRunningData({ result: { + inputs_truncated: false, + process_data_truncated: false, + outputs_truncated: false, status: WorkflowRunningStatus.Running, }, tracing: [], diff --git a/web/app/components/share/text-generation/result/index.tsx b/web/app/components/share/text-generation/result/index.tsx index 57c22ea1bf..7d21df448d 100644 --- a/web/app/components/share/text-generation/result/index.tsx +++ b/web/app/components/share/text-generation/result/index.tsx @@ -3,7 +3,7 @@ import type { FC } from 'react' import React, { useEffect, useRef, useState } from 'react' import { useBoolean } from 'ahooks' import { t } from 'i18next' -import produce from 'immer' +import { produce } from 'immer' import TextGenerationRes from '@/app/components/app/text-generate/item' import NoData from '@/app/components/share/text-generation/no-data' import Toast from '@/app/components/base/toast' diff --git a/web/app/components/tools/add-tool-modal/index.tsx b/web/app/components/tools/add-tool-modal/index.tsx index c45313fc09..e12ba3e334 100644 --- a/web/app/components/tools/add-tool-modal/index.tsx +++ b/web/app/components/tools/add-tool-modal/index.tsx @@ -3,7 +3,7 @@ import type { FC } from 'react' import React, { useMemo, useState } from 'react' import { useTranslation } from 'react-i18next' import { useContext } from 'use-context-selector' -import produce from 'immer' +import { produce } from 'immer' import { RiAddLine, RiCloseLine, diff --git a/web/app/components/tools/edit-custom-collection-modal/index.tsx b/web/app/components/tools/edit-custom-collection-modal/index.tsx index b9a29ef32d..95a204c1ec 100644 --- a/web/app/components/tools/edit-custom-collection-modal/index.tsx +++ b/web/app/components/tools/edit-custom-collection-modal/index.tsx @@ -4,7 +4,7 @@ import React, { useEffect, useState } from 'react' import { useTranslation } from 'react-i18next' import { useDebounce, useGetState } from 'ahooks' import { RiSettings2Line } from '@remixicon/react' -import produce from 'immer' +import { produce } from 'immer' import { LinkExternal02 } from '../../base/icons/src/vender/line/general' import type { Credential, CustomCollectionBackend, CustomParamSchema, Emoji } from '../types' import { AuthHeaderPrefix, AuthType } from '../types' diff --git a/web/app/components/tools/edit-custom-collection-modal/modal.tsx b/web/app/components/tools/edit-custom-collection-modal/modal.tsx index ce7ba8a735..3e278f7b53 100644 --- a/web/app/components/tools/edit-custom-collection-modal/modal.tsx +++ b/web/app/components/tools/edit-custom-collection-modal/modal.tsx @@ -3,7 +3,7 @@ import type { FC } from 'react' import React, { useEffect, useState } from 'react' import { useTranslation } from 'react-i18next' import { useDebounce, useGetState } from 'ahooks' -import produce from 'immer' +import { produce } from 'immer' import { LinkExternal02, Settings01 } from '../../base/icons/src/vender/line/general' import type { Credential, CustomCollectionBackend, CustomParamSchema, Emoji } from '../types' import { AuthHeaderPrefix, AuthType } from '../types' diff --git a/web/app/components/tools/mcp/detail/tool-item.tsx b/web/app/components/tools/mcp/detail/tool-item.tsx index 7a5ea6143d..d5dfa1f978 100644 --- a/web/app/components/tools/mcp/detail/tool-item.tsx +++ b/web/app/components/tools/mcp/detail/tool-item.tsx @@ -6,6 +6,7 @@ import I18n from '@/context/i18n' import { getLanguage } from '@/i18n-config/language' import Tooltip from '@/app/components/base/tooltip' import cn from '@/utils/classnames' +import { useTranslation } from 'react-i18next' type Props = { tool: Tool @@ -16,6 +17,32 @@ const MCPToolItem = ({ }: Props) => { const { locale } = useContext(I18n) const language = getLanguage(locale) + const { t } = useTranslation() + + const renderParameters = () => { + const parameters = tool.parameters + + if (parameters.length === 0) + return null + + return ( +
+
{t('tools.mcp.toolItem.parameters')}:
+
    + {parameters.map((parameter) => { + const descriptionContent = parameter.human_description[language] || t('tools.mcp.toolItem.noDescription') + return ( +
  • + {parameter.name} + ({parameter.type}): + {descriptionContent} +
  • + ) + })} +
+
+ ) + } return (
{tool.label[language]}
{tool.description[language]}
+ {renderParameters()}
)} > diff --git a/web/app/components/tools/workflow-tool/index.tsx b/web/app/components/tools/workflow-tool/index.tsx index 30afc1aa3e..78b05fb14f 100644 --- a/web/app/components/tools/workflow-tool/index.tsx +++ b/web/app/components/tools/workflow-tool/index.tsx @@ -2,7 +2,7 @@ import type { FC } from 'react' import React, { useState } from 'react' import { useTranslation } from 'react-i18next' -import produce from 'immer' +import { produce } from 'immer' import type { Emoji, WorkflowToolProviderParameter, WorkflowToolProviderRequest } from '../types' import cn from '@/utils/classnames' import Drawer from '@/app/components/base/drawer-plus' diff --git a/web/app/components/workflow-app/hooks/use-nodes-sync-draft.ts b/web/app/components/workflow-app/hooks/use-nodes-sync-draft.ts index d33bfcc8b8..c1f40c9d8c 100644 --- a/web/app/components/workflow-app/hooks/use-nodes-sync-draft.ts +++ b/web/app/components/workflow-app/hooks/use-nodes-sync-draft.ts @@ -1,5 +1,5 @@ import { useCallback } from 'react' -import produce from 'immer' +import { produce } from 'immer' import { useStoreApi } from 'reactflow' import { useParams } from 'next/navigation' import { diff --git a/web/app/components/workflow-app/hooks/use-workflow-run.ts b/web/app/components/workflow-app/hooks/use-workflow-run.ts index 72dc7fea2f..0cfcd6099b 100644 --- a/web/app/components/workflow-app/hooks/use-workflow-run.ts +++ b/web/app/components/workflow-app/hooks/use-workflow-run.ts @@ -3,7 +3,7 @@ import { useReactFlow, useStoreApi, } from 'reactflow' -import produce from 'immer' +import { produce } from 'immer' import { v4 as uuidV4 } from 'uuid' import { usePathname } from 'next/navigation' import { useWorkflowStore } from '@/app/components/workflow/store' @@ -164,6 +164,9 @@ export const useWorkflowRun = () => { } = workflowStore.getState() setWorkflowRunningData({ result: { + inputs_truncated: false, + process_data_truncated: false, + outputs_truncated: false, status: WorkflowRunningStatus.Running, }, tracing: [], diff --git a/web/app/components/workflow-app/index.tsx b/web/app/components/workflow-app/index.tsx index 68ed601344..df83b3ca26 100644 --- a/web/app/components/workflow-app/index.tsx +++ b/web/app/components/workflow-app/index.tsx @@ -86,7 +86,7 @@ const WorkflowAppWithAdditionalContext = () => { if (!parsedInputs) return - const userInputs: Record = {} + const userInputs: Record = {} Object.entries(parsedInputs).forEach(([key, value]) => { if (key.startsWith('sys.')) return diff --git a/web/app/components/workflow/block-selector/market-place-plugin/list.tsx b/web/app/components/workflow/block-selector/market-place-plugin/list.tsx index 3e36d64fbb..07ed17f86c 100644 --- a/web/app/components/workflow/block-selector/market-place-plugin/list.tsx +++ b/web/app/components/workflow/block-selector/market-place-plugin/list.tsx @@ -11,7 +11,7 @@ import { noop } from 'lodash-es' import { getMarketplaceUrl } from '@/utils/var' export type ListProps = { - wrapElemRef: React.RefObject + wrapElemRef: React.RefObject list: Plugin[] searchText: string tags: string[] diff --git a/web/app/components/workflow/candidate-node.tsx b/web/app/components/workflow/candidate-node.tsx index 35bcd5c201..6f2389aad2 100644 --- a/web/app/components/workflow/candidate-node.tsx +++ b/web/app/components/workflow/candidate-node.tsx @@ -1,7 +1,7 @@ import { memo, } from 'react' -import produce from 'immer' +import { produce } from 'immer' import { useReactFlow, useStoreApi, diff --git a/web/app/components/workflow/datasets-detail-store/store.ts b/web/app/components/workflow/datasets-detail-store/store.ts index 4bc8c335e5..80f19bfea0 100644 --- a/web/app/components/workflow/datasets-detail-store/store.ts +++ b/web/app/components/workflow/datasets-detail-store/store.ts @@ -2,7 +2,7 @@ import { useContext } from 'react' import { createStore, useStore } from 'zustand' import type { DataSet } from '@/models/datasets' import { DatasetsDetailContext } from './provider' -import produce from 'immer' +import { produce } from 'immer' type DatasetsDetailStore = { datasetsDetail: Record diff --git a/web/app/components/workflow/hooks/use-config-vision.ts b/web/app/components/workflow/hooks/use-config-vision.ts index a3cddbc47c..ab859a5ba3 100644 --- a/web/app/components/workflow/hooks/use-config-vision.ts +++ b/web/app/components/workflow/hooks/use-config-vision.ts @@ -1,4 +1,4 @@ -import produce from 'immer' +import { produce } from 'immer' import { useCallback } from 'react' import { useIsChatMode } from './use-workflow' import type { ModelConfig, VisionSetting } from '@/app/components/workflow/types' diff --git a/web/app/components/workflow/hooks/use-edges-interactions-without-sync.ts b/web/app/components/workflow/hooks/use-edges-interactions-without-sync.ts index c4c709cd25..e7b4fb0a42 100644 --- a/web/app/components/workflow/hooks/use-edges-interactions-without-sync.ts +++ b/web/app/components/workflow/hooks/use-edges-interactions-without-sync.ts @@ -1,5 +1,5 @@ import { useCallback } from 'react' -import produce from 'immer' +import { produce } from 'immer' import { useStoreApi } from 'reactflow' export const useEdgesInteractionsWithoutSync = () => { diff --git a/web/app/components/workflow/hooks/use-edges-interactions.ts b/web/app/components/workflow/hooks/use-edges-interactions.ts index 306af1e96c..297535ac24 100644 --- a/web/app/components/workflow/hooks/use-edges-interactions.ts +++ b/web/app/components/workflow/hooks/use-edges-interactions.ts @@ -1,5 +1,5 @@ import { useCallback } from 'react' -import produce from 'immer' +import { produce } from 'immer' import type { EdgeMouseHandler, OnEdgesChange, diff --git a/web/app/components/workflow/hooks/use-inspect-vars-crud-common.ts b/web/app/components/workflow/hooks/use-inspect-vars-crud-common.ts index dc131a150f..f35f0c7dab 100644 --- a/web/app/components/workflow/hooks/use-inspect-vars-crud-common.ts +++ b/web/app/components/workflow/hooks/use-inspect-vars-crud-common.ts @@ -10,7 +10,7 @@ import { isSystemVar, toNodeOutputVars, } from '@/app/components/workflow/nodes/_base/components/variable/utils' -import produce from 'immer' +import { produce } from 'immer' import type { Node } from '@/app/components/workflow/types' import { useNodesInteractionsWithoutSync } from '@/app/components/workflow/hooks/use-nodes-interactions-without-sync' import { useEdgesInteractionsWithoutSync } from '@/app/components/workflow/hooks/use-edges-interactions-without-sync' diff --git a/web/app/components/workflow/hooks/use-node-data-update.ts b/web/app/components/workflow/hooks/use-node-data-update.ts index c59c858184..edacc31a7c 100644 --- a/web/app/components/workflow/hooks/use-node-data-update.ts +++ b/web/app/components/workflow/hooks/use-node-data-update.ts @@ -1,5 +1,5 @@ import { useCallback } from 'react' -import produce from 'immer' +import { produce } from 'immer' import { useStoreApi } from 'reactflow' import { useNodesSyncDraft } from './use-nodes-sync-draft' import { useNodesReadOnly } from './use-workflow' diff --git a/web/app/components/workflow/hooks/use-nodes-interactions-without-sync.ts b/web/app/components/workflow/hooks/use-nodes-interactions-without-sync.ts index e01609cdb6..e3d661ff08 100644 --- a/web/app/components/workflow/hooks/use-nodes-interactions-without-sync.ts +++ b/web/app/components/workflow/hooks/use-nodes-interactions-without-sync.ts @@ -1,5 +1,5 @@ import { useCallback } from 'react' -import produce from 'immer' +import { produce } from 'immer' import { useStoreApi } from 'reactflow' import { NodeRunningStatus } from '../types' diff --git a/web/app/components/workflow/hooks/use-nodes-interactions.ts b/web/app/components/workflow/hooks/use-nodes-interactions.ts index afd13a73fb..fa61cdeb8c 100644 --- a/web/app/components/workflow/hooks/use-nodes-interactions.ts +++ b/web/app/components/workflow/hooks/use-nodes-interactions.ts @@ -1,7 +1,7 @@ import type { MouseEvent } from 'react' import { useCallback, useRef, useState } from 'react' import { useTranslation } from 'react-i18next' -import produce from 'immer' +import { produce } from 'immer' import type { NodeDragHandler, NodeMouseHandler, diff --git a/web/app/components/workflow/hooks/use-selection-interactions.ts b/web/app/components/workflow/hooks/use-selection-interactions.ts index 0055549b7d..481483d762 100644 --- a/web/app/components/workflow/hooks/use-selection-interactions.ts +++ b/web/app/components/workflow/hooks/use-selection-interactions.ts @@ -2,7 +2,7 @@ import type { MouseEvent } from 'react' import { useCallback, } from 'react' -import produce from 'immer' +import { produce } from 'immer' import type { OnSelectionChangeFunc, } from 'reactflow' diff --git a/web/app/components/workflow/hooks/use-workflow-interactions.ts b/web/app/components/workflow/hooks/use-workflow-interactions.ts index f63250dd42..c080d6279e 100644 --- a/web/app/components/workflow/hooks/use-workflow-interactions.ts +++ b/web/app/components/workflow/hooks/use-workflow-interactions.ts @@ -2,7 +2,7 @@ import { useCallback, } from 'react' import { useReactFlow, useStoreApi } from 'reactflow' -import produce from 'immer' +import { produce } from 'immer' import { useStore, useWorkflowStore } from '../store' import { CUSTOM_NODE, diff --git a/web/app/components/workflow/hooks/use-workflow-run-event/use-workflow-agent-log.ts b/web/app/components/workflow/hooks/use-workflow-run-event/use-workflow-agent-log.ts index 6e9303773e..a9deb9bc70 100644 --- a/web/app/components/workflow/hooks/use-workflow-run-event/use-workflow-agent-log.ts +++ b/web/app/components/workflow/hooks/use-workflow-run-event/use-workflow-agent-log.ts @@ -1,5 +1,5 @@ import { useCallback } from 'react' -import produce from 'immer' +import { produce } from 'immer' import type { AgentLogResponse } from '@/types/workflow' import { useWorkflowStore } from '@/app/components/workflow/store' diff --git a/web/app/components/workflow/hooks/use-workflow-run-event/use-workflow-failed.ts b/web/app/components/workflow/hooks/use-workflow-run-event/use-workflow-failed.ts index 733f0152a6..ff16aa1935 100644 --- a/web/app/components/workflow/hooks/use-workflow-run-event/use-workflow-failed.ts +++ b/web/app/components/workflow/hooks/use-workflow-run-event/use-workflow-failed.ts @@ -1,5 +1,5 @@ import { useCallback } from 'react' -import produce from 'immer' +import { produce } from 'immer' import { useWorkflowStore } from '@/app/components/workflow/store' import { WorkflowRunningStatus } from '@/app/components/workflow/types' diff --git a/web/app/components/workflow/hooks/use-workflow-run-event/use-workflow-finished.ts b/web/app/components/workflow/hooks/use-workflow-run-event/use-workflow-finished.ts index f447031047..681a123b93 100644 --- a/web/app/components/workflow/hooks/use-workflow-run-event/use-workflow-finished.ts +++ b/web/app/components/workflow/hooks/use-workflow-run-event/use-workflow-finished.ts @@ -1,5 +1,5 @@ import { useCallback } from 'react' -import produce from 'immer' +import { produce } from 'immer' import type { WorkflowFinishedResponse } from '@/types/workflow' import { useWorkflowStore } from '@/app/components/workflow/store' import { getFilesInLogs } from '@/app/components/base/file-uploader/utils' diff --git a/web/app/components/workflow/hooks/use-workflow-run-event/use-workflow-node-finished.ts b/web/app/components/workflow/hooks/use-workflow-run-event/use-workflow-node-finished.ts index 85382e5796..9b90a2ebee 100644 --- a/web/app/components/workflow/hooks/use-workflow-run-event/use-workflow-node-finished.ts +++ b/web/app/components/workflow/hooks/use-workflow-run-event/use-workflow-node-finished.ts @@ -1,6 +1,6 @@ import { useCallback } from 'react' import { useStoreApi } from 'reactflow' -import produce from 'immer' +import { produce } from 'immer' import type { NodeFinishedResponse } from '@/types/workflow' import { BlockEnum, diff --git a/web/app/components/workflow/hooks/use-workflow-run-event/use-workflow-node-iteration-finished.ts b/web/app/components/workflow/hooks/use-workflow-run-event/use-workflow-node-iteration-finished.ts index 7da8665c66..50700a7fad 100644 --- a/web/app/components/workflow/hooks/use-workflow-run-event/use-workflow-node-iteration-finished.ts +++ b/web/app/components/workflow/hooks/use-workflow-run-event/use-workflow-node-iteration-finished.ts @@ -1,6 +1,6 @@ import { useCallback } from 'react' import { useStoreApi } from 'reactflow' -import produce from 'immer' +import { produce } from 'immer' import type { IterationFinishedResponse } from '@/types/workflow' import { useWorkflowStore } from '@/app/components/workflow/store' import { DEFAULT_ITER_TIMES } from '@/app/components/workflow/constants' diff --git a/web/app/components/workflow/hooks/use-workflow-run-event/use-workflow-node-iteration-next.ts b/web/app/components/workflow/hooks/use-workflow-run-event/use-workflow-node-iteration-next.ts index 454f822675..3b88a02bfc 100644 --- a/web/app/components/workflow/hooks/use-workflow-run-event/use-workflow-node-iteration-next.ts +++ b/web/app/components/workflow/hooks/use-workflow-run-event/use-workflow-node-iteration-next.ts @@ -1,6 +1,6 @@ import { useCallback } from 'react' import { useStoreApi } from 'reactflow' -import produce from 'immer' +import { produce } from 'immer' import type { IterationNextResponse } from '@/types/workflow' import { useWorkflowStore } from '@/app/components/workflow/store' diff --git a/web/app/components/workflow/hooks/use-workflow-run-event/use-workflow-node-iteration-started.ts b/web/app/components/workflow/hooks/use-workflow-run-event/use-workflow-node-iteration-started.ts index 0308f62b31..c064809a10 100644 --- a/web/app/components/workflow/hooks/use-workflow-run-event/use-workflow-node-iteration-started.ts +++ b/web/app/components/workflow/hooks/use-workflow-run-event/use-workflow-node-iteration-started.ts @@ -3,7 +3,7 @@ import { useReactFlow, useStoreApi, } from 'reactflow' -import produce from 'immer' +import { produce } from 'immer' import { useWorkflowStore } from '@/app/components/workflow/store' import type { IterationStartedResponse } from '@/types/workflow' import { NodeRunningStatus } from '@/app/components/workflow/types' diff --git a/web/app/components/workflow/hooks/use-workflow-run-event/use-workflow-node-loop-finished.ts b/web/app/components/workflow/hooks/use-workflow-run-event/use-workflow-node-loop-finished.ts index 5b6c7f005f..a7605dfc55 100644 --- a/web/app/components/workflow/hooks/use-workflow-run-event/use-workflow-node-loop-finished.ts +++ b/web/app/components/workflow/hooks/use-workflow-run-event/use-workflow-node-loop-finished.ts @@ -1,6 +1,6 @@ import { useCallback } from 'react' import { useStoreApi } from 'reactflow' -import produce from 'immer' +import { produce } from 'immer' import type { LoopFinishedResponse } from '@/types/workflow' import { useWorkflowStore } from '@/app/components/workflow/store' diff --git a/web/app/components/workflow/hooks/use-workflow-run-event/use-workflow-node-loop-next.ts b/web/app/components/workflow/hooks/use-workflow-run-event/use-workflow-node-loop-next.ts index 8525e2838b..26f52bc23c 100644 --- a/web/app/components/workflow/hooks/use-workflow-run-event/use-workflow-node-loop-next.ts +++ b/web/app/components/workflow/hooks/use-workflow-run-event/use-workflow-node-loop-next.ts @@ -1,6 +1,6 @@ import { useCallback } from 'react' import { useStoreApi } from 'reactflow' -import produce from 'immer' +import { produce } from 'immer' import type { LoopNextResponse } from '@/types/workflow' import { NodeRunningStatus } from '@/app/components/workflow/types' diff --git a/web/app/components/workflow/hooks/use-workflow-run-event/use-workflow-node-loop-started.ts b/web/app/components/workflow/hooks/use-workflow-run-event/use-workflow-node-loop-started.ts index 1745f43b60..d83b9a2ab8 100644 --- a/web/app/components/workflow/hooks/use-workflow-run-event/use-workflow-node-loop-started.ts +++ b/web/app/components/workflow/hooks/use-workflow-run-event/use-workflow-node-loop-started.ts @@ -3,7 +3,7 @@ import { useReactFlow, useStoreApi, } from 'reactflow' -import produce from 'immer' +import { produce } from 'immer' import { useWorkflowStore } from '@/app/components/workflow/store' import type { LoopStartedResponse } from '@/types/workflow' import { NodeRunningStatus } from '@/app/components/workflow/types' diff --git a/web/app/components/workflow/hooks/use-workflow-run-event/use-workflow-node-retry.ts b/web/app/components/workflow/hooks/use-workflow-run-event/use-workflow-node-retry.ts index a57bfbce39..b7fb631a4f 100644 --- a/web/app/components/workflow/hooks/use-workflow-run-event/use-workflow-node-retry.ts +++ b/web/app/components/workflow/hooks/use-workflow-run-event/use-workflow-node-retry.ts @@ -1,6 +1,6 @@ import { useCallback } from 'react' import { useStoreApi } from 'reactflow' -import produce from 'immer' +import { produce } from 'immer' import type { NodeFinishedResponse, } from '@/types/workflow' diff --git a/web/app/components/workflow/hooks/use-workflow-run-event/use-workflow-node-started.ts b/web/app/components/workflow/hooks/use-workflow-run-event/use-workflow-node-started.ts index 54af9843e6..a3ae0407ea 100644 --- a/web/app/components/workflow/hooks/use-workflow-run-event/use-workflow-node-started.ts +++ b/web/app/components/workflow/hooks/use-workflow-run-event/use-workflow-node-started.ts @@ -3,7 +3,7 @@ import { useReactFlow, useStoreApi, } from 'reactflow' -import produce from 'immer' +import { produce } from 'immer' import type { NodeStartedResponse } from '@/types/workflow' import { NodeRunningStatus } from '@/app/components/workflow/types' import { useWorkflowStore } from '@/app/components/workflow/store' diff --git a/web/app/components/workflow/hooks/use-workflow-run-event/use-workflow-started.ts b/web/app/components/workflow/hooks/use-workflow-run-event/use-workflow-started.ts index f9911313cc..2843cf0f1c 100644 --- a/web/app/components/workflow/hooks/use-workflow-run-event/use-workflow-started.ts +++ b/web/app/components/workflow/hooks/use-workflow-run-event/use-workflow-started.ts @@ -1,6 +1,6 @@ import { useCallback } from 'react' import { useStoreApi } from 'reactflow' -import produce from 'immer' +import { produce } from 'immer' import type { WorkflowStartedResponse } from '@/types/workflow' import { WorkflowRunningStatus } from '@/app/components/workflow/types' import { useWorkflowStore } from '@/app/components/workflow/store' diff --git a/web/app/components/workflow/hooks/use-workflow-run-event/use-workflow-text-chunk.ts b/web/app/components/workflow/hooks/use-workflow-run-event/use-workflow-text-chunk.ts index c086e57697..1667265548 100644 --- a/web/app/components/workflow/hooks/use-workflow-run-event/use-workflow-text-chunk.ts +++ b/web/app/components/workflow/hooks/use-workflow-run-event/use-workflow-text-chunk.ts @@ -1,5 +1,5 @@ import { useCallback } from 'react' -import produce from 'immer' +import { produce } from 'immer' import type { TextChunkResponse } from '@/types/workflow' import { useWorkflowStore } from '@/app/components/workflow/store' diff --git a/web/app/components/workflow/hooks/use-workflow-run-event/use-workflow-text-replace.ts b/web/app/components/workflow/hooks/use-workflow-run-event/use-workflow-text-replace.ts index a00530932d..3efd287c9b 100644 --- a/web/app/components/workflow/hooks/use-workflow-run-event/use-workflow-text-replace.ts +++ b/web/app/components/workflow/hooks/use-workflow-run-event/use-workflow-text-replace.ts @@ -1,5 +1,5 @@ import { useCallback } from 'react' -import produce from 'immer' +import { produce } from 'immer' import type { TextReplaceResponse } from '@/types/workflow' import { useWorkflowStore } from '@/app/components/workflow/store' diff --git a/web/app/components/workflow/nodes/_base/components/before-run-form/form-item.tsx b/web/app/components/workflow/nodes/_base/components/before-run-form/form-item.tsx index d6f56b8c43..041c8dab28 100644 --- a/web/app/components/workflow/nodes/_base/components/before-run-form/form-item.tsx +++ b/web/app/components/workflow/nodes/_base/components/before-run-form/form-item.tsx @@ -2,7 +2,7 @@ import type { FC } from 'react' import React, { useCallback, useMemo } from 'react' import { useTranslation } from 'react-i18next' -import produce from 'immer' +import { produce } from 'immer' import { RiDeleteBinLine, } from '@remixicon/react' diff --git a/web/app/components/workflow/nodes/_base/components/before-run-form/form.tsx b/web/app/components/workflow/nodes/_base/components/before-run-form/form.tsx index 780a01d89b..e24498e7eb 100644 --- a/web/app/components/workflow/nodes/_base/components/before-run-form/form.tsx +++ b/web/app/components/workflow/nodes/_base/components/before-run-form/form.tsx @@ -1,7 +1,7 @@ 'use client' import type { FC } from 'react' import React, { useCallback, useEffect, useMemo, useRef } from 'react' -import produce from 'immer' +import { produce } from 'immer' import type { InputVar } from '../../../../types' import FormItem from './form-item' import cn from '@/utils/classnames' diff --git a/web/app/components/workflow/nodes/_base/components/config-vision.tsx b/web/app/components/workflow/nodes/_base/components/config-vision.tsx index 56cd1a5dbb..0132ce147e 100644 --- a/web/app/components/workflow/nodes/_base/components/config-vision.tsx +++ b/web/app/components/workflow/nodes/_base/components/config-vision.tsx @@ -2,7 +2,7 @@ import type { FC } from 'react' import React, { useCallback } from 'react' import { useTranslation } from 'react-i18next' -import produce from 'immer' +import { produce } from 'immer' import VarReferencePicker from './variable/var-reference-picker' import ResolutionPicker from '@/app/components/workflow/nodes/llm/components/resolution-picker' import Field from '@/app/components/workflow/nodes/_base/components/field' diff --git a/web/app/components/workflow/nodes/_base/components/file-upload-setting.tsx b/web/app/components/workflow/nodes/_base/components/file-upload-setting.tsx index 8613ee54b3..0dccf23e9e 100644 --- a/web/app/components/workflow/nodes/_base/components/file-upload-setting.tsx +++ b/web/app/components/workflow/nodes/_base/components/file-upload-setting.tsx @@ -2,7 +2,7 @@ import type { FC } from 'react' import React, { useCallback } from 'react' import useSWR from 'swr' -import produce from 'immer' +import { produce } from 'immer' import { useTranslation } from 'react-i18next' import type { UploadFileSetting } from '../../../types' import { SupportUploadFileTypes } from '../../../types' diff --git a/web/app/components/workflow/nodes/_base/components/memory-config.tsx b/web/app/components/workflow/nodes/_base/components/memory-config.tsx index 168ad656b6..0e274a2420 100644 --- a/web/app/components/workflow/nodes/_base/components/memory-config.tsx +++ b/web/app/components/workflow/nodes/_base/components/memory-config.tsx @@ -2,7 +2,7 @@ import type { FC } from 'react' import React, { useCallback } from 'react' import { useTranslation } from 'react-i18next' -import produce from 'immer' +import { produce } from 'immer' import type { Memory } from '../../../types' import { MemoryRole } from '../../../types' import cn from '@/utils/classnames' diff --git a/web/app/components/workflow/nodes/_base/components/variable/output-var-list.tsx b/web/app/components/workflow/nodes/_base/components/variable/output-var-list.tsx index 7365e91c21..3c2415bf9d 100644 --- a/web/app/components/workflow/nodes/_base/components/variable/output-var-list.tsx +++ b/web/app/components/workflow/nodes/_base/components/variable/output-var-list.tsx @@ -1,7 +1,7 @@ 'use client' import type { FC } from 'react' import React, { useCallback, useState } from 'react' -import produce from 'immer' +import { produce } from 'immer' import { useTranslation } from 'react-i18next' import type { OutputVar } from '../../../code/types' import RemoveButton from '../remove-button' diff --git a/web/app/components/workflow/nodes/_base/components/variable/utils.ts b/web/app/components/workflow/nodes/_base/components/variable/utils.ts index 10919e198b..715551cbff 100644 --- a/web/app/components/workflow/nodes/_base/components/variable/utils.ts +++ b/web/app/components/workflow/nodes/_base/components/variable/utils.ts @@ -1,4 +1,4 @@ -import produce from 'immer' +import { produce } from 'immer' import { isArray, uniq } from 'lodash-es' import type { CodeNodeType } from '../../../code/types' import type { EndNodeType } from '../../../end/types' diff --git a/web/app/components/workflow/nodes/_base/components/variable/var-list.tsx b/web/app/components/workflow/nodes/_base/components/variable/var-list.tsx index 5e84a518cc..e2d86c009c 100644 --- a/web/app/components/workflow/nodes/_base/components/variable/var-list.tsx +++ b/web/app/components/workflow/nodes/_base/components/variable/var-list.tsx @@ -2,7 +2,7 @@ import type { FC } from 'react' import React, { useCallback, useMemo, useState } from 'react' import { useTranslation } from 'react-i18next' -import produce from 'immer' +import { produce } from 'immer' import RemoveButton from '../remove-button' import VarReferencePicker from './var-reference-picker' import Input from '@/app/components/base/input' diff --git a/web/app/components/workflow/nodes/_base/components/variable/var-reference-picker.tsx b/web/app/components/workflow/nodes/_base/components/variable/var-reference-picker.tsx index 4d74e09fde..85424cdaf4 100644 --- a/web/app/components/workflow/nodes/_base/components/variable/var-reference-picker.tsx +++ b/web/app/components/workflow/nodes/_base/components/variable/var-reference-picker.tsx @@ -9,7 +9,7 @@ import { RiLoader4Line, RiMoreLine, } from '@remixicon/react' -import produce from 'immer' +import { produce } from 'immer' import { useNodes, useReactFlow, diff --git a/web/app/components/workflow/nodes/_base/hooks/use-one-step-run.ts b/web/app/components/workflow/nodes/_base/hooks/use-one-step-run.ts index 46a5a82839..908609c975 100644 --- a/web/app/components/workflow/nodes/_base/hooks/use-one-step-run.ts +++ b/web/app/components/workflow/nodes/_base/hooks/use-one-step-run.ts @@ -1,7 +1,7 @@ import { useCallback, useEffect, useRef, useState } from 'react' import { useTranslation } from 'react-i18next' import { unionBy } from 'lodash-es' -import produce from 'immer' +import { produce } from 'immer' import { useIsChatMode, useNodeDataUpdate, diff --git a/web/app/components/workflow/nodes/_base/hooks/use-output-var-list.ts b/web/app/components/workflow/nodes/_base/hooks/use-output-var-list.ts index 771bfb5161..87a5f69c95 100644 --- a/web/app/components/workflow/nodes/_base/hooks/use-output-var-list.ts +++ b/web/app/components/workflow/nodes/_base/hooks/use-output-var-list.ts @@ -1,5 +1,5 @@ import { useCallback, useRef, useState } from 'react' -import produce from 'immer' +import { produce } from 'immer' import { useBoolean, useDebounceFn } from 'ahooks' import type { CodeNodeType, diff --git a/web/app/components/workflow/nodes/_base/hooks/use-var-list.ts b/web/app/components/workflow/nodes/_base/hooks/use-var-list.ts index 63d284f260..ffacf9a2df 100644 --- a/web/app/components/workflow/nodes/_base/hooks/use-var-list.ts +++ b/web/app/components/workflow/nodes/_base/hooks/use-var-list.ts @@ -1,5 +1,5 @@ import { useCallback } from 'react' -import produce from 'immer' +import { produce } from 'immer' import type { Variable } from '@/app/components/workflow/types' type Params = { diff --git a/web/app/components/workflow/nodes/agent/use-config.ts b/web/app/components/workflow/nodes/agent/use-config.ts index 3d21d76ed5..90d6736f51 100644 --- a/web/app/components/workflow/nodes/agent/use-config.ts +++ b/web/app/components/workflow/nodes/agent/use-config.ts @@ -12,7 +12,7 @@ import { useCheckInstalled, useFetchPluginsInMarketPlaceByIds } from '@/service/ import type { Memory, Var } from '../../types' import { VarType as VarKindType } from '../../types' import useAvailableVarList from '../_base/hooks/use-available-var-list' -import produce from 'immer' +import { produce } from 'immer' import { FormTypeEnum } from '@/app/components/header/account-setting/model-provider-page/declarations' import { isSupportMCP } from '@/utils/plugin-version-feature' import { generateAgentToolValue, toolParametersToFormSchemas } from '@/app/components/tools/utils/to-form-schema' diff --git a/web/app/components/workflow/nodes/answer/use-config.ts b/web/app/components/workflow/nodes/answer/use-config.ts index 269d953743..c00b2bd7c5 100644 --- a/web/app/components/workflow/nodes/answer/use-config.ts +++ b/web/app/components/workflow/nodes/answer/use-config.ts @@ -1,5 +1,5 @@ import { useCallback } from 'react' -import produce from 'immer' +import { produce } from 'immer' import useVarList from '../_base/hooks/use-var-list' import type { Var } from '../../types' import { VarType } from '../../types' diff --git a/web/app/components/workflow/nodes/assigner/components/var-list/index.tsx b/web/app/components/workflow/nodes/assigner/components/var-list/index.tsx index 68d4afdce8..bfb48d4eb2 100644 --- a/web/app/components/workflow/nodes/assigner/components/var-list/index.tsx +++ b/web/app/components/workflow/nodes/assigner/components/var-list/index.tsx @@ -2,7 +2,7 @@ import type { FC } from 'react' import { useTranslation } from 'react-i18next' import React, { useCallback } from 'react' -import produce from 'immer' +import { produce } from 'immer' import { RiDeleteBinLine } from '@remixicon/react' import OperationSelector from '../operation-selector' import { AssignerNodeInputType, WriteMode } from '../../types' diff --git a/web/app/components/workflow/nodes/assigner/components/var-list/use-var-list.ts b/web/app/components/workflow/nodes/assigner/components/var-list/use-var-list.ts index 1ae53cecec..c97006d023 100644 --- a/web/app/components/workflow/nodes/assigner/components/var-list/use-var-list.ts +++ b/web/app/components/workflow/nodes/assigner/components/var-list/use-var-list.ts @@ -1,5 +1,5 @@ import { useCallback } from 'react' -import produce from 'immer' +import { produce } from 'immer' import type { AssignerNodeOperation, AssignerNodeType } from '../../types' import { AssignerNodeInputType, WriteMode } from '../../types' diff --git a/web/app/components/workflow/nodes/assigner/use-config.ts b/web/app/components/workflow/nodes/assigner/use-config.ts index c42dd67b37..a69ddd2464 100644 --- a/web/app/components/workflow/nodes/assigner/use-config.ts +++ b/web/app/components/workflow/nodes/assigner/use-config.ts @@ -1,5 +1,5 @@ import { useCallback, useMemo } from 'react' -import produce from 'immer' +import { produce } from 'immer' import { useStoreApi } from 'reactflow' import { VarType } from '../../types' import type { ValueSelector, Var } from '../../types' diff --git a/web/app/components/workflow/nodes/code/use-config.ts b/web/app/components/workflow/nodes/code/use-config.ts index 80183da0d6..39137ada30 100644 --- a/web/app/components/workflow/nodes/code/use-config.ts +++ b/web/app/components/workflow/nodes/code/use-config.ts @@ -1,5 +1,5 @@ import { useCallback, useEffect, useState } from 'react' -import produce from 'immer' +import { produce } from 'immer' import useVarList from '../_base/hooks/use-var-list' import useOutputVarList from '../_base/hooks/use-output-var-list' import { BlockEnum, VarType } from '../../types' diff --git a/web/app/components/workflow/nodes/document-extractor/use-config.ts b/web/app/components/workflow/nodes/document-extractor/use-config.ts index 43f3e71fa2..53393aa030 100644 --- a/web/app/components/workflow/nodes/document-extractor/use-config.ts +++ b/web/app/components/workflow/nodes/document-extractor/use-config.ts @@ -1,5 +1,5 @@ import { useCallback, useMemo } from 'react' -import produce from 'immer' +import { produce } from 'immer' import { useStoreApi } from 'reactflow' import type { ValueSelector, Var } from '../../types' import { VarType } from '../../types' diff --git a/web/app/components/workflow/nodes/http/components/authorization/index.tsx b/web/app/components/workflow/nodes/http/components/authorization/index.tsx index b2de919906..f12806050f 100644 --- a/web/app/components/workflow/nodes/http/components/authorization/index.tsx +++ b/web/app/components/workflow/nodes/http/components/authorization/index.tsx @@ -2,7 +2,7 @@ import type { FC } from 'react' import { useTranslation } from 'react-i18next' import React, { useCallback, useState } from 'react' -import produce from 'immer' +import { produce } from 'immer' import type { Authorization as AuthorizationPayloadType } from '../../types' import { APIType, AuthorizationType } from '../../types' import RadioGroup from './radio-group' diff --git a/web/app/components/workflow/nodes/http/components/edit-body/index.tsx b/web/app/components/workflow/nodes/http/components/edit-body/index.tsx index bfdb0b32e0..97cc1e4575 100644 --- a/web/app/components/workflow/nodes/http/components/edit-body/index.tsx +++ b/web/app/components/workflow/nodes/http/components/edit-body/index.tsx @@ -1,7 +1,7 @@ 'use client' import type { FC } from 'react' import React, { useCallback, useMemo } from 'react' -import produce from 'immer' +import { produce } from 'immer' import { uniqueId } from 'lodash-es' import type { Body, BodyPayload, KeyValue as KeyValueType } from '../../types' import { BodyPayloadValueType, BodyType } from '../../types' diff --git a/web/app/components/workflow/nodes/http/components/key-value/key-value-edit/index.tsx b/web/app/components/workflow/nodes/http/components/key-value/key-value-edit/index.tsx index b333bd651b..53b2dd85e2 100644 --- a/web/app/components/workflow/nodes/http/components/key-value/key-value-edit/index.tsx +++ b/web/app/components/workflow/nodes/http/components/key-value/key-value-edit/index.tsx @@ -1,7 +1,7 @@ 'use client' import type { FC } from 'react' import React, { useCallback } from 'react' -import produce from 'immer' +import { produce } from 'immer' import { useTranslation } from 'react-i18next' import type { KeyValue } from '../../../types' import KeyValueItem from './item' diff --git a/web/app/components/workflow/nodes/http/components/key-value/key-value-edit/item.tsx b/web/app/components/workflow/nodes/http/components/key-value/key-value-edit/item.tsx index b2df1cbb3a..73095704b0 100644 --- a/web/app/components/workflow/nodes/http/components/key-value/key-value-edit/item.tsx +++ b/web/app/components/workflow/nodes/http/components/key-value/key-value-edit/item.tsx @@ -2,7 +2,7 @@ import type { FC } from 'react' import React, { useCallback } from 'react' import { useTranslation } from 'react-i18next' -import produce from 'immer' +import { produce } from 'immer' import type { KeyValue } from '../../../types' import VarReferencePicker from '../../../../_base/components/variable/var-reference-picker' import InputItem from './input-item' diff --git a/web/app/components/workflow/nodes/http/use-config.ts b/web/app/components/workflow/nodes/http/use-config.ts index 761ce99b26..45303c3b46 100644 --- a/web/app/components/workflow/nodes/http/use-config.ts +++ b/web/app/components/workflow/nodes/http/use-config.ts @@ -1,5 +1,5 @@ import { useCallback, useEffect, useState } from 'react' -import produce from 'immer' +import { produce } from 'immer' import { useBoolean } from 'ahooks' import useVarList from '../_base/hooks/use-var-list' import { VarType } from '../../types' diff --git a/web/app/components/workflow/nodes/if-else/components/condition-list/condition-item.tsx b/web/app/components/workflow/nodes/if-else/components/condition-list/condition-item.tsx index 45973122e8..9bcd4b9671 100644 --- a/web/app/components/workflow/nodes/if-else/components/condition-list/condition-item.tsx +++ b/web/app/components/workflow/nodes/if-else/components/condition-list/condition-item.tsx @@ -5,7 +5,7 @@ import { } from 'react' import { useTranslation } from 'react-i18next' import { RiDeleteBinLine } from '@remixicon/react' -import produce from 'immer' +import { produce } from 'immer' import type { VarType as NumberVarType } from '../../../tool/types' import type { Condition, diff --git a/web/app/components/workflow/nodes/if-else/use-config.ts b/web/app/components/workflow/nodes/if-else/use-config.ts index f88c119614..205715b898 100644 --- a/web/app/components/workflow/nodes/if-else/use-config.ts +++ b/web/app/components/workflow/nodes/if-else/use-config.ts @@ -1,5 +1,5 @@ import { useCallback, useMemo } from 'react' -import produce from 'immer' +import { produce } from 'immer' import { v4 as uuid4 } from 'uuid' import { useUpdateNodeInternals } from 'reactflow' import type { diff --git a/web/app/components/workflow/nodes/iteration/use-config.ts b/web/app/components/workflow/nodes/iteration/use-config.ts index 08922f261b..5d449a4756 100644 --- a/web/app/components/workflow/nodes/iteration/use-config.ts +++ b/web/app/components/workflow/nodes/iteration/use-config.ts @@ -1,5 +1,5 @@ import { useCallback } from 'react' -import produce from 'immer' +import { produce } from 'immer' import { useIsChatMode, useNodesReadOnly, diff --git a/web/app/components/workflow/nodes/iteration/use-interactions.ts b/web/app/components/workflow/nodes/iteration/use-interactions.ts index 35767f2b62..3bbbaf252f 100644 --- a/web/app/components/workflow/nodes/iteration/use-interactions.ts +++ b/web/app/components/workflow/nodes/iteration/use-interactions.ts @@ -1,5 +1,5 @@ import { useCallback } from 'react' -import produce from 'immer' +import { produce } from 'immer' import { useTranslation } from 'react-i18next' import { useStoreApi } from 'reactflow' import type { diff --git a/web/app/components/workflow/nodes/knowledge-retrieval/components/dataset-list.tsx b/web/app/components/workflow/nodes/knowledge-retrieval/components/dataset-list.tsx index bf18dbf7ca..35fd225d82 100644 --- a/web/app/components/workflow/nodes/knowledge-retrieval/components/dataset-list.tsx +++ b/web/app/components/workflow/nodes/knowledge-retrieval/components/dataset-list.tsx @@ -1,7 +1,7 @@ 'use client' import type { FC } from 'react' import React, { useCallback, useMemo } from 'react' -import produce from 'immer' +import { produce } from 'immer' import { useTranslation } from 'react-i18next' import Item from './dataset-item' import type { DataSet } from '@/models/datasets' diff --git a/web/app/components/workflow/nodes/knowledge-retrieval/use-config.ts b/web/app/components/workflow/nodes/knowledge-retrieval/use-config.ts index 8a1f2d8455..60789e6863 100644 --- a/web/app/components/workflow/nodes/knowledge-retrieval/use-config.ts +++ b/web/app/components/workflow/nodes/knowledge-retrieval/use-config.ts @@ -4,7 +4,7 @@ import { useRef, useState, } from 'react' -import produce from 'immer' +import { produce } from 'immer' import { isEqual } from 'lodash-es' import { v4 as uuid4 } from 'uuid' import type { ValueSelector, Var } from '../../types' diff --git a/web/app/components/workflow/nodes/list-operator/use-config.ts b/web/app/components/workflow/nodes/list-operator/use-config.ts index d53a0a6c3a..eff249b717 100644 --- a/web/app/components/workflow/nodes/list-operator/use-config.ts +++ b/web/app/components/workflow/nodes/list-operator/use-config.ts @@ -1,5 +1,5 @@ import { useCallback, useMemo } from 'react' -import produce from 'immer' +import { produce } from 'immer' import { useStoreApi } from 'reactflow' import type { ValueSelector, Var } from '../../types' import { VarType } from '../../types' diff --git a/web/app/components/workflow/nodes/llm/components/config-prompt.tsx b/web/app/components/workflow/nodes/llm/components/config-prompt.tsx index fee762bd25..35ea2fed68 100644 --- a/web/app/components/workflow/nodes/llm/components/config-prompt.tsx +++ b/web/app/components/workflow/nodes/llm/components/config-prompt.tsx @@ -2,7 +2,7 @@ import type { FC } from 'react' import React, { useCallback } from 'react' import { useTranslation } from 'react-i18next' -import produce from 'immer' +import { produce } from 'immer' import { ReactSortable } from 'react-sortablejs' import { v4 as uuid4 } from 'uuid' import type { ModelConfig, PromptItem, ValueSelector, Var, Variable } from '../../../types' diff --git a/web/app/components/workflow/nodes/llm/components/json-schema-config-modal/visual-editor/hooks.ts b/web/app/components/workflow/nodes/llm/components/json-schema-config-modal/visual-editor/hooks.ts index 4f7e1e6f00..202bb44638 100644 --- a/web/app/components/workflow/nodes/llm/components/json-schema-config-modal/visual-editor/hooks.ts +++ b/web/app/components/workflow/nodes/llm/components/json-schema-config-modal/visual-editor/hooks.ts @@ -1,4 +1,4 @@ -import produce from 'immer' +import { produce } from 'immer' import type { VisualEditorProps } from '.' import { useMittContext } from './context' import { useVisualEditorStore } from './store' diff --git a/web/app/components/workflow/nodes/llm/use-config.ts b/web/app/components/workflow/nodes/llm/use-config.ts index d11fb6db28..44c7096744 100644 --- a/web/app/components/workflow/nodes/llm/use-config.ts +++ b/web/app/components/workflow/nodes/llm/use-config.ts @@ -1,5 +1,5 @@ import { useCallback, useEffect, useRef, useState } from 'react' -import produce from 'immer' +import { produce } from 'immer' import { EditionType, VarType } from '../../types' import type { Memory, PromptItem, ValueSelector, Var, Variable } from '../../types' import { useStore } from '../../store' diff --git a/web/app/components/workflow/nodes/loop/components/condition-list/condition-item.tsx b/web/app/components/workflow/nodes/loop/components/condition-list/condition-item.tsx index 4de07cc3da..3f51217991 100644 --- a/web/app/components/workflow/nodes/loop/components/condition-list/condition-item.tsx +++ b/web/app/components/workflow/nodes/loop/components/condition-list/condition-item.tsx @@ -5,7 +5,7 @@ import { } from 'react' import { useTranslation } from 'react-i18next' import { RiDeleteBinLine } from '@remixicon/react' -import produce from 'immer' +import { produce } from 'immer' import type { VarType as NumberVarType } from '../../../tool/types' import type { Condition, diff --git a/web/app/components/workflow/nodes/loop/use-config.ts b/web/app/components/workflow/nodes/loop/use-config.ts index 2047b0d2d5..fcf437eb96 100644 --- a/web/app/components/workflow/nodes/loop/use-config.ts +++ b/web/app/components/workflow/nodes/loop/use-config.ts @@ -2,7 +2,7 @@ import { useCallback, useRef, } from 'react' -import produce from 'immer' +import { produce } from 'immer' import { v4 as uuid4 } from 'uuid' import { useIsChatMode, diff --git a/web/app/components/workflow/nodes/loop/use-interactions.ts b/web/app/components/workflow/nodes/loop/use-interactions.ts index 532de56e54..737da404a0 100644 --- a/web/app/components/workflow/nodes/loop/use-interactions.ts +++ b/web/app/components/workflow/nodes/loop/use-interactions.ts @@ -1,5 +1,5 @@ import { useCallback } from 'react' -import produce from 'immer' +import { produce } from 'immer' import { useStoreApi } from 'reactflow' import type { BlockEnum, diff --git a/web/app/components/workflow/nodes/parameter-extractor/use-config.ts b/web/app/components/workflow/nodes/parameter-extractor/use-config.ts index d3699853c2..81dace1014 100644 --- a/web/app/components/workflow/nodes/parameter-extractor/use-config.ts +++ b/web/app/components/workflow/nodes/parameter-extractor/use-config.ts @@ -1,5 +1,5 @@ import { useCallback, useEffect, useRef, useState } from 'react' -import produce from 'immer' +import { produce } from 'immer' import type { Memory, MoreInfo, ValueSelector, Var } from '../../types' import { ChangeType, VarType } from '../../types' import { useStore } from '../../store' diff --git a/web/app/components/workflow/nodes/question-classifier/components/class-list.tsx b/web/app/components/workflow/nodes/question-classifier/components/class-list.tsx index fa4f4df266..92c531bd9f 100644 --- a/web/app/components/workflow/nodes/question-classifier/components/class-list.tsx +++ b/web/app/components/workflow/nodes/question-classifier/components/class-list.tsx @@ -1,7 +1,7 @@ 'use client' import type { FC } from 'react' import React, { useCallback } from 'react' -import produce from 'immer' +import { produce } from 'immer' import { useTranslation } from 'react-i18next' import { useEdgesInteractions } from '../../../hooks' import AddButton from '../../_base/components/add-button' diff --git a/web/app/components/workflow/nodes/question-classifier/use-config.ts b/web/app/components/workflow/nodes/question-classifier/use-config.ts index 5106f373a8..dc197a079e 100644 --- a/web/app/components/workflow/nodes/question-classifier/use-config.ts +++ b/web/app/components/workflow/nodes/question-classifier/use-config.ts @@ -1,5 +1,5 @@ import { useCallback, useEffect, useRef, useState } from 'react' -import produce from 'immer' +import { produce } from 'immer' import { BlockEnum, VarType } from '../../types' import type { Memory, ValueSelector, Var } from '../../types' import { diff --git a/web/app/components/workflow/nodes/start/components/var-list.tsx b/web/app/components/workflow/nodes/start/components/var-list.tsx index 36524b482f..44d6e389e2 100644 --- a/web/app/components/workflow/nodes/start/components/var-list.tsx +++ b/web/app/components/workflow/nodes/start/components/var-list.tsx @@ -1,7 +1,7 @@ 'use client' import type { FC } from 'react' import React, { useCallback, useMemo } from 'react' -import produce from 'immer' +import { produce } from 'immer' import { useTranslation } from 'react-i18next' import VarItem from './var-item' import { ChangeType, type InputVar, type MoreInfo } from '@/app/components/workflow/types' diff --git a/web/app/components/workflow/nodes/start/use-config.ts b/web/app/components/workflow/nodes/start/use-config.ts index d67b5f790a..5e4d1b01c6 100644 --- a/web/app/components/workflow/nodes/start/use-config.ts +++ b/web/app/components/workflow/nodes/start/use-config.ts @@ -1,5 +1,5 @@ import { useCallback, useState } from 'react' -import produce from 'immer' +import { produce } from 'immer' import { useBoolean } from 'ahooks' import type { StartNodeType } from './types' import { ChangeType } from '@/app/components/workflow/types' diff --git a/web/app/components/workflow/nodes/template-transform/use-config.ts b/web/app/components/workflow/nodes/template-transform/use-config.ts index dc012a3844..3e5b0f3d31 100644 --- a/web/app/components/workflow/nodes/template-transform/use-config.ts +++ b/web/app/components/workflow/nodes/template-transform/use-config.ts @@ -1,5 +1,5 @@ import { useCallback, useEffect, useRef } from 'react' -import produce from 'immer' +import { produce } from 'immer' import useVarList from '../_base/hooks/use-var-list' import type { Var, Variable } from '../../types' import { VarType } from '../../types' diff --git a/web/app/components/workflow/nodes/tool/components/input-var-list.tsx b/web/app/components/workflow/nodes/tool/components/input-var-list.tsx index 1daf3a49e9..eb53979197 100644 --- a/web/app/components/workflow/nodes/tool/components/input-var-list.tsx +++ b/web/app/components/workflow/nodes/tool/components/input-var-list.tsx @@ -1,7 +1,7 @@ 'use client' import type { FC } from 'react' import React, { useCallback, useState } from 'react' -import produce from 'immer' +import { produce } from 'immer' import { useTranslation } from 'react-i18next' import type { ToolVarInputs } from '../types' import { VarType as VarKindType } from '../types' diff --git a/web/app/components/workflow/nodes/tool/use-config.ts b/web/app/components/workflow/nodes/tool/use-config.ts index 82fc838d30..5b8827936c 100644 --- a/web/app/components/workflow/nodes/tool/use-config.ts +++ b/web/app/components/workflow/nodes/tool/use-config.ts @@ -1,6 +1,6 @@ import { useCallback, useEffect, useMemo, useState } from 'react' import { useTranslation } from 'react-i18next' -import produce from 'immer' +import { produce } from 'immer' import { useBoolean } from 'ahooks' import { useStore, useWorkflowStore } from '../../store' import type { ToolNodeType, ToolVarInputs } from './types' diff --git a/web/app/components/workflow/nodes/tool/use-single-run-form-params.ts b/web/app/components/workflow/nodes/tool/use-single-run-form-params.ts index 3ebb88b7c8..b393711e98 100644 --- a/web/app/components/workflow/nodes/tool/use-single-run-form-params.ts +++ b/web/app/components/workflow/nodes/tool/use-single-run-form-params.ts @@ -5,7 +5,7 @@ import useNodeCrud from '../_base/hooks/use-node-crud' import { type ToolNodeType, VarType } from './types' import type { ValueSelector } from '@/app/components/workflow/types' import type { Props as FormProps } from '@/app/components/workflow/nodes/_base/components/before-run-form/form' -import produce from 'immer' +import { produce } from 'immer' import type { NodeTracing } from '@/types/workflow' import { useTranslation } from 'react-i18next' import formatToTracingNodeList from '@/app/components/workflow/run/utils/format-log' diff --git a/web/app/components/workflow/nodes/variable-assigner/components/var-group-item.tsx b/web/app/components/workflow/nodes/variable-assigner/components/var-group-item.tsx index a6b02931d9..90a30f4845 100644 --- a/web/app/components/workflow/nodes/variable-assigner/components/var-group-item.tsx +++ b/web/app/components/workflow/nodes/variable-assigner/components/var-group-item.tsx @@ -2,7 +2,7 @@ import React, { useCallback } from 'react' import type { ChangeEvent, FC } from 'react' import { useTranslation } from 'react-i18next' -import produce from 'immer' +import { produce } from 'immer' import { useBoolean } from 'ahooks' import { RiDeleteBinLine, diff --git a/web/app/components/workflow/nodes/variable-assigner/components/var-list/index.tsx b/web/app/components/workflow/nodes/variable-assigner/components/var-list/index.tsx index a007463db1..d38ee51465 100644 --- a/web/app/components/workflow/nodes/variable-assigner/components/var-list/index.tsx +++ b/web/app/components/workflow/nodes/variable-assigner/components/var-list/index.tsx @@ -2,7 +2,7 @@ import type { FC } from 'react' import { useTranslation } from 'react-i18next' import React, { useCallback } from 'react' -import produce from 'immer' +import { produce } from 'immer' import RemoveButton from '../../../_base/components/remove-button' import ListNoDataPlaceholder from '../../../_base/components/list-no-data-placeholder' import VarReferencePicker from '@/app/components/workflow/nodes/_base/components/variable/var-reference-picker' diff --git a/web/app/components/workflow/nodes/variable-assigner/components/var-list/use-var-list.ts b/web/app/components/workflow/nodes/variable-assigner/components/var-list/use-var-list.ts index 5686f1a37a..7e781a4068 100644 --- a/web/app/components/workflow/nodes/variable-assigner/components/var-list/use-var-list.ts +++ b/web/app/components/workflow/nodes/variable-assigner/components/var-list/use-var-list.ts @@ -1,5 +1,5 @@ import { useCallback } from 'react' -import produce from 'immer' +import { produce } from 'immer' import type { VariableAssignerNodeType } from '../../types' import type { ValueSelector } from '@/app/components/workflow/types' diff --git a/web/app/components/workflow/nodes/variable-assigner/hooks.ts b/web/app/components/workflow/nodes/variable-assigner/hooks.ts index d4e4115a78..62bd11ce2e 100644 --- a/web/app/components/workflow/nodes/variable-assigner/hooks.ts +++ b/web/app/components/workflow/nodes/variable-assigner/hooks.ts @@ -4,7 +4,7 @@ import { useStoreApi, } from 'reactflow' import { uniqBy } from 'lodash-es' -import produce from 'immer' +import { produce } from 'immer' import { useIsChatMode, useNodeDataUpdate, diff --git a/web/app/components/workflow/nodes/variable-assigner/use-config.ts b/web/app/components/workflow/nodes/variable-assigner/use-config.ts index 31bd53dca7..583f779575 100644 --- a/web/app/components/workflow/nodes/variable-assigner/use-config.ts +++ b/web/app/components/workflow/nodes/variable-assigner/use-config.ts @@ -1,5 +1,5 @@ import { useCallback, useRef, useState } from 'react' -import produce from 'immer' +import { produce } from 'immer' import { useBoolean, useDebounceFn } from 'ahooks' import { v4 as uuid4 } from 'uuid' import type { ValueSelector, Var } from '../../types' diff --git a/web/app/components/workflow/panel/chat-variable-panel/components/array-bool-list.tsx b/web/app/components/workflow/panel/chat-variable-panel/components/array-bool-list.tsx index 5f1dcc2298..328a696e86 100644 --- a/web/app/components/workflow/panel/chat-variable-panel/components/array-bool-list.tsx +++ b/web/app/components/workflow/panel/chat-variable-panel/components/array-bool-list.tsx @@ -3,7 +3,7 @@ import type { FC } from 'react' import React, { useCallback } from 'react' import { useTranslation } from 'react-i18next' import { RiAddLine } from '@remixicon/react' -import produce from 'immer' +import { produce } from 'immer' import RemoveButton from '@/app/components/workflow/nodes/_base/components/remove-button' import Button from '@/app/components/base/button' import BoolValue from './bool-value' diff --git a/web/app/components/workflow/panel/chat-variable-panel/components/array-value-list.tsx b/web/app/components/workflow/panel/chat-variable-panel/components/array-value-list.tsx index 302b8ff26e..f7d0c69d89 100644 --- a/web/app/components/workflow/panel/chat-variable-panel/components/array-value-list.tsx +++ b/web/app/components/workflow/panel/chat-variable-panel/components/array-value-list.tsx @@ -3,7 +3,7 @@ import type { FC } from 'react' import React, { useCallback } from 'react' import { useTranslation } from 'react-i18next' import { RiAddLine } from '@remixicon/react' -import produce from 'immer' +import { produce } from 'immer' import RemoveButton from '@/app/components/workflow/nodes/_base/components/remove-button' import Button from '@/app/components/base/button' import Input from '@/app/components/base/input' diff --git a/web/app/components/workflow/panel/chat-variable-panel/components/object-value-item.tsx b/web/app/components/workflow/panel/chat-variable-panel/components/object-value-item.tsx index 2649cfb70f..f223aca5eb 100644 --- a/web/app/components/workflow/panel/chat-variable-panel/components/object-value-item.tsx +++ b/web/app/components/workflow/panel/chat-variable-panel/components/object-value-item.tsx @@ -2,7 +2,7 @@ import type { FC } from 'react' import React, { useCallback, useState } from 'react' import { useTranslation } from 'react-i18next' -import produce from 'immer' +import { produce } from 'immer' import { useContext } from 'use-context-selector' import { ToastContext } from '@/app/components/base/toast' import VariableTypeSelector from '@/app/components/workflow/panel/chat-variable-panel/components/variable-type-select' diff --git a/web/app/components/workflow/selection-contextmenu.tsx b/web/app/components/workflow/selection-contextmenu.tsx index e5101fb5f3..53392f2cd3 100644 --- a/web/app/components/workflow/selection-contextmenu.tsx +++ b/web/app/components/workflow/selection-contextmenu.tsx @@ -17,7 +17,7 @@ import { RiAlignTop, } from '@remixicon/react' import { useNodesReadOnly, useNodesSyncDraft } from './hooks' -import produce from 'immer' +import { produce } from 'immer' import { WorkflowHistoryEvent, useWorkflowHistory } from './hooks/use-workflow-history' import { useStore } from './store' import { useSelectionInteractions } from './hooks/use-selection-interactions' diff --git a/web/app/components/workflow/store/workflow/debug/inspect-vars-slice.ts b/web/app/components/workflow/store/workflow/debug/inspect-vars-slice.ts index 291ed86ba3..7d9797630d 100644 --- a/web/app/components/workflow/store/workflow/debug/inspect-vars-slice.ts +++ b/web/app/components/workflow/store/workflow/debug/inspect-vars-slice.ts @@ -1,5 +1,5 @@ import type { StateCreator } from 'zustand' -import produce from 'immer' +import { produce } from 'immer' import type { NodeWithVar, VarInInspect } from '@/types/workflow' import type { ValueSelector } from '../../../types' diff --git a/web/app/components/workflow/variable-inspect/right.tsx b/web/app/components/workflow/variable-inspect/right.tsx index a820341c1f..4e38e66269 100644 --- a/web/app/components/workflow/variable-inspect/right.tsx +++ b/web/app/components/workflow/variable-inspect/right.tsx @@ -31,7 +31,7 @@ import { useNodesInteractions, useToolIcon } from '../hooks' import { CodeLanguage } from '../nodes/code/types' import useNodeCrud from '../nodes/_base/hooks/use-node-crud' import type { GenRes } from '@/service/debug' -import produce from 'immer' +import { produce } from 'immer' import { PROMPT_EDITOR_UPDATE_VALUE_BY_EVENT_EMITTER } from '../../base/prompt-editor/plugins/update-block' import { useEventEmitterContextContext } from '@/context/event-emitter' import { VariableIconWithColor } from '@/app/components/workflow/nodes/_base/components/variable/variable-label' diff --git a/web/app/components/workflow/workflow-preview/components/nodes/loop/hooks.ts b/web/app/components/workflow/workflow-preview/components/nodes/loop/hooks.ts index ad671d5453..af252ce2f3 100644 --- a/web/app/components/workflow/workflow-preview/components/nodes/loop/hooks.ts +++ b/web/app/components/workflow/workflow-preview/components/nodes/loop/hooks.ts @@ -1,5 +1,5 @@ import { useCallback } from 'react' -import produce from 'immer' +import { produce } from 'immer' import { useStoreApi } from 'reactflow' import type { Node, diff --git a/web/i18n/de-DE/tools.ts b/web/i18n/de-DE/tools.ts index a838c224e6..8cef76b732 100644 --- a/web/i18n/de-DE/tools.ts +++ b/web/i18n/de-DE/tools.ts @@ -243,6 +243,10 @@ const translation = { }, publishTip: 'App nicht veröffentlicht. Bitte zuerst die App veröffentlichen.', }, + toolItem: { + parameters: 'Parameter', + noDescription: 'Keine Beschreibung', + }, }, allTools: 'Alle Werkzeuge', } diff --git a/web/i18n/en-US/tools.ts b/web/i18n/en-US/tools.ts index 35d5202879..3fba10447f 100644 --- a/web/i18n/en-US/tools.ts +++ b/web/i18n/en-US/tools.ts @@ -243,6 +243,10 @@ const translation = { }, publishTip: 'App not published. Please publish the app first.', }, + toolItem: { + noDescription: 'No description', + parameters: 'Parameters', + }, }, allTools: 'All tools', } diff --git a/web/i18n/es-ES/tools.ts b/web/i18n/es-ES/tools.ts index a53752c4e0..10584c41ca 100644 --- a/web/i18n/es-ES/tools.ts +++ b/web/i18n/es-ES/tools.ts @@ -243,6 +243,10 @@ const translation = { }, publishTip: 'App no publicada. Publícala primero.', }, + toolItem: { + noDescription: 'Sin descripción', + parameters: 'Parámetros', + }, }, allTools: 'Todas las herramientas', } diff --git a/web/i18n/fa-IR/tools.ts b/web/i18n/fa-IR/tools.ts index 6fd29d29fc..587c16d960 100644 --- a/web/i18n/fa-IR/tools.ts +++ b/web/i18n/fa-IR/tools.ts @@ -243,6 +243,10 @@ const translation = { }, publishTip: 'برنامه منتشر نشده است. لطفاً ابتدا برنامه را منتشر کنید.', }, + toolItem: { + parameters: 'پارامترها', + noDescription: 'بدون توضیح', + }, }, allTools: 'همه ابزارها', } diff --git a/web/i18n/fr-FR/tools.ts b/web/i18n/fr-FR/tools.ts index ea49f62579..c91952d6c5 100644 --- a/web/i18n/fr-FR/tools.ts +++ b/web/i18n/fr-FR/tools.ts @@ -243,6 +243,10 @@ const translation = { }, publishTip: 'Application non publiée. Merci de publier l\'application en premier.', }, + toolItem: { + parameters: 'Paramètres', + noDescription: 'Aucune description', + }, }, allTools: 'Tous les outils', } diff --git a/web/i18n/hi-IN/tools.ts b/web/i18n/hi-IN/tools.ts index 5b342c569d..7279d3bcbe 100644 --- a/web/i18n/hi-IN/tools.ts +++ b/web/i18n/hi-IN/tools.ts @@ -248,6 +248,10 @@ const translation = { }, publishTip: 'ऐप प्रकाशित नहीं हुआ। कृपया पहले ऐप प्रकाशित करें।', }, + toolItem: { + parameters: 'पैरामीटर', + noDescription: 'कोई वर्णन नहीं', + }, }, allTools: 'सभी उपकरण', } diff --git a/web/i18n/id-ID/tools.ts b/web/i18n/id-ID/tools.ts index 427e77867f..e3817e0111 100644 --- a/web/i18n/id-ID/tools.ts +++ b/web/i18n/id-ID/tools.ts @@ -226,6 +226,10 @@ const translation = { toolUpdateConfirmContent: 'Memperbarui daftar alat dapat memengaruhi aplikasi yang ada. Apakah Anda ingin melanjutkan?', update: 'Pemutakhiran', identifier: 'Pengenal Server (Klik untuk Menyalin)', + toolItem: { + parameters: 'Parameter', + noDescription: 'Tanpa deskripsi', + }, }, title: 'Perkakas', createCustomTool: 'Buat Alat Kustom', diff --git a/web/i18n/it-IT/tools.ts b/web/i18n/it-IT/tools.ts index b12c07a0f8..5e54b8f837 100644 --- a/web/i18n/it-IT/tools.ts +++ b/web/i18n/it-IT/tools.ts @@ -253,6 +253,10 @@ const translation = { }, publishTip: 'App non pubblicata. Pubblica l\'app prima.', }, + toolItem: { + parameters: 'Parametri', + noDescription: 'Nessuna descrizione', + }, }, allTools: 'Tutti gli strumenti', } diff --git a/web/i18n/ja-JP/tools.ts b/web/i18n/ja-JP/tools.ts index 5b5dc3d07e..2fed3768c0 100644 --- a/web/i18n/ja-JP/tools.ts +++ b/web/i18n/ja-JP/tools.ts @@ -243,6 +243,10 @@ const translation = { }, publishTip: 'アプリが公開されていません。まずアプリを公開してください。', }, + toolItem: { + parameters: 'パラメータ', + noDescription: '説明なし', + }, }, allTools: 'すべての道具', } diff --git a/web/i18n/ko-KR/tools.ts b/web/i18n/ko-KR/tools.ts index 988d06cdd5..d8e975e61c 100644 --- a/web/i18n/ko-KR/tools.ts +++ b/web/i18n/ko-KR/tools.ts @@ -243,6 +243,10 @@ const translation = { }, publishTip: '앱이 게시되지 않았습니다. 먼저 앱을 게시하십시오.', }, + toolItem: { + noDescription: '설명 없음', + parameters: '매개변수', + }, }, allTools: '모든 도구', } diff --git a/web/i18n/pl-PL/tools.ts b/web/i18n/pl-PL/tools.ts index eddf1f8da4..dfa83d1231 100644 --- a/web/i18n/pl-PL/tools.ts +++ b/web/i18n/pl-PL/tools.ts @@ -247,6 +247,10 @@ const translation = { }, publishTip: 'Aplikacja nieopublikowana. Najpierw opublikuj aplikację.', }, + toolItem: { + parameters: 'Parametry', + noDescription: 'Brak opisu', + }, }, allTools: 'Wszystkie narzędzia', } diff --git a/web/i18n/pt-BR/tools.ts b/web/i18n/pt-BR/tools.ts index ae05738137..401a81f615 100644 --- a/web/i18n/pt-BR/tools.ts +++ b/web/i18n/pt-BR/tools.ts @@ -243,6 +243,10 @@ const translation = { }, publishTip: 'Aplicativo não publicado. Por favor, publique o aplicativo primeiro.', }, + toolItem: { + noDescription: 'Sem descrição', + parameters: 'Parâmetros', + }, }, allTools: 'Todas as ferramentas', } diff --git a/web/i18n/ro-RO/tools.ts b/web/i18n/ro-RO/tools.ts index 6c534a6be5..b732128684 100644 --- a/web/i18n/ro-RO/tools.ts +++ b/web/i18n/ro-RO/tools.ts @@ -243,6 +243,10 @@ const translation = { }, publishTip: 'Aplicație nepublicată. Publicați aplicația mai întâi.', }, + toolItem: { + parameters: 'Parametri', + noDescription: 'Fără descriere', + }, }, allTools: 'Toate instrumentele', } diff --git a/web/i18n/ru-RU/tools.ts b/web/i18n/ru-RU/tools.ts index 97efd5f551..36d48affc2 100644 --- a/web/i18n/ru-RU/tools.ts +++ b/web/i18n/ru-RU/tools.ts @@ -243,6 +243,10 @@ const translation = { }, publishTip: 'Приложение не опубликовано. Пожалуйста, сначала опубликуйте приложение.', }, + toolItem: { + parameters: 'Параметры', + noDescription: 'Нет описания', + }, }, allTools: 'Все инструменты', } diff --git a/web/i18n/sl-SI/tools.ts b/web/i18n/sl-SI/tools.ts index 08c14a9acd..8eb28c21bf 100644 --- a/web/i18n/sl-SI/tools.ts +++ b/web/i18n/sl-SI/tools.ts @@ -243,6 +243,10 @@ const translation = { }, publishTip: 'Aplikacija ni objavljena. Najprej objavite aplikacijo.', }, + toolItem: { + parameters: 'Parametri', + noDescription: 'Brez opisa', + }, }, allTools: 'Vsa orodja', } diff --git a/web/i18n/th-TH/tools.ts b/web/i18n/th-TH/tools.ts index 61ca965ead..71175ff26c 100644 --- a/web/i18n/th-TH/tools.ts +++ b/web/i18n/th-TH/tools.ts @@ -243,6 +243,10 @@ const translation = { }, publishTip: 'แอปไม่ถูกเผยแพร่ กรุณาเผยแพร่แอปก่อน', }, + toolItem: { + noDescription: 'ไม่มีคำอธิบาย', + parameters: 'พารามิเตอร์', + }, }, allTools: 'เครื่องมือทั้งหมด', } diff --git a/web/i18n/tr-TR/tools.ts b/web/i18n/tr-TR/tools.ts index 84d22185a7..d309b78689 100644 --- a/web/i18n/tr-TR/tools.ts +++ b/web/i18n/tr-TR/tools.ts @@ -243,6 +243,10 @@ const translation = { }, publishTip: 'Uygulama yayınlanmadı. Lütfen önce uygulamayı yayınlayın.', }, + toolItem: { + parameters: 'Parametreler', + noDescription: 'Açıklama yok', + }, }, allTools: 'Tüm araçlar', } diff --git a/web/i18n/uk-UA/tools.ts b/web/i18n/uk-UA/tools.ts index e20f82e066..596153974f 100644 --- a/web/i18n/uk-UA/tools.ts +++ b/web/i18n/uk-UA/tools.ts @@ -243,6 +243,10 @@ const translation = { }, publishTip: 'Додаток не опубліковано. Спочатку опублікуйте додаток.', }, + toolItem: { + parameters: 'Параметри', + noDescription: 'Немає опису', + }, }, allTools: 'Всі інструменти', } diff --git a/web/i18n/vi-VN/tools.ts b/web/i18n/vi-VN/tools.ts index 5ed60527a7..7c0826890e 100644 --- a/web/i18n/vi-VN/tools.ts +++ b/web/i18n/vi-VN/tools.ts @@ -243,6 +243,10 @@ const translation = { }, publishTip: 'Ứng dụng chưa xuất bản. Vui lòng xuất bản ứng dụng trước.', }, + toolItem: { + parameters: 'Các thông số', + noDescription: 'Không có mô tả', + }, }, allTools: 'Tất cả các công cụ', } diff --git a/web/i18n/zh-Hans/tools.ts b/web/i18n/zh-Hans/tools.ts index e45d396617..15b1c7f592 100644 --- a/web/i18n/zh-Hans/tools.ts +++ b/web/i18n/zh-Hans/tools.ts @@ -243,6 +243,10 @@ const translation = { }, publishTip: '应用未发布。请先发布应用。', }, + toolItem: { + parameters: '参数', + noDescription: '暂无描述', + }, }, allTools: '全部工具', } diff --git a/web/i18n/zh-Hant/tools.ts b/web/i18n/zh-Hant/tools.ts index e904f1bda9..3c53b87c72 100644 --- a/web/i18n/zh-Hant/tools.ts +++ b/web/i18n/zh-Hant/tools.ts @@ -243,6 +243,10 @@ const translation = { }, publishTip: '應用程式尚未發布。請先發布應用程式。', }, + toolItem: { + parameters: '參數', + noDescription: '無描述', + }, }, allTools: '所有工具', } diff --git a/web/package.json b/web/package.json index 1721e54d73..25fc27807a 100644 --- a/web/package.json +++ b/web/package.json @@ -54,7 +54,7 @@ "@lexical/link": "^0.36.2", "@lexical/list": "^0.36.2", "@lexical/react": "^0.36.2", - "@lexical/selection": "^0.36.2", + "@lexical/selection": "^0.37.0", "@lexical/text": "^0.36.2", "@lexical/utils": "^0.37.0", "@monaco-editor/react": "^4.6.0", @@ -81,10 +81,10 @@ "elkjs": "^0.9.3", "emoji-mart": "^5.5.2", "fast-deep-equal": "^3.1.3", - "html-to-image": "1.11.11", + "html-to-image": "1.11.13", "i18next": "^23.16.4", "i18next-resources-to-backend": "^1.2.1", - "immer": "^9.0.19", + "immer": "^10.1.3", "js-audio-recorder": "^1.0.7", "js-cookie": "^3.0.5", "jsonschema": "^1.5.0", @@ -142,7 +142,7 @@ "devDependencies": { "@antfu/eslint-config": "^5.0.0", "@babel/core": "^7.28.3", - "@chromatic-com/storybook": "^3.1.0", + "@chromatic-com/storybook": "^4.1.1", "@eslint-react/eslint-plugin": "^1.15.0", "@happy-dom/jest-environment": "^20.0.2", "@mdx-js/loader": "^3.1.0", @@ -151,14 +151,12 @@ "@next/eslint-plugin-next": "15.5.4", "@next/mdx": "15.5.4", "@rgrove/parse-xml": "^4.1.0", - "@storybook/addon-essentials": "8.5.0", - "@storybook/addon-interactions": "8.5.0", - "@storybook/addon-links": "8.5.0", - "@storybook/addon-onboarding": "8.5.0", - "@storybook/addon-themes": "8.5.0", - "@storybook/nextjs": "8.5.0", - "@storybook/react": "8.5.0", - "@storybook/test": "8.5.0", + "@storybook/addon-docs": "9.1.13", + "@storybook/addon-links": "9.1.13", + "@storybook/addon-onboarding": "9.1.13", + "@storybook/addon-themes": "9.1.13", + "@storybook/nextjs": "9.1.13", + "@storybook/react": "9.1.13", "@testing-library/dom": "^10.4.0", "@testing-library/jest-dom": "^6.8.0", "@testing-library/react": "^16.0.1", @@ -180,13 +178,13 @@ "babel-loader": "^10.0.0", "bing-translate-api": "^4.0.2", "code-inspector-plugin": "1.2.9", - "cross-env": "^7.0.3", + "cross-env": "^10.1.0", "eslint": "^9.35.0", "eslint-plugin-oxlint": "^1.6.0", "eslint-plugin-react-hooks": "^5.1.0", "eslint-plugin-react-refresh": "^0.4.19", "eslint-plugin-sonarjs": "^3.0.2", - "eslint-plugin-storybook": "^9.0.7", + "eslint-plugin-storybook": "^9.1.13", "eslint-plugin-tailwindcss": "^3.18.0", "globals": "^15.11.0", "husky": "^9.1.6", @@ -197,7 +195,7 @@ "magicast": "^0.3.4", "postcss": "^8.4.47", "sass": "^1.92.1", - "storybook": "8.5.0", + "storybook": "9.1.13", "tailwindcss": "^3.4.14", "typescript": "^5.8.3", "uglify-js": "^3.19.3" @@ -243,7 +241,8 @@ "object.fromentries": "npm:@nolyfill/object.fromentries@^1", "object.groupby": "npm:@nolyfill/object.groupby@^1", "object.values": "npm:@nolyfill/object.values@^1", - "safe-buffer": "npm:@nolyfill/safe-buffer@^1", + "safe-buffer": "^5.2.1", + "@nolyfill/safe-buffer": "npm:safe-buffer@^5.2.1", "safe-regex-test": "npm:@nolyfill/safe-regex-test@^1", "safer-buffer": "npm:@nolyfill/safer-buffer@^1", "side-channel": "npm:@nolyfill/side-channel@^1", diff --git a/web/pnpm-lock.yaml b/web/pnpm-lock.yaml index 4f75b6e93e..8da733391b 100644 --- a/web/pnpm-lock.yaml +++ b/web/pnpm-lock.yaml @@ -9,11 +9,12 @@ overrides: '@types/react-dom': 19.1.7 string-width: 4.2.3 '@eslint/plugin-kit@<0.3.4': 0.3.4 + brace-expansion@<2.0.2: 2.0.2 + devalue@<5.3.2: 5.3.2 esbuild@<0.25.0: 0.25.0 pbkdf2@<3.1.3: 3.1.3 - vite@<6.2.7: 6.2.7 prismjs@<1.30.0: 1.30.0 - brace-expansion@<2.0.2: 2.0.2 + vite@<6.2.7: 6.2.7 array-includes: npm:@nolyfill/array-includes@^1 array.prototype.findlast: npm:@nolyfill/array.prototype.findlast@^1 array.prototype.findlastindex: npm:@nolyfill/array.prototype.findlastindex@^1 @@ -33,7 +34,8 @@ overrides: object.fromentries: npm:@nolyfill/object.fromentries@^1 object.groupby: npm:@nolyfill/object.groupby@^1 object.values: npm:@nolyfill/object.values@^1 - safe-buffer: npm:@nolyfill/safe-buffer@^1 + safe-buffer: ^5.2.1 + '@nolyfill/safe-buffer': npm:safe-buffer@^5.2.1 safe-regex-test: npm:@nolyfill/safe-regex-test@^1 safer-buffer: npm:@nolyfill/safer-buffer@^1 side-channel: npm:@nolyfill/side-channel@^1 @@ -43,7 +45,6 @@ overrides: string.prototype.trimend: npm:@nolyfill/string.prototype.trimend@^1 typed-array-buffer: npm:@nolyfill/typed-array-buffer@^1 which-typed-array: npm:@nolyfill/which-typed-array@^1 - devalue@<5.3.2: 5.3.2 importers: @@ -80,8 +81,8 @@ importers: specifier: ^0.36.2 version: 0.36.2(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(yjs@13.6.27) '@lexical/selection': - specifier: ^0.36.2 - version: 0.36.2 + specifier: ^0.37.0 + version: 0.37.0 '@lexical/text': specifier: ^0.36.2 version: 0.36.2 @@ -161,8 +162,8 @@ importers: specifier: ^3.1.3 version: 3.1.3 html-to-image: - specifier: 1.11.11 - version: 1.11.11 + specifier: 1.11.13 + version: 1.11.13 i18next: specifier: ^23.16.4 version: 23.16.8 @@ -170,8 +171,8 @@ importers: specifier: ^1.2.1 version: 1.2.1 immer: - specifier: ^9.0.19 - version: 9.0.21 + specifier: ^10.1.3 + version: 10.1.3 js-audio-recorder: specifier: ^1.0.7 version: 1.0.7 @@ -216,7 +217,7 @@ importers: version: 15.5.4(@babel/core@7.28.3)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(sass@1.92.1) next-pwa: specifier: ^5.6.0 - version: 5.6.0(@babel/core@7.28.3)(@types/babel__core@7.20.5)(esbuild@0.25.0)(next@15.5.4(@babel/core@7.28.3)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(sass@1.92.1))(uglify-js@3.19.3)(webpack@5.100.2(esbuild@0.25.0)(uglify-js@3.19.3)) + version: 5.6.0(@babel/core@7.28.3)(@types/babel__core@7.20.5)(esbuild@0.25.0)(next@15.5.4(@babel/core@7.28.3)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(sass@1.92.1))(uglify-js@3.19.3)(webpack@5.102.1(esbuild@0.25.0)(uglify-js@3.19.3)) next-themes: specifier: ^0.4.3 version: 0.4.6(react-dom@19.1.1(react@19.1.1))(react@19.1.1) @@ -279,7 +280,7 @@ importers: version: 1.8.11(react-dom@19.1.1(react@19.1.1))(react@19.1.1) reactflow: specifier: ^11.11.3 - version: 11.11.4(@types/react@19.1.11)(immer@9.0.21)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + version: 11.11.4(@types/react@19.1.11)(immer@10.1.3)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) rehype-katex: specifier: ^7.0.1 version: 7.0.1 @@ -327,10 +328,10 @@ importers: version: 3.25.76 zundo: specifier: ^2.1.0 - version: 2.3.0(zustand@4.5.7(@types/react@19.1.11)(immer@9.0.21)(react@19.1.1)) + version: 2.3.0(zustand@4.5.7(@types/react@19.1.11)(immer@10.1.3)(react@19.1.1)) zustand: specifier: ^4.5.2 - version: 4.5.7(@types/react@19.1.11)(immer@9.0.21)(react@19.1.1) + version: 4.5.7(@types/react@19.1.11)(immer@10.1.3)(react@19.1.1) devDependencies: '@antfu/eslint-config': specifier: ^5.0.0 @@ -339,8 +340,8 @@ importers: specifier: ^7.28.3 version: 7.28.3 '@chromatic-com/storybook': - specifier: ^3.1.0 - version: 3.2.7(react@19.1.1)(storybook@8.5.0) + specifier: ^4.1.1 + version: 4.1.1(storybook@9.1.13(@testing-library/dom@10.4.0)(vite@6.2.7(@types/node@18.15.0)(jiti@2.6.1)(sass@1.92.1)(terser@5.43.1)(yaml@2.8.0))) '@eslint-react/eslint-plugin': specifier: ^1.15.0 version: 1.52.3(eslint@9.35.0(jiti@2.6.1))(ts-api-utils@2.1.0(typescript@5.8.3))(typescript@5.8.3) @@ -349,7 +350,7 @@ importers: version: 20.0.4(@jest/environment@29.7.0)(@jest/fake-timers@29.7.0)(@jest/types@29.6.3)(jest-mock@29.7.0)(jest-util@29.7.0) '@mdx-js/loader': specifier: ^3.1.0 - version: 3.1.0(acorn@8.15.0)(webpack@5.100.2(esbuild@0.25.0)(uglify-js@3.19.3)) + version: 3.1.0(acorn@8.15.0)(webpack@5.102.1(esbuild@0.25.0)(uglify-js@3.19.3)) '@mdx-js/react': specifier: ^3.1.0 version: 3.1.0(@types/react@19.1.11)(react@19.1.1) @@ -361,34 +362,28 @@ importers: version: 15.5.4 '@next/mdx': specifier: 15.5.4 - version: 15.5.4(@mdx-js/loader@3.1.0(acorn@8.15.0)(webpack@5.100.2(esbuild@0.25.0)(uglify-js@3.19.3)))(@mdx-js/react@3.1.0(@types/react@19.1.11)(react@19.1.1)) + version: 15.5.4(@mdx-js/loader@3.1.0(acorn@8.15.0)(webpack@5.102.1(esbuild@0.25.0)(uglify-js@3.19.3)))(@mdx-js/react@3.1.0(@types/react@19.1.11)(react@19.1.1)) '@rgrove/parse-xml': specifier: ^4.1.0 version: 4.2.0 - '@storybook/addon-essentials': - specifier: 8.5.0 - version: 8.5.0(@types/react@19.1.11)(storybook@8.5.0) - '@storybook/addon-interactions': - specifier: 8.5.0 - version: 8.5.0(storybook@8.5.0) + '@storybook/addon-docs': + specifier: 9.1.13 + version: 9.1.13(@types/react@19.1.11)(storybook@9.1.13(@testing-library/dom@10.4.0)(vite@6.2.7(@types/node@18.15.0)(jiti@2.6.1)(sass@1.92.1)(terser@5.43.1)(yaml@2.8.0))) '@storybook/addon-links': - specifier: 8.5.0 - version: 8.5.0(react@19.1.1)(storybook@8.5.0) + specifier: 9.1.13 + version: 9.1.13(react@19.1.1)(storybook@9.1.13(@testing-library/dom@10.4.0)(vite@6.2.7(@types/node@18.15.0)(jiti@2.6.1)(sass@1.92.1)(terser@5.43.1)(yaml@2.8.0))) '@storybook/addon-onboarding': - specifier: 8.5.0 - version: 8.5.0(storybook@8.5.0) + specifier: 9.1.13 + version: 9.1.13(storybook@9.1.13(@testing-library/dom@10.4.0)(vite@6.2.7(@types/node@18.15.0)(jiti@2.6.1)(sass@1.92.1)(terser@5.43.1)(yaml@2.8.0))) '@storybook/addon-themes': - specifier: 8.5.0 - version: 8.5.0(storybook@8.5.0) + specifier: 9.1.13 + version: 9.1.13(storybook@9.1.13(@testing-library/dom@10.4.0)(vite@6.2.7(@types/node@18.15.0)(jiti@2.6.1)(sass@1.92.1)(terser@5.43.1)(yaml@2.8.0))) '@storybook/nextjs': - specifier: 8.5.0 - version: 8.5.0(esbuild@0.25.0)(next@15.5.4(@babel/core@7.28.3)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(sass@1.92.1))(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(sass@1.92.1)(storybook@8.5.0)(type-fest@2.19.0)(typescript@5.8.3)(uglify-js@3.19.3)(webpack-hot-middleware@2.26.1)(webpack@5.100.2(esbuild@0.25.0)(uglify-js@3.19.3)) + specifier: 9.1.13 + version: 9.1.13(esbuild@0.25.0)(next@15.5.4(@babel/core@7.28.3)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(sass@1.92.1))(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(sass@1.92.1)(storybook@9.1.13(@testing-library/dom@10.4.0)(vite@6.2.7(@types/node@18.15.0)(jiti@2.6.1)(sass@1.92.1)(terser@5.43.1)(yaml@2.8.0)))(type-fest@2.19.0)(typescript@5.8.3)(uglify-js@3.19.3)(webpack-hot-middleware@2.26.1)(webpack@5.102.1(esbuild@0.25.0)(uglify-js@3.19.3)) '@storybook/react': - specifier: 8.5.0 - version: 8.5.0(@storybook/test@8.5.0(storybook@8.5.0))(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(storybook@8.5.0)(typescript@5.8.3) - '@storybook/test': - specifier: 8.5.0 - version: 8.5.0(storybook@8.5.0) + specifier: 9.1.13 + version: 9.1.13(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(storybook@9.1.13(@testing-library/dom@10.4.0)(vite@6.2.7(@types/node@18.15.0)(jiti@2.6.1)(sass@1.92.1)(terser@5.43.1)(yaml@2.8.0)))(typescript@5.8.3) '@testing-library/dom': specifier: ^10.4.0 version: 10.4.0 @@ -445,7 +440,7 @@ importers: version: 10.4.21(postcss@8.5.6) babel-loader: specifier: ^10.0.0 - version: 10.0.0(@babel/core@7.28.3)(webpack@5.100.2(esbuild@0.25.0)(uglify-js@3.19.3)) + version: 10.0.0(@babel/core@7.28.3)(webpack@5.102.1(esbuild@0.25.0)(uglify-js@3.19.3)) bing-translate-api: specifier: ^4.0.2 version: 4.1.0 @@ -453,8 +448,8 @@ importers: specifier: 1.2.9 version: 1.2.9 cross-env: - specifier: ^7.0.3 - version: 7.0.3 + specifier: ^10.1.0 + version: 10.1.0 eslint: specifier: ^9.35.0 version: 9.35.0(jiti@2.6.1) @@ -471,8 +466,8 @@ importers: specifier: ^3.0.2 version: 3.0.4(eslint@9.35.0(jiti@2.6.1)) eslint-plugin-storybook: - specifier: ^9.0.7 - version: 9.0.7(eslint@9.35.0(jiti@2.6.1))(typescript@5.8.3) + specifier: ^9.1.13 + version: 9.1.13(eslint@9.35.0(jiti@2.6.1))(storybook@9.1.13(@testing-library/dom@10.4.0)(vite@6.2.7(@types/node@18.15.0)(jiti@2.6.1)(sass@1.92.1)(terser@5.43.1)(yaml@2.8.0)))(typescript@5.8.3) eslint-plugin-tailwindcss: specifier: ^3.18.0 version: 3.18.2(tailwindcss@3.4.17(ts-node@10.9.2(@types/node@18.15.0)(typescript@5.8.3))) @@ -504,8 +499,8 @@ importers: specifier: ^1.92.1 version: 1.92.1 storybook: - specifier: 8.5.0 - version: 8.5.0 + specifier: 9.1.13 + version: 9.1.13(@testing-library/dom@10.4.0)(vite@6.2.7(@types/node@18.15.0)(jiti@2.6.1)(sass@1.92.1)(terser@5.43.1)(yaml@2.8.0)) tailwindcss: specifier: ^3.4.14 version: 3.4.17(ts-node@10.9.2(@types/node@18.15.0)(typescript@5.8.3)) @@ -1289,11 +1284,11 @@ packages: '@chevrotain/utils@11.0.3': resolution: {integrity: sha512-YslZMgtJUyuMbZ+aKvfF3x1f5liK4mWNxghFRv7jqRR9C3R3fAOGTTKvxXDa2Y1s9zSbcpuO0cAxDYsc9SrXoQ==} - '@chromatic-com/storybook@3.2.7': - resolution: {integrity: sha512-fCGhk4cd3VA8RNg55MZL5CScdHqljsQcL9g6Ss7YuobHpSo9yytEWNdgMd5QxAHSPBlLGFHjnSmliM3G/BeBqw==} - engines: {node: '>=16.0.0', yarn: '>=1.22.18'} + '@chromatic-com/storybook@4.1.1': + resolution: {integrity: sha512-+Ib4cHtEjKl/Do+4LyU0U1FhLPbIU2Q/zgbOKHBCV+dTC4T3/vGzPqiGsgkdnZyTsK/zXg96LMPSPC4jjOiapg==} + engines: {node: '>=20.0.0', yarn: '>=1.22.18'} peerDependencies: - storybook: ^8.2.0 || ^8.3.0-0 || ^8.4.0-0 || ^8.5.0-0 || ^8.6.0-0 + storybook: ^0.0.0-0 || ^9.0.0 || ^9.1.0-0 || ^9.2.0-0 || ^10.0.0-0 '@clack/core@0.5.0': resolution: {integrity: sha512-p3y0FIOwaYRUPRcMO7+dlmLh8PSRcrjuTndsiA0WAFbWES0mLZlrjVoBRZ9DzkPFJZG6KGkJmoEAY0ZcVWTkow==} @@ -1339,6 +1334,9 @@ packages: '@emoji-mart/data@1.2.1': resolution: {integrity: sha512-no2pQMWiBy6gpBEiqGeU77/bFejDqUTRY7KX+0+iur13op3bqUsXdnwoZs6Xb1zbv0gAj5VvS1PWoUUckSr5Dw==} + '@epic-web/invariant@1.0.0': + resolution: {integrity: sha512-lrTPqgvfFQtR/eY/qkIzp98OGdNJu0m5ji3q/nJI8v3SXkRKEnWiOxMmbvcSoAIzv/cGiuvRy57k4suKQSAdwA==} + '@es-joy/jsdoccomment@0.50.2': resolution: {integrity: sha512-YAdE/IJSpwbOTiaURNCKECdAwqrJuFiZhylmesBcIRawtYKnBR2wxPhoIewMg+Yu+QuYvHfJNReWpoxGBKOChA==} engines: {node: '>=18'} @@ -2168,6 +2166,9 @@ packages: '@napi-rs/wasm-runtime@1.0.7': resolution: {integrity: sha512-SeDnOO0Tk7Okiq6DbXmmBODgOAb9dp9gjlphokTUxmt8U3liIP1ZsozBahH69j/RJv+Rfs6IwUKHTgQYJ/HBAw==} + '@neoconfetti/react@1.0.0': + resolution: {integrity: sha512-klcSooChXXOzIm+SE5IISIAn3bYzYfPjbX7D7HoqZL84oAfgREeSg5vSIaSFH+DaGzzvImTyWe1OyrJ67vik4A==} + '@next/bundle-analyzer@15.5.4': resolution: {integrity: sha512-wMtpIjEHi+B/wC34ZbEcacGIPgQTwTFjjp0+F742s9TxC6QwT0MwB/O0QEgalMe8s3SH/K09DO0gmTvUSJrLRA==} @@ -2300,10 +2301,6 @@ packages: resolution: {integrity: sha512-bwIpVzFMudUC0ofnvdSDB/OyGUizcU+r32ZZ0QTMbN03gUttMtdCFDekuSYT0XGFgufTQyZ4ONBnAeb3DFCPGQ==} engines: {node: '>=12.4.0'} - '@nolyfill/safe-buffer@1.0.44': - resolution: {integrity: sha512-SqlKXtlhNTDMeZKey9jnnuPhi8YTl1lJuEcY9zbm5i4Pqe79UJJ8IJ9oiD6DhgI8KjYc+HtLzpQJNRdNYqb/hw==} - engines: {node: '>=12.4.0'} - '@nolyfill/safer-buffer@1.0.44': resolution: {integrity: sha512-Ouw1fMwjAy1V4MpnDASfu1DCPgkP0nNFteiiWbFoEGSqa7Vnmkb6if2c522N2WcMk+RuaaabQbC1F1D4/kTXcg==} engines: {node: '>=12.4.0'} @@ -2858,6 +2855,116 @@ packages: peerDependencies: rollup: ^1.20.0||^2.0.0 + '@rollup/rollup-android-arm-eabi@4.52.5': + resolution: {integrity: sha512-8c1vW4ocv3UOMp9K+gToY5zL2XiiVw3k7f1ksf4yO1FlDFQ1C2u72iACFnSOceJFsWskc2WZNqeRhFRPzv+wtQ==} + cpu: [arm] + os: [android] + + '@rollup/rollup-android-arm64@4.52.5': + resolution: {integrity: sha512-mQGfsIEFcu21mvqkEKKu2dYmtuSZOBMmAl5CFlPGLY94Vlcm+zWApK7F/eocsNzp8tKmbeBP8yXyAbx0XHsFNA==} + cpu: [arm64] + os: [android] + + '@rollup/rollup-darwin-arm64@4.52.5': + resolution: {integrity: sha512-takF3CR71mCAGA+v794QUZ0b6ZSrgJkArC+gUiG6LB6TQty9T0Mqh3m2ImRBOxS2IeYBo4lKWIieSvnEk2OQWA==} + cpu: [arm64] + os: [darwin] + + '@rollup/rollup-darwin-x64@4.52.5': + resolution: {integrity: sha512-W901Pla8Ya95WpxDn//VF9K9u2JbocwV/v75TE0YIHNTbhqUTv9w4VuQ9MaWlNOkkEfFwkdNhXgcLqPSmHy0fA==} + cpu: [x64] + os: [darwin] + + '@rollup/rollup-freebsd-arm64@4.52.5': + resolution: {integrity: sha512-QofO7i7JycsYOWxe0GFqhLmF6l1TqBswJMvICnRUjqCx8b47MTo46W8AoeQwiokAx3zVryVnxtBMcGcnX12LvA==} + cpu: [arm64] + os: [freebsd] + + '@rollup/rollup-freebsd-x64@4.52.5': + resolution: {integrity: sha512-jr21b/99ew8ujZubPo9skbrItHEIE50WdV86cdSoRkKtmWa+DDr6fu2c/xyRT0F/WazZpam6kk7IHBerSL7LDQ==} + cpu: [x64] + os: [freebsd] + + '@rollup/rollup-linux-arm-gnueabihf@4.52.5': + resolution: {integrity: sha512-PsNAbcyv9CcecAUagQefwX8fQn9LQ4nZkpDboBOttmyffnInRy8R8dSg6hxxl2Re5QhHBf6FYIDhIj5v982ATQ==} + cpu: [arm] + os: [linux] + + '@rollup/rollup-linux-arm-musleabihf@4.52.5': + resolution: {integrity: sha512-Fw4tysRutyQc/wwkmcyoqFtJhh0u31K+Q6jYjeicsGJJ7bbEq8LwPWV/w0cnzOqR2m694/Af6hpFayLJZkG2VQ==} + cpu: [arm] + os: [linux] + + '@rollup/rollup-linux-arm64-gnu@4.52.5': + resolution: {integrity: sha512-a+3wVnAYdQClOTlyapKmyI6BLPAFYs0JM8HRpgYZQO02rMR09ZcV9LbQB+NL6sljzG38869YqThrRnfPMCDtZg==} + cpu: [arm64] + os: [linux] + + '@rollup/rollup-linux-arm64-musl@4.52.5': + resolution: {integrity: sha512-AvttBOMwO9Pcuuf7m9PkC1PUIKsfaAJ4AYhy944qeTJgQOqJYJ9oVl2nYgY7Rk0mkbsuOpCAYSs6wLYB2Xiw0Q==} + cpu: [arm64] + os: [linux] + + '@rollup/rollup-linux-loong64-gnu@4.52.5': + resolution: {integrity: sha512-DkDk8pmXQV2wVrF6oq5tONK6UHLz/XcEVow4JTTerdeV1uqPeHxwcg7aFsfnSm9L+OO8WJsWotKM2JJPMWrQtA==} + cpu: [loong64] + os: [linux] + + '@rollup/rollup-linux-ppc64-gnu@4.52.5': + resolution: {integrity: sha512-W/b9ZN/U9+hPQVvlGwjzi+Wy4xdoH2I8EjaCkMvzpI7wJUs8sWJ03Rq96jRnHkSrcHTpQe8h5Tg3ZzUPGauvAw==} + cpu: [ppc64] + os: [linux] + + '@rollup/rollup-linux-riscv64-gnu@4.52.5': + resolution: {integrity: sha512-sjQLr9BW7R/ZiXnQiWPkErNfLMkkWIoCz7YMn27HldKsADEKa5WYdobaa1hmN6slu9oWQbB6/jFpJ+P2IkVrmw==} + cpu: [riscv64] + os: [linux] + + '@rollup/rollup-linux-riscv64-musl@4.52.5': + resolution: {integrity: sha512-hq3jU/kGyjXWTvAh2awn8oHroCbrPm8JqM7RUpKjalIRWWXE01CQOf/tUNWNHjmbMHg/hmNCwc/Pz3k1T/j/Lg==} + cpu: [riscv64] + os: [linux] + + '@rollup/rollup-linux-s390x-gnu@4.52.5': + resolution: {integrity: sha512-gn8kHOrku8D4NGHMK1Y7NA7INQTRdVOntt1OCYypZPRt6skGbddska44K8iocdpxHTMMNui5oH4elPH4QOLrFQ==} + cpu: [s390x] + os: [linux] + + '@rollup/rollup-linux-x64-gnu@4.52.5': + resolution: {integrity: sha512-hXGLYpdhiNElzN770+H2nlx+jRog8TyynpTVzdlc6bndktjKWyZyiCsuDAlpd+j+W+WNqfcyAWz9HxxIGfZm1Q==} + cpu: [x64] + os: [linux] + + '@rollup/rollup-linux-x64-musl@4.52.5': + resolution: {integrity: sha512-arCGIcuNKjBoKAXD+y7XomR9gY6Mw7HnFBv5Rw7wQRvwYLR7gBAgV7Mb2QTyjXfTveBNFAtPt46/36vV9STLNg==} + cpu: [x64] + os: [linux] + + '@rollup/rollup-openharmony-arm64@4.52.5': + resolution: {integrity: sha512-QoFqB6+/9Rly/RiPjaomPLmR/13cgkIGfA40LHly9zcH1S0bN2HVFYk3a1eAyHQyjs3ZJYlXvIGtcCs5tko9Cw==} + cpu: [arm64] + os: [openharmony] + + '@rollup/rollup-win32-arm64-msvc@4.52.5': + resolution: {integrity: sha512-w0cDWVR6MlTstla1cIfOGyl8+qb93FlAVutcor14Gf5Md5ap5ySfQ7R9S/NjNaMLSFdUnKGEasmVnu3lCMqB7w==} + cpu: [arm64] + os: [win32] + + '@rollup/rollup-win32-ia32-msvc@4.52.5': + resolution: {integrity: sha512-Aufdpzp7DpOTULJCuvzqcItSGDH73pF3ko/f+ckJhxQyHtp67rHw3HMNxoIdDMUITJESNE6a8uh4Lo4SLouOUg==} + cpu: [ia32] + os: [win32] + + '@rollup/rollup-win32-x64-gnu@4.52.5': + resolution: {integrity: sha512-UGBUGPFp1vkj6p8wCRraqNhqwX/4kNQPS57BCFc8wYh0g94iVIW33wJtQAx3G7vrjjNtRaxiMUylM0ktp/TRSQ==} + cpu: [x64] + os: [win32] + + '@rollup/rollup-win32-x64-msvc@4.52.5': + resolution: {integrity: sha512-TAcgQh2sSkykPRWLrdyy2AiceMckNf5loITqXxFI5VuQjS5tSuw3WlwdN8qv8vzjLAUTvYaH/mVjSFpbkFbpTg==} + cpu: [x64] + os: [win32] + '@sentry-internal/browser-utils@8.55.0': resolution: {integrity: sha512-ROgqtQfpH/82AQIpESPqPQe0UyWywKJsmVIqi3c5Fh+zkds5LUxnssTj3yNd1x+kxaPDVB023jAP+3ibNgeNDw==} engines: {node: '>=14.18'} @@ -2901,158 +3008,67 @@ packages: '@sinonjs/fake-timers@10.3.0': resolution: {integrity: sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==} - '@storybook/addon-actions@8.5.0': - resolution: {integrity: sha512-6CW9+17rk5eNx6I8EKqCxRKtsJFTR/lHL+xiJ6/iBWApIm8sg63vhXvUTJ58UixmIkT5oLh0+ESNPh+x10D8fw==} + '@storybook/addon-docs@9.1.13': + resolution: {integrity: sha512-V1nCo7bfC3kQ5VNVq0VDcHsIhQf507m+BxMA5SIYiwdJHljH2BXpW2fL3FFn9gv9Wp57AEEzhm+wh4zANaJgkg==} peerDependencies: - storybook: ^8.5.0 + storybook: ^9.1.13 - '@storybook/addon-backgrounds@8.5.0': - resolution: {integrity: sha512-lzyFLs7niNsqlhH5kdUrp7htLiMIcjY50VLWe0PaeJ6T6GZ7X9qhQzROAUV6cGqzyd8A6y/LzIUntDPMVEm/6g==} - peerDependencies: - storybook: ^8.5.0 - - '@storybook/addon-controls@8.5.0': - resolution: {integrity: sha512-1fivx77A/ahObrPl0L66o9i9MUNfqXxsrpekne5gjMNXw9XJFIRNUe/ddL4CMmwu7SgVbj2QV+q5E5mlnZNTJw==} - peerDependencies: - storybook: ^8.5.0 - - '@storybook/addon-docs@8.5.0': - resolution: {integrity: sha512-REwLSr1VgOVNJZwP3y3mldhOjBHlM5fqTvq/tC8NaYpAzx9O4rZdoUSZxW3tYtoNoYrHpB8kzRTeZl8WSdKllw==} - peerDependencies: - storybook: ^8.5.0 - - '@storybook/addon-essentials@8.5.0': - resolution: {integrity: sha512-RrHRdaw2j3ugZiYQ6OHt3Ff08ID4hwAvipqULEsbEnEw3VlXOaW/MT5e2M7kW3MHskQ3iJ6XAD1Y1rNm432Pzw==} - peerDependencies: - storybook: ^8.5.0 - - '@storybook/addon-highlight@8.5.0': - resolution: {integrity: sha512-/JxYzMK5aJSYs0K/0eAEFyER2dMoxqwM891MdnkNwLFdyrM58lzHee00F9oEX6zeQoRUNQPRepq0ui2PvbTMGw==} - peerDependencies: - storybook: ^8.5.0 - - '@storybook/addon-interactions@8.5.0': - resolution: {integrity: sha512-vX1a8qS7o/W3kEzfL/CqOj/Rr6UlGLT/n0KXMpfIhx63tzxe1a1qGpFLL0h0zqAVPHZIOu9humWMKri5Iny6oA==} - peerDependencies: - storybook: ^8.5.0 - - '@storybook/addon-links@8.5.0': - resolution: {integrity: sha512-Y11GIByAYqn0TibI/xsy0vCe+ZxJS9PVAAoHngLxkf9J4WodAXcJABr8ZPlWDNdaEhSS/FF7UQUmNag0UC2/pw==} + '@storybook/addon-links@9.1.13': + resolution: {integrity: sha512-wx33RA5PPRSepVAjR0hMFp2IXoPgjwNAHIP92aoi2QQFS3+NHlf1I4vXEPpHU6lc0WBwM43qvLSI0qTAyZd8Nw==} peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta - storybook: ^8.5.0 + storybook: ^9.1.13 peerDependenciesMeta: react: optional: true - '@storybook/addon-measure@8.5.0': - resolution: {integrity: sha512-e8pJy2sICyj0Ff0W1PFc6HPE6PqcjnnHtfuDaO3M9uSKJLYkpTWJ8i1VSP178f8seq44r5/PdQCHqs5q5l3zgw==} + '@storybook/addon-onboarding@9.1.13': + resolution: {integrity: sha512-WqyzBA2VIPkWw6yFbyZ6PLVJWf+H+R99gvKHchUj7oJWVEs8FHYoP2Lum+5LonUerBqgwGQZlS3UPrRKJ0avZw==} peerDependencies: - storybook: ^8.5.0 + storybook: ^9.1.13 - '@storybook/addon-onboarding@8.5.0': - resolution: {integrity: sha512-77ebcHkKR744ciPbT4ZgqW4W7KrLv1uAdSb3mX3gWukSl4oxP9D/HjmNiX5fBDYWUC4wsf6q5barOs4Hqn8ivw==} + '@storybook/addon-themes@9.1.13': + resolution: {integrity: sha512-0ewLnwpoeOzOxDYg4VBlcnWiJz2jXvbZgEsQnqDXcK6y+WwK5MdupRFzSSJb+h470h3MnINAQrskPgGMKmI44A==} peerDependencies: - storybook: ^8.5.0 + storybook: ^9.1.13 - '@storybook/addon-outline@8.5.0': - resolution: {integrity: sha512-r12sk1b38Ph6NroWAOTfjbJ/V+gDobm7tKQQlbSDf6fgX7cqyPHmKjfNDCOCQpXouZm/Jm+41zd758PW+Yt4ng==} + '@storybook/builder-webpack5@9.1.13': + resolution: {integrity: sha512-BoFXrTlc22ryLl6U5QwgV/gHVbHBcXeVSjYOyu6XZ9SPV5GGbw5T/G7NJYJAZcsz1ZxuMEYYSMFryfZ5qcjRsA==} peerDependencies: - storybook: ^8.5.0 - - '@storybook/addon-themes@8.5.0': - resolution: {integrity: sha512-pBNut4sLfcOeLBvWdNAJ3cxv/BfMSTmJcUtSzE4G+1pVNsBbGF+T2f/GM0IjaM0K8Ft03VDzeEAB64nluDS4RA==} - peerDependencies: - storybook: ^8.5.0 - - '@storybook/addon-toolbars@8.5.0': - resolution: {integrity: sha512-q3yYYO2WX8K2DYNM++FzixGDjzYaeREincgsl2WXYXrcuGb5hkOoOgRiAQL8Nz9NQ1Eo+B/yZxrhG/5VoVhUUQ==} - peerDependencies: - storybook: ^8.5.0 - - '@storybook/addon-viewport@8.5.0': - resolution: {integrity: sha512-MlhVELImk9YzjEgGR2ciLC8d5tUSGcO7my4kWIClN0VyTRcvG4ZfwrsEC+jN3/l52nrgjLmKrDX5UAGZm6w5mQ==} - peerDependencies: - storybook: ^8.5.0 - - '@storybook/blocks@8.5.0': - resolution: {integrity: sha512-2sTOgjH/JFOgWnpqkKjpKVvKAgUaC9ZBjH1gnCoA5dne/SDafYaCAYfv6yZn7g2Xm1sTxWCAmMIUkYSALeWr+w==} - peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta - react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta - storybook: ^8.5.0 - peerDependenciesMeta: - react: - optional: true - react-dom: - optional: true - - '@storybook/builder-webpack5@8.5.0': - resolution: {integrity: sha512-MyCj11cktyN2HeK8NsLv+L0Km36qAz2UGqu6j1VKJUgPelgpCCi4StCW/KaSBeOFAwGD52xjAdNu+c1h/vfiMg==} - peerDependencies: - storybook: ^8.5.0 + storybook: ^9.1.13 typescript: '*' peerDependenciesMeta: typescript: optional: true - '@storybook/components@8.5.0': - resolution: {integrity: sha512-DhaHtwfEcfWYj3ih/5RBSDHe3Idxyf+oHw2/DmaLKJX6MluhdK3ZqigjRcTmA9Gj/SbR4CkHEEtDzAvBlW0BYw==} + '@storybook/core-webpack@9.1.13': + resolution: {integrity: sha512-HtBZ+ZVgeqlhyMiT/Tdb/vpKrCSiZEi6p4s7y/qk04SaX8XIPSufEeqLI/ELSz2hOcuCy6smU/tE1JkqVz/4uA==} peerDependencies: - storybook: ^8.2.0 || ^8.3.0-0 || ^8.4.0-0 || ^8.5.0-0 || ^8.6.0-0 + storybook: ^9.1.13 - '@storybook/core-webpack@8.5.0': - resolution: {integrity: sha512-bJAcF9TwNO2qNa7Jef4h5U9ka4399HDiHiQec1AxdqUIy/2zfbetgV6+2Fr5mtejPqJgbs7kXNGErI+fFByLGg==} + '@storybook/csf-plugin@9.1.13': + resolution: {integrity: sha512-EMpzYuyt9FDcxxfBChWzfId50y8QMpdenviEQ8m+pa6c+ANx3pC5J6t7y0khD8TQu815sTy+nc6cc8PC45dPUA==} peerDependencies: - storybook: ^8.5.0 - - '@storybook/core@8.5.0': - resolution: {integrity: sha512-apborO6ynns7SeydBSqE9o0zT6JSU+VY4gLFPJROGcconvSW4bS5xtJCsgjlulceyWVxepFHGXl4jEZw+SktXA==} - peerDependencies: - prettier: ^2 || ^3 - peerDependenciesMeta: - prettier: - optional: true - - '@storybook/csf-plugin@8.5.0': - resolution: {integrity: sha512-cs6ogviNyLG1h9J8Sb47U3DqIrQmn2EHm4ta3fpCeV3ABbrMgbzYyxtmybz4g/AwlDgjAZAt6PPcXkfCJ6p2CQ==} - peerDependencies: - storybook: ^8.5.0 - - '@storybook/csf@0.1.12': - resolution: {integrity: sha512-9/exVhabisyIVL0VxTCxo01Tdm8wefIXKXfltAPTSr8cbLn5JAxGQ6QV3mjdecLGEOucfoVhAKtJfVHxEK1iqw==} - - '@storybook/csf@0.1.13': - resolution: {integrity: sha512-7xOOwCLGB3ebM87eemep89MYRFTko+D8qE7EdAAq74lgdqRR5cOUtYWJLjO2dLtP94nqoOdHJo6MdLLKzg412Q==} + storybook: ^9.1.13 '@storybook/global@5.0.0': resolution: {integrity: sha512-FcOqPAXACP0I3oJ/ws6/rrPT9WGhu915Cg8D02a9YxLo0DE9zI+a9A5gRGvmQ09fiWPukqI8ZAEoQEdWUKMQdQ==} - '@storybook/icons@1.4.0': - resolution: {integrity: sha512-Td73IeJxOyalzvjQL+JXx72jlIYHgs+REaHiREOqfpo3A2AYYG71AUbcv+lg7mEDIweKVCxsMQ0UKo634c8XeA==} + '@storybook/icons@1.6.0': + resolution: {integrity: sha512-hcFZIjW8yQz8O8//2WTIXylm5Xsgc+lW9ISLgUk1xGmptIJQRdlhVIXCpSyLrQaaRiyhQRaVg7l3BD9S216BHw==} engines: {node: '>=14.0.0'} peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta - '@storybook/instrumenter@8.5.0': - resolution: {integrity: sha512-eZ/UY6w4U2vay+wX7QVwKiRoyMzZscuv6v4k4r8BlmHPFWbhiZDO9S2GsG16UkyKnrQrYk432he70n7hn1Xvmg==} + '@storybook/nextjs@9.1.13': + resolution: {integrity: sha512-Vio6+sLkuAGB9C7wai/4wTutYbMylsMjWaDZzGSAra4/Fx3Qk40CK3YiyPzQ5fhkpcONA9amPZ8iM0vLUs1UcQ==} + engines: {node: '>=20.0.0'} peerDependencies: - storybook: ^8.5.0 - - '@storybook/manager-api@8.5.0': - resolution: {integrity: sha512-Ildriueo3eif4M+gMlMxu/mrBIbAnz8+oesmQJKdzZfe/U9eQTI9OUqJsxx/IVBmdzQ3ySsgNmzj5VweRkse4A==} - peerDependencies: - storybook: ^8.2.0 || ^8.3.0-0 || ^8.4.0-0 || ^8.5.0-0 || ^8.6.0-0 - - '@storybook/nextjs@8.5.0': - resolution: {integrity: sha512-zUU0wQd4F2p006gZX0XC3+Zsj0tB4DOz+7FjSlnyGbzf5cDE6cD74l0Azj6aZluR4Q2say7gWDIpHu05YvIJsg==} - engines: {node: '>=18.0.0'} - peerDependencies: - next: ^13.5.0 || ^14.0.0 || ^15.0.0 + next: ^14.1.0 || ^15.0.0 react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta - storybook: ^8.5.0 + storybook: ^9.1.13 typescript: '*' webpack: ^5.0.0 peerDependenciesMeta: @@ -3061,61 +3077,43 @@ packages: webpack: optional: true - '@storybook/preset-react-webpack@8.5.0': - resolution: {integrity: sha512-KJwVcQVYQWuMT5QUF06be60UuBfazBIO+90erfoYoIx0UwOxKMVnQz0HfG2JMc4EIoNLIl0/cm5mb2k4BWyhbA==} - engines: {node: '>=18.0.0'} + '@storybook/preset-react-webpack@9.1.13': + resolution: {integrity: sha512-2bWRdGSYvXWaE1QnrKFeE7EbTj+/Y0D8DHZ/OlKCB3xtNM7koMDrTnnI27hVlMjXqcX8RvOwb/N31FGBRgkiNg==} + engines: {node: '>=20.0.0'} peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta - storybook: ^8.5.0 + storybook: ^9.1.13 typescript: '*' peerDependenciesMeta: typescript: optional: true - '@storybook/preview-api@8.5.0': - resolution: {integrity: sha512-g0XbD54zMUkl6bpuA7qEBCE9rW1QV6KKmwkO4bkxMOJcMke3x9l00JTaYn7Un8wItjXiS3BIG15B6mnfBG7fng==} - peerDependencies: - storybook: ^8.2.0 || ^8.3.0-0 || ^8.4.0-0 || ^8.5.0-0 || ^8.6.0-0 - '@storybook/react-docgen-typescript-plugin@1.0.6--canary.9.0c3f3b7.0': resolution: {integrity: sha512-KUqXC3oa9JuQ0kZJLBhVdS4lOneKTOopnNBK4tUAgoxWQ3u/IjzdueZjFr7gyBrXMoU6duutk3RQR9u8ZpYJ4Q==} peerDependencies: typescript: '>= 4.x' webpack: '>= 4' - '@storybook/react-dom-shim@8.5.0': - resolution: {integrity: sha512-7P8xg4FiuFpM6kQOzZynno+0zyLVs8NgsmRK58t3JRZXbda1tzlxTXzvqx4hUevvbPJGjmrB0F3xTFH+8Otnvw==} + '@storybook/react-dom-shim@9.1.13': + resolution: {integrity: sha512-/tMr9TmV3+98GEQO0S03k4gtKHGCpv9+k9Dmnv+TJK3TBz7QsaFEzMwe3gCgoTaebLACyVveDiZkWnCYAWB6NA==} peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta - storybook: ^8.5.0 + storybook: ^9.1.13 - '@storybook/react@8.5.0': - resolution: {integrity: sha512-/jbkmGGc95N7KduIennL/k8grNTP5ye/YBnkcS4TbF7uDWBtKy3/Wqvx5BIlFXq3qeUnZJ8YtZc0lPIYeCY8XQ==} - engines: {node: '>=18.0.0'} + '@storybook/react@9.1.13': + resolution: {integrity: sha512-B0UpYikKf29t8QGcdmumWojSQQ0phSDy/Ne2HYdrpNIxnUvHHUVOlGpq4lFcIDt52Ip5YG5GuAwJg3+eR4LCRg==} + engines: {node: '>=20.0.0'} peerDependencies: - '@storybook/test': 8.5.0 react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta - storybook: ^8.5.0 - typescript: '>= 4.2.x' + storybook: ^9.1.13 + typescript: '>= 4.9.x' peerDependenciesMeta: - '@storybook/test': - optional: true typescript: optional: true - '@storybook/test@8.5.0': - resolution: {integrity: sha512-M/DdPlI6gwL7NGkK5o7GYjdEBp95AsFEUtW29zQfnVIAngYugzi3nIuM/XkQHunidVdAZCYjw2s2Yhhsx/m9sw==} - peerDependencies: - storybook: ^8.5.0 - - '@storybook/theming@8.5.0': - resolution: {integrity: sha512-591LbOj/HMmHYUfLgrMerxhF1A9mY61HWKxcRpB6xxalc1Xw1kRtQ49DcwuTXnUu9ktBB3nuOzPNPQPFSh/7PQ==} - peerDependencies: - storybook: ^8.2.0 || ^8.3.0-0 || ^8.4.0-0 || ^8.5.0-0 || ^8.6.0-0 - '@stylistic/eslint-plugin@5.2.2': resolution: {integrity: sha512-bE2DUjruqXlHYP3Q2Gpqiuj2bHq7/88FnuaS0FjeGGLCy+X6a07bGVuwtiOYnPSLHR6jmx5Bwdv+j7l8H+G97A==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -3197,10 +3195,6 @@ packages: resolution: {integrity: sha512-pemlzrSESWbdAloYml3bAJMEfNh1Z7EduzqPKprCH5S341frlpYnUEW0H72dLxa6IsYr+mPno20GiSm+h9dEdQ==} engines: {node: '>=18'} - '@testing-library/jest-dom@6.5.0': - resolution: {integrity: sha512-xGGHpBXYSHUUr6XsKBfs85TWlYKpTc37cSBBVrXcib2MkHLboWlkClhWF37JKlDb9KEq3dHs+f2xR7XJEWGBxA==} - engines: {node: '>=14', npm: '>=6', yarn: '>=1'} - '@testing-library/jest-dom@6.8.0': resolution: {integrity: sha512-WgXcWzVM6idy5JaftTVC8Vs83NKRmGJz4Hqs4oyOuO2J4r/y79vvKZsb+CaGyCSEbUPI6OsewfPd0G1A0/TUZQ==} engines: {node: '>=14', npm: '>=6', yarn: '>=1'} @@ -3220,8 +3214,8 @@ packages: '@types/react-dom': optional: true - '@testing-library/user-event@14.5.2': - resolution: {integrity: sha512-YAh82Wh4TIrxYLmfGcixwD18oIjyC1pFQC2Y01F2lzV2HTMiYrI0nze0FD0ocB//CKS/7jIUgae+adPqxK5yCQ==} + '@testing-library/user-event@14.6.1': + resolution: {integrity: sha512-vq7fv0rnt+QTXgPxr5Hjc210p6YKq2kmdziLgnsZGgLJ9e6VAShx1pACLuRjd/AS/sr7phAR58OIIpf0LlmQNw==} engines: {node: '>=12', npm: '>=6'} peerDependencies: '@testing-library/dom': '>=7.21.4' @@ -3259,6 +3253,9 @@ packages: '@types/cacheable-request@6.0.3': resolution: {integrity: sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw==} + '@types/chai@5.2.2': + resolution: {integrity: sha512-8kB30R7Hwqf40JPiKhVzodJs2Qc1ZJ5zuT3uzw5Hq/dhNCl3G3l83jfpdI1e20BP348+fV7VIL/+FxaXkqBmWg==} + '@types/d3-array@3.2.1': resolution: {integrity: sha512-Y2Jn2idRrLzUfAKV2LyRImR+y4oa2AntrgID95SHJxuMUrkNXmanDSed71sRNZysveJVt1hLLemQZIady0FpEg==} @@ -3355,6 +3352,9 @@ packages: '@types/debug@4.1.12': resolution: {integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==} + '@types/deep-eql@4.0.2': + resolution: {integrity: sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==} + '@types/doctrine@0.0.9': resolution: {integrity: sha512-eOIHzCUSH7SMfonMG1LsC2f8vxBFtho6NGBznK41R84YzPuvSBzrhEps33IsQiOW9+VL6NQ9DbjQJznk/S4uRA==} @@ -3502,9 +3502,6 @@ packages: '@types/uuid@10.0.0': resolution: {integrity: sha512-7gqG38EyHgyP1S+7+xomFtL+ZNHcKv6DwNaCZmJmo1vgMugyF3TCnXVg4t1uk89mLNwnLtnY3TpOpCOyp1/xHQ==} - '@types/uuid@9.0.8': - resolution: {integrity: sha512-jg+97EGIcY9AGHJJRaaPVgetKDsrTgbRjQ5Msgjh/DQKEFl0DtyRr/VCOyD1T2R1MNeWPK/u7JoGhlDZnKBAfA==} - '@types/whatwg-mimetype@3.0.2': resolution: {integrity: sha512-c2AKvDT8ToxLIOUlN51gTiHXflsfIFisS4pO7pDPoKouJCESkhZnEy623gwP9laCy5lnLDAw1vAzu2vM2YLOrA==} @@ -3669,23 +3666,28 @@ packages: vitest: optional: true - '@vitest/expect@2.0.5': - resolution: {integrity: sha512-yHZtwuP7JZivj65Gxoi8upUN2OzHTi3zVfjwdpu2WrvCZPLwsJ2Ey5ILIPccoW23dd/zQBlJ4/dhi7DWNyXCpA==} + '@vitest/expect@3.2.4': + resolution: {integrity: sha512-Io0yyORnB6sikFlt8QW5K7slY4OjqNX9jmJQ02QDda8lyM6B5oNgVWoSoKPac8/kgnCUzuHQKrSLtu/uOqqrig==} - '@vitest/pretty-format@2.0.5': - resolution: {integrity: sha512-h8k+1oWHfwTkyTkb9egzwNMfJAEx4veaPSnMeKbVSjp4euqGSbQlm5+6VHwTr7u4FJslVVsUG5nopCaAYdOmSQ==} + '@vitest/mocker@3.2.4': + resolution: {integrity: sha512-46ryTE9RZO/rfDd7pEqFl7etuyzekzEhUbTW3BvmeO/BcCMEgq59BKhek3dXDWgAj4oMK6OZi+vRr1wPW6qjEQ==} + peerDependencies: + msw: ^2.4.9 + vite: 6.2.7 + peerDependenciesMeta: + msw: + optional: true + vite: + optional: true - '@vitest/pretty-format@2.1.9': - resolution: {integrity: sha512-KhRIdGV2U9HOUzxfiHmY8IFHTdqtOhIzCpd8WRdJiE7D/HUcZVD0EgQCVjm+Q9gkUXWgBvMmTtZgIG48wq7sOQ==} + '@vitest/pretty-format@3.2.4': + resolution: {integrity: sha512-IVNZik8IVRJRTr9fxlitMKeJeXFFFN0JaB9PHPGQ8NKQbGpfjlTx9zO4RefN8gp7eqjNy8nyK3NZmBzOPeIxtA==} - '@vitest/spy@2.0.5': - resolution: {integrity: sha512-c/jdthAhvJdpfVuaexSrnawxZz6pywlTPe84LUB2m/4t3rl2fTo9NFGBG4oWgaD+FTgDDV8hJ/nibT7IfH3JfA==} + '@vitest/spy@3.2.4': + resolution: {integrity: sha512-vAfasCOe6AIK70iP5UD11Ac4siNUNJ9i/9PZ3NKx07sG6sUxeag1LWdNrMWeKKYBLlzuK+Gn65Yd5nyL6ds+nw==} - '@vitest/utils@2.0.5': - resolution: {integrity: sha512-d8HKbqIcya+GR67mkZbrzhS5kKhtp8dQLcmRZLGTscGVg7yImT82cIrhtn2L8+VujWcy6KZweApgNmPsTAO/UQ==} - - '@vitest/utils@2.1.9': - resolution: {integrity: sha512-v0psaMSkNJ3A2NMrUEHFRzJtDPFn+/VWZ5WxImB21T9fjucJRmS7xCS3ppEnARb9y11OAzaD+P2Ps+b+BGX5iQ==} + '@vitest/utils@3.2.4': + resolution: {integrity: sha512-fB2V0JFrQSMsCo9HiSq3Ezpdv4iYaXRG1Sx8edX3MwxfyNn83mKiGzOcH+Fkxt4MHxr3y42fQi1oeAInqgX2QA==} '@vue/compiler-core@3.5.17': resolution: {integrity: sha512-Xe+AittLbAyV0pabcN7cP7/BenRBNcteM4aSDCtRvGw0d9OL+HG1u/XHLY/kt1q4fyMeZYXyIYrsHuPSiDPosA==} @@ -4017,6 +4019,10 @@ packages: base64-js@1.5.1: resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + baseline-browser-mapping@2.8.18: + resolution: {integrity: sha512-UYmTpOBwgPScZpS4A+YbapwWuBwasxvO/2IOHArSsAhL/+ZdmATBXTex3t+l2hXwLVYK382ibr/nKoY9GKe86w==} + hasBin: true + before-after-hook@3.0.2: resolution: {integrity: sha512-Nik3Sc0ncrMK4UUdXQmAnRtzmNQTAAXmXIopizwZ1W1t8QmfJj+zL4OA2I7XPTPW5z5TDqv4hRo/JzouDJnX3A==} @@ -4056,9 +4062,6 @@ packages: brorand@1.1.0: resolution: {integrity: sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==} - browser-assert@1.2.1: - resolution: {integrity: sha512-nfulgvOR6S4gt9UKCeGJOuSGBPGiFT6oQ/2UBnvTY/5aQ1PnksW72fhZkM30DzoRRv2WpwZf1vHHEr3mtuXIWQ==} - browserify-aes@1.2.0: resolution: {integrity: sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==} @@ -4084,6 +4087,11 @@ packages: engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true + browserslist@4.26.3: + resolution: {integrity: sha512-lAUU+02RFBuCKQPj/P6NgjlbCnLBMp4UtgTx7vNHd3XSIJF87s9a5rA3aH2yw3GS9DqZAUbOtZdCCiZeVRqt0w==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + bser@2.1.1: resolution: {integrity: sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==} @@ -4148,6 +4156,9 @@ packages: caniuse-lite@1.0.30001746: resolution: {integrity: sha512-eA7Ys/DGw+pnkWWSE/id29f2IcPHVoE8wxtvE5JdvD2V28VTDPy1yEeo11Guz0sJ4ZeGRcm3uaTcAqK1LXaphA==} + caniuse-lite@1.0.30001751: + resolution: {integrity: sha512-A0QJhug0Ly64Ii3eIqHu5X51ebln3k4yTUkY1j8drqpWHVreg/VLijN48cZ1bYPiqOQuqpkIKnzr/Ul8V+p6Cw==} + canvas@2.11.2: resolution: {integrity: sha512-ItanGBMrmRV7Py2Z+Xhs7cT+FNt5K0vPL4p9EZ/UX/Mu7hFbkxSjKF2KVtPwX7UYWp7dRKnrTvReflgrItJbdw==} engines: {node: '>=6'} @@ -4163,10 +4174,6 @@ packages: resolution: {integrity: sha512-5nFxhUrX0PqtyogoYOA8IPswy5sZFTOsBFl/9bNsmDLgsxYTzSZQJDPppDnZPTQbzSEm0hqGjWPzRemQCYbD6A==} engines: {node: '>=18'} - chalk@3.0.0: - resolution: {integrity: sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==} - engines: {node: '>=8'} - chalk@4.1.1: resolution: {integrity: sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==} engines: {node: '>=10'} @@ -4231,8 +4238,8 @@ packages: resolution: {integrity: sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==} engines: {node: '>=10'} - chromatic@11.29.0: - resolution: {integrity: sha512-yisBlntp9hHVj19lIQdpTlcYIXuU9H/DbFuu6tyWHmj6hWT2EtukCCcxYXL78XdQt1vm2GfIrtgtKpj/Rzmo4A==} + chromatic@12.2.0: + resolution: {integrity: sha512-GswmBW9ZptAoTns1BMyjbm55Z7EsIJnUvYKdQqXIBZIKbGErmpA+p4c0BYA+nzw5B0M+rb3Iqp1IaH8TFwIQew==} hasBin: true peerDependencies: '@chromatic-com/cypress': ^0.*.* || ^1.0.0 @@ -4468,9 +4475,9 @@ packages: create-require@1.1.1: resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} - cross-env@7.0.3: - resolution: {integrity: sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw==} - engines: {node: '>=10.14', npm: '>=6', yarn: '>=1'} + cross-env@10.1.0: + resolution: {integrity: sha512-GsYosgnACZTADcmEyJctkJIoqAhHjttw7RsFrVoJNXbsWWqaq6Ym+7kZjq6mS45O0jij6vtiReppKQEtqWy6Dw==} + engines: {node: '>=20'} hasBin: true cross-spawn@7.0.6: @@ -4768,8 +4775,8 @@ packages: resolution: {integrity: sha512-vEtk+OcP7VBRtQZ1EJ3bdgzSfBjgnEalLTp5zjJrS+2Z1w2KZly4SBdac/WDU3hhsNAZ9E8SC96ME4Ey8MZ7cg==} engines: {node: '>=8'} - detect-libc@2.1.1: - resolution: {integrity: sha512-ecqj/sy1jcK1uWrwpR67UhYrIFQ+5WlGxth34WquCbamhFA6hkkwiu37o6J5xCHdo1oixJRfVRw+ywV+Hq/0Aw==} + detect-libc@2.1.2: + resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==} engines: {node: '>=8'} detect-newline@3.1.0: @@ -4866,6 +4873,9 @@ packages: electron-to-chromium@1.5.186: resolution: {integrity: sha512-lur7L4BFklgepaJxj4DqPk7vKbTEl0pajNlg2QjE5shefmlmBLm2HvQ7PMf1R/GvlevT/581cop33/quQcfX3A==} + electron-to-chromium@1.5.237: + resolution: {integrity: sha512-icUt1NvfhGLar5lSWH3tHNzablaA5js3HVHacQimfP8ViEBOQv+L7DKEuHdbTZ0SKCO1ogTJTIL1Gwk9S6Qvcg==} + elkjs@0.9.3: resolution: {integrity: sha512-f/ZeWvW/BCXbhGEf1Ujp29EASo/lk1FDnETgNKwJrsVvGZhUWCZyg3xLJjAsxfOmt8KjswHmI5EwCQcPMpOYhQ==} @@ -5143,11 +5153,12 @@ packages: peerDependencies: eslint: ^8.0.0 || ^9.0.0 - eslint-plugin-storybook@9.0.7: - resolution: {integrity: sha512-da9oIFo2ww+/PWAsTrpeEPUmhel6Ej1++SwBvdf+SV0H6+rOPbzJGOh367hdOvkwKCbGdKRmw+JmXFCQfHCpqw==} - engines: {node: '>= 18'} + eslint-plugin-storybook@9.1.13: + resolution: {integrity: sha512-kPuhbtGDiJLB5OLZuwFZAxgzWakNDw64sJtXUPN8g0+VAeXfHyZEmsE28qIIETHxtal71lPKVm8QNnERaJHPJQ==} + engines: {node: '>=20.0.0'} peerDependencies: eslint: '>=8' + storybook: ^9.1.13 eslint-plugin-tailwindcss@3.18.2: resolution: {integrity: sha512-QbkMLDC/OkkjFQ1iz/5jkMdHfiMu/uwujUHLAJK5iwNHD8RTxVTlsUezE0toTZ6VhybNBsk+gYGPDq2agfeRNA==} @@ -5413,6 +5424,10 @@ packages: resolution: {integrity: sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + find-up@7.0.0: + resolution: {integrity: sha512-YyZM99iHrqLKjmt4LJDj58KI+fYyufRLBSYcqycxf//KpBk9FoewoGX0450m9nB44qrZnovzC2oeP5hUibxc/g==} + engines: {node: '>=18'} + flat-cache@3.2.0: resolution: {integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==} engines: {node: ^10.12.0 || >=12.0.0} @@ -5671,8 +5686,8 @@ packages: html-parse-stringify@3.0.1: resolution: {integrity: sha512-KknJ50kTInJ7qIScF3jeaFRpMpE8/lfiTdzf/twXyPBLAGrLRTmkz3AdTnKeh40X8k9L2fdYwEp/42WGXIRGcg==} - html-to-image@1.11.11: - resolution: {integrity: sha512-9gux8QhvjRO/erSnDPv28noDZcPZmYE7e1vFsBLKLlRlKDSqNJYebj6Qz1TGd5lsRV+X+xYyjCKjuZdABinWjA==} + html-to-image@1.11.13: + resolution: {integrity: sha512-cuOPoI7WApyhBElTTb9oqsawRvZ0rHhaHwghRLlTuffoD1B2aDemlCruLeZrUIIdvG7gs9xeELEPm6PhuASqrg==} html-url-attributes@3.0.1: resolution: {integrity: sha512-ol6UPyBWqsrO6EJySPz2O7ZSr856WDrEzM5zMqp+FJJLGMW35cLYmmZnl0vztAZxRUoNZJFTCohfjuIJ8I4QBQ==} @@ -5680,17 +5695,11 @@ packages: html-void-elements@3.0.0: resolution: {integrity: sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==} - html-webpack-plugin@5.6.3: - resolution: {integrity: sha512-QSf1yjtSAsmf7rYBV7XX86uua4W/vkhIt0xNXKbsi2foEeW7vjJQz4bhnpL3xH+l1ryl1680uNv968Z+X6jSYg==} + html-webpack-plugin@5.5.4: + resolution: {integrity: sha512-3wNSaVVxdxcu0jd4FpQFoICdqgxs4zIQQvj+2yQKFfBOnLETQ6X5CDWdeasuGlSsooFlMkEioWDTqBv1wvw5Iw==} engines: {node: '>=10.13.0'} peerDependencies: - '@rspack/core': 0.x || 1.x webpack: ^5.20.0 - peerDependenciesMeta: - '@rspack/core': - optional: true - webpack: - optional: true htmlparser2@6.1.0: resolution: {integrity: sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==} @@ -5752,13 +5761,13 @@ packages: resolution: {integrity: sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==} engines: {node: '>= 4'} - image-size@1.2.1: - resolution: {integrity: sha512-rH+46sQJ2dlwfjfhCyNx5thzrv+dtmBIhPHk0zgRUukHzZ/kRueTJXoYYsclBaKcSMBWuGbOFXtioLpzTb5euw==} + image-size@2.0.2: + resolution: {integrity: sha512-IRqXKlaXwgSMAMtpNzZa1ZAe8m+Sa1770Dhk8VkSsP9LS+iHD62Zd8FQKs8fbPiagBE7BzoFX23cxFnwshpV6w==} engines: {node: '>=16.x'} hasBin: true - immer@9.0.21: - resolution: {integrity: sha512-bc4NBHqOqSfRW7POMkHd51LvClaeMXpm8dx0e8oE2GORbq5aRK7Bxl4FyzVLdGtLmvLKL7BTDBG5ACQm4HWjTA==} + immer@10.1.3: + resolution: {integrity: sha512-tmjF/k8QDKydUlm3mZU+tjM6zeq9/fFpPqH9SzWmBnVVKsPBg/V66qsMwb3/Bo90cgUN+ghdVBess+hPsxUyRw==} immutable@5.1.3: resolution: {integrity: sha512-+chQdDfvscSF1SJqv2gn4SRO2ZyS3xL3r7IW/wWEEzrzLisnOlKiQu5ytC/BVNcS15C39WT2Hg/bjKjDMcu+zg==} @@ -6356,9 +6365,6 @@ packages: magic-string@0.25.9: resolution: {integrity: sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==} - magic-string@0.30.17: - resolution: {integrity: sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==} - magic-string@0.30.19: resolution: {integrity: sha512-2N21sPY9Ws53PZvsEpVtNuSW+ScYbQdp4b9qUaL+9QkHUrGFKo56Lg9Emg5s9V/qrtNBmiR01sYhUOwu3H+VOw==} @@ -6379,9 +6385,6 @@ packages: makeerror@1.0.12: resolution: {integrity: sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==} - map-or-similar@1.5.0: - resolution: {integrity: sha512-0aF7ZmVon1igznGI4VS30yugpduQW3y3GkcgGJOp7d8x8QrizhigUxjI/m2UojsXXto+jLAH3KSz+xOJTiORjg==} - markdown-extensions@2.0.0: resolution: {integrity: sha512-o5vL7aDWatOTX8LzaS1WMoaoxIiLRQJuIKKe2wAw6IeULDHaqbiqiggmx+pKvZDb1Sj+pE46Sn1T7lCqfFtg1Q==} engines: {node: '>=16'} @@ -6461,9 +6464,6 @@ packages: memoize-one@5.2.1: resolution: {integrity: sha512-zYiwtZUcYyXKo/np96AGZAckk+FWWsUdJ3cHGGmld7+AhvcWmQyGCYUh1hc4Q/pkOhb65dQR/pqCyK0cOaHz4Q==} - memoizerific@1.11.3: - resolution: {integrity: sha512-/EuHYwAPdLtXwAwSZkh/Gutery6pD2KYd44oQLhAvQp/50mpyduZh8Q7PYHXTCJ+wuXxt7oij2LXyIJOOYFPog==} - merge-stream@2.0.0: resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} @@ -6785,6 +6785,9 @@ packages: node-releases@2.0.19: resolution: {integrity: sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==} + node-releases@2.0.25: + resolution: {integrity: sha512-4auku8B/vw5psvTiiN9j1dAOsXvMoGqJuKJcR+dTdqiXEK20mMTk1UEo3HS16LeGQsVG6+qKTPM9u/qQ2LqATA==} + nopt@5.0.0: resolution: {integrity: sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==} engines: {node: '>=6'} @@ -7068,10 +7071,6 @@ packages: resolution: {integrity: sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==} engines: {node: '>=4'} - pnp-webpack-plugin@1.7.0: - resolution: {integrity: sha512-2Rb3vm+EXble/sMXNSu6eoBx8e79gKqhNq9F5ZWW6ERNCTE/Q0wQNne5541tE5vKjfM8hpNCYL+LGc1YTfI0dg==} - engines: {node: '>=6'} - pnpm-workspace-yaml@1.1.0: resolution: {integrity: sha512-OWUzBxtitpyUV0fBYYwLAfWxn3mSzVbVB7cwgNaHvTTU9P0V2QHjyaY5i7f1hEiT9VeKsNH1Skfhe2E3lx/zhA==} @@ -7081,10 +7080,6 @@ packages: points-on-path@0.2.1: resolution: {integrity: sha512-25ClnWWuw7JbWZcgqY/gJ4FQWadKxGWk+3kR/7kD0tCaDtPPMj7oHu2ToLaVhfpnHrZzYby2w6tUA0eOIuUg8g==} - polished@4.3.1: - resolution: {integrity: sha512-OBatVyC/N7SCW/FaDHrSd+vn0o5cS855TOmYi4OkdWUMSJCET/xip//ch8xGUvtr3i44X9LVyWwQlRMTN3pwSA==} - engines: {node: '>=10'} - portfinder@1.0.37: resolution: {integrity: sha512-yuGIEjDAYnnOex9ddMnKZEMFE0CcGo6zbfzDklkmT1m5z734ss6JMzN9rNB3+RR7iS+F10D4/BVIaXOyh8PQKw==} engines: {node: '>= 10.12'} @@ -7263,9 +7258,6 @@ packages: queue-microtask@1.2.3: resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} - queue@6.0.2: - resolution: {integrity: sha512-iHZWu+q3IdFZFX36ro/lKBkSvfkztY5Y7HMiPlOUjhupPcG2JMfst2KKEpu5XndviX/3UhFbRngUPNKtgvtZiA==} - quick-lru@5.1.1: resolution: {integrity: sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==} engines: {node: '>=10'} @@ -7291,12 +7283,6 @@ packages: peerDependencies: react: ^16.3.0 || ^17.0.0 || ^18.0.0 - react-confetti@6.4.0: - resolution: {integrity: sha512-5MdGUcqxrTU26I2EU7ltkWPwxvucQTuqMm8dUz72z2YMqTD6s9vMcDUysk7n9jnC+lXuCPeJJ7Knf98VEYE9Rg==} - engines: {node: '>=16'} - peerDependencies: - react: ^16.3.0 || ^17.0.1 || ^18.0.0 || ^19.0.0 - react-docgen-typescript@2.4.0: resolution: {integrity: sha512-ZtAp5XTO5HRzQctjPU0ybY0RRCQO19X/8fxn3w7y2VVTUbGHDKULPTL4ky3vB05euSgG5NpALhEhDPvQ56wvXg==} peerDependencies: @@ -7306,11 +7292,6 @@ packages: resolution: {integrity: sha512-hlSJDQ2synMPKFZOsKo9Hi8WWZTC7POR8EmWvTSjow+VDgKzkmjQvFm2fk0tmRw+f0vTOIYKlarR0iL4996pdg==} engines: {node: '>=16.14.0'} - react-dom@18.3.1: - resolution: {integrity: sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==} - peerDependencies: - react: ^18.3.1 - react-dom@19.1.1: resolution: {integrity: sha512-Dlq/5LAZgF0Gaz6yiqZCf6VCcZs1ghAJyrsu84Q/GT0gV+mCxbfmKNoGRKBYMJ8IEdGPqu49YWXD02GCknEDkw==} peerDependencies: @@ -7466,10 +7447,6 @@ packages: react: ^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 react-dom: ^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - react@18.3.1: - resolution: {integrity: sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==} - engines: {node: '>=0.10.0'} - react@19.1.1: resolution: {integrity: sha512-w8nqGImo45dmMIfljjMwOGtbmC/mk4CMYhWIicdSflH91J9TyCyczcPFXJzrZ/ZXcgGRFeP6BU0BEJTw6tZdfQ==} engines: {node: '>=0.10.0'} @@ -7681,6 +7658,11 @@ packages: engines: {node: '>=10.0.0'} hasBin: true + rollup@4.52.5: + resolution: {integrity: sha512-3GuObel8h7Kqdjt0gxkEzaifHTqLVW56Y/bjN7PSQtkKr0w3V/QYSdt6QWYtd7A1xUtYQigtdUfgj1RvWVtorw==} + engines: {node: '>=18.0.0', npm: '>=8.0.0'} + hasBin: true + roughjs@4.6.6: resolution: {integrity: sha512-ZUz/69+SYpFN/g/lUlo2FXcIjRkSu3nDarreVdGGndHEBJ6cXPdKguS8JGxwj5HA5xIbVKSmLgr5b3AWxtRfvQ==} @@ -7690,8 +7672,11 @@ packages: rw@1.3.3: resolution: {integrity: sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ==} - sass-loader@14.2.1: - resolution: {integrity: sha512-G0VcnMYU18a4N7VoNDegg2OuMjYtxnqzQWARVWCIVSZwJeiL9kg8QMsuIZOplsJgTzZLF6jGxI3AClj8I9nRdQ==} + safe-buffer@5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + + sass-loader@16.0.5: + resolution: {integrity: sha512-oL+CMBXrj6BZ/zOq4os+UECPL+bWqt6OAC6DWS8Ln8GZRcMDjlJ4JC3FBDuHJdYaFWIdKNIBYmtZtK2MaMkNIw==} engines: {node: '>= 18.12.0'} peerDependencies: '@rspack/core': 0.x || 1.x @@ -7716,9 +7701,6 @@ packages: engines: {node: '>=14.0.0'} hasBin: true - scheduler@0.23.2: - resolution: {integrity: sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==} - scheduler@0.26.0: resolution: {integrity: sha512-NlHwttCI/l5gCPR3D1nNXtWABUmBwvZpEQiD4IXSbIDq8BzLIK/7Ir5gTFSGZDUu37K5cMNp0hFtzO38sC7gWA==} @@ -7734,6 +7716,10 @@ packages: resolution: {integrity: sha512-Gn/JaSk/Mt9gYubxTtSn/QCV4em9mpAPiR1rqy/Ocu19u/G9J5WWdNoUT4SiV6mFC3y6cxyFcFwdzPM3FgxGAQ==} engines: {node: '>= 10.13.0'} + schema-utils@4.3.3: + resolution: {integrity: sha512-eflK8wEtyOE6+hsaRVPxvUKYCpRgzLqDTb8krvAsRIwOGlHoSgYLgBXoubGgLd2fT41/OUYdb48v4k4WWHQurA==} + engines: {node: '>= 10.13.0'} + screenfull@5.2.0: resolution: {integrity: sha512-9BakfsO2aUQN2K9Fdbj87RJIEZ82Q9IGim7FqM5OsebfoFC6ZHXgDq/KvniuLTPdeM8wY2o6Dj3WQ7KeQCj3cA==} engines: {node: '>=0.10.0'} @@ -7891,8 +7877,8 @@ packages: state-local@1.0.7: resolution: {integrity: sha512-HTEHMNieakEnoe33shBYcZ7NX83ACUjCu8c40iOGEZsngj9zRnkqS9j1pqQPXwobB0ZcVTk27REb7COQ0UR59w==} - storybook@8.5.0: - resolution: {integrity: sha512-cEx42OlCetManF+cONVJVYP7SYsnI2K922DfWKmZhebP0it0n6TUof4y5/XzJ8YUruwPgyclGLdX8TvdRuNSfw==} + storybook@9.1.13: + resolution: {integrity: sha512-G3KZ36EVzXyHds72B/qtWiJnhUpM0xOUeYlDcO9DSHL1bDTv15cW4+upBl+mcBZrDvU838cn7Bv4GpF+O5MCfw==} hasBin: true peerDependencies: prettier: ^2 || ^3 @@ -8064,6 +8050,10 @@ packages: resolution: {integrity: sha512-Re10+NauLTMCudc7T5WLFLAwDhQ0JWdrMK+9B2M8zR5hRExKmsRDCBA7/aV/pNJFltmBFO5BAMlQFi/vq3nKOg==} engines: {node: '>=6'} + tapable@2.3.0: + resolution: {integrity: sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg==} + engines: {node: '>=6'} + tar@6.2.1: resolution: {integrity: sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==} engines: {node: '>=10'} @@ -8125,12 +8115,12 @@ packages: resolution: {integrity: sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ==} engines: {node: '>=12.0.0'} - tinyrainbow@1.2.0: - resolution: {integrity: sha512-weEDEq7Z5eTHPDh4xjX789+fHfF+P8boiFB+0vbWzpbnbsEr/GRaohi/uMKxg8RZMXnl1ItAi/IUHWMsjDV7kQ==} + tinyrainbow@2.0.0: + resolution: {integrity: sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw==} engines: {node: '>=14.0.0'} - tinyspy@3.0.2: - resolution: {integrity: sha512-n1cw8k1k0x4pgA2+9XrOkFydTerNcJ1zWCO5Nn9scWHTD+5tp8dghT2x1uduQePZTZgd3Tupf+x9BxJjeJi77Q==} + tinyspy@4.0.4: + resolution: {integrity: sha512-azl+t0z7pw/z958Gy9svOTuzqIk6xq+NSheJzn5MMWtWTFywIacg2wUlzKFGtt3cthx0r2SxMK0yzJOR0IES7Q==} engines: {node: '>=14.0.0'} tldts-core@7.0.10: @@ -8212,15 +8202,6 @@ packages: ts-pattern@5.7.1: resolution: {integrity: sha512-EGs8PguQqAAUIcQfK4E9xdXxB6s2GK4sJfT/vcc9V1ELIvC4LH/zXu2t/5fajtv6oiRCxdv7BgtVK3vWgROxag==} - ts-pnp@1.2.0: - resolution: {integrity: sha512-csd+vJOb/gkzvcCHgTGSChYpy5f1/XKNsmvBGO4JXS+z1v2HobugDz4s1IeFXM3wZB44uczs+eazB5Q/ccdhQw==} - engines: {node: '>=6'} - peerDependencies: - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - tsconfig-paths-webpack-plugin@4.2.0: resolution: {integrity: sha512-zbem3rfRS8BgeNK50Zz5SIQgXzLafiHjOwUAvk/38/o1jHn/V5QAgVUcz884or7WYcPaH3N2CIfUc2u0ul7UcA==} engines: {node: '>=10.13.0'} @@ -8241,9 +8222,6 @@ packages: tty-browserify@0.0.1: resolution: {integrity: sha512-C3TaO7K81YvjCgQH9Q1S3R3P3BtN3RIM8n+OvX4il1K1zgE8ZhI0op7kClgkxtutIE8hQrcrHBXvIheqKUUCxw==} - tween-functions@1.2.0: - resolution: {integrity: sha512-PZBtLYcCLtEcjL14Fzb1gSxPBeL7nWvGhO5ZFPGqziCcr8uvHp0NDmdjBchp6KHL+tExcg0m3NISmKxhU394dA==} - type-check@0.4.0: resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} engines: {node: '>= 0.8.0'} @@ -8296,6 +8274,10 @@ packages: resolution: {integrity: sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==} engines: {node: '>=4'} + unicorn-magic@0.1.0: + resolution: {integrity: sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ==} + engines: {node: '>=18'} + unified@11.0.5: resolution: {integrity: sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==} @@ -8433,10 +8415,6 @@ packages: resolution: {integrity: sha512-0/A9rDy9P7cJ+8w1c9WD9V//9Wj15Ce2MPz8Ri6032usz+NfePxx5AcN3bN+r6ZL6jEo066/yNYB3tn4pQEx+A==} hasBin: true - uuid@9.0.1: - resolution: {integrity: sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==} - hasBin: true - v8-compile-cache-lib@3.0.1: resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} @@ -8453,6 +8431,46 @@ packages: vfile@6.0.3: resolution: {integrity: sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==} + vite@6.2.7: + resolution: {integrity: sha512-qg3LkeuinTrZoJHHF94coSaTfIPyBYoywp+ys4qu20oSJFbKMYoIJo0FWJT9q6Vp49l6z9IsJRbHdcGtiKbGoQ==} + engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} + hasBin: true + peerDependencies: + '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0 + jiti: '>=1.21.0' + less: '*' + lightningcss: ^1.21.0 + sass: '*' + sass-embedded: '*' + stylus: '*' + sugarss: '*' + terser: ^5.16.0 + tsx: ^4.8.1 + yaml: ^2.4.2 + peerDependenciesMeta: + '@types/node': + optional: true + jiti: + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + sass-embedded: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + tsx: + optional: true + yaml: + optional: true + vm-browserify@1.1.2: resolution: {integrity: sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==} @@ -8533,8 +8551,8 @@ packages: webpack-virtual-modules@0.6.2: resolution: {integrity: sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==} - webpack@5.100.2: - resolution: {integrity: sha512-QaNKAvGCDRh3wW1dsDjeMdDXwZm2vqq3zn6Pvq4rHOEOGSaUMgOOjG2Y9ZbIGzpfkJk9ZYTHpDqgDfeBDcnLaw==} + webpack@5.102.1: + resolution: {integrity: sha512-7h/weGm9d/ywQ6qzJ+Xy+r9n/3qgp/thalBbpOi5i223dPXKi04IBtqPN9nTd+jBc7QKfvDbaBnFipYp4sJAUQ==} engines: {node: '>=10.13.0'} hasBin: true peerDependencies: @@ -9200,7 +9218,7 @@ snapshots: '@babel/plugin-transform-class-properties@7.27.1(@babel/core@7.28.3)': dependencies: '@babel/core': 7.28.3 - '@babel/helper-create-class-features-plugin': 7.27.1(@babel/core@7.28.3) + '@babel/helper-create-class-features-plugin': 7.28.3(@babel/core@7.28.3) '@babel/helper-plugin-utils': 7.27.1 transitivePeerDependencies: - supports-color @@ -9378,7 +9396,7 @@ snapshots: '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-transform-destructuring': 7.28.0(@babel/core@7.28.3) '@babel/plugin-transform-parameters': 7.27.7(@babel/core@7.28.3) - '@babel/traverse': 7.28.0 + '@babel/traverse': 7.28.3 transitivePeerDependencies: - supports-color @@ -9449,7 +9467,7 @@ snapshots: '@babel/helper-module-imports': 7.27.1 '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.28.3) - '@babel/types': 7.28.1 + '@babel/types': 7.28.4 transitivePeerDependencies: - supports-color @@ -9519,7 +9537,7 @@ snapshots: dependencies: '@babel/core': 7.28.3 '@babel/helper-annotate-as-pure': 7.27.3 - '@babel/helper-create-class-features-plugin': 7.27.1(@babel/core@7.28.3) + '@babel/helper-create-class-features-plugin': 7.28.3(@babel/core@7.28.3) '@babel/helper-plugin-utils': 7.27.1 '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 '@babel/plugin-syntax-typescript': 7.27.1(@babel/core@7.28.3) @@ -9725,18 +9743,17 @@ snapshots: '@chevrotain/utils@11.0.3': {} - '@chromatic-com/storybook@3.2.7(react@19.1.1)(storybook@8.5.0)': + '@chromatic-com/storybook@4.1.1(storybook@9.1.13(@testing-library/dom@10.4.0)(vite@6.2.7(@types/node@18.15.0)(jiti@2.6.1)(sass@1.92.1)(terser@5.43.1)(yaml@2.8.0)))': dependencies: - chromatic: 11.29.0 + '@neoconfetti/react': 1.0.0 + chromatic: 12.2.0 filesize: 10.1.6 jsonfile: 6.1.0 - react-confetti: 6.4.0(react@19.1.1) - storybook: 8.5.0 + storybook: 9.1.13(@testing-library/dom@10.4.0)(vite@6.2.7(@types/node@18.15.0)(jiti@2.6.1)(sass@1.92.1)(terser@5.43.1)(yaml@2.8.0)) strip-ansi: 7.1.0 transitivePeerDependencies: - '@chromatic-com/cypress' - '@chromatic-com/playwright' - - react '@clack/core@0.5.0': dependencies: @@ -9816,6 +9833,8 @@ snapshots: '@emoji-mart/data@1.2.1': {} + '@epic-web/invariant@1.0.0': {} + '@es-joy/jsdoccomment@0.50.2': dependencies: '@types/estree': 1.0.8 @@ -10786,12 +10805,12 @@ snapshots: - supports-color optional: true - '@mdx-js/loader@3.1.0(acorn@8.15.0)(webpack@5.100.2(esbuild@0.25.0)(uglify-js@3.19.3))': + '@mdx-js/loader@3.1.0(acorn@8.15.0)(webpack@5.102.1(esbuild@0.25.0)(uglify-js@3.19.3))': dependencies: '@mdx-js/mdx': 3.1.0(acorn@8.15.0) source-map: 0.7.4 optionalDependencies: - webpack: 5.100.2(esbuild@0.25.0)(uglify-js@3.19.3) + webpack: 5.102.1(esbuild@0.25.0)(uglify-js@3.19.3) transitivePeerDependencies: - acorn - supports-color @@ -10826,12 +10845,6 @@ snapshots: - acorn - supports-color - '@mdx-js/react@3.1.0(@types/react@19.1.11)(react@18.3.1)': - dependencies: - '@types/mdx': 2.0.13 - '@types/react': 19.1.11 - react: 18.3.1 - '@mdx-js/react@3.1.0(@types/react@19.1.11)(react@19.1.1)': dependencies: '@types/mdx': 2.0.13 @@ -10860,6 +10873,8 @@ snapshots: '@tybys/wasm-util': 0.10.1 optional: true + '@neoconfetti/react@1.0.0': {} + '@next/bundle-analyzer@15.5.4': dependencies: webpack-bundle-analyzer: 4.10.1 @@ -10873,11 +10888,11 @@ snapshots: dependencies: fast-glob: 3.3.1 - '@next/mdx@15.5.4(@mdx-js/loader@3.1.0(acorn@8.15.0)(webpack@5.100.2(esbuild@0.25.0)(uglify-js@3.19.3)))(@mdx-js/react@3.1.0(@types/react@19.1.11)(react@19.1.1))': + '@next/mdx@15.5.4(@mdx-js/loader@3.1.0(acorn@8.15.0)(webpack@5.102.1(esbuild@0.25.0)(uglify-js@3.19.3)))(@mdx-js/react@3.1.0(@types/react@19.1.11)(react@19.1.1))': dependencies: source-map: 0.7.6 optionalDependencies: - '@mdx-js/loader': 3.1.0(acorn@8.15.0)(webpack@5.100.2(esbuild@0.25.0)(uglify-js@3.19.3)) + '@mdx-js/loader': 3.1.0(acorn@8.15.0)(webpack@5.102.1(esbuild@0.25.0)(uglify-js@3.19.3)) '@mdx-js/react': 3.1.0(@types/react@19.1.11)(react@19.1.1) '@next/swc-darwin-arm64@15.5.4': @@ -10962,8 +10977,6 @@ snapshots: dependencies: '@nolyfill/shared': 1.0.44 - '@nolyfill/safe-buffer@1.0.44': {} - '@nolyfill/safer-buffer@1.0.44': {} '@nolyfill/shared@1.0.24': {} @@ -11150,7 +11163,7 @@ snapshots: '@pkgr/core@0.2.7': {} - '@pmmmwh/react-refresh-webpack-plugin@0.5.17(react-refresh@0.14.2)(type-fest@2.19.0)(webpack-hot-middleware@2.26.1)(webpack@5.100.2(esbuild@0.25.0)(uglify-js@3.19.3))': + '@pmmmwh/react-refresh-webpack-plugin@0.5.17(react-refresh@0.14.2)(type-fest@2.19.0)(webpack-hot-middleware@2.26.1)(webpack@5.102.1(esbuild@0.25.0)(uglify-js@3.19.3))': dependencies: ansi-html: 0.0.9 core-js-pure: 3.44.0 @@ -11158,9 +11171,9 @@ snapshots: html-entities: 2.6.0 loader-utils: 2.0.4 react-refresh: 0.14.2 - schema-utils: 4.3.2 - source-map: 0.7.4 - webpack: 5.100.2(esbuild@0.25.0)(uglify-js@3.19.3) + schema-utils: 4.3.3 + source-map: 0.7.6 + webpack: 5.102.1(esbuild@0.25.0)(uglify-js@3.19.3) optionalDependencies: type-fest: 2.19.0 webpack-hot-middleware: 2.26.1 @@ -11361,29 +11374,29 @@ snapshots: dependencies: react: 19.1.1 - '@reactflow/background@11.3.14(@types/react@19.1.11)(immer@9.0.21)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': + '@reactflow/background@11.3.14(@types/react@19.1.11)(immer@10.1.3)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': dependencies: - '@reactflow/core': 11.11.4(@types/react@19.1.11)(immer@9.0.21)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@reactflow/core': 11.11.4(@types/react@19.1.11)(immer@10.1.3)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) classcat: 5.0.5 react: 19.1.1 react-dom: 19.1.1(react@19.1.1) - zustand: 4.5.7(@types/react@19.1.11)(immer@9.0.21)(react@19.1.1) + zustand: 4.5.7(@types/react@19.1.11)(immer@10.1.3)(react@19.1.1) transitivePeerDependencies: - '@types/react' - immer - '@reactflow/controls@11.2.14(@types/react@19.1.11)(immer@9.0.21)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': + '@reactflow/controls@11.2.14(@types/react@19.1.11)(immer@10.1.3)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': dependencies: - '@reactflow/core': 11.11.4(@types/react@19.1.11)(immer@9.0.21)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@reactflow/core': 11.11.4(@types/react@19.1.11)(immer@10.1.3)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) classcat: 5.0.5 react: 19.1.1 react-dom: 19.1.1(react@19.1.1) - zustand: 4.5.7(@types/react@19.1.11)(immer@9.0.21)(react@19.1.1) + zustand: 4.5.7(@types/react@19.1.11)(immer@10.1.3)(react@19.1.1) transitivePeerDependencies: - '@types/react' - immer - '@reactflow/core@11.11.4(@types/react@19.1.11)(immer@9.0.21)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': + '@reactflow/core@11.11.4(@types/react@19.1.11)(immer@10.1.3)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': dependencies: '@types/d3': 7.4.3 '@types/d3-drag': 3.0.7 @@ -11395,14 +11408,14 @@ snapshots: d3-zoom: 3.0.0 react: 19.1.1 react-dom: 19.1.1(react@19.1.1) - zustand: 4.5.7(@types/react@19.1.11)(immer@9.0.21)(react@19.1.1) + zustand: 4.5.7(@types/react@19.1.11)(immer@10.1.3)(react@19.1.1) transitivePeerDependencies: - '@types/react' - immer - '@reactflow/minimap@11.7.14(@types/react@19.1.11)(immer@9.0.21)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': + '@reactflow/minimap@11.7.14(@types/react@19.1.11)(immer@10.1.3)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': dependencies: - '@reactflow/core': 11.11.4(@types/react@19.1.11)(immer@9.0.21)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@reactflow/core': 11.11.4(@types/react@19.1.11)(immer@10.1.3)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) '@types/d3-selection': 3.0.11 '@types/d3-zoom': 3.0.8 classcat: 5.0.5 @@ -11410,31 +11423,31 @@ snapshots: d3-zoom: 3.0.0 react: 19.1.1 react-dom: 19.1.1(react@19.1.1) - zustand: 4.5.7(@types/react@19.1.11)(immer@9.0.21)(react@19.1.1) + zustand: 4.5.7(@types/react@19.1.11)(immer@10.1.3)(react@19.1.1) transitivePeerDependencies: - '@types/react' - immer - '@reactflow/node-resizer@2.2.14(@types/react@19.1.11)(immer@9.0.21)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': + '@reactflow/node-resizer@2.2.14(@types/react@19.1.11)(immer@10.1.3)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': dependencies: - '@reactflow/core': 11.11.4(@types/react@19.1.11)(immer@9.0.21)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@reactflow/core': 11.11.4(@types/react@19.1.11)(immer@10.1.3)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) classcat: 5.0.5 d3-drag: 3.0.0 d3-selection: 3.0.0 react: 19.1.1 react-dom: 19.1.1(react@19.1.1) - zustand: 4.5.7(@types/react@19.1.11)(immer@9.0.21)(react@19.1.1) + zustand: 4.5.7(@types/react@19.1.11)(immer@10.1.3)(react@19.1.1) transitivePeerDependencies: - '@types/react' - immer - '@reactflow/node-toolbar@1.3.14(@types/react@19.1.11)(immer@9.0.21)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': + '@reactflow/node-toolbar@1.3.14(@types/react@19.1.11)(immer@10.1.3)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': dependencies: - '@reactflow/core': 11.11.4(@types/react@19.1.11)(immer@9.0.21)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@reactflow/core': 11.11.4(@types/react@19.1.11)(immer@10.1.3)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) classcat: 5.0.5 react: 19.1.1 react-dom: 19.1.1(react@19.1.1) - zustand: 4.5.7(@types/react@19.1.11)(immer@9.0.21)(react@19.1.1) + zustand: 4.5.7(@types/react@19.1.11)(immer@10.1.3)(react@19.1.1) transitivePeerDependencies: - '@types/react' - immer @@ -11479,6 +11492,72 @@ snapshots: picomatch: 2.3.1 rollup: 2.79.2 + '@rollup/rollup-android-arm-eabi@4.52.5': + optional: true + + '@rollup/rollup-android-arm64@4.52.5': + optional: true + + '@rollup/rollup-darwin-arm64@4.52.5': + optional: true + + '@rollup/rollup-darwin-x64@4.52.5': + optional: true + + '@rollup/rollup-freebsd-arm64@4.52.5': + optional: true + + '@rollup/rollup-freebsd-x64@4.52.5': + optional: true + + '@rollup/rollup-linux-arm-gnueabihf@4.52.5': + optional: true + + '@rollup/rollup-linux-arm-musleabihf@4.52.5': + optional: true + + '@rollup/rollup-linux-arm64-gnu@4.52.5': + optional: true + + '@rollup/rollup-linux-arm64-musl@4.52.5': + optional: true + + '@rollup/rollup-linux-loong64-gnu@4.52.5': + optional: true + + '@rollup/rollup-linux-ppc64-gnu@4.52.5': + optional: true + + '@rollup/rollup-linux-riscv64-gnu@4.52.5': + optional: true + + '@rollup/rollup-linux-riscv64-musl@4.52.5': + optional: true + + '@rollup/rollup-linux-s390x-gnu@4.52.5': + optional: true + + '@rollup/rollup-linux-x64-gnu@4.52.5': + optional: true + + '@rollup/rollup-linux-x64-musl@4.52.5': + optional: true + + '@rollup/rollup-openharmony-arm64@4.52.5': + optional: true + + '@rollup/rollup-win32-arm64-msvc@4.52.5': + optional: true + + '@rollup/rollup-win32-ia32-msvc@4.52.5': + optional: true + + '@rollup/rollup-win32-x64-gnu@4.52.5': + optional: true + + '@rollup/rollup-win32-x64-msvc@4.52.5': + optional: true + '@sentry-internal/browser-utils@8.55.0': dependencies: '@sentry/core': 8.55.0 @@ -11526,146 +11605,51 @@ snapshots: dependencies: '@sinonjs/commons': 3.0.1 - '@storybook/addon-actions@8.5.0(storybook@8.5.0)': + '@storybook/addon-docs@9.1.13(@types/react@19.1.11)(storybook@9.1.13(@testing-library/dom@10.4.0)(vite@6.2.7(@types/node@18.15.0)(jiti@2.6.1)(sass@1.92.1)(terser@5.43.1)(yaml@2.8.0)))': dependencies: - '@storybook/global': 5.0.0 - '@types/uuid': 9.0.8 - dequal: 2.0.3 - polished: 4.3.1 - storybook: 8.5.0 - uuid: 9.0.1 - - '@storybook/addon-backgrounds@8.5.0(storybook@8.5.0)': - dependencies: - '@storybook/global': 5.0.0 - memoizerific: 1.11.3 - storybook: 8.5.0 - ts-dedent: 2.2.0 - - '@storybook/addon-controls@8.5.0(storybook@8.5.0)': - dependencies: - '@storybook/global': 5.0.0 - dequal: 2.0.3 - storybook: 8.5.0 - ts-dedent: 2.2.0 - - '@storybook/addon-docs@8.5.0(@types/react@19.1.11)(storybook@8.5.0)': - dependencies: - '@mdx-js/react': 3.1.0(@types/react@19.1.11)(react@18.3.1) - '@storybook/blocks': 8.5.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@8.5.0) - '@storybook/csf-plugin': 8.5.0(storybook@8.5.0) - '@storybook/react-dom-shim': 8.5.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@8.5.0) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - storybook: 8.5.0 + '@mdx-js/react': 3.1.0(@types/react@19.1.11)(react@19.1.1) + '@storybook/csf-plugin': 9.1.13(storybook@9.1.13(@testing-library/dom@10.4.0)(vite@6.2.7(@types/node@18.15.0)(jiti@2.6.1)(sass@1.92.1)(terser@5.43.1)(yaml@2.8.0))) + '@storybook/icons': 1.6.0(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@storybook/react-dom-shim': 9.1.13(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(storybook@9.1.13(@testing-library/dom@10.4.0)(vite@6.2.7(@types/node@18.15.0)(jiti@2.6.1)(sass@1.92.1)(terser@5.43.1)(yaml@2.8.0))) + react: 19.1.1 + react-dom: 19.1.1(react@19.1.1) + storybook: 9.1.13(@testing-library/dom@10.4.0)(vite@6.2.7(@types/node@18.15.0)(jiti@2.6.1)(sass@1.92.1)(terser@5.43.1)(yaml@2.8.0)) ts-dedent: 2.2.0 transitivePeerDependencies: - '@types/react' - '@storybook/addon-essentials@8.5.0(@types/react@19.1.11)(storybook@8.5.0)': - dependencies: - '@storybook/addon-actions': 8.5.0(storybook@8.5.0) - '@storybook/addon-backgrounds': 8.5.0(storybook@8.5.0) - '@storybook/addon-controls': 8.5.0(storybook@8.5.0) - '@storybook/addon-docs': 8.5.0(@types/react@19.1.11)(storybook@8.5.0) - '@storybook/addon-highlight': 8.5.0(storybook@8.5.0) - '@storybook/addon-measure': 8.5.0(storybook@8.5.0) - '@storybook/addon-outline': 8.5.0(storybook@8.5.0) - '@storybook/addon-toolbars': 8.5.0(storybook@8.5.0) - '@storybook/addon-viewport': 8.5.0(storybook@8.5.0) - storybook: 8.5.0 - ts-dedent: 2.2.0 - transitivePeerDependencies: - - '@types/react' - - '@storybook/addon-highlight@8.5.0(storybook@8.5.0)': + '@storybook/addon-links@9.1.13(react@19.1.1)(storybook@9.1.13(@testing-library/dom@10.4.0)(vite@6.2.7(@types/node@18.15.0)(jiti@2.6.1)(sass@1.92.1)(terser@5.43.1)(yaml@2.8.0)))': dependencies: '@storybook/global': 5.0.0 - storybook: 8.5.0 - - '@storybook/addon-interactions@8.5.0(storybook@8.5.0)': - dependencies: - '@storybook/global': 5.0.0 - '@storybook/instrumenter': 8.5.0(storybook@8.5.0) - '@storybook/test': 8.5.0(storybook@8.5.0) - polished: 4.3.1 - storybook: 8.5.0 - ts-dedent: 2.2.0 - - '@storybook/addon-links@8.5.0(react@19.1.1)(storybook@8.5.0)': - dependencies: - '@storybook/csf': 0.1.12 - '@storybook/global': 5.0.0 - storybook: 8.5.0 - ts-dedent: 2.2.0 + storybook: 9.1.13(@testing-library/dom@10.4.0)(vite@6.2.7(@types/node@18.15.0)(jiti@2.6.1)(sass@1.92.1)(terser@5.43.1)(yaml@2.8.0)) optionalDependencies: react: 19.1.1 - '@storybook/addon-measure@8.5.0(storybook@8.5.0)': + '@storybook/addon-onboarding@9.1.13(storybook@9.1.13(@testing-library/dom@10.4.0)(vite@6.2.7(@types/node@18.15.0)(jiti@2.6.1)(sass@1.92.1)(terser@5.43.1)(yaml@2.8.0)))': dependencies: - '@storybook/global': 5.0.0 - storybook: 8.5.0 - tiny-invariant: 1.3.3 + storybook: 9.1.13(@testing-library/dom@10.4.0)(vite@6.2.7(@types/node@18.15.0)(jiti@2.6.1)(sass@1.92.1)(terser@5.43.1)(yaml@2.8.0)) - '@storybook/addon-onboarding@8.5.0(storybook@8.5.0)': + '@storybook/addon-themes@9.1.13(storybook@9.1.13(@testing-library/dom@10.4.0)(vite@6.2.7(@types/node@18.15.0)(jiti@2.6.1)(sass@1.92.1)(terser@5.43.1)(yaml@2.8.0)))': dependencies: - storybook: 8.5.0 - - '@storybook/addon-outline@8.5.0(storybook@8.5.0)': - dependencies: - '@storybook/global': 5.0.0 - storybook: 8.5.0 + storybook: 9.1.13(@testing-library/dom@10.4.0)(vite@6.2.7(@types/node@18.15.0)(jiti@2.6.1)(sass@1.92.1)(terser@5.43.1)(yaml@2.8.0)) ts-dedent: 2.2.0 - '@storybook/addon-themes@8.5.0(storybook@8.5.0)': + '@storybook/builder-webpack5@9.1.13(esbuild@0.25.0)(storybook@9.1.13(@testing-library/dom@10.4.0)(vite@6.2.7(@types/node@18.15.0)(jiti@2.6.1)(sass@1.92.1)(terser@5.43.1)(yaml@2.8.0)))(typescript@5.8.3)(uglify-js@3.19.3)': dependencies: - storybook: 8.5.0 - ts-dedent: 2.2.0 - - '@storybook/addon-toolbars@8.5.0(storybook@8.5.0)': - dependencies: - storybook: 8.5.0 - - '@storybook/addon-viewport@8.5.0(storybook@8.5.0)': - dependencies: - memoizerific: 1.11.3 - storybook: 8.5.0 - - '@storybook/blocks@8.5.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@8.5.0)': - dependencies: - '@storybook/csf': 0.1.12 - '@storybook/icons': 1.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - storybook: 8.5.0 - ts-dedent: 2.2.0 - optionalDependencies: - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - - '@storybook/builder-webpack5@8.5.0(esbuild@0.25.0)(storybook@8.5.0)(typescript@5.8.3)(uglify-js@3.19.3)': - dependencies: - '@storybook/core-webpack': 8.5.0(storybook@8.5.0) - '@types/semver': 7.7.0 - browser-assert: 1.2.1 + '@storybook/core-webpack': 9.1.13(storybook@9.1.13(@testing-library/dom@10.4.0)(vite@6.2.7(@types/node@18.15.0)(jiti@2.6.1)(sass@1.92.1)(terser@5.43.1)(yaml@2.8.0))) case-sensitive-paths-webpack-plugin: 2.4.0 cjs-module-lexer: 1.4.3 - constants-browserify: 1.0.0 - css-loader: 6.11.0(webpack@5.100.2(esbuild@0.25.0)(uglify-js@3.19.3)) + css-loader: 6.11.0(webpack@5.102.1(esbuild@0.25.0)(uglify-js@3.19.3)) es-module-lexer: 1.7.0 - fork-ts-checker-webpack-plugin: 8.0.0(typescript@5.8.3)(webpack@5.100.2(esbuild@0.25.0)(uglify-js@3.19.3)) - html-webpack-plugin: 5.6.3(webpack@5.100.2(esbuild@0.25.0)(uglify-js@3.19.3)) - magic-string: 0.30.17 - path-browserify: 1.0.1 - process: 0.11.10 - semver: 7.7.2 - storybook: 8.5.0 - style-loader: 3.3.4(webpack@5.100.2(esbuild@0.25.0)(uglify-js@3.19.3)) - terser-webpack-plugin: 5.3.14(esbuild@0.25.0)(uglify-js@3.19.3)(webpack@5.100.2(esbuild@0.25.0)(uglify-js@3.19.3)) + fork-ts-checker-webpack-plugin: 8.0.0(typescript@5.8.3)(webpack@5.102.1(esbuild@0.25.0)(uglify-js@3.19.3)) + html-webpack-plugin: 5.5.4(webpack@5.102.1(esbuild@0.25.0)(uglify-js@3.19.3)) + magic-string: 0.30.19 + storybook: 9.1.13(@testing-library/dom@10.4.0)(vite@6.2.7(@types/node@18.15.0)(jiti@2.6.1)(sass@1.92.1)(terser@5.43.1)(yaml@2.8.0)) + style-loader: 3.3.4(webpack@5.102.1(esbuild@0.25.0)(uglify-js@3.19.3)) + terser-webpack-plugin: 5.3.14(esbuild@0.25.0)(uglify-js@3.19.3)(webpack@5.102.1(esbuild@0.25.0)(uglify-js@3.19.3)) ts-dedent: 2.2.0 - url: 0.11.4 - util: 0.12.5 - util-deprecate: 1.0.2 - webpack: 5.100.2(esbuild@0.25.0)(uglify-js@3.19.3) - webpack-dev-middleware: 6.1.3(webpack@5.100.2(esbuild@0.25.0)(uglify-js@3.19.3)) + webpack: 5.102.1(esbuild@0.25.0)(uglify-js@3.19.3) + webpack-dev-middleware: 6.1.3(webpack@5.102.1(esbuild@0.25.0)(uglify-js@3.19.3)) webpack-hot-middleware: 2.26.1 webpack-virtual-modules: 0.6.2 optionalDependencies: @@ -11677,64 +11661,24 @@ snapshots: - uglify-js - webpack-cli - '@storybook/components@8.5.0(storybook@8.5.0)': + '@storybook/core-webpack@9.1.13(storybook@9.1.13(@testing-library/dom@10.4.0)(vite@6.2.7(@types/node@18.15.0)(jiti@2.6.1)(sass@1.92.1)(terser@5.43.1)(yaml@2.8.0)))': dependencies: - storybook: 8.5.0 - - '@storybook/core-webpack@8.5.0(storybook@8.5.0)': - dependencies: - storybook: 8.5.0 + storybook: 9.1.13(@testing-library/dom@10.4.0)(vite@6.2.7(@types/node@18.15.0)(jiti@2.6.1)(sass@1.92.1)(terser@5.43.1)(yaml@2.8.0)) ts-dedent: 2.2.0 - '@storybook/core@8.5.0': + '@storybook/csf-plugin@9.1.13(storybook@9.1.13(@testing-library/dom@10.4.0)(vite@6.2.7(@types/node@18.15.0)(jiti@2.6.1)(sass@1.92.1)(terser@5.43.1)(yaml@2.8.0)))': dependencies: - '@storybook/csf': 0.1.12 - better-opn: 3.0.2 - browser-assert: 1.2.1 - esbuild: 0.25.0 - esbuild-register: 3.6.0(esbuild@0.25.0) - jsdoc-type-pratt-parser: 4.1.0 - process: 0.11.10 - recast: 0.23.11 - semver: 7.7.2 - util: 0.12.5 - ws: 8.18.3 - transitivePeerDependencies: - - bufferutil - - supports-color - - utf-8-validate - - '@storybook/csf-plugin@8.5.0(storybook@8.5.0)': - dependencies: - storybook: 8.5.0 + storybook: 9.1.13(@testing-library/dom@10.4.0)(vite@6.2.7(@types/node@18.15.0)(jiti@2.6.1)(sass@1.92.1)(terser@5.43.1)(yaml@2.8.0)) unplugin: 1.16.1 - '@storybook/csf@0.1.12': - dependencies: - type-fest: 2.19.0 - - '@storybook/csf@0.1.13': - dependencies: - type-fest: 2.19.0 - '@storybook/global@5.0.0': {} - '@storybook/icons@1.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@storybook/icons@1.6.0(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': dependencies: - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) + react: 19.1.1 + react-dom: 19.1.1(react@19.1.1) - '@storybook/instrumenter@8.5.0(storybook@8.5.0)': - dependencies: - '@storybook/global': 5.0.0 - '@vitest/utils': 2.1.9 - storybook: 8.5.0 - - '@storybook/manager-api@8.5.0(storybook@8.5.0)': - dependencies: - storybook: 8.5.0 - - '@storybook/nextjs@8.5.0(esbuild@0.25.0)(next@15.5.4(@babel/core@7.28.3)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(sass@1.92.1))(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(sass@1.92.1)(storybook@8.5.0)(type-fest@2.19.0)(typescript@5.8.3)(uglify-js@3.19.3)(webpack-hot-middleware@2.26.1)(webpack@5.100.2(esbuild@0.25.0)(uglify-js@3.19.3))': + '@storybook/nextjs@9.1.13(esbuild@0.25.0)(next@15.5.4(@babel/core@7.28.3)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(sass@1.92.1))(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(sass@1.92.1)(storybook@9.1.13(@testing-library/dom@10.4.0)(vite@6.2.7(@types/node@18.15.0)(jiti@2.6.1)(sass@1.92.1)(terser@5.43.1)(yaml@2.8.0)))(type-fest@2.19.0)(typescript@5.8.3)(uglify-js@3.19.3)(webpack-hot-middleware@2.26.1)(webpack@5.102.1(esbuild@0.25.0)(uglify-js@3.19.3))': dependencies: '@babel/core': 7.28.3 '@babel/plugin-syntax-bigint': 7.8.3(@babel/core@7.28.3) @@ -11748,39 +11692,34 @@ snapshots: '@babel/preset-env': 7.28.3(@babel/core@7.28.3) '@babel/preset-react': 7.27.1(@babel/core@7.28.3) '@babel/preset-typescript': 7.27.1(@babel/core@7.28.3) - '@babel/runtime': 7.27.6 - '@pmmmwh/react-refresh-webpack-plugin': 0.5.17(react-refresh@0.14.2)(type-fest@2.19.0)(webpack-hot-middleware@2.26.1)(webpack@5.100.2(esbuild@0.25.0)(uglify-js@3.19.3)) - '@storybook/builder-webpack5': 8.5.0(esbuild@0.25.0)(storybook@8.5.0)(typescript@5.8.3)(uglify-js@3.19.3) - '@storybook/preset-react-webpack': 8.5.0(@storybook/test@8.5.0(storybook@8.5.0))(esbuild@0.25.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(storybook@8.5.0)(typescript@5.8.3)(uglify-js@3.19.3) - '@storybook/react': 8.5.0(@storybook/test@8.5.0(storybook@8.5.0))(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(storybook@8.5.0)(typescript@5.8.3) - '@storybook/test': 8.5.0(storybook@8.5.0) + '@babel/runtime': 7.28.4 + '@pmmmwh/react-refresh-webpack-plugin': 0.5.17(react-refresh@0.14.2)(type-fest@2.19.0)(webpack-hot-middleware@2.26.1)(webpack@5.102.1(esbuild@0.25.0)(uglify-js@3.19.3)) + '@storybook/builder-webpack5': 9.1.13(esbuild@0.25.0)(storybook@9.1.13(@testing-library/dom@10.4.0)(vite@6.2.7(@types/node@18.15.0)(jiti@2.6.1)(sass@1.92.1)(terser@5.43.1)(yaml@2.8.0)))(typescript@5.8.3)(uglify-js@3.19.3) + '@storybook/preset-react-webpack': 9.1.13(esbuild@0.25.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(storybook@9.1.13(@testing-library/dom@10.4.0)(vite@6.2.7(@types/node@18.15.0)(jiti@2.6.1)(sass@1.92.1)(terser@5.43.1)(yaml@2.8.0)))(typescript@5.8.3)(uglify-js@3.19.3) + '@storybook/react': 9.1.13(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(storybook@9.1.13(@testing-library/dom@10.4.0)(vite@6.2.7(@types/node@18.15.0)(jiti@2.6.1)(sass@1.92.1)(terser@5.43.1)(yaml@2.8.0)))(typescript@5.8.3) '@types/semver': 7.7.0 - babel-loader: 9.2.1(@babel/core@7.28.3)(webpack@5.100.2(esbuild@0.25.0)(uglify-js@3.19.3)) - css-loader: 6.11.0(webpack@5.100.2(esbuild@0.25.0)(uglify-js@3.19.3)) - find-up: 5.0.0 - image-size: 1.2.1 + babel-loader: 9.2.1(@babel/core@7.28.3)(webpack@5.102.1(esbuild@0.25.0)(uglify-js@3.19.3)) + css-loader: 6.11.0(webpack@5.102.1(esbuild@0.25.0)(uglify-js@3.19.3)) + image-size: 2.0.2 loader-utils: 3.3.1 next: 15.5.4(@babel/core@7.28.3)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(sass@1.92.1) - node-polyfill-webpack-plugin: 2.0.1(webpack@5.100.2(esbuild@0.25.0)(uglify-js@3.19.3)) - pnp-webpack-plugin: 1.7.0(typescript@5.8.3) + node-polyfill-webpack-plugin: 2.0.1(webpack@5.102.1(esbuild@0.25.0)(uglify-js@3.19.3)) postcss: 8.5.6 - postcss-loader: 8.1.1(postcss@8.5.6)(typescript@5.8.3)(webpack@5.100.2(esbuild@0.25.0)(uglify-js@3.19.3)) + postcss-loader: 8.1.1(postcss@8.5.6)(typescript@5.8.3)(webpack@5.102.1(esbuild@0.25.0)(uglify-js@3.19.3)) react: 19.1.1 react-dom: 19.1.1(react@19.1.1) react-refresh: 0.14.2 resolve-url-loader: 5.0.0 - sass-loader: 14.2.1(sass@1.92.1)(webpack@5.100.2(esbuild@0.25.0)(uglify-js@3.19.3)) + sass-loader: 16.0.5(sass@1.92.1)(webpack@5.102.1(esbuild@0.25.0)(uglify-js@3.19.3)) semver: 7.7.2 - storybook: 8.5.0 - style-loader: 3.3.4(webpack@5.100.2(esbuild@0.25.0)(uglify-js@3.19.3)) + storybook: 9.1.13(@testing-library/dom@10.4.0)(vite@6.2.7(@types/node@18.15.0)(jiti@2.6.1)(sass@1.92.1)(terser@5.43.1)(yaml@2.8.0)) + style-loader: 3.3.4(webpack@5.102.1(esbuild@0.25.0)(uglify-js@3.19.3)) styled-jsx: 5.1.7(@babel/core@7.28.3)(react@19.1.1) - ts-dedent: 2.2.0 tsconfig-paths: 4.2.0 tsconfig-paths-webpack-plugin: 4.2.0 optionalDependencies: - sharp: 0.33.5 typescript: 5.8.3 - webpack: 5.100.2(esbuild@0.25.0)(uglify-js@3.19.3) + webpack: 5.102.1(esbuild@0.25.0)(uglify-js@3.19.3) transitivePeerDependencies: - '@rspack/core' - '@swc/core' @@ -11799,39 +11738,33 @@ snapshots: - webpack-hot-middleware - webpack-plugin-serve - '@storybook/preset-react-webpack@8.5.0(@storybook/test@8.5.0(storybook@8.5.0))(esbuild@0.25.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(storybook@8.5.0)(typescript@5.8.3)(uglify-js@3.19.3)': + '@storybook/preset-react-webpack@9.1.13(esbuild@0.25.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(storybook@9.1.13(@testing-library/dom@10.4.0)(vite@6.2.7(@types/node@18.15.0)(jiti@2.6.1)(sass@1.92.1)(terser@5.43.1)(yaml@2.8.0)))(typescript@5.8.3)(uglify-js@3.19.3)': dependencies: - '@storybook/core-webpack': 8.5.0(storybook@8.5.0) - '@storybook/react': 8.5.0(@storybook/test@8.5.0(storybook@8.5.0))(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(storybook@8.5.0)(typescript@5.8.3) - '@storybook/react-docgen-typescript-plugin': 1.0.6--canary.9.0c3f3b7.0(typescript@5.8.3)(webpack@5.100.2(esbuild@0.25.0)(uglify-js@3.19.3)) + '@storybook/core-webpack': 9.1.13(storybook@9.1.13(@testing-library/dom@10.4.0)(vite@6.2.7(@types/node@18.15.0)(jiti@2.6.1)(sass@1.92.1)(terser@5.43.1)(yaml@2.8.0))) + '@storybook/react-docgen-typescript-plugin': 1.0.6--canary.9.0c3f3b7.0(typescript@5.8.3)(webpack@5.102.1(esbuild@0.25.0)(uglify-js@3.19.3)) '@types/semver': 7.7.0 - find-up: 5.0.0 - magic-string: 0.30.17 + find-up: 7.0.0 + magic-string: 0.30.19 react: 19.1.1 react-docgen: 7.1.1 react-dom: 19.1.1(react@19.1.1) resolve: 1.22.10 semver: 7.7.2 - storybook: 8.5.0 + storybook: 9.1.13(@testing-library/dom@10.4.0)(vite@6.2.7(@types/node@18.15.0)(jiti@2.6.1)(sass@1.92.1)(terser@5.43.1)(yaml@2.8.0)) tsconfig-paths: 4.2.0 - webpack: 5.100.2(esbuild@0.25.0)(uglify-js@3.19.3) + webpack: 5.102.1(esbuild@0.25.0)(uglify-js@3.19.3) optionalDependencies: typescript: 5.8.3 transitivePeerDependencies: - - '@storybook/test' - '@swc/core' - esbuild - supports-color - uglify-js - webpack-cli - '@storybook/preview-api@8.5.0(storybook@8.5.0)': + '@storybook/react-docgen-typescript-plugin@1.0.6--canary.9.0c3f3b7.0(typescript@5.8.3)(webpack@5.102.1(esbuild@0.25.0)(uglify-js@3.19.3))': dependencies: - storybook: 8.5.0 - - '@storybook/react-docgen-typescript-plugin@1.0.6--canary.9.0c3f3b7.0(typescript@5.8.3)(webpack@5.100.2(esbuild@0.25.0)(uglify-js@3.19.3))': - dependencies: - debug: 4.4.1 + debug: 4.4.3 endent: 2.1.0 find-cache-dir: 3.3.2 flat-cache: 3.2.0 @@ -11839,53 +11772,26 @@ snapshots: react-docgen-typescript: 2.4.0(typescript@5.8.3) tslib: 2.8.1 typescript: 5.8.3 - webpack: 5.100.2(esbuild@0.25.0)(uglify-js@3.19.3) + webpack: 5.102.1(esbuild@0.25.0)(uglify-js@3.19.3) transitivePeerDependencies: - supports-color - '@storybook/react-dom-shim@8.5.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@8.5.0)': - dependencies: - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - storybook: 8.5.0 - - '@storybook/react-dom-shim@8.5.0(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(storybook@8.5.0)': + '@storybook/react-dom-shim@9.1.13(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(storybook@9.1.13(@testing-library/dom@10.4.0)(vite@6.2.7(@types/node@18.15.0)(jiti@2.6.1)(sass@1.92.1)(terser@5.43.1)(yaml@2.8.0)))': dependencies: react: 19.1.1 react-dom: 19.1.1(react@19.1.1) - storybook: 8.5.0 + storybook: 9.1.13(@testing-library/dom@10.4.0)(vite@6.2.7(@types/node@18.15.0)(jiti@2.6.1)(sass@1.92.1)(terser@5.43.1)(yaml@2.8.0)) - '@storybook/react@8.5.0(@storybook/test@8.5.0(storybook@8.5.0))(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(storybook@8.5.0)(typescript@5.8.3)': + '@storybook/react@9.1.13(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(storybook@9.1.13(@testing-library/dom@10.4.0)(vite@6.2.7(@types/node@18.15.0)(jiti@2.6.1)(sass@1.92.1)(terser@5.43.1)(yaml@2.8.0)))(typescript@5.8.3)': dependencies: - '@storybook/components': 8.5.0(storybook@8.5.0) '@storybook/global': 5.0.0 - '@storybook/manager-api': 8.5.0(storybook@8.5.0) - '@storybook/preview-api': 8.5.0(storybook@8.5.0) - '@storybook/react-dom-shim': 8.5.0(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(storybook@8.5.0) - '@storybook/theming': 8.5.0(storybook@8.5.0) + '@storybook/react-dom-shim': 9.1.13(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(storybook@9.1.13(@testing-library/dom@10.4.0)(vite@6.2.7(@types/node@18.15.0)(jiti@2.6.1)(sass@1.92.1)(terser@5.43.1)(yaml@2.8.0))) react: 19.1.1 react-dom: 19.1.1(react@19.1.1) - storybook: 8.5.0 + storybook: 9.1.13(@testing-library/dom@10.4.0)(vite@6.2.7(@types/node@18.15.0)(jiti@2.6.1)(sass@1.92.1)(terser@5.43.1)(yaml@2.8.0)) optionalDependencies: - '@storybook/test': 8.5.0(storybook@8.5.0) typescript: 5.8.3 - '@storybook/test@8.5.0(storybook@8.5.0)': - dependencies: - '@storybook/csf': 0.1.12 - '@storybook/global': 5.0.0 - '@storybook/instrumenter': 8.5.0(storybook@8.5.0) - '@testing-library/dom': 10.4.0 - '@testing-library/jest-dom': 6.5.0 - '@testing-library/user-event': 14.5.2(@testing-library/dom@10.4.0) - '@vitest/expect': 2.0.5 - '@vitest/spy': 2.0.5 - storybook: 8.5.0 - - '@storybook/theming@8.5.0(storybook@8.5.0)': - dependencies: - storybook: 8.5.0 - '@stylistic/eslint-plugin@5.2.2(eslint@9.35.0(jiti@2.6.1))': dependencies: '@eslint-community/eslint-utils': 4.7.0(eslint@9.35.0(jiti@2.6.1)) @@ -11982,16 +11888,6 @@ snapshots: lz-string: 1.5.0 pretty-format: 27.5.1 - '@testing-library/jest-dom@6.5.0': - dependencies: - '@adobe/css-tools': 4.4.4 - aria-query: 5.3.2 - chalk: 3.0.0 - css.escape: 1.5.1 - dom-accessibility-api: 0.6.3 - lodash: 4.17.21 - redent: 3.0.0 - '@testing-library/jest-dom@6.8.0': dependencies: '@adobe/css-tools': 4.4.4 @@ -12011,7 +11907,7 @@ snapshots: '@types/react': 19.1.11 '@types/react-dom': 19.1.7(@types/react@19.1.11) - '@testing-library/user-event@14.5.2(@testing-library/dom@10.4.0)': + '@testing-library/user-event@14.6.1(@testing-library/dom@10.4.0)': dependencies: '@testing-library/dom': 10.4.0 @@ -12062,6 +11958,10 @@ snapshots: '@types/node': 18.15.0 '@types/responselike': 1.0.3 + '@types/chai@5.2.2': + dependencies: + '@types/deep-eql': 4.0.2 + '@types/d3-array@3.2.1': {} '@types/d3-axis@3.0.6': @@ -12183,6 +12083,8 @@ snapshots: dependencies: '@types/ms': 2.1.0 + '@types/deep-eql@4.0.2': {} + '@types/doctrine@0.0.9': {} '@types/eslint-scope@3.7.7': @@ -12329,8 +12231,6 @@ snapshots: '@types/uuid@10.0.0': {} - '@types/uuid@9.0.8': {} - '@types/whatwg-mimetype@3.0.2': {} '@types/yargs-parser@21.0.3': {} @@ -12559,37 +12459,35 @@ snapshots: transitivePeerDependencies: - supports-color - '@vitest/expect@2.0.5': + '@vitest/expect@3.2.4': dependencies: - '@vitest/spy': 2.0.5 - '@vitest/utils': 2.0.5 + '@types/chai': 5.2.2 + '@vitest/spy': 3.2.4 + '@vitest/utils': 3.2.4 chai: 5.2.1 - tinyrainbow: 1.2.0 + tinyrainbow: 2.0.0 - '@vitest/pretty-format@2.0.5': + '@vitest/mocker@3.2.4(vite@6.2.7(@types/node@18.15.0)(jiti@2.6.1)(sass@1.92.1)(terser@5.43.1)(yaml@2.8.0))': dependencies: - tinyrainbow: 1.2.0 - - '@vitest/pretty-format@2.1.9': - dependencies: - tinyrainbow: 1.2.0 - - '@vitest/spy@2.0.5': - dependencies: - tinyspy: 3.0.2 - - '@vitest/utils@2.0.5': - dependencies: - '@vitest/pretty-format': 2.0.5 + '@vitest/spy': 3.2.4 estree-walker: 3.0.3 - loupe: 3.1.4 - tinyrainbow: 1.2.0 + magic-string: 0.30.19 + optionalDependencies: + vite: 6.2.7(@types/node@18.15.0)(jiti@2.6.1)(sass@1.92.1)(terser@5.43.1)(yaml@2.8.0) - '@vitest/utils@2.1.9': + '@vitest/pretty-format@3.2.4': dependencies: - '@vitest/pretty-format': 2.1.9 + tinyrainbow: 2.0.0 + + '@vitest/spy@3.2.4': + dependencies: + tinyspy: 4.0.4 + + '@vitest/utils@3.2.4': + dependencies: + '@vitest/pretty-format': 3.2.4 loupe: 3.1.4 - tinyrainbow: 1.2.0 + tinyrainbow: 2.0.0 '@vue/compiler-core@3.5.17': dependencies: @@ -12893,27 +12791,27 @@ snapshots: transitivePeerDependencies: - supports-color - babel-loader@10.0.0(@babel/core@7.28.3)(webpack@5.100.2(esbuild@0.25.0)(uglify-js@3.19.3)): + babel-loader@10.0.0(@babel/core@7.28.3)(webpack@5.102.1(esbuild@0.25.0)(uglify-js@3.19.3)): dependencies: '@babel/core': 7.28.3 find-up: 5.0.0 - webpack: 5.100.2(esbuild@0.25.0)(uglify-js@3.19.3) + webpack: 5.102.1(esbuild@0.25.0)(uglify-js@3.19.3) - babel-loader@8.4.1(@babel/core@7.28.3)(webpack@5.100.2(esbuild@0.25.0)(uglify-js@3.19.3)): + babel-loader@8.4.1(@babel/core@7.28.3)(webpack@5.102.1(esbuild@0.25.0)(uglify-js@3.19.3)): dependencies: '@babel/core': 7.28.3 find-cache-dir: 3.3.2 loader-utils: 2.0.4 make-dir: 3.1.0 schema-utils: 2.7.1 - webpack: 5.100.2(esbuild@0.25.0)(uglify-js@3.19.3) + webpack: 5.102.1(esbuild@0.25.0)(uglify-js@3.19.3) - babel-loader@9.2.1(@babel/core@7.28.3)(webpack@5.100.2(esbuild@0.25.0)(uglify-js@3.19.3)): + babel-loader@9.2.1(@babel/core@7.28.3)(webpack@5.102.1(esbuild@0.25.0)(uglify-js@3.19.3)): dependencies: '@babel/core': 7.28.3 find-cache-dir: 4.0.0 - schema-utils: 4.3.2 - webpack: 5.100.2(esbuild@0.25.0)(uglify-js@3.19.3) + schema-utils: 4.3.3 + webpack: 5.102.1(esbuild@0.25.0)(uglify-js@3.19.3) babel-plugin-istanbul@6.1.1: dependencies: @@ -12987,6 +12885,8 @@ snapshots: base64-js@1.5.1: {} + baseline-browser-mapping@2.8.18: {} + before-after-hook@3.0.2: {} better-opn@3.0.2: @@ -13019,8 +12919,6 @@ snapshots: brorand@1.1.0: {} - browser-assert@1.2.1: {} - browserify-aes@1.2.0: dependencies: buffer-xor: 1.0.3 @@ -13028,7 +12926,7 @@ snapshots: create-hash: 1.2.0 evp_bytestokey: 1.0.3 inherits: 2.0.4 - safe-buffer: '@nolyfill/safe-buffer@1.0.44' + safe-buffer: 5.2.1 browserify-cipher@1.0.1: dependencies: @@ -13041,13 +12939,13 @@ snapshots: cipher-base: 1.0.6 des.js: 1.1.0 inherits: 2.0.4 - safe-buffer: '@nolyfill/safe-buffer@1.0.44' + safe-buffer: 5.2.1 browserify-rsa@4.1.1: dependencies: bn.js: 5.2.2 randombytes: 2.1.0 - safe-buffer: '@nolyfill/safe-buffer@1.0.44' + safe-buffer: 5.2.1 browserify-sign@4.2.3: dependencies: @@ -13060,7 +12958,7 @@ snapshots: inherits: 2.0.4 parse-asn1: 5.1.7 readable-stream: 2.3.8 - safe-buffer: '@nolyfill/safe-buffer@1.0.44' + safe-buffer: 5.2.1 browserify-zlib@0.2.0: dependencies: @@ -13073,6 +12971,14 @@ snapshots: node-releases: 2.0.19 update-browserslist-db: 1.1.3(browserslist@4.25.1) + browserslist@4.26.3: + dependencies: + baseline-browser-mapping: 2.8.18 + caniuse-lite: 1.0.30001746 + electron-to-chromium: 1.5.237 + node-releases: 2.0.25 + update-browserslist-db: 1.1.3(browserslist@4.26.3) + bser@2.1.1: dependencies: node-int64: 0.4.0 @@ -13125,6 +13031,8 @@ snapshots: caniuse-lite@1.0.30001746: {} + caniuse-lite@1.0.30001751: {} + canvas@2.11.2: dependencies: '@mapbox/node-pre-gyp': 1.0.11 @@ -13147,11 +13055,6 @@ snapshots: loupe: 3.1.4 pathval: 2.0.1 - chalk@3.0.0: - dependencies: - ansi-styles: 4.3.0 - supports-color: 7.2.0 - chalk@4.1.1: dependencies: ansi-styles: 4.3.0 @@ -13217,7 +13120,7 @@ snapshots: chownr@2.0.0: optional: true - chromatic@11.29.0: {} + chromatic@12.2.0: {} chrome-trace-event@1.0.4: {} @@ -13228,7 +13131,7 @@ snapshots: cipher-base@1.0.6: dependencies: inherits: 2.0.4 - safe-buffer: '@nolyfill/safe-buffer@1.0.44' + safe-buffer: 5.2.1 cjs-module-lexer@1.4.3: {} @@ -13250,10 +13153,10 @@ snapshots: dependencies: escape-string-regexp: 1.0.5 - clean-webpack-plugin@4.0.0(webpack@5.100.2(esbuild@0.25.0)(uglify-js@3.19.3)): + clean-webpack-plugin@4.0.0(webpack@5.102.1(esbuild@0.25.0)(uglify-js@3.19.3)): dependencies: del: 4.1.1 - webpack: 5.100.2(esbuild@0.25.0)(uglify-js@3.19.3) + webpack: 5.102.1(esbuild@0.25.0)(uglify-js@3.19.3) cli-cursor@5.0.0: dependencies: @@ -13416,7 +13319,7 @@ snapshots: dependencies: cipher-base: 1.0.6 inherits: 2.0.4 - ripemd160: 2.0.1 + ripemd160: 2.0.2 sha.js: 2.4.12 create-hash@1.2.0: @@ -13433,7 +13336,7 @@ snapshots: create-hash: 1.2.0 inherits: 2.0.4 ripemd160: 2.0.2 - safe-buffer: '@nolyfill/safe-buffer@1.0.44' + safe-buffer: 5.2.1 sha.js: 2.4.12 create-jest@29.7.0(@types/node@18.15.0)(ts-node@10.9.2(@types/node@18.15.0)(typescript@5.8.3)): @@ -13454,8 +13357,9 @@ snapshots: create-require@1.1.1: optional: true - cross-env@7.0.3: + cross-env@10.1.0: dependencies: + '@epic-web/invariant': 1.0.0 cross-spawn: 7.0.6 cross-spawn@7.0.6: @@ -13481,7 +13385,7 @@ snapshots: crypto-random-string@2.0.0: {} - css-loader@6.11.0(webpack@5.100.2(esbuild@0.25.0)(uglify-js@3.19.3)): + css-loader@6.11.0(webpack@5.102.1(esbuild@0.25.0)(uglify-js@3.19.3)): dependencies: icss-utils: 5.1.0(postcss@8.5.6) postcss: 8.5.6 @@ -13492,7 +13396,7 @@ snapshots: postcss-value-parser: 4.2.0 semver: 7.7.2 optionalDependencies: - webpack: 5.100.2(esbuild@0.25.0)(uglify-js@3.19.3) + webpack: 5.102.1(esbuild@0.25.0)(uglify-js@3.19.3) css-select@4.3.0: dependencies: @@ -13766,7 +13670,7 @@ snapshots: detect-libc@2.1.0: {} - detect-libc@2.1.1: + detect-libc@2.1.2: optional: true detect-newline@3.1.0: {} @@ -13861,6 +13765,8 @@ snapshots: electron-to-chromium@1.5.186: {} + electron-to-chromium@1.5.237: {} + elkjs@0.9.3: {} elliptic@6.6.1: @@ -13932,7 +13838,7 @@ snapshots: esbuild-register@3.6.0(esbuild@0.25.0): dependencies: - debug: 4.4.1 + debug: 4.4.3 esbuild: 0.25.0 transitivePeerDependencies: - supports-color @@ -14254,12 +14160,11 @@ snapshots: semver: 7.7.2 typescript: 5.8.3 - eslint-plugin-storybook@9.0.7(eslint@9.35.0(jiti@2.6.1))(typescript@5.8.3): + eslint-plugin-storybook@9.1.13(eslint@9.35.0(jiti@2.6.1))(storybook@9.1.13(@testing-library/dom@10.4.0)(vite@6.2.7(@types/node@18.15.0)(jiti@2.6.1)(sass@1.92.1)(terser@5.43.1)(yaml@2.8.0)))(typescript@5.8.3): dependencies: - '@storybook/csf': 0.1.13 '@typescript-eslint/utils': 8.44.0(eslint@9.35.0(jiti@2.6.1))(typescript@5.8.3) eslint: 9.35.0(jiti@2.6.1) - ts-dedent: 2.2.0 + storybook: 9.1.13(@testing-library/dom@10.4.0)(vite@6.2.7(@types/node@18.15.0)(jiti@2.6.1)(sass@1.92.1)(terser@5.43.1)(yaml@2.8.0)) transitivePeerDependencies: - supports-color - typescript @@ -14467,7 +14372,7 @@ snapshots: evp_bytestokey@1.0.3: dependencies: md5.js: 1.3.5 - safe-buffer: '@nolyfill/safe-buffer@1.0.44' + safe-buffer: 5.2.1 execa@5.1.1: dependencies: @@ -14603,6 +14508,12 @@ snapshots: locate-path: 7.2.0 path-exists: 5.0.0 + find-up@7.0.0: + dependencies: + locate-path: 7.2.0 + path-exists: 5.0.0 + unicorn-magic: 0.1.0 + flat-cache@3.2.0: dependencies: flatted: 3.3.3 @@ -14621,7 +14532,7 @@ snapshots: cross-spawn: 7.0.6 signal-exit: 4.1.0 - fork-ts-checker-webpack-plugin@8.0.0(typescript@5.8.3)(webpack@5.100.2(esbuild@0.25.0)(uglify-js@3.19.3)): + fork-ts-checker-webpack-plugin@8.0.0(typescript@5.8.3)(webpack@5.102.1(esbuild@0.25.0)(uglify-js@3.19.3)): dependencies: '@babel/code-frame': 7.27.1 chalk: 4.1.2 @@ -14634,9 +14545,9 @@ snapshots: node-abort-controller: 3.1.1 schema-utils: 3.3.0 semver: 7.7.2 - tapable: 2.2.2 + tapable: 2.3.0 typescript: 5.8.3 - webpack: 5.100.2(esbuild@0.25.0)(uglify-js@3.19.3) + webpack: 5.102.1(esbuild@0.25.0)(uglify-js@3.19.3) format@0.2.2: {} @@ -14805,7 +14716,7 @@ snapshots: hash-base@3.0.5: dependencies: inherits: 2.0.4 - safe-buffer: '@nolyfill/safe-buffer@1.0.44' + safe-buffer: 5.2.1 hash.js@1.1.7: dependencies: @@ -14983,21 +14894,20 @@ snapshots: dependencies: void-elements: 3.1.0 - html-to-image@1.11.11: {} + html-to-image@1.11.13: {} html-url-attributes@3.0.1: {} html-void-elements@3.0.0: {} - html-webpack-plugin@5.6.3(webpack@5.100.2(esbuild@0.25.0)(uglify-js@3.19.3)): + html-webpack-plugin@5.5.4(webpack@5.102.1(esbuild@0.25.0)(uglify-js@3.19.3)): dependencies: '@types/html-minifier-terser': 6.1.0 html-minifier-terser: 6.1.0 lodash: 4.17.21 pretty-error: 4.0.0 - tapable: 2.2.2 - optionalDependencies: - webpack: 5.100.2(esbuild@0.25.0)(uglify-js@3.19.3) + tapable: 2.3.0 + webpack: 5.102.1(esbuild@0.25.0)(uglify-js@3.19.3) htmlparser2@6.1.0: dependencies: @@ -15053,11 +14963,9 @@ snapshots: ignore@7.0.5: {} - image-size@1.2.1: - dependencies: - queue: 6.0.2 + image-size@2.0.2: {} - immer@9.0.21: {} + immer@10.1.3: {} immutable@5.1.3: {} @@ -15813,10 +15721,6 @@ snapshots: dependencies: sourcemap-codec: 1.4.8 - magic-string@0.30.17: - dependencies: - '@jridgewell/sourcemap-codec': 1.5.4 - magic-string@0.30.19: dependencies: '@jridgewell/sourcemap-codec': 1.5.5 @@ -15842,8 +15746,6 @@ snapshots: dependencies: tmpl: 1.0.5 - map-or-similar@1.5.0: {} - markdown-extensions@2.0.0: {} markdown-table@3.0.4: {} @@ -15854,7 +15756,7 @@ snapshots: dependencies: hash-base: 3.0.5 inherits: 2.0.4 - safe-buffer: '@nolyfill/safe-buffer@1.0.44' + safe-buffer: 5.2.1 mdast-util-find-and-replace@3.0.2: dependencies: @@ -16053,10 +15955,6 @@ snapshots: memoize-one@5.2.1: {} - memoizerific@1.11.3: - dependencies: - map-or-similar: 1.5.0 - merge-stream@2.0.0: {} merge2@1.4.1: {} @@ -16482,14 +16380,14 @@ snapshots: neo-async@2.6.2: {} - next-pwa@5.6.0(@babel/core@7.28.3)(@types/babel__core@7.20.5)(esbuild@0.25.0)(next@15.5.4(@babel/core@7.28.3)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(sass@1.92.1))(uglify-js@3.19.3)(webpack@5.100.2(esbuild@0.25.0)(uglify-js@3.19.3)): + next-pwa@5.6.0(@babel/core@7.28.3)(@types/babel__core@7.20.5)(esbuild@0.25.0)(next@15.5.4(@babel/core@7.28.3)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(sass@1.92.1))(uglify-js@3.19.3)(webpack@5.102.1(esbuild@0.25.0)(uglify-js@3.19.3)): dependencies: - babel-loader: 8.4.1(@babel/core@7.28.3)(webpack@5.100.2(esbuild@0.25.0)(uglify-js@3.19.3)) - clean-webpack-plugin: 4.0.0(webpack@5.100.2(esbuild@0.25.0)(uglify-js@3.19.3)) + babel-loader: 8.4.1(@babel/core@7.28.3)(webpack@5.102.1(esbuild@0.25.0)(uglify-js@3.19.3)) + clean-webpack-plugin: 4.0.0(webpack@5.102.1(esbuild@0.25.0)(uglify-js@3.19.3)) globby: 11.1.0 next: 15.5.4(@babel/core@7.28.3)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(sass@1.92.1) - terser-webpack-plugin: 5.3.14(esbuild@0.25.0)(uglify-js@3.19.3)(webpack@5.100.2(esbuild@0.25.0)(uglify-js@3.19.3)) - workbox-webpack-plugin: 6.6.0(@types/babel__core@7.20.5)(webpack@5.100.2(esbuild@0.25.0)(uglify-js@3.19.3)) + terser-webpack-plugin: 5.3.14(esbuild@0.25.0)(uglify-js@3.19.3)(webpack@5.102.1(esbuild@0.25.0)(uglify-js@3.19.3)) + workbox-webpack-plugin: 6.6.0(@types/babel__core@7.20.5)(webpack@5.102.1(esbuild@0.25.0)(uglify-js@3.19.3)) workbox-window: 6.6.0 transitivePeerDependencies: - '@babel/core' @@ -16509,7 +16407,7 @@ snapshots: dependencies: '@next/env': 15.5.4 '@swc/helpers': 0.5.15 - caniuse-lite: 1.0.30001746 + caniuse-lite: 1.0.30001751 postcss: 8.4.31 react: 19.1.1 react-dom: 19.1.1(react@19.1.1) @@ -16546,7 +16444,7 @@ snapshots: node-int64@0.4.0: {} - node-polyfill-webpack-plugin@2.0.1(webpack@5.100.2(esbuild@0.25.0)(uglify-js@3.19.3)): + node-polyfill-webpack-plugin@2.0.1(webpack@5.102.1(esbuild@0.25.0)(uglify-js@3.19.3)): dependencies: assert: '@nolyfill/assert@1.0.26' browserify-zlib: 0.2.0 @@ -16573,10 +16471,12 @@ snapshots: url: 0.11.4 util: 0.12.5 vm-browserify: 1.1.2 - webpack: 5.100.2(esbuild@0.25.0)(uglify-js@3.19.3) + webpack: 5.102.1(esbuild@0.25.0)(uglify-js@3.19.3) node-releases@2.0.19: {} + node-releases@2.0.25: {} + nopt@5.0.0: dependencies: abbrev: 1.1.1 @@ -16727,7 +16627,7 @@ snapshots: evp_bytestokey: 1.0.3 hash-base: 3.0.5 pbkdf2: 3.1.3 - safe-buffer: '@nolyfill/safe-buffer@1.0.44' + safe-buffer: 5.2.1 parse-entities@2.0.0: dependencies: @@ -16809,7 +16709,7 @@ snapshots: create-hash: 1.1.3 create-hmac: 1.1.7 ripemd160: 2.0.1 - safe-buffer: '@nolyfill/safe-buffer@1.0.44' + safe-buffer: 5.2.1 sha.js: 2.4.12 to-buffer: 1.2.1 @@ -16871,12 +16771,6 @@ snapshots: pluralize@8.0.0: {} - pnp-webpack-plugin@1.7.0(typescript@5.8.3): - dependencies: - ts-pnp: 1.2.0(typescript@5.8.3) - transitivePeerDependencies: - - typescript - pnpm-workspace-yaml@1.1.0: dependencies: yaml: 2.8.0 @@ -16888,10 +16782,6 @@ snapshots: path-data-parser: 0.1.0 points-on-curve: 0.2.0 - polished@4.3.1: - dependencies: - '@babel/runtime': 7.27.6 - portfinder@1.0.37: dependencies: async: 3.2.6 @@ -16919,14 +16809,14 @@ snapshots: postcss: 8.5.6 ts-node: 10.9.2(@types/node@18.15.0)(typescript@5.8.3) - postcss-loader@8.1.1(postcss@8.5.6)(typescript@5.8.3)(webpack@5.100.2(esbuild@0.25.0)(uglify-js@3.19.3)): + postcss-loader@8.1.1(postcss@8.5.6)(typescript@5.8.3)(webpack@5.102.1(esbuild@0.25.0)(uglify-js@3.19.3)): dependencies: cosmiconfig: 9.0.0(typescript@5.8.3) jiti: 1.21.7 postcss: 8.5.6 semver: 7.7.2 optionalDependencies: - webpack: 5.100.2(esbuild@0.25.0)(uglify-js@3.19.3) + webpack: 5.102.1(esbuild@0.25.0)(uglify-js@3.19.3) transitivePeerDependencies: - typescript @@ -17038,7 +16928,7 @@ snapshots: create-hash: 1.2.0 parse-asn1: 5.1.7 randombytes: 2.1.0 - safe-buffer: '@nolyfill/safe-buffer@1.0.44' + safe-buffer: 5.2.1 pump@3.0.3: dependencies: @@ -17067,20 +16957,16 @@ snapshots: queue-microtask@1.2.3: {} - queue@6.0.2: - dependencies: - inherits: 2.0.4 - quick-lru@5.1.1: {} randombytes@2.1.0: dependencies: - safe-buffer: '@nolyfill/safe-buffer@1.0.44' + safe-buffer: 5.2.1 randomfill@1.0.4: dependencies: randombytes: 2.1.0 - safe-buffer: '@nolyfill/safe-buffer@1.0.44' + safe-buffer: 5.2.1 range-parser@1.2.1: {} @@ -17094,11 +16980,6 @@ snapshots: prop-types: 15.8.1 react: 19.1.1 - react-confetti@6.4.0(react@19.1.1): - dependencies: - react: 19.1.1 - tween-functions: 1.2.0 - react-docgen-typescript@2.4.0(typescript@5.8.3): dependencies: typescript: 5.8.3 @@ -17106,8 +16987,8 @@ snapshots: react-docgen@7.1.1: dependencies: '@babel/core': 7.28.3 - '@babel/traverse': 7.28.0 - '@babel/types': 7.28.1 + '@babel/traverse': 7.28.3 + '@babel/types': 7.28.4 '@types/babel__core': 7.20.5 '@types/babel__traverse': 7.20.7 '@types/doctrine': 0.0.9 @@ -17118,12 +16999,6 @@ snapshots: transitivePeerDependencies: - supports-color - react-dom@18.3.1(react@18.3.1): - dependencies: - loose-envify: 1.4.0 - react: 18.3.1 - scheduler: 0.23.2 - react-dom@19.1.1(react@19.1.1): dependencies: react: 19.1.1 @@ -17291,20 +17166,16 @@ snapshots: react: 19.1.1 react-dom: 19.1.1(react@19.1.1) - react@18.3.1: - dependencies: - loose-envify: 1.4.0 - react@19.1.1: {} - reactflow@11.11.4(@types/react@19.1.11)(immer@9.0.21)(react-dom@19.1.1(react@19.1.1))(react@19.1.1): + reactflow@11.11.4(@types/react@19.1.11)(immer@10.1.3)(react-dom@19.1.1(react@19.1.1))(react@19.1.1): dependencies: - '@reactflow/background': 11.3.14(@types/react@19.1.11)(immer@9.0.21)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@reactflow/controls': 11.2.14(@types/react@19.1.11)(immer@9.0.21)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@reactflow/core': 11.11.4(@types/react@19.1.11)(immer@9.0.21)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@reactflow/minimap': 11.7.14(@types/react@19.1.11)(immer@9.0.21)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@reactflow/node-resizer': 2.2.14(@types/react@19.1.11)(immer@9.0.21)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@reactflow/node-toolbar': 1.3.14(@types/react@19.1.11)(immer@9.0.21)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@reactflow/background': 11.3.14(@types/react@19.1.11)(immer@10.1.3)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@reactflow/controls': 11.2.14(@types/react@19.1.11)(immer@10.1.3)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@reactflow/core': 11.11.4(@types/react@19.1.11)(immer@10.1.3)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@reactflow/minimap': 11.7.14(@types/react@19.1.11)(immer@10.1.3)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@reactflow/node-resizer': 2.2.14(@types/react@19.1.11)(immer@10.1.3)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@reactflow/node-toolbar': 1.3.14(@types/react@19.1.11)(immer@10.1.3)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) react: 19.1.1 react-dom: 19.1.1(react@19.1.1) transitivePeerDependencies: @@ -17321,7 +17192,7 @@ snapshots: inherits: 2.0.4 isarray: '@nolyfill/isarray@1.0.44' process-nextick-args: 2.0.1 - safe-buffer: '@nolyfill/safe-buffer@1.0.44' + safe-buffer: 5.2.1 string_decoder: 1.1.1 util-deprecate: 1.0.2 @@ -17597,6 +17468,35 @@ snapshots: optionalDependencies: fsevents: 2.3.3 + rollup@4.52.5: + dependencies: + '@types/estree': 1.0.8 + optionalDependencies: + '@rollup/rollup-android-arm-eabi': 4.52.5 + '@rollup/rollup-android-arm64': 4.52.5 + '@rollup/rollup-darwin-arm64': 4.52.5 + '@rollup/rollup-darwin-x64': 4.52.5 + '@rollup/rollup-freebsd-arm64': 4.52.5 + '@rollup/rollup-freebsd-x64': 4.52.5 + '@rollup/rollup-linux-arm-gnueabihf': 4.52.5 + '@rollup/rollup-linux-arm-musleabihf': 4.52.5 + '@rollup/rollup-linux-arm64-gnu': 4.52.5 + '@rollup/rollup-linux-arm64-musl': 4.52.5 + '@rollup/rollup-linux-loong64-gnu': 4.52.5 + '@rollup/rollup-linux-ppc64-gnu': 4.52.5 + '@rollup/rollup-linux-riscv64-gnu': 4.52.5 + '@rollup/rollup-linux-riscv64-musl': 4.52.5 + '@rollup/rollup-linux-s390x-gnu': 4.52.5 + '@rollup/rollup-linux-x64-gnu': 4.52.5 + '@rollup/rollup-linux-x64-musl': 4.52.5 + '@rollup/rollup-openharmony-arm64': 4.52.5 + '@rollup/rollup-win32-arm64-msvc': 4.52.5 + '@rollup/rollup-win32-ia32-msvc': 4.52.5 + '@rollup/rollup-win32-x64-gnu': 4.52.5 + '@rollup/rollup-win32-x64-msvc': 4.52.5 + fsevents: 2.3.3 + optional: true + roughjs@4.6.6: dependencies: hachure-fill: 0.5.2 @@ -17610,12 +17510,14 @@ snapshots: rw@1.3.3: {} - sass-loader@14.2.1(sass@1.92.1)(webpack@5.100.2(esbuild@0.25.0)(uglify-js@3.19.3)): + safe-buffer@5.2.1: {} + + sass-loader@16.0.5(sass@1.92.1)(webpack@5.102.1(esbuild@0.25.0)(uglify-js@3.19.3)): dependencies: neo-async: 2.6.2 optionalDependencies: sass: 1.92.1 - webpack: 5.100.2(esbuild@0.25.0)(uglify-js@3.19.3) + webpack: 5.102.1(esbuild@0.25.0)(uglify-js@3.19.3) sass@1.92.1: dependencies: @@ -17625,10 +17527,6 @@ snapshots: optionalDependencies: '@parcel/watcher': 2.5.1 - scheduler@0.23.2: - dependencies: - loose-envify: 1.4.0 - scheduler@0.26.0: {} schema-utils@2.7.1: @@ -17650,6 +17548,13 @@ snapshots: ajv-formats: 2.1.1(ajv@8.17.1) ajv-keywords: 5.1.0(ajv@8.17.1) + schema-utils@4.3.3: + dependencies: + '@types/json-schema': 7.0.15 + ajv: 8.17.1 + ajv-formats: 2.1.1(ajv@8.17.1) + ajv-keywords: 5.1.0(ajv@8.17.1) + screenfull@5.2.0: {} scslre@0.3.0: @@ -17678,7 +17583,7 @@ snapshots: sha.js@2.4.12: dependencies: inherits: 2.0.4 - safe-buffer: '@nolyfill/safe-buffer@1.0.44' + safe-buffer: 5.2.1 to-buffer: 1.2.1 sharp@0.33.5: @@ -17710,7 +17615,7 @@ snapshots: sharp@0.34.4: dependencies: '@img/colour': 1.0.0 - detect-libc: 2.1.1 + detect-libc: 2.1.2 semver: 7.7.2 optionalDependencies: '@img/sharp-darwin-arm64': 0.34.4 @@ -17836,13 +17741,27 @@ snapshots: state-local@1.0.7: {} - storybook@8.5.0: + storybook@9.1.13(@testing-library/dom@10.4.0)(vite@6.2.7(@types/node@18.15.0)(jiti@2.6.1)(sass@1.92.1)(terser@5.43.1)(yaml@2.8.0)): dependencies: - '@storybook/core': 8.5.0 + '@storybook/global': 5.0.0 + '@testing-library/jest-dom': 6.8.0 + '@testing-library/user-event': 14.6.1(@testing-library/dom@10.4.0) + '@vitest/expect': 3.2.4 + '@vitest/mocker': 3.2.4(vite@6.2.7(@types/node@18.15.0)(jiti@2.6.1)(sass@1.92.1)(terser@5.43.1)(yaml@2.8.0)) + '@vitest/spy': 3.2.4 + better-opn: 3.0.2 + esbuild: 0.25.0 + esbuild-register: 3.6.0(esbuild@0.25.0) + recast: 0.23.11 + semver: 7.7.2 + ws: 8.18.3 transitivePeerDependencies: + - '@testing-library/dom' - bufferutil + - msw - supports-color - utf-8-validate + - vite stream-browserify@3.0.0: dependencies: @@ -17873,11 +17792,11 @@ snapshots: string_decoder@1.1.1: dependencies: - safe-buffer: '@nolyfill/safe-buffer@1.0.44' + safe-buffer: 5.2.1 string_decoder@1.3.0: dependencies: - safe-buffer: '@nolyfill/safe-buffer@1.0.44' + safe-buffer: 5.2.1 stringify-entities@4.0.4: dependencies: @@ -17922,9 +17841,9 @@ snapshots: strip-json-comments@5.0.2: {} - style-loader@3.3.4(webpack@5.100.2(esbuild@0.25.0)(uglify-js@3.19.3)): + style-loader@3.3.4(webpack@5.102.1(esbuild@0.25.0)(uglify-js@3.19.3)): dependencies: - webpack: 5.100.2(esbuild@0.25.0)(uglify-js@3.19.3) + webpack: 5.102.1(esbuild@0.25.0)(uglify-js@3.19.3) style-to-js@1.1.17: dependencies: @@ -18013,6 +17932,8 @@ snapshots: tapable@2.2.2: {} + tapable@2.3.0: {} + tar@6.2.1: dependencies: chownr: 2.0.0 @@ -18032,14 +17953,14 @@ snapshots: type-fest: 0.16.0 unique-string: 2.0.0 - terser-webpack-plugin@5.3.14(esbuild@0.25.0)(uglify-js@3.19.3)(webpack@5.100.2(esbuild@0.25.0)(uglify-js@3.19.3)): + terser-webpack-plugin@5.3.14(esbuild@0.25.0)(uglify-js@3.19.3)(webpack@5.102.1(esbuild@0.25.0)(uglify-js@3.19.3)): dependencies: '@jridgewell/trace-mapping': 0.3.29 jest-worker: 27.5.1 schema-utils: 4.3.2 serialize-javascript: 6.0.2 terser: 5.43.1 - webpack: 5.100.2(esbuild@0.25.0)(uglify-js@3.19.3) + webpack: 5.102.1(esbuild@0.25.0)(uglify-js@3.19.3) optionalDependencies: esbuild: 0.25.0 uglify-js: 3.19.3 @@ -18080,9 +18001,9 @@ snapshots: fdir: 6.4.6(picomatch@4.0.3) picomatch: 4.0.3 - tinyrainbow@1.2.0: {} + tinyrainbow@2.0.0: {} - tinyspy@3.0.2: {} + tinyspy@4.0.4: {} tldts-core@7.0.10: {} @@ -18095,7 +18016,7 @@ snapshots: to-buffer@1.2.1: dependencies: isarray: '@nolyfill/isarray@1.0.44' - safe-buffer: '@nolyfill/safe-buffer@1.0.44' + safe-buffer: 5.2.1 typed-array-buffer: '@nolyfill/typed-array-buffer@1.0.44' to-regex-range@5.0.1: @@ -18157,15 +18078,11 @@ snapshots: ts-pattern@5.7.1: {} - ts-pnp@1.2.0(typescript@5.8.3): - optionalDependencies: - typescript: 5.8.3 - tsconfig-paths-webpack-plugin@4.2.0: dependencies: chalk: 4.1.2 enhanced-resolve: 5.18.2 - tapable: 2.2.2 + tapable: 2.3.0 tsconfig-paths: 4.2.0 tsconfig-paths@4.2.0: @@ -18182,8 +18099,6 @@ snapshots: tty-browserify@0.0.1: {} - tween-functions@1.2.0: {} - type-check@0.4.0: dependencies: prelude-ls: 1.2.1 @@ -18215,6 +18130,8 @@ snapshots: unicode-property-aliases-ecmascript@2.1.0: {} + unicorn-magic@0.1.0: {} + unified@11.0.5: dependencies: '@types/unist': 3.0.3 @@ -18283,6 +18200,12 @@ snapshots: escalade: 3.2.0 picocolors: 1.1.1 + update-browserslist-db@1.1.3(browserslist@4.26.3): + dependencies: + browserslist: 4.26.3 + escalade: 3.2.0 + picocolors: 1.1.1 + uri-js@4.4.1: dependencies: punycode: 2.3.1 @@ -18353,8 +18276,6 @@ snapshots: uuid@11.1.0: {} - uuid@9.0.1: {} - v8-compile-cache-lib@3.0.1: optional: true @@ -18379,6 +18300,20 @@ snapshots: '@types/unist': 3.0.3 vfile-message: 4.0.2 + vite@6.2.7(@types/node@18.15.0)(jiti@2.6.1)(sass@1.92.1)(terser@5.43.1)(yaml@2.8.0): + dependencies: + esbuild: 0.25.0 + postcss: 8.5.6 + rollup: 4.52.5 + optionalDependencies: + '@types/node': 18.15.0 + fsevents: 2.3.3 + jiti: 2.6.1 + sass: 1.92.1 + terser: 5.43.1 + yaml: 2.8.0 + optional: true + vm-browserify@1.1.2: {} void-elements@3.1.0: {} @@ -18449,15 +18384,15 @@ snapshots: - bufferutil - utf-8-validate - webpack-dev-middleware@6.1.3(webpack@5.100.2(esbuild@0.25.0)(uglify-js@3.19.3)): + webpack-dev-middleware@6.1.3(webpack@5.102.1(esbuild@0.25.0)(uglify-js@3.19.3)): dependencies: colorette: 2.0.20 memfs: 3.5.3 mime-types: 2.1.35 range-parser: 1.2.1 - schema-utils: 4.3.2 + schema-utils: 4.3.3 optionalDependencies: - webpack: 5.100.2(esbuild@0.25.0)(uglify-js@3.19.3) + webpack: 5.102.1(esbuild@0.25.0)(uglify-js@3.19.3) webpack-hot-middleware@2.26.1: dependencies: @@ -18474,7 +18409,7 @@ snapshots: webpack-virtual-modules@0.6.2: {} - webpack@5.100.2(esbuild@0.25.0)(uglify-js@3.19.3): + webpack@5.102.1(esbuild@0.25.0)(uglify-js@3.19.3): dependencies: '@types/eslint-scope': 3.7.7 '@types/estree': 1.0.8 @@ -18484,7 +18419,7 @@ snapshots: '@webassemblyjs/wasm-parser': 1.14.1 acorn: 8.15.0 acorn-import-phases: 1.0.4(acorn@8.15.0) - browserslist: 4.25.1 + browserslist: 4.26.3 chrome-trace-event: 1.0.4 enhanced-resolve: 5.18.2 es-module-lexer: 1.7.0 @@ -18496,9 +18431,9 @@ snapshots: loader-runner: 4.3.0 mime-types: 2.1.35 neo-async: 2.6.2 - schema-utils: 4.3.2 - tapable: 2.2.2 - terser-webpack-plugin: 5.3.14(esbuild@0.25.0)(uglify-js@3.19.3)(webpack@5.100.2(esbuild@0.25.0)(uglify-js@3.19.3)) + schema-utils: 4.3.3 + tapable: 2.3.0 + terser-webpack-plugin: 5.3.14(esbuild@0.25.0)(uglify-js@3.19.3)(webpack@5.102.1(esbuild@0.25.0)(uglify-js@3.19.3)) watchpack: 2.4.4 webpack-sources: 3.3.3 transitivePeerDependencies: @@ -18639,12 +18574,12 @@ snapshots: workbox-sw@6.6.0: {} - workbox-webpack-plugin@6.6.0(@types/babel__core@7.20.5)(webpack@5.100.2(esbuild@0.25.0)(uglify-js@3.19.3)): + workbox-webpack-plugin@6.6.0(@types/babel__core@7.20.5)(webpack@5.102.1(esbuild@0.25.0)(uglify-js@3.19.3)): dependencies: fast-json-stable-stringify: 2.1.0 pretty-bytes: 5.6.0 upath: 1.2.0 - webpack: 5.100.2(esbuild@0.25.0)(uglify-js@3.19.3) + webpack: 5.102.1(esbuild@0.25.0)(uglify-js@3.19.3) webpack-sources: 1.4.3 workbox-build: 6.6.0(@types/babel__core@7.20.5) transitivePeerDependencies: @@ -18736,16 +18671,16 @@ snapshots: dependencies: tslib: 2.3.0 - zundo@2.3.0(zustand@4.5.7(@types/react@19.1.11)(immer@9.0.21)(react@19.1.1)): + zundo@2.3.0(zustand@4.5.7(@types/react@19.1.11)(immer@10.1.3)(react@19.1.1)): dependencies: - zustand: 4.5.7(@types/react@19.1.11)(immer@9.0.21)(react@19.1.1) + zustand: 4.5.7(@types/react@19.1.11)(immer@10.1.3)(react@19.1.1) - zustand@4.5.7(@types/react@19.1.11)(immer@9.0.21)(react@19.1.1): + zustand@4.5.7(@types/react@19.1.11)(immer@10.1.3)(react@19.1.1): dependencies: use-sync-external-store: 1.5.0(react@19.1.1) optionalDependencies: '@types/react': 19.1.11 - immer: 9.0.21 + immer: 10.1.3 react: 19.1.1 zwitch@2.0.4: {}