From 8b23bbc677284e16b882ad6517e2d84bc3d63eaf Mon Sep 17 00:00:00 2001 From: Suraj Yadav Date: Mon, 11 May 2026 10:56:23 +0530 Subject: [PATCH 01/67] bump version to 1.2.9 in manifest.json, constants.js, release_notes.txt, and daemon.py --- manifest.json.in | 2 +- models/constants.js | 2 +- qml/release_notes.txt | 4 ++-- src/daemon.py | 4 ++-- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/manifest.json.in b/manifest.json.in index fec4e48d..1b86184a 100644 --- a/manifest.json.in +++ b/manifest.json.in @@ -18,7 +18,7 @@ "push-helper": "ubtms-push-helper.json" } }, - "version": "1.2.8", + "version": "1.2.9", "maintainer": "CIT Services ", "framework" : "@CLICK_FRAMEWORK@" } diff --git a/models/constants.js b/models/constants.js index 06710b8b..5ad87b3e 100644 --- a/models/constants.js +++ b/models/constants.js @@ -2,7 +2,7 @@ .pragma library -var version="1.2.7" +var version="1.2.9" //fonts var FontSizes = { diff --git a/qml/release_notes.txt b/qml/release_notes.txt index d2a9a4dd..521a6087 100644 --- a/qml/release_notes.txt +++ b/qml/release_notes.txt @@ -63,7 +63,7 @@

Time Management - Alpha Draft

- +

Time Management is a native time-tracking and productivity application built exclusively for Ubuntu Touch phones. @@ -141,7 +141,7 @@


- Time Management for Ubuntu Touch • Version 1.2.8 • © 2026 CIT Services + Time Management for Ubuntu Touch • Version 1.2.9 • © 2026 CIT Services

diff --git a/src/daemon.py b/src/daemon.py index 1d6c5563..ef44b03d 100644 --- a/src/daemon.py +++ b/src/daemon.py @@ -149,7 +149,7 @@ def get_app_version(): if Path(MANIFEST_PATH).exists(): with open(MANIFEST_PATH, 'r') as f: manifest = json.load(f) - return manifest.get('version', '1.2.7') + return manifest.get('version', '1.2.9') # Fallback to development path dev_manifest = Path(__file__).parent.parent / "manifest.json.in" if dev_manifest.exists(): @@ -162,7 +162,7 @@ def get_app_version(): return match.group(1) except Exception as e: log.error(f"[DAEMON] Failed to read app version: {e}") - return "1.2.8" # Fallback version + return "1.2.9" # Fallback version APP_VERSION = get_app_version() From 68e804cd8ff459fe7d4d22c0710e59928b57c5ae Mon Sep 17 00:00:00 2001 From: Suraj Yadav Date: Tue, 12 May 2026 17:27:36 +0530 Subject: [PATCH 02/67] Add Timesheet and Timesheet_Page QML files for timesheet management - Implement Timesheet.qml for creating and editing timesheets with features like auto-save, draft handling, and back navigation. - Introduce Timesheet_Page.qml for displaying a list of timesheets with filtering options, pagination, and actions for creating, editing, and deleting timesheets. - Enhance user experience with notifications for errors and success messages. - Integrate timer service for tracking active timesheets and managing elapsed time. --- qml/MyTasks.qml | 2 +- qml/Project_Page.qml | 2 +- qml/app/AppLayout.qml | 5 +++-- qml/app/navigation/NavigationRoutes.js | 4 ++-- qml/components/GlobalTimerWidget.qml | 3 ++- qml/features/dashboard/pages/Dashboard.qml | 8 ++++---- qml/features/tasks/pages/Task_Page.qml | 2 +- qml/features/tasks/pages/Tasks.qml | 4 ++-- .../components/TimeRecorderWidget.qml | 17 +++++++++-------- .../components/TimeSheetDescriptionPopup.qml | 6 +++--- .../components/TimeSheetDetailsCard.qml | 19 ++++++++++--------- .../timesheets}/components/TimeSheetGrid.qml | 3 ++- .../timesheets/pages}/Timesheet.qml | 19 ++++++++++--------- .../timesheets/pages}/Timesheet_Page.qml | 13 +++++++------ 14 files changed, 57 insertions(+), 50 deletions(-) rename qml/{ => features/timesheets}/components/TimeRecorderWidget.qml (94%) rename qml/{ => features/timesheets}/components/TimeSheetDescriptionPopup.qml (98%) rename qml/{ => features/timesheets}/components/TimeSheetDetailsCard.qml (95%) rename qml/{ => features/timesheets}/components/TimeSheetGrid.qml (98%) rename qml/{ => features/timesheets/pages}/Timesheet.qml (98%) rename qml/{ => features/timesheets/pages}/Timesheet_Page.qml (97%) diff --git a/qml/MyTasks.qml b/qml/MyTasks.qml index 842ddb36..3bc30b58 100644 --- a/qml/MyTasks.qml +++ b/qml/MyTasks.qml @@ -455,7 +455,7 @@ Page { onTaskTimesheetRequested: { let result = Timesheet.createTimesheetFromTask(localId); if (result.success) { - apLayout.addPageToNextColumn(myTasksPage, Qt.resolvedUrl("Timesheet.qml"), { + apLayout.addPageToNextColumn(myTasksPage, Qt.resolvedUrl("features/timesheets/pages/Timesheet.qml"), { "recordid": result.id, "isReadOnly": false }); diff --git a/qml/Project_Page.qml b/qml/Project_Page.qml index 0d9d1347..db6c1a29 100644 --- a/qml/Project_Page.qml +++ b/qml/Project_Page.qml @@ -109,7 +109,7 @@ Page { onProjectTimesheetRequested: localId => { let result = Timesheet.createTimesheetFromProject(localId); if (result.success) { - apLayout.addPageToNextColumn(project, Qt.resolvedUrl("Timesheet.qml"), { + apLayout.addPageToNextColumn(project, Qt.resolvedUrl("features/timesheets/pages/Timesheet.qml"), { "recordid": result.id, "isReadOnly": false }); diff --git a/qml/app/AppLayout.qml b/qml/app/AppLayout.qml index 3581fd3d..412d7c27 100644 --- a/qml/app/AppLayout.qml +++ b/qml/app/AppLayout.qml @@ -7,6 +7,7 @@ import "pages" as AppPages import "../features/dashboard/pages" as DashboardPages import "../features/settings/pages" as SettingsPages import "../features/tasks/pages" as TaskPages +import "../features/timesheets/pages" as TimesheetPages import "navigation/NavigationRoutes.js" as NavigationRoutes AdaptivePageLayout { @@ -108,7 +109,7 @@ AdaptivePageLayout { } } - Timesheet { + TimesheetPages.Timesheet { id: timesheet_page Connections { @@ -176,7 +177,7 @@ AdaptivePageLayout { id: settings_page } - Timesheet_Page { + TimesheetPages.Timesheet_Page { id: timesheet_list Connections { diff --git a/qml/app/navigation/NavigationRoutes.js b/qml/app/navigation/NavigationRoutes.js index 628c1ba2..ae5ddb21 100644 --- a/qml/app/navigation/NavigationRoutes.js +++ b/qml/app/navigation/NavigationRoutes.js @@ -2,7 +2,7 @@ var _menuItems = [ { textKey: "Dashboard", iconName: "home", iconColor: "#3498db", pageUrl: "features/dashboard/pages/Dashboard.qml", pageNum: 0 }, - { textKey: "Timesheet", iconName: "alarm-clock", iconColor: "#e67e22", pageUrl: "Timesheet_Page.qml", pageNum: 1 }, + { textKey: "Timesheet", iconName: "alarm-clock", iconColor: "#e67e22", pageUrl: "features/timesheets/pages/Timesheet_Page.qml", pageNum: 1 }, { textKey: "Activities", iconName: "calendar", iconColor: "#e74c3c", pageUrl: "Activity_Page.qml", pageNum: 2 }, { textKey: "My Tasks", iconName: "scope-manager", iconColor: "#2ecc71", pageUrl: "MyTasks.qml", pageNum: 3 }, { textKey: "All Tasks", iconName: "view-list-symbolic", iconColor: "#1abc9c", pageUrl: "features/tasks/pages/Task_Page.qml", pageNum: 3 }, @@ -17,7 +17,7 @@ var _deepLinkPages = { "Activity": "Activities.qml", "ProjectUpdate": "Updates.qml", "Project": "Projects.qml", - "Timesheet": "Timesheet.qml" + "Timesheet": "features/timesheets/pages/Timesheet.qml" }; function menuItems() { diff --git a/qml/components/GlobalTimerWidget.qml b/qml/components/GlobalTimerWidget.qml index b81775f2..08dd3d53 100644 --- a/qml/components/GlobalTimerWidget.qml +++ b/qml/components/GlobalTimerWidget.qml @@ -3,6 +3,7 @@ import QtQuick.Controls 2.2 import Lomiri.Components 1.3 import "../../models/timer_service.js" as TimerService import "../../models/utils.js" as Utils +import "../features/timesheets/components" as TimesheetComponents Rectangle { id: globalTimer @@ -472,7 +473,7 @@ Rectangle { property var showNotification: null // Description popup for when timer is stopped - TimeSheetDescriptionPopup { + TimesheetComponents.TimeSheetDescriptionPopup { id: descriptionPopup onSaved: function (description, status) { diff --git a/qml/features/dashboard/pages/Dashboard.qml b/qml/features/dashboard/pages/Dashboard.qml index f490e0ef..3ade33fb 100644 --- a/qml/features/dashboard/pages/Dashboard.qml +++ b/qml/features/dashboard/pages/Dashboard.qml @@ -131,7 +131,7 @@ Page { const defaultAccountId = Account.getDefaultAccountId(); const result = TimesheetModel.createTimesheet(defaultAccountId, Account.getCurrentUserOdooId(defaultAccountId)); if (result.success) { - apLayout.addPageToCurrentColumn(mainPage, Qt.resolvedUrl("../../../Timesheet.qml"), { + apLayout.addPageToCurrentColumn(mainPage, Qt.resolvedUrl("../../timesheets/pages/Timesheet.qml"), { "recordid": result.id, "isReadOnly": false }); @@ -233,7 +233,7 @@ Page { if (index === 1) { const result = TimesheetModel.createTimesheet(Account.getDefaultAccountId(), Account.getCurrentUserOdooId(Account.getDefaultAccountId())); if (result.success) { - apLayout.addPageToNextColumn(mainPage, Qt.resolvedUrl("../../../Timesheet.qml"), { + apLayout.addPageToNextColumn(mainPage, Qt.resolvedUrl("../../timesheets/pages/Timesheet.qml"), { "recordid": result.id, "isReadOnly": false }); @@ -467,7 +467,7 @@ Page { onCommitCompleted: { const result = TimesheetModel.createTimesheet(Account.getDefaultAccountId(), Account.getCurrentUserOdooId(Account.getDefaultAccountId())); if (result.success) { - apLayout.addPageToNextColumn(mainPage, Qt.resolvedUrl("../../../Timesheet.qml"), { + apLayout.addPageToNextColumn(mainPage, Qt.resolvedUrl("../../timesheets/pages/Timesheet.qml"), { "recordid": result.id, "isReadOnly": false }); @@ -533,7 +533,7 @@ Page { "isReadOnly": true }); } else if (navType === "Timesheet" && recordId > 0) { - apLayout.addPageToNextColumn(mainPage, Qt.resolvedUrl("../../../Timesheet.qml"), { + apLayout.addPageToNextColumn(mainPage, Qt.resolvedUrl("../../timesheets/pages/Timesheet.qml"), { "recordid": recordId, "isReadOnly": true }); diff --git a/qml/features/tasks/pages/Task_Page.qml b/qml/features/tasks/pages/Task_Page.qml index b9168e53..0722a5a5 100644 --- a/qml/features/tasks/pages/Task_Page.qml +++ b/qml/features/tasks/pages/Task_Page.qml @@ -355,7 +355,7 @@ Page { onTaskTimesheetRequested: { let result = Timesheet.createTimesheetFromTask(localId); if (result.success) { - apLayout.addPageToNextColumn(task, Qt.resolvedUrl("Timesheet.qml"), { + apLayout.addPageToNextColumn(task, Qt.resolvedUrl("../../timesheets/pages/Timesheet.qml"), { "recordid": result.id, "isReadOnly": false }); diff --git a/qml/features/tasks/pages/Tasks.qml b/qml/features/tasks/pages/Tasks.qml index ce50741f..f7a6d45e 100644 --- a/qml/features/tasks/pages/Tasks.qml +++ b/qml/features/tasks/pages/Tasks.qml @@ -840,7 +840,7 @@ Page { onCreateTimesheetRequested: { const result = Timesheet.createTimesheetFromTask(currentTask.odoo_record_id); if (result.success) { - apLayout.addPageToNextColumn(taskCreate, Qt.resolvedUrl("../../../Timesheet.qml"), { + apLayout.addPageToNextColumn(taskCreate, Qt.resolvedUrl("../../timesheets/pages/Timesheet.qml"), { "recordid": result.id, "isReadOnly": false }); @@ -851,7 +851,7 @@ Page { } onViewTimesheetsRequested: { console.log("Viewing timesheets for task:", currentTask.id, "odoo_record_id:", currentTask.odoo_record_id); - apLayout.addPageToNextColumn(taskCreate, Qt.resolvedUrl("../../../Timesheet_Page.qml"), { + apLayout.addPageToNextColumn(taskCreate, Qt.resolvedUrl("../../timesheets/pages/Timesheet_Page.qml"), { "filterByTask": true, "taskOdooRecordId": currentTask.odoo_record_id, "taskAccountId": currentTask.account_id, diff --git a/qml/components/TimeRecorderWidget.qml b/qml/features/timesheets/components/TimeRecorderWidget.qml similarity index 94% rename from qml/components/TimeRecorderWidget.qml rename to qml/features/timesheets/components/TimeRecorderWidget.qml index c7193ee4..7ced382d 100644 --- a/qml/components/TimeRecorderWidget.qml +++ b/qml/features/timesheets/components/TimeRecorderWidget.qml @@ -7,10 +7,11 @@ import QtQuick 2.7 import Lomiri.Components 1.3 import QtQuick.Layouts 1.11 import QtQuick.Controls 2.2 -import "../../models/constants.js" as AppConst -import "../../models/timer_service.js" as TimerService -import "../../models/timesheet.js" as TimeSheet -import "../../models/utils.js" as Utils +import "../../../../models/constants.js" as AppConst +import "../../../../models/timer_service.js" as TimerService +import "../../../../models/timesheet.js" as TimeSheet +import "../../../../models/utils.js" as Utils +import "../../../components" Item { id: autoRecorder @@ -151,12 +152,12 @@ Item { source: { if (!autoMode) - return "../images/play (1).png"; + return "../../../images/play (1).png"; if (isRecording) { - return "../images/pause.png"; + return "../../../images/pause.png"; } else { - return "../images/play (1).png"; + return "../../../images/play (1).png"; } } @@ -200,7 +201,7 @@ Item { id: finalizeIcon anchors.fill: parent anchors.margins: units.gu(0.3) - source: "../images/stop.png" + source: "../../../images/stop.png" fillMode: Image.PreserveAspectFit } diff --git a/qml/components/TimeSheetDescriptionPopup.qml b/qml/features/timesheets/components/TimeSheetDescriptionPopup.qml similarity index 98% rename from qml/components/TimeSheetDescriptionPopup.qml rename to qml/features/timesheets/components/TimeSheetDescriptionPopup.qml index a8997673..11c32b88 100644 --- a/qml/components/TimeSheetDescriptionPopup.qml +++ b/qml/features/timesheets/components/TimeSheetDescriptionPopup.qml @@ -26,9 +26,9 @@ import QtQuick 2.7 import QtQuick.Controls 2.2 import Lomiri.Components.Popups 1.3 import Lomiri.Components 1.3 -import "../../models/timesheet.js" as Model -import "../../models/accounts.js" as Accounts -import "../../models/utils.js" as Utils +import "../../../../models/timesheet.js" as Model +import "../../../../models/accounts.js" as Accounts +import "../../../../models/utils.js" as Utils Item { id: popupWrapper diff --git a/qml/components/TimeSheetDetailsCard.qml b/qml/features/timesheets/components/TimeSheetDetailsCard.qml similarity index 95% rename from qml/components/TimeSheetDetailsCard.qml rename to qml/features/timesheets/components/TimeSheetDetailsCard.qml index 39173961..d5e4733d 100644 --- a/qml/components/TimeSheetDetailsCard.qml +++ b/qml/features/timesheets/components/TimeSheetDetailsCard.qml @@ -25,10 +25,11 @@ import QtQuick 2.12 import QtQuick.Controls 2.2 import Lomiri.Components 1.3 import QtQuick.Layouts 1.1 -import "../../models/utils.js" as Utils -import "../../models/constants.js" as AppConst -import "../../models/timer_service.js" as TimerService -import "../../models/timesheet.js" as Timesheet +import "../../../../models/utils.js" as Utils +import "../../../../models/constants.js" as AppConst +import "../../../../models/timer_service.js" as TimerService +import "../../../../models/timesheet.js" as Timesheet +import "../../../components" ListItem { id: timesheetItem @@ -135,12 +136,12 @@ ListItem { iconSource: { if (recordId === TimerService.getActiveTimesheetId()) { if (TimerService.isPaused()) { - return "../images/play.png"; + return "../../../images/play.png"; } else { - return "../images/pause.png"; + return "../../../images/pause.png"; } } else { - return "../images/play.png"; + return "../../../images/play.png"; } } visible: recordId > 0 @@ -151,7 +152,7 @@ ListItem { }, Action { id: startstopaction - iconSource: "../images/stop.png" + iconSource: "../../../images/stop.png" visible: ((recordId === TimerService.getActiveTimesheetId()) && (TimerService.isRunning())) text: i18n.dtr("ubtms", "update Timesheet") onTriggered: { @@ -161,7 +162,7 @@ ListItem { Action { id: readyAction visible: (recordId !== TimerService.getActiveTimesheetId()) //Dont show this for the active running entry - iconSource: "../images/save.svg" + iconSource: "../../../images/save.svg" text: i18n.dtr("ubtms", "Mark Ready for Sync") onTriggered: { save_workflow(); diff --git a/qml/components/TimeSheetGrid.qml b/qml/features/timesheets/components/TimeSheetGrid.qml similarity index 98% rename from qml/components/TimeSheetGrid.qml rename to qml/features/timesheets/components/TimeSheetGrid.qml index 3034a09e..44f89f53 100644 --- a/qml/components/TimeSheetGrid.qml +++ b/qml/features/timesheets/components/TimeSheetGrid.qml @@ -27,7 +27,8 @@ import QtQuick.Controls 2.2 import QtQuick.Layouts 1.1 import QtQuick.Window 2.2 import QtGraphicalEffects 1.0 -import "../../models/constants.js" as AppConst +import "../../../../models/constants.js" as AppConst +import "../../../../models/timesheet.js" as Model Item { id: timesheetGrid diff --git a/qml/Timesheet.qml b/qml/features/timesheets/pages/Timesheet.qml similarity index 98% rename from qml/Timesheet.qml rename to qml/features/timesheets/pages/Timesheet.qml index 22719a12..9df46116 100644 --- a/qml/Timesheet.qml +++ b/qml/features/timesheets/pages/Timesheet.qml @@ -31,13 +31,14 @@ import Lomiri.Components.Pickers 1.3 import QtCharts 2.0 import QtQuick.Window 2.2 import Qt.labs.settings 1.0 -import "../models/timesheet.js" as Model -import "../models/accounts.js" as Accounts -import "../models/timer_service.js" as TimerService -import "../models/utils.js" as Utils -import "../models/global.js" as Global -import "components" -import "components/richtext" +import "../../../../models/timesheet.js" as Model +import "../../../../models/accounts.js" as Accounts +import "../../../../models/timer_service.js" as TimerService +import "../../../../models/utils.js" as Utils +import "../../../../models/global.js" as Global +import "../../../components" +import "../../../components/richtext" +import "../components" Page { id: timeSheet @@ -75,7 +76,7 @@ Page { trailingActionBar.actions: [ Action { - iconSource: "images/save.svg" + iconSource: "../../../images/save.svg" visible: !isReadOnly text: "Save" onTriggered: { @@ -795,7 +796,7 @@ Page { //set the data to a global store and pass the key to the page Global.description_temporary_holder = getFormattedText(); description_text.liveSyncActive = true; - apLayout.addPageToNextColumn(timeSheet, Qt.resolvedUrl("ReadMorePage.qml"), { + apLayout.addPageToNextColumn(timeSheet, Qt.resolvedUrl("../../../ReadMorePage.qml"), { isReadOnly: isReadOnly, useRichText: false, parentDraftHandler: draftHandler // Pass draft handler reference diff --git a/qml/Timesheet_Page.qml b/qml/features/timesheets/pages/Timesheet_Page.qml similarity index 97% rename from qml/Timesheet_Page.qml rename to qml/features/timesheets/pages/Timesheet_Page.qml index bfe58245..575569b7 100644 --- a/qml/Timesheet_Page.qml +++ b/qml/features/timesheets/pages/Timesheet_Page.qml @@ -27,12 +27,13 @@ import Lomiri.Components 1.3 import QtQuick.Window 2.2 import Ubuntu.Components 1.3 as Ubuntu import QtQuick.LocalStorage 2.7 -import "../models/timesheet.js" as Model -import "../models/project.js" as Project -import "../models/accounts.js" as Account -import "../models/global.js" as Global -import "components" -import "../models/timer_service.js" as TimerService +import "../../../../models/timesheet.js" as Model +import "../../../../models/project.js" as Project +import "../../../../models/accounts.js" as Account +import "../../../../models/global.js" as Global +import "../../../../models/timer_service.js" as TimerService +import "../../../components" +import "../components" Page { property bool isMultiColumn: typeof apLayout !== "undefined" ? apLayout.columns > 1 : false From ca98a19b609a81bbf848f892be62952394e06d63 Mon Sep 17 00:00:00 2001 From: Suraj Yadav Date: Tue, 12 May 2026 17:57:20 +0530 Subject: [PATCH 03/67] feat: Add CreateUpdatePage and FormDraftHandler for project updates - Implemented CreateUpdatePage for creating and updating project updates with fields for title, status, progress, and description. - Integrated FormDraftHandler to manage draft functionality, including auto-save, unsaved changes tracking, and draft recovery. - Added notifications for draft recovery and validation errors. - Included unsaved changes dialog for user confirmation on navigation away from the page. --- .../{ => base}/OutlinedContainer.qml | 1 + .../{ => base}/OutlinedTextField.qml | 1 + qml/components/{ => base}/TSButton.qml | 3 +- qml/components/{ => base}/TSCombobox.qml | 1 + qml/components/{ => base}/TSIconButton.qml | 3 +- qml/components/{ => base}/TSLabel.qml | 1 + qml/components/{ => base}/TSProgressbar.qml | 1 + .../{ => cards}/ActivityDetailsCard.qml | 7 ++- .../{ => cards}/ProjectDetailsCard.qml | 19 ++++--- .../{ => cards}/TasksForDayWidget.qml | 7 ++- .../{ => cards}/UpdatesDetailsCard.qml | 9 +-- .../{ => dialogs}/AccountSelectorDialog.qml | 3 +- qml/components/{ => dialogs}/ColorPicker.qml | 1 + .../{ => dialogs}/ContentPickerDialog.qml | 1 + .../{ => dialogs}/CreateUpdateDialog.qml | 9 +-- .../{ => dialogs}/SaveDiscardDialog.qml | 1 + .../{ => dialogs}/TimePickerPopup.qml | 1 + qml/components/{ => feedback}/InfoBar.qml | 1 + .../{ => feedback}/LoadMoreFooter.qml | 1 + .../{ => feedback}/LoadingIndicator.qml | 1 + .../{ => feedback}/NotificationBell.qml | 29 +++++----- .../{ => feedback}/NotificationPopup.qml | 1 + .../{ => navigation}/AccountDrawer.qml | 5 +- .../{ => navigation}/DialerMenu.qml | 3 +- .../{ => navigation}/ListHeader.qml | 1 + .../{ => navigation}/NavigationMenuList.qml | 3 +- .../{ => pickers}/CustomDatePicker.qml | 3 +- .../{ => pickers}/DateRangeSelector.qml | 1 + qml/components/{ => pickers}/DaySelector.qml | 1 + .../{ => pickers}/QuickDateSelector.qml | 3 +- qml/components/qmldir | 55 +++++++++++++++++++ .../{ => selectors}/AccountSelector.qml | 3 +- .../{ => selectors}/AssigneeFilterMenu.qml | 3 +- .../{ => selectors}/DialogComboSelector.qml | 1 + .../{ => selectors}/InlineOptionSelector.qml | 3 +- .../{ => selectors}/MultiAssigneeSelector.qml | 3 +- .../{ => selectors}/OptionSelectorPopover.qml | 3 +- .../{ => selectors}/ProjectSelector.qml | 5 +- .../{ => selectors}/ProjectStageSelector.qml | 3 +- .../{ => selectors}/SelectionButton.qml | 3 +- .../{ => selectors}/StageFilterMenu.qml | 3 +- .../{ => selectors}/StatusSelector.qml | 1 + .../{ => selectors}/TreeSelector.qml | 1 + .../{ => selectors}/UserSelector.qml | 3 +- .../{ => selectors}/WorkItemSelector.qml | 7 ++- qml/components/{ => system}/BackendBridge.qml | 1 + .../{ => system}/GlobalTimerWidget.qml | 15 ++--- .../{ => system}/ImagePreviewer.qml | 3 +- .../{ => visualization}/Bubblemap.qml | 1 + qml/components/{ => visualization}/EHower.qml | 13 +++-- .../{ => visualization}/EHowerIndicator.qml | 3 +- .../{ => visualization}/ProjectList.qml | 7 ++- .../{ => visualization}/ProjectPieChart.qml | 7 ++- .../{ => workflow}/AttachmentManager.qml | 5 +- .../{ => workflow}/CreateUpdatePage.qml | 7 ++- .../{ => workflow}/FormDraftHandler.qml | 3 +- 56 files changed, 197 insertions(+), 87 deletions(-) rename qml/components/{ => base}/OutlinedContainer.qml (99%) rename qml/components/{ => base}/OutlinedTextField.qml (99%) rename qml/components/{ => base}/TSButton.qml (98%) rename qml/components/{ => base}/TSCombobox.qml (99%) rename qml/components/{ => base}/TSIconButton.qml (98%) rename qml/components/{ => base}/TSLabel.qml (98%) rename qml/components/{ => base}/TSProgressbar.qml (98%) rename qml/components/{ => cards}/ActivityDetailsCard.qml (98%) rename qml/components/{ => cards}/ProjectDetailsCard.qml (96%) rename qml/components/{ => cards}/TasksForDayWidget.qml (96%) rename qml/components/{ => cards}/UpdatesDetailsCard.qml (96%) rename qml/components/{ => dialogs}/AccountSelectorDialog.qml (99%) rename qml/components/{ => dialogs}/ColorPicker.qml (99%) rename qml/components/{ => dialogs}/ContentPickerDialog.qml (99%) rename qml/components/{ => dialogs}/CreateUpdateDialog.qml (97%) rename qml/components/{ => dialogs}/SaveDiscardDialog.qml (99%) rename qml/components/{ => dialogs}/TimePickerPopup.qml (99%) rename qml/components/{ => feedback}/InfoBar.qml (99%) rename qml/components/{ => feedback}/LoadMoreFooter.qml (99%) rename qml/components/{ => feedback}/LoadingIndicator.qml (99%) rename qml/components/{ => feedback}/NotificationBell.qml (98%) rename qml/components/{ => feedback}/NotificationPopup.qml (99%) rename qml/components/{ => navigation}/AccountDrawer.qml (99%) rename qml/components/{ => navigation}/DialerMenu.qml (98%) rename qml/components/{ => navigation}/ListHeader.qml (99%) rename qml/components/{ => navigation}/NavigationMenuList.qml (89%) rename qml/components/{ => pickers}/CustomDatePicker.qml (99%) rename qml/components/{ => pickers}/DateRangeSelector.qml (99%) rename qml/components/{ => pickers}/DaySelector.qml (99%) rename qml/components/{ => pickers}/QuickDateSelector.qml (97%) create mode 100644 qml/components/qmldir rename qml/components/{ => selectors}/AccountSelector.qml (99%) rename qml/components/{ => selectors}/AssigneeFilterMenu.qml (99%) rename qml/components/{ => selectors}/DialogComboSelector.qml (99%) rename qml/components/{ => selectors}/InlineOptionSelector.qml (99%) rename qml/components/{ => selectors}/MultiAssigneeSelector.qml (99%) rename qml/components/{ => selectors}/OptionSelectorPopover.qml (97%) rename qml/components/{ => selectors}/ProjectSelector.qml (98%) rename qml/components/{ => selectors}/ProjectStageSelector.qml (99%) rename qml/components/{ => selectors}/SelectionButton.qml (97%) rename qml/components/{ => selectors}/StageFilterMenu.qml (99%) rename qml/components/{ => selectors}/StatusSelector.qml (99%) rename qml/components/{ => selectors}/TreeSelector.qml (99%) rename qml/components/{ => selectors}/UserSelector.qml (98%) rename qml/components/{ => selectors}/WorkItemSelector.qml (99%) rename qml/components/{ => system}/BackendBridge.qml (99%) rename qml/components/{ => system}/GlobalTimerWidget.qml (97%) rename qml/components/{ => system}/ImagePreviewer.qml (99%) rename qml/components/{ => visualization}/Bubblemap.qml (99%) rename qml/components/{ => visualization}/EHower.qml (98%) rename qml/components/{ => visualization}/EHowerIndicator.qml (94%) rename qml/components/{ => visualization}/ProjectList.qml (99%) rename qml/components/{ => visualization}/ProjectPieChart.qml (98%) rename qml/components/{ => workflow}/AttachmentManager.qml (99%) rename qml/components/{ => workflow}/CreateUpdatePage.qml (99%) rename qml/components/{ => workflow}/FormDraftHandler.qml (99%) diff --git a/qml/components/OutlinedContainer.qml b/qml/components/base/OutlinedContainer.qml similarity index 99% rename from qml/components/OutlinedContainer.qml rename to qml/components/base/OutlinedContainer.qml index e82ccd9d..5f8afa8c 100644 --- a/qml/components/OutlinedContainer.qml +++ b/qml/components/base/OutlinedContainer.qml @@ -1,6 +1,7 @@ import QtQuick 2.7 import QtQuick.Controls 2.2 import Lomiri.Components 1.3 +import ".." Item { id: root diff --git a/qml/components/OutlinedTextField.qml b/qml/components/base/OutlinedTextField.qml similarity index 99% rename from qml/components/OutlinedTextField.qml rename to qml/components/base/OutlinedTextField.qml index 8fe1709e..e8f8e3e8 100644 --- a/qml/components/OutlinedTextField.qml +++ b/qml/components/base/OutlinedTextField.qml @@ -1,6 +1,7 @@ import QtQuick 2.7 import QtQuick.Controls 2.2 import Lomiri.Components 1.3 +import ".." Item { id: root diff --git a/qml/components/TSButton.qml b/qml/components/base/TSButton.qml similarity index 98% rename from qml/components/TSButton.qml rename to qml/components/base/TSButton.qml index bda3afa1..089ad3e6 100644 --- a/qml/components/TSButton.qml +++ b/qml/components/base/TSButton.qml @@ -25,7 +25,8 @@ import QtQuick 2.7 import QtQuick.Controls 2.2 import Lomiri.Components 1.3 -import "../../models/constants.js" as AppConst +import "../../../models/constants.js" as AppConst +import ".." Item { id: root diff --git a/qml/components/TSCombobox.qml b/qml/components/base/TSCombobox.qml similarity index 99% rename from qml/components/TSCombobox.qml rename to qml/components/base/TSCombobox.qml index bfd1e8b1..326b1d78 100644 --- a/qml/components/TSCombobox.qml +++ b/qml/components/base/TSCombobox.qml @@ -2,6 +2,7 @@ import QtQuick 2.12 import QtQuick.Controls 2.12 import QtQuick.Layouts 1.3 +import ".." ComboBox { id: innerCombo diff --git a/qml/components/TSIconButton.qml b/qml/components/base/TSIconButton.qml similarity index 98% rename from qml/components/TSIconButton.qml rename to qml/components/base/TSIconButton.qml index 719627e2..da9672fa 100644 --- a/qml/components/TSIconButton.qml +++ b/qml/components/base/TSIconButton.qml @@ -24,7 +24,8 @@ import QtQuick 2.7 import QtQuick.Controls 2.2 import Lomiri.Components 1.3 -import "../../models/constants.js" as AppConst +import "../../../models/constants.js" as AppConst +import ".." Item { id: root diff --git a/qml/components/TSLabel.qml b/qml/components/base/TSLabel.qml similarity index 98% rename from qml/components/TSLabel.qml rename to qml/components/base/TSLabel.qml index 315db55d..92d0f038 100644 --- a/qml/components/TSLabel.qml +++ b/qml/components/base/TSLabel.qml @@ -1,6 +1,7 @@ // components/ThemedLabel.qml import QtQuick 2.7 import Lomiri.Components 1.3 +import ".." LomiriShape { id: themedLabel diff --git a/qml/components/TSProgressbar.qml b/qml/components/base/TSProgressbar.qml similarity index 98% rename from qml/components/TSProgressbar.qml rename to qml/components/base/TSProgressbar.qml index 5256cc57..8f183a10 100644 --- a/qml/components/TSProgressbar.qml +++ b/qml/components/base/TSProgressbar.qml @@ -1,5 +1,6 @@ import QtQuick 2.7 import Lomiri.Components 1.3 +import ".." Item { id: customProgressBar diff --git a/qml/components/ActivityDetailsCard.qml b/qml/components/cards/ActivityDetailsCard.qml similarity index 98% rename from qml/components/ActivityDetailsCard.qml rename to qml/components/cards/ActivityDetailsCard.qml index 89b6dd2c..7485b21d 100644 --- a/qml/components/ActivityDetailsCard.qml +++ b/qml/components/cards/ActivityDetailsCard.qml @@ -1,7 +1,8 @@ import QtQuick 2.12 import Lomiri.Components 1.3 -import "../../models/utils.js" as Utils -import "../../models/activity.js" as Activity +import "../../../models/utils.js" as Utils +import "../../../models/activity.js" as Activity +import ".." ListItem { id: root @@ -256,7 +257,7 @@ ListItem { width: parent.height / 2 height: parent.height / 2 fillMode: Image.PreserveAspectFit - source: "../images/" + Activity.getActivityIconForType(activity_type_name) + source: "../../images/" + Activity.getActivityIconForType(activity_type_name) anchors.verticalCenter: parent.verticalCenter // anchors.margins: units.gu(2) // anchors.leftMargin: units.gu(3) diff --git a/qml/components/ProjectDetailsCard.qml b/qml/components/cards/ProjectDetailsCard.qml similarity index 96% rename from qml/components/ProjectDetailsCard.qml rename to qml/components/cards/ProjectDetailsCard.qml index e00f47fe..d0f353c1 100644 --- a/qml/components/ProjectDetailsCard.qml +++ b/qml/components/cards/ProjectDetailsCard.qml @@ -24,13 +24,14 @@ import QtQuick 2.12 import QtQuick.Controls 2.2 -import "../../models/constants.js" as AppConst -import "../../models/utils.js" as Utils -import "../../models/timesheet.js" as Timesheet -import "../../models/timer_service.js" as TimerService -import "../../models/project.js" as Project +import "../../../models/constants.js" as AppConst +import "../../../models/utils.js" as Utils +import "../../../models/timesheet.js" as Timesheet +import "../../../models/timer_service.js" as TimerService +import "../../../models/project.js" as Project import Lomiri.Components 1.3 import QtQuick.Layouts 1.1 +import ".." ListItem { id: projectCard @@ -121,7 +122,7 @@ ListItem { }, Action { id: playpauseaction - iconSource: timer_on ? (timer_paused ? "../images/play.png" : "../images/pause.png") : "../images/play.png" + iconSource: timer_on ? (timer_paused ? "../../images/play.png" : "../../images/pause.png") : "../../images/play.png" visible: recordId > 0 text: "Start Timer" onTriggered: { @@ -131,7 +132,7 @@ ListItem { Action { id: startstopaction visible: recordId > 0 - iconSource: "../images/stop.png" + iconSource: "../../images/stop.png" text: i18n.dtr("ubtms", "Stop Timer") onTriggered: { stop_workflow(); @@ -191,7 +192,7 @@ ListItem { anchors.verticalCenter: parent.verticalCenter anchors.horizontalCenter: parent.horizontalCenter anchors.leftMargin: units.gu(0.5) - source: isFavorite ? "../images/star.png" : "../images/star-inactive.png" + source: isFavorite ? "../../images/star.png" : "../../images/star-inactive.png" fillMode: Image.PreserveAspectFit width: units.gu(2) height: units.gu(2) @@ -210,7 +211,7 @@ ListItem { if (result.success) { isFavorite = newFavoriteState; - starIcon.source = isFavorite ? "../images/star.png" : "../images/star-inactive.png"; + starIcon.source = isFavorite ? "../../images/star.png" : "../../images/star-inactive.png"; } else { console.warn("⚠️ Failed to toggle project favorite:", result.message); } diff --git a/qml/components/TasksForDayWidget.qml b/qml/components/cards/TasksForDayWidget.qml similarity index 96% rename from qml/components/TasksForDayWidget.qml rename to qml/components/cards/TasksForDayWidget.qml index 071d9976..966a8323 100644 --- a/qml/components/TasksForDayWidget.qml +++ b/qml/components/cards/TasksForDayWidget.qml @@ -7,9 +7,10 @@ import QtQuick 2.7 import Lomiri.Components 1.3 import QtQuick.Layouts 1.3 import QtQuick.LocalStorage 2.7 as Sql -import "../../models/constants.js" as AppConst -import "../../models/task.js" as Task -import "../../models/utils.js" as Utils +import "../../../models/constants.js" as AppConst +import "../../../models/task.js" as Task +import "../../../models/utils.js" as Utils +import ".." Item { id: todayTasksWidget diff --git a/qml/components/UpdatesDetailsCard.qml b/qml/components/cards/UpdatesDetailsCard.qml similarity index 96% rename from qml/components/UpdatesDetailsCard.qml rename to qml/components/cards/UpdatesDetailsCard.qml index 2a41e98f..25fe7849 100644 --- a/qml/components/UpdatesDetailsCard.qml +++ b/qml/components/cards/UpdatesDetailsCard.qml @@ -8,10 +8,11 @@ import QtQuick 2.12 import QtQuick.Controls 2.2 import Lomiri.Components 1.3 import QtQuick.Layouts 1.1 -import "../../models/utils.js" as Utils -import "../../models/constants.js" as AppConst -import "../../models/project.js" as Project -import "../../models/accounts.js" as Accounts +import "../../../models/utils.js" as Utils +import "../../../models/constants.js" as AppConst +import "../../../models/project.js" as Project +import "../../../models/accounts.js" as Accounts +import ".." ListItem { id: updateItem diff --git a/qml/components/AccountSelectorDialog.qml b/qml/components/dialogs/AccountSelectorDialog.qml similarity index 99% rename from qml/components/AccountSelectorDialog.qml rename to qml/components/dialogs/AccountSelectorDialog.qml index 4478751c..4134c590 100644 --- a/qml/components/AccountSelectorDialog.qml +++ b/qml/components/dialogs/AccountSelectorDialog.qml @@ -9,7 +9,8 @@ import QtQuick 2.7 import Lomiri.Components 1.3 import Lomiri.Components.Popups 1.3 -import "../../models/accounts.js" as Accounts +import "../../../models/accounts.js" as Accounts +import ".." Item { id: root diff --git a/qml/components/ColorPicker.qml b/qml/components/dialogs/ColorPicker.qml similarity index 99% rename from qml/components/ColorPicker.qml rename to qml/components/dialogs/ColorPicker.qml index e5f401bd..a0a5cc53 100644 --- a/qml/components/ColorPicker.qml +++ b/qml/components/dialogs/ColorPicker.qml @@ -2,6 +2,7 @@ import QtQuick 2.7 import QtQuick.Controls 2.2 import QtQuick.Layouts 1.1 import Lomiri.Components.Popups 1.3 +import ".." Item { id: colorPopupWrapper diff --git a/qml/components/ContentPickerDialog.qml b/qml/components/dialogs/ContentPickerDialog.qml similarity index 99% rename from qml/components/ContentPickerDialog.qml rename to qml/components/dialogs/ContentPickerDialog.qml index 5e1d96e0..82e0e037 100644 --- a/qml/components/ContentPickerDialog.qml +++ b/qml/components/dialogs/ContentPickerDialog.qml @@ -3,6 +3,7 @@ import QtQuick 2.4 import Lomiri.Components 1.3 import Lomiri.Components.Popups 1.0 as Popups import Lomiri.Content 1.3 +import ".." Popups.PopupBase { id: picker diff --git a/qml/components/CreateUpdateDialog.qml b/qml/components/dialogs/CreateUpdateDialog.qml similarity index 97% rename from qml/components/CreateUpdateDialog.qml rename to qml/components/dialogs/CreateUpdateDialog.qml index fac484da..f6a60004 100644 --- a/qml/components/CreateUpdateDialog.qml +++ b/qml/components/dialogs/CreateUpdateDialog.qml @@ -14,10 +14,11 @@ import QtQuick.Controls 2.2 import Lomiri.Components.Popups 1.3 import Lomiri.Components 1.3 import QtQuick.Layouts 1.3 -import "../../models/accounts.js" as Accounts -import "../../models/global.js" as Global -import "../components" as Components -import "richtext" +import "../../../models/accounts.js" as Accounts +import "../../../models/global.js" as Global +import ".." as Components +import "../richtext" +import ".." Item { id: popupWrapper diff --git a/qml/components/SaveDiscardDialog.qml b/qml/components/dialogs/SaveDiscardDialog.qml similarity index 99% rename from qml/components/SaveDiscardDialog.qml rename to qml/components/dialogs/SaveDiscardDialog.qml index a044a090..633e3035 100644 --- a/qml/components/SaveDiscardDialog.qml +++ b/qml/components/dialogs/SaveDiscardDialog.qml @@ -26,6 +26,7 @@ import QtQuick 2.7 import QtQuick.Controls 2.2 import Lomiri.Components.Popups 1.3 import Lomiri.Components 1.3 +import ".." Item { id: dialogWrapper diff --git a/qml/components/TimePickerPopup.qml b/qml/components/dialogs/TimePickerPopup.qml similarity index 99% rename from qml/components/TimePickerPopup.qml rename to qml/components/dialogs/TimePickerPopup.qml index d5dd9c03..a718dc78 100644 --- a/qml/components/TimePickerPopup.qml +++ b/qml/components/dialogs/TimePickerPopup.qml @@ -24,6 +24,7 @@ import QtQuick 2.7 import QtQuick.Controls 2.2 import Lomiri.Components.Popups 1.3 +import ".." Item { id: popupWrapper diff --git a/qml/components/InfoBar.qml b/qml/components/feedback/InfoBar.qml similarity index 99% rename from qml/components/InfoBar.qml rename to qml/components/feedback/InfoBar.qml index e4b30977..5aad9ebd 100644 --- a/qml/components/InfoBar.qml +++ b/qml/components/feedback/InfoBar.qml @@ -1,4 +1,5 @@ import QtQuick 2.7 +import ".." Item { id: root diff --git a/qml/components/LoadMoreFooter.qml b/qml/components/feedback/LoadMoreFooter.qml similarity index 99% rename from qml/components/LoadMoreFooter.qml rename to qml/components/feedback/LoadMoreFooter.qml index 79ceb7eb..e56e5e92 100644 --- a/qml/components/LoadMoreFooter.qml +++ b/qml/components/feedback/LoadMoreFooter.qml @@ -24,6 +24,7 @@ import QtQuick 2.7 import Lomiri.Components 1.3 +import ".." /** * LoadMoreFooter - A footer component for infinite scroll ListView diff --git a/qml/components/LoadingIndicator.qml b/qml/components/feedback/LoadingIndicator.qml similarity index 99% rename from qml/components/LoadingIndicator.qml rename to qml/components/feedback/LoadingIndicator.qml index 75ff8204..a73f6eb5 100644 --- a/qml/components/LoadingIndicator.qml +++ b/qml/components/feedback/LoadingIndicator.qml @@ -24,6 +24,7 @@ import QtQuick 2.7 import Lomiri.Components 1.3 +import ".." /** * LoadingIndicator - A reusable loading indicator component diff --git a/qml/components/NotificationBell.qml b/qml/components/feedback/NotificationBell.qml similarity index 98% rename from qml/components/NotificationBell.qml rename to qml/components/feedback/NotificationBell.qml index b7a81c4f..537a39b0 100644 --- a/qml/components/NotificationBell.qml +++ b/qml/components/feedback/NotificationBell.qml @@ -2,9 +2,10 @@ import QtQuick 2.7 import QtQuick.Controls 2.2 as Controls import QtQuick.Layouts 1.3 import Lomiri.Components 1.3 -import "../../models/constants.js" as AppConst -import "../../models/notifications.js" as Notifications +import "../../../models/constants.js" as AppConst +import "../../../models/notifications.js" as Notifications import Pparent.Notifications 1.0 +import ".." Item { id: bellWidget @@ -587,12 +588,12 @@ Item { source: { var notifType = modelData.type || ""; switch(notifType) { - case "Task": return "../images/task.svg"; - case "Activity": return "../images/activity.svg"; - case "Project": return "../images/project.svg"; - case "ProjectUpdate": return "../images/project.svg"; - case "Timesheet": return "../images/timesheet.svg"; - default: return "../images/notification.png"; + case "Task": return "../../images/task.svg"; + case "Activity": return "../../images/activity.svg"; + case "Project": return "../../images/project.svg"; + case "ProjectUpdate": return "../../images/project.svg"; + case "Timesheet": return "../../images/timesheet.svg"; + default: return "../../images/notification.png"; } } fillMode: Image.PreserveAspectFit @@ -630,12 +631,12 @@ Item { source: { var notifType = modelData.type || ""; switch(notifType) { - case "Task": return "../images/task.svg"; - case "Activity": return "../images/activity.svg"; - case "Project": return "../images/project.svg"; - case "ProjectUpdate": return "../images/project.svg"; - case "Timesheet": return "../images/timesheet.svg"; - default: return "../images/notification.png"; + case "Task": return "../../images/task.svg"; + case "Activity": return "../../images/activity.svg"; + case "Project": return "../../images/project.svg"; + case "ProjectUpdate": return "../../images/project.svg"; + case "Timesheet": return "../../images/timesheet.svg"; + default: return "../../images/notification.png"; } } fillMode: Image.PreserveAspectFit diff --git a/qml/components/NotificationPopup.qml b/qml/components/feedback/NotificationPopup.qml similarity index 99% rename from qml/components/NotificationPopup.qml rename to qml/components/feedback/NotificationPopup.qml index ae0160c1..16b4d70f 100644 --- a/qml/components/NotificationPopup.qml +++ b/qml/components/feedback/NotificationPopup.qml @@ -26,6 +26,7 @@ import QtQuick 2.7 import QtQuick.Controls 2.2 import Lomiri.Components.Popups 1.3 import Lomiri.Components 1.3 +import ".." Item { id: popupWrapper diff --git a/qml/components/AccountDrawer.qml b/qml/components/navigation/AccountDrawer.qml similarity index 99% rename from qml/components/AccountDrawer.qml rename to qml/components/navigation/AccountDrawer.qml index 1e1eb4c0..5255ccbb 100644 --- a/qml/components/AccountDrawer.qml +++ b/qml/components/navigation/AccountDrawer.qml @@ -3,8 +3,9 @@ import Lomiri.Components 1.3 import Lomiri.Components.Popups 1.3 import QtQuick.Controls 2.2 import QtQuick.Layouts 1.11 -import "../../models/accounts.js" as Accounts -import "../../models/utils.js" as Utils +import "../../../models/accounts.js" as Accounts +import "../../../models/utils.js" as Utils +import ".." Item { id: accountDrawer diff --git a/qml/components/DialerMenu.qml b/qml/components/navigation/DialerMenu.qml similarity index 98% rename from qml/components/DialerMenu.qml rename to qml/components/navigation/DialerMenu.qml index beee4c9a..36bdf8bb 100644 --- a/qml/components/DialerMenu.qml +++ b/qml/components/navigation/DialerMenu.qml @@ -27,7 +27,8 @@ import QtQuick.Controls 2.2 import QtQuick.Layouts 1.1 import QtGraphicalEffects 1.0 import Lomiri.Components 1.3 -import "../../models/constants.js" as AppConst +import "../../../models/constants.js" as AppConst +import ".." Item { id: dialerMenu diff --git a/qml/components/ListHeader.qml b/qml/components/navigation/ListHeader.qml similarity index 99% rename from qml/components/ListHeader.qml rename to qml/components/navigation/ListHeader.qml index 71c4731b..4cf9b45b 100644 --- a/qml/components/ListHeader.qml +++ b/qml/components/navigation/ListHeader.qml @@ -1,6 +1,7 @@ import QtQuick 2.7 import QtQuick.Controls 2.2 import QtGraphicalEffects 1.0 +import ".." Rectangle { id: topFilterBar diff --git a/qml/components/NavigationMenuList.qml b/qml/components/navigation/NavigationMenuList.qml similarity index 89% rename from qml/components/NavigationMenuList.qml rename to qml/components/navigation/NavigationMenuList.qml index 5e4bc96b..1da1ed30 100644 --- a/qml/components/NavigationMenuList.qml +++ b/qml/components/navigation/NavigationMenuList.qml @@ -1,6 +1,7 @@ import QtQuick 2.6 import Lomiri.Components 1.3 -import "../features/settings/components" as SettingsComponents +import "../../features/settings/components" as SettingsComponents +import ".." Column { id: root diff --git a/qml/components/CustomDatePicker.qml b/qml/components/pickers/CustomDatePicker.qml similarity index 99% rename from qml/components/CustomDatePicker.qml rename to qml/components/pickers/CustomDatePicker.qml index 9fed5433..46f8f601 100644 --- a/qml/components/CustomDatePicker.qml +++ b/qml/components/pickers/CustomDatePicker.qml @@ -28,7 +28,8 @@ import QtQuick.Controls 2.2 import QtQuick.Layouts 1.1 import Lomiri.Components.Popups 1.3 import Lomiri.Components.Pickers 1.3 -import "../../models/utils.js" as Utils +import "../../../models/utils.js" as Utils +import ".." Item { id: popupWrapper diff --git a/qml/components/DateRangeSelector.qml b/qml/components/pickers/DateRangeSelector.qml similarity index 99% rename from qml/components/DateRangeSelector.qml rename to qml/components/pickers/DateRangeSelector.qml index 57dfe6e7..75dc0d2b 100644 --- a/qml/components/DateRangeSelector.qml +++ b/qml/components/pickers/DateRangeSelector.qml @@ -3,6 +3,7 @@ import QtQuick.Controls 2.12 import QtQuick.Layouts 1.3 import QtQuick.Dialogs 1.2 import Lomiri.Components.Pickers 1.3 +import ".." Item { id: dateRangeSelector diff --git a/qml/components/DaySelector.qml b/qml/components/pickers/DaySelector.qml similarity index 99% rename from qml/components/DaySelector.qml rename to qml/components/pickers/DaySelector.qml index e76dd633..86050c6f 100644 --- a/qml/components/DaySelector.qml +++ b/qml/components/pickers/DaySelector.qml @@ -3,6 +3,7 @@ import QtQuick.Controls 2.12 import QtQuick.Layouts 1.3 import QtQuick.Dialogs 1.2 import Lomiri.Components.Pickers 1.3 +import ".." Item { id: daySelector diff --git a/qml/components/QuickDateSelector.qml b/qml/components/pickers/QuickDateSelector.qml similarity index 97% rename from qml/components/QuickDateSelector.qml rename to qml/components/pickers/QuickDateSelector.qml index 4555920b..93686d41 100644 --- a/qml/components/QuickDateSelector.qml +++ b/qml/components/pickers/QuickDateSelector.qml @@ -27,7 +27,8 @@ import QtQuick.Controls 2.2 import QtQuick.Layouts 1.1 import QtGraphicalEffects 1.0 import Lomiri.Components 1.3 -import "../../models/constants.js" as AppConst +import "../../../models/constants.js" as AppConst +import ".." LomiriShape { id: datepicker_tb diff --git a/qml/components/qmldir b/qml/components/qmldir new file mode 100644 index 00000000..5963a662 --- /dev/null +++ b/qml/components/qmldir @@ -0,0 +1,55 @@ +AccountDrawer 1.0 navigation/AccountDrawer.qml +AccountSelector 1.0 selectors/AccountSelector.qml +AccountSelectorDialog 1.0 dialogs/AccountSelectorDialog.qml +ActivityDetailsCard 1.0 cards/ActivityDetailsCard.qml +AssigneeFilterMenu 1.0 selectors/AssigneeFilterMenu.qml +AttachmentManager 1.0 workflow/AttachmentManager.qml +BackendBridge 1.0 system/BackendBridge.qml +Bubblemap 1.0 visualization/Bubblemap.qml +ColorPicker 1.0 dialogs/ColorPicker.qml +ContentPickerDialog 1.0 dialogs/ContentPickerDialog.qml +CreateUpdateDialog 1.0 dialogs/CreateUpdateDialog.qml +CreateUpdatePage 1.0 workflow/CreateUpdatePage.qml +CustomDatePicker 1.0 pickers/CustomDatePicker.qml +DateRangeSelector 1.0 pickers/DateRangeSelector.qml +DaySelector 1.0 pickers/DaySelector.qml +DialerMenu 1.0 navigation/DialerMenu.qml +DialogComboSelector 1.0 selectors/DialogComboSelector.qml +EHower 1.0 visualization/EHower.qml +EHowerIndicator 1.0 visualization/EHowerIndicator.qml +FormDraftHandler 1.0 workflow/FormDraftHandler.qml +GlobalTimerWidget 1.0 system/GlobalTimerWidget.qml +ImagePreviewer 1.0 system/ImagePreviewer.qml +InfoBar 1.0 feedback/InfoBar.qml +InlineOptionSelector 1.0 selectors/InlineOptionSelector.qml +ListHeader 1.0 navigation/ListHeader.qml +LoadMoreFooter 1.0 feedback/LoadMoreFooter.qml +LoadingIndicator 1.0 feedback/LoadingIndicator.qml +MultiAssigneeSelector 1.0 selectors/MultiAssigneeSelector.qml +NavigationMenuList 1.0 navigation/NavigationMenuList.qml +NotificationBell 1.0 feedback/NotificationBell.qml +NotificationPopup 1.0 feedback/NotificationPopup.qml +OptionSelectorPopover 1.0 selectors/OptionSelectorPopover.qml +OutlinedContainer 1.0 base/OutlinedContainer.qml +OutlinedTextField 1.0 base/OutlinedTextField.qml +ProjectDetailsCard 1.0 cards/ProjectDetailsCard.qml +ProjectList 1.0 visualization/ProjectList.qml +ProjectPieChart 1.0 visualization/ProjectPieChart.qml +ProjectSelector 1.0 selectors/ProjectSelector.qml +ProjectStageSelector 1.0 selectors/ProjectStageSelector.qml +QuickDateSelector 1.0 pickers/QuickDateSelector.qml +SaveDiscardDialog 1.0 dialogs/SaveDiscardDialog.qml +SelectionButton 1.0 selectors/SelectionButton.qml +StageFilterMenu 1.0 selectors/StageFilterMenu.qml +StatusSelector 1.0 selectors/StatusSelector.qml +TSButton 1.0 base/TSButton.qml +TSCombobox 1.0 base/TSCombobox.qml +TSIconButton 1.0 base/TSIconButton.qml +TSLabel 1.0 base/TSLabel.qml +TSProgressbar 1.0 base/TSProgressbar.qml +TasksForDayWidget 1.0 cards/TasksForDayWidget.qml +TimePickerPopup 1.0 dialogs/TimePickerPopup.qml +TreeSelector 1.0 selectors/TreeSelector.qml +UpdatesDetailsCard 1.0 cards/UpdatesDetailsCard.qml +UserSelector 1.0 selectors/UserSelector.qml +WorkItemSelector 1.0 selectors/WorkItemSelector.qml diff --git a/qml/components/AccountSelector.qml b/qml/components/selectors/AccountSelector.qml similarity index 99% rename from qml/components/AccountSelector.qml rename to qml/components/selectors/AccountSelector.qml index dc979b69..2252e70f 100644 --- a/qml/components/AccountSelector.qml +++ b/qml/components/selectors/AccountSelector.qml @@ -1,6 +1,7 @@ import QtQuick 2.7 import QtQuick.Controls 2.2 -import "../../models/accounts.js" as Accounts +import "../../../models/accounts.js" as Accounts +import ".." ComboBox { id: instanceCombo diff --git a/qml/components/AssigneeFilterMenu.qml b/qml/components/selectors/AssigneeFilterMenu.qml similarity index 99% rename from qml/components/AssigneeFilterMenu.qml rename to qml/components/selectors/AssigneeFilterMenu.qml index 037aa50a..faa6e908 100644 --- a/qml/components/AssigneeFilterMenu.qml +++ b/qml/components/selectors/AssigneeFilterMenu.qml @@ -27,7 +27,8 @@ import QtQuick.Controls 2.2 import QtQuick.Layouts 1.1 import QtGraphicalEffects 1.0 import Lomiri.Components 1.3 -import "../../models/constants.js" as AppConst +import "../../../models/constants.js" as AppConst +import ".." Item { id: assigneeFilterMenu diff --git a/qml/components/DialogComboSelector.qml b/qml/components/selectors/DialogComboSelector.qml similarity index 99% rename from qml/components/DialogComboSelector.qml rename to qml/components/selectors/DialogComboSelector.qml index 53583a65..84636613 100644 --- a/qml/components/DialogComboSelector.qml +++ b/qml/components/selectors/DialogComboSelector.qml @@ -2,6 +2,7 @@ import QtQuick 2.7 import QtQuick.Controls 2.2 import Lomiri.Components 1.3 import Lomiri.Components.Popups 1.3 +import ".." Item { id: dialogWrapper diff --git a/qml/components/InlineOptionSelector.qml b/qml/components/selectors/InlineOptionSelector.qml similarity index 99% rename from qml/components/InlineOptionSelector.qml rename to qml/components/selectors/InlineOptionSelector.qml index 9755f18c..38d3b5e9 100644 --- a/qml/components/InlineOptionSelector.qml +++ b/qml/components/selectors/InlineOptionSelector.qml @@ -1,7 +1,8 @@ import QtQuick 2.7 import QtQuick.Controls 2.2 import Lomiri.Components 1.3 -import "../../models/constants.js" as AppConst +import "../../../models/constants.js" as AppConst +import ".." /** * InlineOptionSelector - Displays options directly on the page without popup diff --git a/qml/components/MultiAssigneeSelector.qml b/qml/components/selectors/MultiAssigneeSelector.qml similarity index 99% rename from qml/components/MultiAssigneeSelector.qml rename to qml/components/selectors/MultiAssigneeSelector.qml index 631b312a..b074cea1 100644 --- a/qml/components/MultiAssigneeSelector.qml +++ b/qml/components/selectors/MultiAssigneeSelector.qml @@ -26,7 +26,8 @@ import QtQuick 2.7 import QtQuick.Controls 2.2 import QtQuick.Layouts 1.3 import Lomiri.Components 1.3 -import "../../models/accounts.js" as Accounts +import "../../../models/accounts.js" as Accounts +import ".." Item { id: multiAssigneeSelector diff --git a/qml/components/OptionSelectorPopover.qml b/qml/components/selectors/OptionSelectorPopover.qml similarity index 97% rename from qml/components/OptionSelectorPopover.qml rename to qml/components/selectors/OptionSelectorPopover.qml index 1d2b7a86..ba11d713 100644 --- a/qml/components/OptionSelectorPopover.qml +++ b/qml/components/selectors/OptionSelectorPopover.qml @@ -2,7 +2,8 @@ import QtQuick 2.7 import QtQuick.Controls 2.2 import Lomiri.Components 1.3 import Lomiri.Components.Popups 1.3 -import "../../models/constants.js" as AppConst +import "../../../models/constants.js" as AppConst +import ".." /** * OptionSelectorPopover - Direct list selection without intermediate ComboBox diff --git a/qml/components/ProjectSelector.qml b/qml/components/selectors/ProjectSelector.qml similarity index 98% rename from qml/components/ProjectSelector.qml rename to qml/components/selectors/ProjectSelector.qml index 56c6a587..8843d8db 100644 --- a/qml/components/ProjectSelector.qml +++ b/qml/components/selectors/ProjectSelector.qml @@ -8,8 +8,9 @@ import QtQuick 2.7 import QtQuick.Controls 2.2 import Lomiri.Components 1.3 import Lomiri.Components.Popups 1.3 -import "../../models/project.js" as Project -import "../../models/accounts.js" as Accounts +import "../../../models/project.js" as Project +import "../../../models/accounts.js" as Accounts +import ".." Item { id: root diff --git a/qml/components/ProjectStageSelector.qml b/qml/components/selectors/ProjectStageSelector.qml similarity index 99% rename from qml/components/ProjectStageSelector.qml rename to qml/components/selectors/ProjectStageSelector.qml index a12fe1eb..e7004e05 100644 --- a/qml/components/ProjectStageSelector.qml +++ b/qml/components/selectors/ProjectStageSelector.qml @@ -26,7 +26,8 @@ import QtQuick 2.12 import QtQuick.Controls 2.2 import Lomiri.Components 1.3 import Lomiri.Components.Popups 1.3 -import "../../models/project.js" as Project +import "../../../models/project.js" as Project +import ".." /** * ProjectStageSelector - A popup dialog for selecting and changing project stages diff --git a/qml/components/SelectionButton.qml b/qml/components/selectors/SelectionButton.qml similarity index 97% rename from qml/components/SelectionButton.qml rename to qml/components/selectors/SelectionButton.qml index 30f1bdf1..9426aa01 100644 --- a/qml/components/SelectionButton.qml +++ b/qml/components/selectors/SelectionButton.qml @@ -1,7 +1,8 @@ import QtQuick 2.7 import QtQuick.Controls 2.2 import Lomiri.Components 1.3 -import "../../models/constants.js" as AppConst +import "../../../models/constants.js" as AppConst +import ".." /** * SelectionButton - Inline option selector wrapper diff --git a/qml/components/StageFilterMenu.qml b/qml/components/selectors/StageFilterMenu.qml similarity index 99% rename from qml/components/StageFilterMenu.qml rename to qml/components/selectors/StageFilterMenu.qml index 779941f6..25dc223a 100644 --- a/qml/components/StageFilterMenu.qml +++ b/qml/components/selectors/StageFilterMenu.qml @@ -27,7 +27,8 @@ import QtQuick.Controls 2.2 import QtQuick.Layouts 1.1 import QtGraphicalEffects 1.0 import Lomiri.Components 1.3 -import "../../models/constants.js" as AppConst +import "../../../models/constants.js" as AppConst +import ".." Item { id: stageFilterMenu diff --git a/qml/components/StatusSelector.qml b/qml/components/selectors/StatusSelector.qml similarity index 99% rename from qml/components/StatusSelector.qml rename to qml/components/selectors/StatusSelector.qml index c871ee7b..a37be96d 100644 --- a/qml/components/StatusSelector.qml +++ b/qml/components/selectors/StatusSelector.qml @@ -7,6 +7,7 @@ import QtQuick 2.7 import QtQuick.Controls 2.2 import Lomiri.Components 1.3 +import ".." Item { id: root diff --git a/qml/components/TreeSelector.qml b/qml/components/selectors/TreeSelector.qml similarity index 99% rename from qml/components/TreeSelector.qml rename to qml/components/selectors/TreeSelector.qml index bf9bda20..4a0fcf4d 100644 --- a/qml/components/TreeSelector.qml +++ b/qml/components/selectors/TreeSelector.qml @@ -2,6 +2,7 @@ import QtQuick 2.7 import QtQuick.Controls 2.2 import QtQuick.Layouts 1.3 import Lomiri.Components 1.3 +import ".." Item { id: treeSelector diff --git a/qml/components/UserSelector.qml b/qml/components/selectors/UserSelector.qml similarity index 98% rename from qml/components/UserSelector.qml rename to qml/components/selectors/UserSelector.qml index f567163a..633fc052 100644 --- a/qml/components/UserSelector.qml +++ b/qml/components/selectors/UserSelector.qml @@ -24,7 +24,8 @@ import QtQuick 2.7 import QtQuick.Controls 2.2 -import "../../models/accounts.js" as Accounts +import "../../../models/accounts.js" as Accounts +import ".." ComboBox { id: userCombo diff --git a/qml/components/WorkItemSelector.qml b/qml/components/selectors/WorkItemSelector.qml similarity index 99% rename from qml/components/WorkItemSelector.qml rename to qml/components/selectors/WorkItemSelector.qml index 73baa77e..5863b86a 100644 --- a/qml/components/WorkItemSelector.qml +++ b/qml/components/selectors/WorkItemSelector.qml @@ -1,10 +1,11 @@ import QtQuick 2.7 import QtQuick.Controls 2.2 import Lomiri.Components 1.3 -import "../../models/accounts.js" as Accounts -import "../../models/project.js" as Project -import "../../models/task.js" as Task +import "../../../models/accounts.js" as Accounts +import "../../../models/project.js" as Project +import "../../../models/task.js" as Task import QtQml 2.7 +import ".." Rectangle { id: workItemSelector diff --git a/qml/components/BackendBridge.qml b/qml/components/system/BackendBridge.qml similarity index 99% rename from qml/components/BackendBridge.qml rename to qml/components/system/BackendBridge.qml index 214c5314..3f8a02e6 100644 --- a/qml/components/BackendBridge.qml +++ b/qml/components/system/BackendBridge.qml @@ -26,6 +26,7 @@ import QtQuick 2.7 import io.thp.pyotherside 1.4 +import ".." Item { id: bridge diff --git a/qml/components/GlobalTimerWidget.qml b/qml/components/system/GlobalTimerWidget.qml similarity index 97% rename from qml/components/GlobalTimerWidget.qml rename to qml/components/system/GlobalTimerWidget.qml index 08dd3d53..b63199ce 100644 --- a/qml/components/GlobalTimerWidget.qml +++ b/qml/components/system/GlobalTimerWidget.qml @@ -1,9 +1,10 @@ import QtQuick 2.7 import QtQuick.Controls 2.2 import Lomiri.Components 1.3 -import "../../models/timer_service.js" as TimerService -import "../../models/utils.js" as Utils -import "../features/timesheets/components" as TimesheetComponents +import "../../../models/timer_service.js" as TimerService +import "../../../models/utils.js" as Utils +import "../../features/timesheets/components" as TimesheetComponents +import ".." Rectangle { id: globalTimer @@ -216,10 +217,10 @@ Rectangle { // Emit paused/resumed signals if (currentlyPaused && !globalTimer.previousPausedState) { globalTimer.timerPaused(); - pausebutton.source = "../images/play.png"; + pausebutton.source = "../../images/play.png"; } else if (!currentlyPaused && globalTimer.previousPausedState) { globalTimer.timerResumed(); - pausebutton.source = "../images/pause.png"; + pausebutton.source = "../../images/pause.png"; } // Update previous states @@ -314,7 +315,7 @@ Rectangle { anchors.margins: units.gu(1) width: units.gu(5) height: units.gu(5) - source: "../images/pause.png" + source: "../../images/pause.png" fillMode: Image.PreserveAspectFit visible: !isSyncing || TimerService.isRunning() @@ -343,7 +344,7 @@ Rectangle { anchors.margins: units.gu(1) width: units.gu(5) height: units.gu(5) - source: "../images/stop.png" + source: "../../images/stop.png" fillMode: Image.PreserveAspectFit visible: !isSyncing || TimerService.isRunning() diff --git a/qml/components/ImagePreviewer.qml b/qml/components/system/ImagePreviewer.qml similarity index 99% rename from qml/components/ImagePreviewer.qml rename to qml/components/system/ImagePreviewer.qml index 6bb30c84..937bc81e 100644 --- a/qml/components/ImagePreviewer.qml +++ b/qml/components/system/ImagePreviewer.qml @@ -6,9 +6,10 @@ import Lomiri.Components 1.3 import Lomiri.Components.Popups 1.3 import Lomiri.Content 1.3 import io.thp.pyotherside 1.4 +import ".." // DB helpers -import "../../models/accounts.js" as Accounts +import "../../../models/accounts.js" as Accounts // --- Fullscreen Image Previewer (Download → Open in…) --- Rectangle { diff --git a/qml/components/Bubblemap.qml b/qml/components/visualization/Bubblemap.qml similarity index 99% rename from qml/components/Bubblemap.qml rename to qml/components/visualization/Bubblemap.qml index 46692c0e..31faeeab 100644 --- a/qml/components/Bubblemap.qml +++ b/qml/components/visualization/Bubblemap.qml @@ -25,6 +25,7 @@ import QtQuick 2.7 import QtQuick.Controls 2.2 import QtGraphicalEffects 1.0 +import ".." Item { id: bubbleMap diff --git a/qml/components/EHower.qml b/qml/components/visualization/EHower.qml similarity index 98% rename from qml/components/EHower.qml rename to qml/components/visualization/EHower.qml index 6b589029..02485664 100644 --- a/qml/components/EHower.qml +++ b/qml/components/visualization/EHower.qml @@ -27,9 +27,10 @@ import Lomiri.Components 1.3 import QtCharts 2.0 import QtQuick.Layouts 1.11 import Qt.labs.settings 1.0 -import "../../models/constants.js" as AppConst +import "../../../models/constants.js" as AppConst import QtQuick.LocalStorage 2.7 as Sql -import "../../models/accounts.js" as Accounts +import "../../../models/accounts.js" as Accounts +import ".." Item { id: ehoverMatrix @@ -232,7 +233,7 @@ Item { anchors.centerIn: parent spacing: units.gu(1) Image { - source: "../images/q1.png" + source: "../../images/q1.png" width: units.gu(4) height: units.gu(4) fillMode: Image.PreserveAspectFit @@ -290,7 +291,7 @@ Item { anchors.centerIn: parent spacing: units.gu(1) Image { - source: "../images/q2.png" + source: "../../images/q2.png" width: units.gu(4) height: units.gu(4) fillMode: Image.PreserveAspectFit @@ -347,7 +348,7 @@ Item { anchors.centerIn: parent spacing: units.gu(1) Image { - source: "../images/q3.png" + source: "../../images/q3.png" width: units.gu(4) height: units.gu(4) fillMode: Image.PreserveAspectFit @@ -405,7 +406,7 @@ Item { anchors.centerIn: parent spacing: units.gu(1) Image { - source: "../images/q4.png" + source: "../../images/q4.png" width: units.gu(4) height: units.gu(4) fillMode: Image.PreserveAspectFit diff --git a/qml/components/EHowerIndicator.qml b/qml/components/visualization/EHowerIndicator.qml similarity index 94% rename from qml/components/EHowerIndicator.qml rename to qml/components/visualization/EHowerIndicator.qml index 20854349..3ad4baf9 100644 --- a/qml/components/EHowerIndicator.qml +++ b/qml/components/visualization/EHowerIndicator.qml @@ -1,6 +1,7 @@ import QtQuick 2.7 import QtQuick.Controls 2.2 -import "../../models/constants.js" as AppConst +import "../../../models/constants.js" as AppConst +import ".." Text { id: quadrantLabel diff --git a/qml/components/ProjectList.qml b/qml/components/visualization/ProjectList.qml similarity index 99% rename from qml/components/ProjectList.qml rename to qml/components/visualization/ProjectList.qml index 2792a5bb..c68099f2 100644 --- a/qml/components/ProjectList.qml +++ b/qml/components/visualization/ProjectList.qml @@ -26,10 +26,11 @@ import QtQuick 2.7 import QtQuick.Controls 2.2 import QtQuick.Layouts 1.1 import Lomiri.Components 1.3 -import "./" as Components +import ".." as Components import QtQuick.LocalStorage 2.7 as Sql -import "../../models/accounts.js" as Accounts -import "../../models/project.js" as Project +import "../../../models/accounts.js" as Accounts +import "../../../models/project.js" as Project +import ".." /* ProjectNavigator.qml - Logic Overview diff --git a/qml/components/ProjectPieChart.qml b/qml/components/visualization/ProjectPieChart.qml similarity index 98% rename from qml/components/ProjectPieChart.qml rename to qml/components/visualization/ProjectPieChart.qml index 43fab283..5aa11129 100644 --- a/qml/components/ProjectPieChart.qml +++ b/qml/components/visualization/ProjectPieChart.qml @@ -25,9 +25,10 @@ import QtQuick 2.7 import QtCharts 2.0 import QtQuick.Controls 2.2 -import "../../models/utils.js" as Utils -import "../../models/project.js" as Project -import "../../models/accounts.js" as Account +import "../../../models/utils.js" as Utils +import "../../../models/project.js" as Project +import "../../../models/accounts.js" as Account +import ".." Item { id: root diff --git a/qml/components/AttachmentManager.qml b/qml/components/workflow/AttachmentManager.qml similarity index 99% rename from qml/components/AttachmentManager.qml rename to qml/components/workflow/AttachmentManager.qml index f2f5db2e..25bc100f 100644 --- a/qml/components/AttachmentManager.qml +++ b/qml/components/workflow/AttachmentManager.qml @@ -11,6 +11,7 @@ import Lomiri.Components 1.3 import Lomiri.Components.Popups 1.3 import Lomiri.Content 1.3 import io.thp.pyotherside 1.4 +import ".." Item { id: attachmentManager @@ -118,7 +119,7 @@ Item { anchors.centerIn: parent spacing: units.gu(1) Icon { - source: "../images/upload-svgrepo-com.svg" + source: "../../images/upload-svgrepo-com.svg" width: units.gu(3) height: units.gu(3) color: "white" @@ -205,7 +206,7 @@ Item { trailingActions: ListItemActions { actions: [ Action { - iconSource: "../images/show.png" + iconSource: "../../images/show.png" text: i18n.dtr("ubtms", "View") onTriggered: attachmentManager._downloadAndOpen(attachmentListItem.rec) } diff --git a/qml/components/CreateUpdatePage.qml b/qml/components/workflow/CreateUpdatePage.qml similarity index 99% rename from qml/components/CreateUpdatePage.qml rename to qml/components/workflow/CreateUpdatePage.qml index 0f4c103b..35041c7e 100644 --- a/qml/components/CreateUpdatePage.qml +++ b/qml/components/workflow/CreateUpdatePage.qml @@ -9,9 +9,10 @@ import QtQuick.Controls 2.2 import Lomiri.Components 1.3 import Lomiri.Components.Popups 1.3 import QtQuick.Layouts 1.3 -import "../../models/accounts.js" as Accounts -import "../../models/global.js" as Global -import "richtext" +import "../../../models/accounts.js" as Accounts +import "../../../models/global.js" as Global +import "../richtext" +import ".." Page { id: createUpdatePage diff --git a/qml/components/FormDraftHandler.qml b/qml/components/workflow/FormDraftHandler.qml similarity index 99% rename from qml/components/FormDraftHandler.qml rename to qml/components/workflow/FormDraftHandler.qml index 17c703c0..e123a8fc 100644 --- a/qml/components/FormDraftHandler.qml +++ b/qml/components/workflow/FormDraftHandler.qml @@ -23,7 +23,8 @@ */ import QtQuick 2.7 -import "../../models/draft_manager.js" as DraftManager +import "../../../models/draft_manager.js" as DraftManager +import ".." /** * FormDraftHandler - Reusable component for form draft management From 14bedd61139bda1e8db29c6eb432fd6f2e1acfbc Mon Sep 17 00:00:00 2001 From: Suraj Yadav Date: Thu, 14 May 2026 10:59:41 +0530 Subject: [PATCH 04/67] fix: Update Python import paths in BackendBridge, ImagePreviewer, and AttachmentManager components --- qml/components/system/BackendBridge.qml | 5 +++-- qml/components/system/ImagePreviewer.qml | 2 +- qml/components/workflow/AttachmentManager.qml | 2 +- 3 files changed, 5 insertions(+), 4 deletions(-) diff --git a/qml/components/system/BackendBridge.qml b/qml/components/system/BackendBridge.qml index 3f8a02e6..8337d06a 100644 --- a/qml/components/system/BackendBridge.qml +++ b/qml/components/system/BackendBridge.qml @@ -32,8 +32,8 @@ Item { id: bridge // --- Configuration --- - // Path where Python modules live. Default points to ../../src/ - property url pythonImportPath: Qt.resolvedUrl("../../src/") + // Path where Python modules live. + property url pythonImportPath: Qt.resolvedUrl("../../../src/") // True once the Python module is imported and ready property bool ready: false @@ -83,6 +83,7 @@ Item { // Forward Python errors to QML onError: function (traceback) { + console.error("PyOtherSide error:", traceback); bridge.pythonError(traceback); } diff --git a/qml/components/system/ImagePreviewer.qml b/qml/components/system/ImagePreviewer.qml index 937bc81e..90dc19c3 100644 --- a/qml/components/system/ImagePreviewer.qml +++ b/qml/components/system/ImagePreviewer.qml @@ -46,7 +46,7 @@ Rectangle { Python { id: python Component.onCompleted: { - addImportPath(Qt.resolvedUrl("../src/")); + addImportPath(Qt.resolvedUrl("../../../src/")); importModule("backend", function () { console.log("[ImagePreviewer] backend imported"); }); } onError: function (name, msg, tb) { console.error("[ImagePreviewer][py] " + name + ": " + msg + "\n" + tb); } diff --git a/qml/components/workflow/AttachmentManager.qml b/qml/components/workflow/AttachmentManager.qml index 25bc100f..6ff08870 100644 --- a/qml/components/workflow/AttachmentManager.qml +++ b/qml/components/workflow/AttachmentManager.qml @@ -293,7 +293,7 @@ Item { Python { id: python Component.onCompleted: { - addImportPath(Qt.resolvedUrl("../src/")); + addImportPath(Qt.resolvedUrl("../../../src/")); importModule("backend", function () { console.log("backend imported"); }); From fabe8887d427d0935ebed8847e691a989f6dc93e Mon Sep 17 00:00:00 2001 From: Suraj Yadav Date: Thu, 14 May 2026 13:01:20 +0530 Subject: [PATCH 05/67] feat: Enhance attachment download handling with error notifications and improved response structure --- qml/components/workflow/AttachmentManager.qml | 5 +++ src/backend.py | 40 ++++++++++++++----- 2 files changed, 36 insertions(+), 9 deletions(-) diff --git a/qml/components/workflow/AttachmentManager.qml b/qml/components/workflow/AttachmentManager.qml index 6ff08870..c8a5107b 100644 --- a/qml/components/workflow/AttachmentManager.qml +++ b/qml/components/workflow/AttachmentManager.qml @@ -726,6 +726,11 @@ Item { return; } + if (res.success === false) { + attachmentManager._notify(res.error || "Attachment could not be downloaded", 3500); + return; + } + if (res.type === "binary" && res.data) { var dlName = (res.name && res.name.length) ? res.name : fname; var dlMime = res.mimetype || mime; diff --git a/src/backend.py b/src/backend.py index 54a34015..e4cfc8d7 100755 --- a/src/backend.py +++ b/src/backend.py @@ -282,7 +282,7 @@ def ensure_export_file_from_base64(suggested_name, b64_data, mime): return None -def attachment_ondemand_download(settings_db,account_id, remote_record_id): +def attachment_ondemand_download(settings_db, account_id, remote_record_id): accounts = get_all_accounts(settings_db) selected = None for acc in accounts: @@ -291,15 +291,37 @@ def attachment_ondemand_download(settings_db,account_id, remote_record_id): break if not selected: - return None + return { + "success": False, + "error": "Account not found", + } - client = OdooClient( - selected["link"], - selected["database"], - selected["username"], - selected["api_key"], - ) - return client.ondemanddownload(remote_record_id,selected["username"],selected["api_key"],False) + try: + client = OdooClient( + selected["link"], + selected["database"], + selected["username"], + selected["api_key"], + ) + result = client.ondemanddownload( + remote_record_id, + selected["username"], + selected["api_key"], + False, + ) + if isinstance(result, dict): + result["success"] = True + return result + except Exception as e: + log.exception( + "[ATTACHMENT] Failed to download attachment %s for account %s", + remote_record_id, + account_id, + ) + return { + "success": False, + "error": str(e), + } def attachment_upload(settings_db,account_id, filepath,res_type,res_id): send("ondemand_upload_message","Initiating upload") From 760b082806d9b35de6f5c46529bd292896213765 Mon Sep 17 00:00:00 2001 From: Anmol Garg Date: Thu, 14 May 2026 16:00:44 +0530 Subject: [PATCH 06/67] feat: add offline Voice-to-Text support and Model Management --- .gitignore | 2 + CMakeLists.txt | 61 ++ clickable.yaml | 4 + pulse-socket | 1 + qml/TSApp.qml | 1 + qml/app/GlobalWidgets.qml | 12 + qml/components/ModelDownloadTimerWidget.qml | 63 +++ qml/components/richtext/HtmlEditorToolbar.qml | 25 + qml/components/richtext/RichTextEditor.qml | 96 ++++ qml/components/richtext/RichTextPreview.qml | 151 ++++- qml/features/settings/pages/Settings_Page.qml | 13 +- .../settings/pages/Settings_VoiceModel.qml | 531 ++++++++++++++++++ qml/images/download.svg | 12 + qml/images/mic.svg | 12 + src/backend.py | 528 ++++++++++++++++- ubtms.apparmor | 2 +- voice_to_text/__init__.py | 0 voice_to_text/requirements.txt | 10 + voice_to_text/voice2text.py | 131 +++++ 19 files changed, 1640 insertions(+), 15 deletions(-) create mode 120000 pulse-socket create mode 100644 qml/components/ModelDownloadTimerWidget.qml create mode 100644 qml/features/settings/pages/Settings_VoiceModel.qml create mode 100644 qml/images/download.svg create mode 100644 qml/images/mic.svg create mode 100644 voice_to_text/__init__.py create mode 100644 voice_to_text/requirements.txt create mode 100644 voice_to_text/voice2text.py diff --git a/.gitignore b/.gitignore index acbd12fa..b3e132a7 100644 --- a/.gitignore +++ b/.gitignore @@ -2,3 +2,5 @@ __pycache__ build *.pot .agent +voice_to_text/lib/ +.clickable \ No newline at end of file diff --git a/CMakeLists.txt b/CMakeLists.txt index 20462bf9..0843f357 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -57,6 +57,67 @@ install(DIRECTORY src DESTINATION ${DATA_DIR}) install(DIRECTORY qml DESTINATION ${DATA_DIR}) install(DIRECTORY models DESTINATION ${DATA_DIR}) +install(DIRECTORY voice_to_text DESTINATION ${DATA_DIR} PATTERN "model" EXCLUDE) + + +# Map Clickable architecture to Pip platform tags +if(CLICK_ARCH STREQUAL "arm64") + set(PIP_PLATFORM "manylinux2014_aarch64") +elseif(CLICK_ARCH STREQUAL "amd64") + set(PIP_PLATFORM "manylinux2014_x86_64") +else() + set(PIP_PLATFORM "manylinux2014_${CLICK_ARCH}") +endif() + +# Detect Python version and ABI for pip dependencies +execute_process( + COMMAND python3 -c "import sys; print('{}.{}'.format(sys.version_info.major, sys.version_info.minor))" + OUTPUT_VARIABLE PYTHON_VERSION + OUTPUT_STRIP_TRAILING_WHITESPACE +) +execute_process( + COMMAND python3 -c "import sys; print('cp{}{}'.format(sys.version_info.major, sys.version_info.minor))" + OUTPUT_VARIABLE PYTHON_ABI + OUTPUT_STRIP_TRAILING_WHITESPACE +) + +# Dynamically download python dependencies during build +add_custom_command( + OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/voice_deps_installed.stamp + # Clean the build-time lib directory to ensure a fresh install + COMMAND rm -rf ${CMAKE_CURRENT_BINARY_DIR}/voice_to_text/lib + COMMAND mkdir -p ${CMAKE_CURRENT_BINARY_DIR}/voice_to_text/lib + # 1. Download all dependencies with the correct architecture/platform tags + COMMAND mkdir -p ${CMAKE_CURRENT_BINARY_DIR}/python_downloads + # Download binary packages (force aarch64) + # We use --no-deps to prevent it from trying to resolve pure-python dependencies with platform tags + COMMAND python3 -m pip download --dest ${CMAKE_CURRENT_BINARY_DIR}/python_downloads + --platform ${PIP_PLATFORM} --python-version ${PYTHON_VERSION} --implementation cp --abi ${PYTHON_ABI} --only-binary=:all: --no-deps + vosk==0.3.45 cffi==1.17.1 websockets==13.1 charset-normalizer==3.4.7 + # Download pure-python packages (no platform tags needed as they are none-any) + COMMAND python3 -m pip download --dest ${CMAKE_CURRENT_BINARY_DIR}/python_downloads + certifi==2024.2.2 idna==3.13 requests==2.31.0 srt==3.5.3 tqdm==4.67.3 urllib3==1.26.18 pycparser + + # 2. Install the downloaded packages into the target lib folder + # Phase 1: Binary ones (force platform). Use --no-deps to skip resolution of pure-python deps. + COMMAND python3 -m pip install --target ${CMAKE_CURRENT_BINARY_DIR}/voice_to_text/lib + --no-index --find-links=${CMAKE_CURRENT_BINARY_DIR}/python_downloads + --platform ${PIP_PLATFORM} --python-version ${PYTHON_VERSION} --implementation cp --abi ${PYTHON_ABI} --only-binary=:all: --no-deps + vosk==0.3.45 cffi==1.17.1 websockets==13.1 charset-normalizer==3.4.7 + # Phase 2: Pure-python ones. We also use --no-deps here to be safe and specific. + COMMAND python3 -m pip install --target ${CMAKE_CURRENT_BINARY_DIR}/voice_to_text/lib + --no-index --find-links=${CMAKE_CURRENT_BINARY_DIR}/python_downloads --no-deps + certifi==2024.2.2 idna==3.13 requests==2.31.0 srt==3.5.3 tqdm==4.67.3 urllib3==1.26.18 pycparser + + # 3. Bundle libatomic.so.1 (required by vosk on some arm64 devices) + # It's installed in the container via dependencies_target in clickable.yaml + COMMAND cp /usr/lib/${ARCH_TRIPLET}/libatomic.so.1 ${CMAKE_CURRENT_BINARY_DIR}/voice_to_text/lib/ || true + COMMAND touch ${CMAKE_CURRENT_BINARY_DIR}/voice_deps_installed.stamp + DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/voice_to_text/requirements.txt + COMMENT "Installing Python dependencies for voice to text (${CLICK_ARCH})" +) +add_custom_target(install_voice_deps ALL DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/voice_deps_installed.stamp) +install(DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/voice_to_text/lib DESTINATION voice_to_text) # Translations file(GLOB_RECURSE I18N_SRC_FILES RELATIVE ${CMAKE_CURRENT_SOURCE_DIR}/po qml/*.qml qml/*.js) diff --git a/clickable.yaml b/clickable.yaml index 34297d33..e121c029 100644 --- a/clickable.yaml +++ b/clickable.yaml @@ -2,3 +2,7 @@ clickable_minimum_required: 8.0.0 builder: cmake kill: qmlscene skip_review: true +dependencies_target: + - libatomic1 +dependencies_host: + - python3-pip \ No newline at end of file diff --git a/pulse-socket b/pulse-socket new file mode 120000 index 00000000..f67f038c --- /dev/null +++ b/pulse-socket @@ -0,0 +1 @@ +/run/user/1000/pulse/native \ No newline at end of file diff --git a/qml/TSApp.qml b/qml/TSApp.qml index 25f711a8..b187e9ab 100644 --- a/qml/TSApp.qml +++ b/qml/TSApp.qml @@ -34,6 +34,7 @@ MainView { applicationName: "ubtms" property bool init: true property alias globalTimerWidget: globalWidgets.globalTimerWidget + property alias modelDownloadTimerWidget: globalWidgets.modelDownloadTimerWidget property alias backend_bridge: globalWidgets.backend_bridge property alias imagePreviewer: globalWidgets.imagePreviewer property alias accountPicker: globalWidgets.accountPicker diff --git a/qml/app/GlobalWidgets.qml b/qml/app/GlobalWidgets.qml index 227aca33..8eec9c24 100644 --- a/qml/app/GlobalWidgets.qml +++ b/qml/app/GlobalWidgets.qml @@ -8,6 +8,7 @@ Item { property var rootApp property alias globalTimerWidget: globalTimerWidget + property alias modelDownloadTimerWidget: modelDownloadTimerWidget property alias backend_bridge: backend_bridge property alias notifPopup: notifPopup property alias imagePreviewer: imagePreviewer @@ -27,6 +28,17 @@ Item { } } + // Model download progress bar for voice-to-text model - like sync + ModelDownloadTimerWidget { + id: modelDownloadTimerWidget + z: 9999 + anchors.bottom: parent.bottom + visible: false + showNotification: function (title, message, type) { + notifPopup.open(title, message, type); + } + } + BackendBridge { id: backend_bridge onPythonError: function (tb) { diff --git a/qml/components/ModelDownloadTimerWidget.qml b/qml/components/ModelDownloadTimerWidget.qml new file mode 100644 index 00000000..a570910d --- /dev/null +++ b/qml/components/ModelDownloadTimerWidget.qml @@ -0,0 +1,63 @@ +import QtQuick 2.7 +import Lomiri.Components 1.3 + +GlobalTimerWidget { + id: downloadWidget + + // Override completion logic to connect to our specific download events + Component.onCompleted: { + var root = downloadWidget; + while (root.parent) { + root = root.parent; + if (root.backend_bridge) { + backendBridge = root.backend_bridge; + // Connect our specialized handler for download-specific events + backendBridge.messageReceived.connect(handleDownloadEvent); + break; + } + } + } + + // Specialized handler for voice model downloads + function handleDownloadEvent(data) { + if (!data || !data.event || !isSyncing) + return; + + // This widget only handles download_* events + switch(data.event) { + case "download_progress": + syncProgress = data.payload / 100.0; + break; + case "download_message": + syncStatusMessage = data.payload; + break; + case "download_completed": + completeSyncSuccessfully(); + break; + case "download_error": + failSync(data.payload); + break; + } + } + + // Custom naming logic for downloads (overriding conceptual logic) + function updateSyncMessage() { + if (!isSyncing) + return; + + var progressPercent = Math.round(syncProgress * 100); + + if (progressPercent < 15) { + syncStatusMessage = i18n.dtr("ubtms", "Initializing download..."); + } else if (progressPercent < 80) { + syncStatusMessage = i18n.dtr("ubtms", "Downloading model files..."); + } else if (progressPercent < 95) { + syncStatusMessage = i18n.dtr("ubtms", "Extracting and installing..."); + } else { + syncStatusMessage = i18n.dtr("ubtms", "Installation complete!"); + } + } + + // Ensure naming logic runs when progress changes + onSyncProgressChanged: updateSyncMessage() +} diff --git a/qml/components/richtext/HtmlEditorToolbar.qml b/qml/components/richtext/HtmlEditorToolbar.qml index 08d857cd..9599c4f2 100644 --- a/qml/components/richtext/HtmlEditorToolbar.qml +++ b/qml/components/richtext/HtmlEditorToolbar.qml @@ -62,6 +62,31 @@ Rectangle { anchors.verticalCenter: parent.verticalCenter spacing: units.gu(0.5) + + // Mic / Voice Input + Button { + width: units.gu(5) + height: units.gu(4) + color: (editor && editor.listening) ? LomiriColors.red : (darkMode ? "#555555" : "#F0F0F0") + + Icon { + anchors.centerIn: parent + name: "microphone" + width: units.gu(2) + height: units.gu(2) + opacity: (editor && (editor.listening || editor.processing)) ? 0.5 : 1.0 + } + + onClicked: { + if (editor) { + editor.toggleVoiceRecognition() + } + } + } + + ToolbarSeparator {} + + // Bold Button { width: units.gu(5) diff --git a/qml/components/richtext/RichTextEditor.qml b/qml/components/richtext/RichTextEditor.qml index 98716d3e..f7cc1938 100644 --- a/qml/components/richtext/RichTextEditor.qml +++ b/qml/components/richtext/RichTextEditor.qml @@ -65,6 +65,102 @@ Item { /** Emitted when editor has finished loading */ signal contentLoaded() + // ============ VOICE RECOGNITION ============ + + /** Whether the editor is currently listening for voice input */ + property bool listening: false + + /** Whether the editor is processing voice input */ + property bool processing: false + + /** Partial voice recognition text (for UI feedback) */ + property string _partialVoiceText: "" + + Connections { + target: mainView.backend_bridge + onMessageReceived: { + if (data.event === "voice_recognition_partial") { + // Only handle voice events if this instance is active + if (!listening && !processing) return; + + var partialText = data.payload + if (partialText) { + var jsCode = "var marker = document.getElementById('voice-partial-marker'); " + + "if (marker) { " + + " marker.innerText = " + JSON.stringify(partialText + " (Listening...)") + "; " + + " window.editor.moveCursorToEnd(); " + + "}"; + wv.runJavaScript(jsCode); + } + } else if (data.event === "voice_recognition_result") { + editor.listening = false + editor.processing = false + var recognizedText = data.payload + console.log("[RichTextEditor] Received recognition result: " + recognizedText) + + // Replace the partial span with the final text + var jsCode = "var marker = document.getElementById('voice-partial-marker'); " + + "if (marker) { " + + " marker.outerHTML = " + JSON.stringify(recognizedText ? (recognizedText + " ") : "") + "; " + + "} else if (" + JSON.stringify(recognizedText) + ") { " + + " window.editor.focus(); window.editor.insertHTML(" + JSON.stringify(recognizedText + " ") + "); " + + "}"; + wv.runJavaScript(jsCode); + + // Force a sync to update the 'text' property and emit contentChanged + editor.syncContent(); + } else if (data.event === "voice_recognition_error") { + editor.listening = false + editor.processing = false + console.log("[RichTextEditor] Voice recognition error: " + data.payload) + + // Remove the partial span on error + var jsCode = "var marker = document.getElementById('voice-partial-marker'); " + + "if (marker) { " + + " marker.remove(); " + + "}"; + wv.runJavaScript(jsCode); + } + } + } + + /** Toggle voice recognition state */ + function toggleVoiceRecognition() { + if (listening) { + console.log("[RichTextEditor] Stopping voice recognition...") + listening = false + processing = true + mainView.backend_bridge.call("backend.stop_voice_recognition", []) + } else { + if (processing) return; + console.log("[RichTextEditor] Starting voice recognition...") + listening = true + processing = false + _partialVoiceText = "" + + // Move cursor to the end and insert a new line if there's already text, + // then insert a temporary span for live partial text + var jsCode = "try { " + + " window.editor.focus(); " + + " window.editor.moveCursorToEnd(); " + + + " var currentHTML = window.editor.getHTML(); " + + " var hasContent = currentHTML.replace(/<[^>]*>/g, '').trim().length > 0; " + + " var marker = 'Listening...'; " + + + " if (hasContent) { " + + " window.editor.insertHTML('

' + marker); " + + " } else { " + + " window.editor.insertHTML(marker); " + + " } " + + " window.editor.moveCursorToEnd(); " + + "} catch(e) { console.error('Error inserting voice marker: ', e); }"; + wv.runJavaScript(jsCode); + + mainView.backend_bridge.call("backend.run_voice_recognition", []) + } + } + // ============ PRIVATE PROPERTIES ============ property bool _isLoaded: false diff --git a/qml/components/richtext/RichTextPreview.qml b/qml/components/richtext/RichTextPreview.qml index 10a1cc80..7709998f 100644 --- a/qml/components/richtext/RichTextPreview.qml +++ b/qml/components/richtext/RichTextPreview.qml @@ -20,6 +20,58 @@ Rectangle { * without manual save. */ property bool liveSyncActive: false + property bool listening: false + property bool processing: false + property string textBeforeRecording: "" + property int _liveStartPos: 0 + property int _liveLength: 0 + + Connections { + target: mainView.backend_bridge + onMessageReceived: { + // Only handle voice events if this instance is the one listening + if (!root.listening && !root.processing) return; + + // data is the object sent from Python via bus.send() + if (data.event === "voice_recognition_partial") { + var partialText = data.payload + if (partialText) { + var str = " " + partialText + " (Listening...)"; + previewText.remove(root._liveStartPos, root._liveStartPos + root._liveLength); + previewText.insert(root._liveStartPos, str); + root._liveLength = str.length; + + cursorTimer.start(); + } + } else if (data.event === "voice_recognition_result") { + root.listening = false + root.processing = false + var recognizedText = data.payload + console.log("[RichTextPreview] Received recognition result: " + recognizedText) + + if (recognizedText) { + var finalStr = " " + recognizedText; + previewText.remove(root._liveStartPos, root._liveStartPos + root._liveLength); + previewText.insert(root._liveStartPos, finalStr); + root._liveLength = 0; + + root.contentChanged(previewText.text); + cursorTimer.start(); + } else { + // Restore if no text + previewText.remove(root._liveStartPos, root._liveStartPos + root._liveLength); + root._liveLength = 0; + cursorTimer.start(); + } + } else if (data.event === "voice_recognition_error") { + root.listening = false + root.processing = false + root.text = root.textBeforeRecording + console.log("[RichTextPreview] Voice recognition error: " + data.payload) + cursorTimer.start() + } + } + } // Internal: tracks last synced content to detect external changes property string _lastSyncedContent: "" @@ -190,6 +242,26 @@ Rectangle { } } + Timer { + id: cursorTimer + interval: 100 + repeat: false + onTriggered: { + if (previewText) { + // Ensure the TextArea is focused so it respects scroll-to-cursor + // and use .length (visible characters) instead of .text.length (HTML source length) + previewText.cursorPosition = previewText.length; + + // Force scroll to bottom if internal flickable exists + if (previewText.flickableItem) { + previewText.flickableItem.contentY = Math.max(0, previewText.flickableItem.contentHeight - previewText.flickableItem.height); + } else if (previewText.flickable) { + previewText.flickable.contentY = Math.max(0, previewText.flickable.contentHeight - previewText.flickable.height); + } + } + } + } + Column { id: column width: parent.width @@ -222,6 +294,7 @@ Rectangle { width: parent.width - units.gu(2) anchors.horizontalCenter: parent.horizontalCenter + height: parent.height // Update originalHtmlContent when user types onTextChanged: { @@ -259,38 +332,92 @@ Rectangle { // z: -1 } - Item { + Row { id: floatingActionButton - width: units.gu(3) - height: units.gu(3) + // width: units.gu(3) + // height: units.gu(3) anchors.right: parent.right anchors.bottom: parent.bottom anchors.rightMargin: units.gu(1) anchors.bottomMargin: units.gu(1) + spacing: units.gu(1) z: 10 visible: true Rectangle { + id: voiceButton + width: units.gu(3) + height: units.gu(3) + radius: units.gu(.5) + color: root.listening ? LomiriColors.red : LomiriColors.orange + + Icon { + id: voiceIcon + // source: "../../images/mic.svg" + name: "microphone" + width: units.gu(1.5) + height: units.gu(1.5) + anchors.horizontalCenter: parent.horizontalCenter + anchors.verticalCenter: parent.verticalCenter + opacity: (root.listening || root.processing) ? 0.5 : 1.0 + color: (root.listening || root.processing) ? LomiriColors.white : "white" + } + + MouseArea { + anchors.fill: parent + cursorShape: Qt.PointingHandCursor + onClicked: { + if (root.listening) { + console.log("[RichTextPreview] Stopping voice recognition...") + root.listening = false + root.processing = true + + // Replace the Listening indicator with Processing via direct node manipulation + previewText.remove(root._liveStartPos, root._liveStartPos + root._liveLength); + previewText.insert(root._liveStartPos, " (Processing...)"); + root._liveLength = " (Processing...)".length; + + backend_bridge.call("backend.stop_voice_recognition", []) + return; + } + if (root.processing) return; // Prevent double trigger + + console.log("[RichTextPreview] Voice recognition started") + root.textBeforeRecording = root.text + + // Initialize the live insertion point at the very end + root._liveStartPos = previewText.length; + root._liveLength = " (Listening...)".length; + previewText.insert(root._liveStartPos, " (Listening...)"); + + cursorTimer.start() + root.listening = true + root.processing = false + backend_bridge.call("backend.run_voice_recognition", []) + } + } + } + Rectangle { + id: expansionButton + width: units.gu(3) + height: units.gu(3) radius: units.gu(.5) color: LomiriColors.orange - anchors.fill: parent + Image { id: expansionIcon - source: "../../images/expansion.png" width: units.gu(1.5) height: units.gu(1.5) - // anchors.right: parent.right - // anchors.rightMargin: units.gu(2) anchors.horizontalCenter: parent.horizontalCenter anchors.verticalCenter: parent.verticalCenter + } - MouseArea { - anchors.fill: parent - cursorShape: Qt.PointingHandCursor - onClicked: root.clicked() - } + MouseArea { + anchors.fill: parent + // cursorShape: Qt.PointingHandCursor + onClicked: root.clicked() } } } diff --git a/qml/features/settings/pages/Settings_Page.qml b/qml/features/settings/pages/Settings_Page.qml index 07f34cd8..3e7ebf25 100644 --- a/qml/features/settings/pages/Settings_Page.qml +++ b/qml/features/settings/pages/Settings_Page.qml @@ -101,13 +101,24 @@ Page { iconColor: "#8e44ad" text: i18n.dtr("ubtms", "Theme Settings") active: settings.selectedSettingsPageUrl === "Settings_Theme.qml" - showDivider: false onClicked: { settings.selectedSettingsPageUrl = "Settings_Theme.qml"; apLayout.addPageToNextColumn(settings, Qt.resolvedUrl('Settings_Theme.qml')); } } + // select voice model + SettingsListItem { + iconName: "audio-input-microphone-symbolic" + iconColor: "#8e44ad" + text: i18n.dtr("ubtms", "Voice Model Settings") + showDivider: false + onClicked: { + apLayout.addPageToNextColumn(settings, Qt.resolvedUrl('Settings_VoiceModel.qml')); + } + } + + // Bottom spacer Item { width: parent.width; height: units.gu(1) } } diff --git a/qml/features/settings/pages/Settings_VoiceModel.qml b/qml/features/settings/pages/Settings_VoiceModel.qml new file mode 100644 index 00000000..65a35854 --- /dev/null +++ b/qml/features/settings/pages/Settings_VoiceModel.qml @@ -0,0 +1,531 @@ +/* +* MIT License +* +* Copyright (c) 2025 CIT-Services +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in all +* copies or substantial portions of the Software. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +*/ + +import QtQuick 2.7 +import QtQuick.Controls 2.2 +import QtQuick.LocalStorage 2.7 as Sql +import Lomiri.Components 1.3 +import Lomiri.Components.Popups 1.3 +import QtGraphicalEffects 1.0 +import "../components" +import "../../../components" +Page { + id: voiceModelSettingsPage + title: i18n.dtr("ubtms", "Voice Model Settings") + + header: SettingsHeader { + id: pageHeader + title: voiceModelSettingsPage.title + trailingActions: [ + Action { + iconName: "reload" + onTriggered: refreshModels() + enabled: !isDownloading + } + ] + } + + property string activeModelPath: "" + property bool isLoading: false + property bool isDownloading: false + property string downloadingModelId: "" + property string downloadingModelName: "" + property var downloadStatus: { "in_progress": false, "progress": 0, "message": "", "error": "" } + + function getActiveModelSetting() { + try { + var db = Sql.LocalStorage.openDatabaseSync("UBTMS_SettingsDB", "1.0", "UBTMS Settings Database", 1000000); + var result = "voice_to_text/model"; // Default + + db.transaction(function (tx) { + var rs = tx.executeSql('SELECT value FROM app_settings WHERE key = "active_voice_model"'); + if (rs.rows.length > 0) { + result = rs.rows.item(0).value; + } + }); + return result; + } catch (e) { + console.warn("Error reading active_voice_model setting:", e); + return "voice_to_text/model"; + } + } + + function saveActiveModelSetting(value) { + try { + var db = Sql.LocalStorage.openDatabaseSync("UBTMS_SettingsDB", "1.0", "UBTMS Settings Database", 1000000); + db.transaction(function (tx) { + tx.executeSql('CREATE TABLE IF NOT EXISTS app_settings (key TEXT PRIMARY KEY, value TEXT)'); + tx.executeSql('INSERT OR REPLACE INTO app_settings (key, value) VALUES ("active_voice_model", ?)', [value]); + }); + activeModelPath = value; + console.log("Setting saved: active_voice_model =", value); + } catch (e) { + console.warn("Error saving active_voice_model setting:", e); + } + } + + function refreshModels() { + if (!mainView.backend_bridge.ready) return; + + isLoading = true; + modelList.clear(); + + mainView.backend_bridge.call("backend.list_installed_models", [], function(models) { + isLoading = false; + if (models && models.length > 0) { + for (var i = 0; i < models.length; i++) { + modelList.append({ + "name": models[i].m_name, + "path": models[i].m_path, + "m_source": models[i].m_source, + "size": models[i].m_size || "" + }); + } + } + // After refreshing installed models, refresh available ones + refreshAvailableModels(); + }); + } + + function refreshAvailableModels() { + if (!mainView.backend_bridge.ready) return; + + availableModelList.clear(); + mainView.backend_bridge.call("backend.list_available_models", [], function(models) { + if (models && models.length > 0) { + // Only show models that are NOT installed + var installedPaths = []; + for (var i = 0; i < modelList.count; i++) { + installedPaths.push(modelList.get(i).path); + } + + for (var j = 0; j < models.length; j++) { + var modelId = models[j].id; + // Check if already installed (simple check by ID in path or similar) + var alreadyInstalled = false; + for (var k = 0; k < installedPaths.length; k++) { + if (installedPaths[k].indexOf(modelId) !== -1) { + alreadyInstalled = true; + break; + } + } + + if (!alreadyInstalled) { + availableModelList.append({ + "id": models[j].id, + "name": models[j].name, + "size": models[j].size, + "url": models[j].url + }); + } + } + } + }); + } + + function downloadModel(modelId, url, modelName) { + if (!mainView.backend_bridge.ready) return; + + downloadingModelId = modelId; + downloadingModelName = modelName; + isDownloading = true; + + // Start global timer widget indication at the bottom + if (mainView.modelDownloadTimerWidget) { + mainView.modelDownloadTimerWidget.startSync(0, modelName); + mainView.modelDownloadTimerWidget.syncStatusMessage = i18n.dtr("ubtms", "Starting download..."); + } + + notifPopup.open(i18n.dtr("ubtms", "Download Started"), i18n.dtr("ubtms", "Downloading %1...").arg(modelName), "info"); + mainView.backend_bridge.call("backend.download_voice_model", [modelId, url], function(res) { + if (res.status === "started") { + downloadStatusTimer.start(); + } else { + isDownloading = false; + console.error("Download failed to start:", res.message); + if (mainView.modelDownloadTimerWidget) { + mainView.modelDownloadTimerWidget.failSync(res.message || i18n.dtr("ubtms", "Could not start download")); + } + notifPopup.open(i18n.dtr("ubtms", "Download Failed"), res.message || i18n.dtr("ubtms", "Could not start download"), "error"); + } + }); + } + + Component.onCompleted: { + activeModelPath = getActiveModelSetting(); + if (mainView.backend_bridge.ready) { + refreshModels(); + checkInProgressDownload(); + } + } + + function checkInProgressDownload() { + mainView.backend_bridge.call("backend.get_model_download_status", [], function(status) { + if (status.in_progress) { + isDownloading = true; + downloadingModelId = status.model_id || ""; + downloadStatus = status; + downloadStatusTimer.start(); + } + }); + } + + function deleteModel(path, name) { + if (!mainView.backend_bridge.ready) return; + + var dialog = PopupUtils.open(confirmDeleteComponent, voiceModelSettingsPage, { + "modelPath": path, + "modelName": name + }); + } + + Component { + id: confirmDeleteComponent + Dialog { + id: confirmDeleteDialog + property string modelPath + property string modelName + title: i18n.dtr("ubtms", "Delete Model") + + Column { + spacing: units.gu(2) + width: parent.width + + Text { + text: i18n.dtr("ubtms", "Are you sure you want to delete the voice model '%1'?").arg(confirmDeleteDialog.modelName) + width: parent.width + wrapMode: Text.WordWrap + color: theme.palette.normal.backgroundText + horizontalAlignment: Text.AlignHCenter + } + + Row { + spacing: units.gu(2) + anchors.horizontalCenter: parent.horizontalCenter + + Button { + text: i18n.dtr("ubtms", "Cancel") + onClicked: PopupUtils.close(confirmDeleteDialog) + } + + Button { + text: i18n.dtr("ubtms", "Delete") + color: LomiriColors.red + onClicked: { + mainView.backend_bridge.call("backend.delete_voice_model", [confirmDeleteDialog.modelPath], function(res) { + PopupUtils.close(confirmDeleteDialog); + if (res.status === "success") { + notifPopup.open(i18n.dtr("ubtms", "Deleted"), i18n.dtr("ubtms", "Model %1 deleted successfully.").arg(confirmDeleteDialog.modelName), "success"); + refreshModels(); + } else { + notifPopup.open(i18n.dtr("ubtms", "Error"), res.message || i18n.dtr("ubtms", "Could not delete model"), "error"); + } + }); + } + } + } + } + } + } + + Connections { + target: mainView.backend_bridge + onReadyChanged: { + if (mainView.backend_bridge.ready) { + refreshModels(); + checkInProgressDownload(); + } + } + } + + ListModel { + id: modelList + } + + ListModel { + id: availableModelList + } + + Timer { + id: downloadStatusTimer + interval: 1000 + repeat: true + onTriggered: { + mainView.backend_bridge.call("backend.get_model_download_status", [], function(status) { + downloadStatus = status; + + // Update global timer widget at the bottom + if (mainView.modelDownloadTimerWidget) { + mainView.modelDownloadTimerWidget.syncProgress = status.progress / 100.0; + mainView.modelDownloadTimerWidget.syncStatusMessage = status.message || i18n.dtr("ubtms", "Downloading..."); + } + + if (!status.in_progress) { + downloadStatusTimer.stop(); + isDownloading = false; + refreshModels(); // Refresh both lists + if (status.error) { + // Show error + console.error("Download error:", status.error); + if (mainView.modelDownloadTimerWidget) { + mainView.modelDownloadTimerWidget.failSync(status.error); + } + notifPopup.open(i18n.dtr("ubtms", "Download Failed"), i18n.dtr("ubtms", "Failed to download %1: %2").arg(downloadingModelName).arg(status.error), "error"); + } else { + if (mainView.modelDownloadTimerWidget) { + mainView.modelDownloadTimerWidget.completeSyncSuccessfully(); + } + notifPopup.open(i18n.dtr("ubtms", "Success"), i18n.dtr("ubtms", "%1 installed successfully!").arg(downloadingModelName), "success"); + } + } + }); + } + } + + Flickable { + id: flickable + anchors.top: pageHeader.bottom + anchors.left: parent.left + anchors.right: parent.right + anchors.bottom: parent.bottom + contentHeight: contentColumn.height + clip: true + + Column { + id: contentColumn + width: parent.width + // spacing: units.gu(1) + + ListItem { + width: parent.width + // height: units.gu(5) + enabled: false + Label { + text: i18n.dtr("ubtms", "INSTALLED MODELS") + font.bold: true + font.pixelSize: units.gu(1.5) + anchors.left: parent.left + anchors.leftMargin: units.gu(2) + anchors.verticalCenter: parent.verticalCenter + color: LomiriColors.orange + } + } + + Repeater { + model: modelList + delegate: ListItem { + width: parent.width + height: units.gu(9) + divider.visible: true + + trailingActions: ListItemActions { + actions: [ + Action { + iconName: "delete" + enabled: model.m_source === "User" + onTriggered: { + deleteModel(model.path, model.name) + } + } + ] + } + + onClicked: { + saveActiveModelSetting(model.path); + } + + Rectangle { + anchors.fill: parent + color: activeModelPath === model.path ? + (theme.name === "Ubuntu.Components.Themes.SuruDark" ? "#222" : "#f0f0f0") : + "transparent" + visible: activeModelPath === model.path + } + + Column { + anchors { + left: parent.left + right: parent.right + verticalCenter: parent.verticalCenter + leftMargin: units.gu(2) + rightMargin: units.gu(6) + } + spacing: units.gu(0.5) + + Text { + text: model.name + font.pixelSize: units.gu(2) + font.bold: activeModelPath === model.path + color: theme.name === "Ubuntu.Components.Themes.SuruDark" ? "#f5f5f5" : "#111" + elide: Text.ElideRight + width: parent.width + } + + Text { + text: model.path + (model.size ? " (" + model.size + ")" : "") + font.pixelSize: units.gu(1.3) + color: theme.name === "Ubuntu.Components.Themes.SuruDark" ? "#888" : "#777" + elide: Text.ElideMiddle + width: parent.width + } + } + + Icon { + anchors.right: parent.right + anchors.verticalCenter: parent.verticalCenter + anchors.rightMargin: units.gu(2) + name: "ok" + width: units.gu(2.5) + height: units.gu(2.5) + color: LomiriColors.orange + visible: activeModelPath === model.path + } + } + } + + // Empty state for installed models + Text { + width: parent.width + height: units.gu(10) + horizontalAlignment: Text.AlignHCenter + verticalAlignment: Text.AlignVCenter + text: isLoading ? i18n.dtr("ubtms", "Scanning for models...") : i18n.dtr("ubtms", "No installed models found.") + visible: modelList.count === 0 + color: "#888" + font.italic: true + } + + // Available Models Section + ListItem { + width: parent.width + height: units.gu(5) + enabled: false + Label { + text: i18n.dtr("ubtms", "AVAILABLE FOR DOWNLOAD") + font.bold: true + font.pixelSize: units.gu(1.5) + anchors.left: parent.left + anchors.leftMargin: units.gu(2) + anchors.verticalCenter: parent.verticalCenter + color: LomiriColors.orange + } + } + + + + Repeater { + model: availableModelList + delegate: ListItem { + width: parent.width + height: units.gu(9) + divider.visible: true + enabled: true + opacity: isDownloading ? (downloadingModelId === model.id ? 1.0 : 0.5) : 1.0 + + onClicked: { + if (!isDownloading) { + downloadModel(model.id, model.url, model.name); + } + } + + Column { + anchors { + left: parent.left + right: parent.right + verticalCenter: parent.verticalCenter + leftMargin: units.gu(2) + rightMargin: units.gu(8) + } + spacing: units.gu(0.5) + + Text { + text: model.name + font.pixelSize: units.gu(2) + color: theme.name === "Ubuntu.Components.Themes.SuruDark" ? "#f5f5f5" : "#111" + elide: Text.ElideRight + width: parent.width + } + + Text { + text: model.size + font.pixelSize: units.gu(1.3) + color: theme.name === "Ubuntu.Components.Themes.SuruDark" ? "#888" : "#777" + elide: Text.ElideMiddle + width: parent.width + } + } + + Item { + anchors.right: parent.right + anchors.verticalCenter: parent.verticalCenter + anchors.rightMargin: units.gu(2) + width: units.gu(2.5) + height: units.gu(2.5) + visible: !isDownloading || downloadingModelId !== model.id + + Image { + id: downloadImg + anchors.fill: parent + source: Qt.resolvedUrl("../../../images/download.svg") + sourceSize: Qt.size(parent.width, parent.height) + visible: false + } + + ColorOverlay { + anchors.fill: downloadImg + source: downloadImg + color: LomiriColors.orange + } + } + + BusyIndicator { + anchors.right: parent.right + anchors.verticalCenter: parent.verticalCenter + anchors.rightMargin: units.gu(2) + running: isDownloading && downloadingModelId === model.id + visible: isDownloading && downloadingModelId === model.id + width: units.gu(2.5) + height: units.gu(2.5) + } + } + } + + // Empty state for available models + Text { + width: parent.width + height: units.gu(10) + horizontalAlignment: Text.AlignHCenter + verticalAlignment: Text.AlignVCenter + text: i18n.dtr("ubtms", "All available models are installed.") + visible: availableModelList.count === 0 && !isLoading + color: "#888" + font.italic: true + }} + + + } + NotificationPopup { + id: notifPopup + } +} diff --git a/qml/images/download.svg b/qml/images/download.svg new file mode 100644 index 00000000..e906eba0 --- /dev/null +++ b/qml/images/download.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/qml/images/mic.svg b/qml/images/mic.svg new file mode 100644 index 00000000..88825783 --- /dev/null +++ b/qml/images/mic.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/src/backend.py b/src/backend.py index 54a34015..a3f4dc97 100755 --- a/src/backend.py +++ b/src/backend.py @@ -22,7 +22,7 @@ # SOFTWARE. -from config import get_all_accounts, initialize_app_settings_db, update_last_synced_at +from config import get_all_accounts, initialize_app_settings_db, update_last_synced_at, get_setting from odoo_client import OdooClient from sync_from_odoo import sync_all_from_odoo,sync_ondemand_tables_from_odoo from sync_to_odoo import sync_all_to_odoo @@ -31,7 +31,18 @@ log = setup_logger() import os +import sys from pathlib import Path +import ctypes + +# Add root directory and voice_to_text/lib to sys.path +root_dir = Path(__file__).parent.parent.resolve() +if str(root_dir) not in sys.path: + sys.path.insert(0, str(root_dir)) + +voice_lib = root_dir / "voice_to_text" / "lib" +if voice_lib.exists() and str(voice_lib) not in sys.path: + sys.path.insert(0, str(voice_lib)) import platform import urllib3 import json @@ -48,6 +59,14 @@ http = urllib3.PoolManager(cert_reqs="CERT_NONE") +# Voice model download state +download_status = { + "in_progress": False, + "progress": 0, + "message": "", + "error": "" +} + def is_file_present(file_path): """ @@ -505,3 +524,510 @@ def start_sync_in_background(settings_db, account_id): Wrapper function for sync_background to provide a cleaner interface. """ return sync_background(settings_db, account_id) + +# Voice to Text STarts Here +_voice_stop_event = threading.Event() + +def stop_voice_recognition(): + """Signals the voice recognition thread to stop recording.""" + log.info("[VOICE] stop_voice_recognition called") + _voice_stop_event.set() + return True + +def get_voice_models_dir(): + """ + Returns the writable directory for voice models. + On Ubuntu Touch, this is in ~/.local/share/ubtms/voice_models + """ + data_home = os.environ.get('XDG_DATA_HOME') + if data_home: + base_dir = Path(data_home) / "ubtms" + else: + base_dir = Path.home() / ".local" / "share" / "ubtms" + + models_dir = base_dir / "voice_models" + models_dir.mkdir(parents=True, exist_ok=True) + return models_dir + + +def list_installed_models(): + """ + Scans for installed Vosk models in both the app directory and writable data directory. + Returns a list of dictionaries with model names, paths, and sizes. + """ + # 1. App directory models (Read-only on device) + app_models_dir = root_dir / "voice_to_text" + + # 2. User data directory models (Writable) + user_models_dir = get_voice_models_dir() + + search_paths = [ + (app_models_dir, "App"), + (user_models_dir, "User") + ] + + models = [] + seen_paths = set() + + for root_dir_to_scan, source_label in search_paths: + if not root_dir_to_scan.exists(): + continue + + # Standard Vosk models are directories containing 'am' and 'graph' subdirectories + for item in root_dir_to_scan.iterdir(): + if item.is_dir() and item not in seen_paths: + am_dir = item / "am" + graph_dir = item / "graph" + + if am_dir.exists() and graph_dir.exists(): + available_models = list_available_models() + known_names = {m["id"]: m["name"] for m in available_models if "id" in m} + known_names["model"] = "Indian English" # The bundled one is usually named 'model' + + if item.name in known_names: + model_name = known_names[item.name] + else: + # Fallback to cleaning README or using folder name + model_name = item.name + readme_path = item / "README" + if readme_path.exists(): + try: + with open(readme_path, 'r') as f: + first_line = f.readline().strip() + if first_line: + clean_name = first_line + noise_phrases = [ + "for mobile Vosk applications", + "for Android and iOS", + "Vosk mobile model", + "Vosk model", + "Vosk", + "model" + ] + for phrase in noise_phrases: + clean_name = clean_name.replace(phrase, "").strip() + + if clean_name: + model_name = clean_name + except Exception as e: + log.error(f"[VOICE] Error reading README for {item.name}: {e}") + + # Add (Default) suffix for bundled models + display_name = model_name + if source_label == "App": + display_name = f"{model_name} (Default)" + + # Calculate directory size + total_size = 0 + try: + for f in item.rglob('*'): + if f.is_file(): + total_size += f.stat().st_size + size_mb = total_size / (1024 * 1024) + model_size = f"{size_mb:.1f} MB" + except Exception: + model_size = "Unknown" + + try: + if source_label == "App": + rel_path = item.relative_to(root_dir) + else: + rel_path = item + + models.append({ + "m_name": display_name, + "m_path": str(rel_path), + "m_size": model_size, + "m_source": source_label + }) + except ValueError: + models.append({ + "m_name": display_name, + "m_path": str(item), + "m_size": model_size, + "m_source": source_label + }) + seen_paths.add(item) + + log.info(f"[VOICE] Found {len(models)} installed models") + return models + + +def list_available_models(): + """ + Returns a list of models available for download. + """ + return [ + {"id": "vosk-model-small-en-us-0.15", "name": "English (US, Small)", "size": "40M", "url": "https://alphacephei.com/vosk/models/vosk-model-small-en-us-0.15.zip"}, + {"id": "vosk-model-en-us-0.22", "name": "English (US)", "size": "1.8G", "url": "https://alphacephei.com/vosk/models/vosk-model-en-us-0.22.zip"}, + {"id": "vosk-model-en-us-0.22-lgraph", "name": "English (US, LGraph)", "size": "128M", "url": "https://alphacephei.com/vosk/models/vosk-model-en-us-0.22-lgraph.zip"}, + {"id": "vosk-model-en-us-0.42-gigaspeech", "name": "English (US, Gigaspeech)", "size": "2.3G", "url": "https://alphacephei.com/vosk/models/vosk-model-en-us-0.42-gigaspeech.zip"}, + {"id": "vosk-model-en-us-daanzu-20200905", "name": "English (US, Daanzu)", "size": "1.0G", "url": "https://alphacephei.com/vosk/models/vosk-model-en-us-daanzu-20200905.zip"}, + {"id": "vosk-model-en-us-daanzu-20200905-lgraph", "name": "English (US, Daanzu LGraph)", "size": "129M", "url": "https://alphacephei.com/vosk/models/vosk-model-en-us-daanzu-20200905-lgraph.zip"}, + {"id": "vosk-model-en-us-librispeech-0.2", "name": "English (US, Librispeech)", "size": "845M", "url": "https://alphacephei.com/vosk/models/vosk-model-en-us-librispeech-0.2.zip"}, + {"id": "vosk-model-small-en-us-zamia-0.5", "name": "English (US, Zamia Small)", "size": "49M", "url": "https://alphacephei.com/vosk/models/vosk-model-small-en-us-zamia-0.5.zip"}, + {"id": "vosk-model-en-us-aspire-0.2", "name": "English (US, Aspire)", "size": "1.4G", "url": "https://alphacephei.com/vosk/models/vosk-model-en-us-aspire-0.2.zip"}, + {"id": "vosk-model-en-us-0.21", "name": "English (US, 0.21)", "size": "1.6G", "url": "https://alphacephei.com/vosk/models/vosk-model-en-us-0.21.zip"}, + {"id": "vosk-model-en-in-0.5", "name": "English (Indian)", "size": "1G", "url": "https://alphacephei.com/vosk/models/vosk-model-en-in-0.5.zip"}, + {"id": "vosk-model-small-en-in-0.4", "name": "English (Indian, Small)", "size": "36M", "url": "https://alphacephei.com/vosk/models/vosk-model-small-en-in-0.4.zip"}, + {"id": "vosk-model-small-cn-0.22", "name": "Chinese (Small)", "size": "42M", "url": "https://alphacephei.com/vosk/models/vosk-model-small-cn-0.22.zip"}, + {"id": "vosk-model-cn-0.22", "name": "Chinese", "size": "1.3G", "url": "https://alphacephei.com/vosk/models/vosk-model-cn-0.22.zip"}, + {"id": "vosk-model-cn-kaldi-multicn-0.15", "name": "Chinese (Multi-cn)", "size": "1.5G", "url": "https://alphacephei.com/vosk/models/vosk-model-cn-kaldi-multicn-0.15.zip"}, + {"id": "vosk-model-ru-0.42", "name": "Russian", "size": "1.8G", "url": "https://alphacephei.com/vosk/models/vosk-model-ru-0.42.zip"}, + {"id": "vosk-model-small-ru-0.22", "name": "Russian (Small)", "size": "45M", "url": "https://alphacephei.com/vosk/models/vosk-model-small-ru-0.22.zip"}, + {"id": "vosk-model-ru-0.22", "name": "Russian (0.22)", "size": "1.5G", "url": "https://alphacephei.com/vosk/models/vosk-model-ru-0.22.zip"}, + {"id": "vosk-model-ru-0.10", "name": "Russian (0.10)", "size": "2.5G", "url": "https://alphacephei.com/vosk/models/vosk-model-ru-0.10.zip"}, + {"id": "vosk-model-small-fr-0.22", "name": "French (Small)", "size": "41M", "url": "https://alphacephei.com/vosk/models/vosk-model-small-fr-0.22.zip"}, + {"id": "vosk-model-fr-0.22", "name": "French", "size": "1.4G", "url": "https://alphacephei.com/vosk/models/vosk-model-fr-0.22.zip"}, + {"id": "vosk-model-small-fr-pguyot-0.3", "name": "French (pguyot Small)", "size": "39M", "url": "https://alphacephei.com/vosk/models/vosk-model-small-fr-pguyot-0.3.zip"}, + {"id": "vosk-model-fr-0.6-linto-2.2.0", "name": "French (Linto)", "size": "1.5G", "url": "https://alphacephei.com/vosk/models/vosk-model-fr-0.6-linto-2.2.0.zip"}, + {"id": "vosk-model-de-0.21", "name": "German", "size": "1.9G", "url": "https://alphacephei.com/vosk/models/vosk-model-de-0.21.zip"}, + {"id": "vosk-model-de-tuda-0.6-900k", "name": "German (Tuda)", "size": "4.4G", "url": "https://alphacephei.com/vosk/models/vosk-model-de-tuda-0.6-900k.zip"}, + {"id": "vosk-model-small-de-zamia-0.3", "name": "German (Zamia Small)", "size": "49M", "url": "https://alphacephei.com/vosk/models/vosk-model-small-de-zamia-0.3.zip"}, + {"id": "vosk-model-small-de-0.15", "name": "German (Small)", "size": "45M", "url": "https://alphacephei.com/vosk/models/vosk-model-small-de-0.15.zip"}, + {"id": "vosk-model-small-es-0.42", "name": "Spanish (Small)", "size": "39M", "url": "https://alphacephei.com/vosk/models/vosk-model-small-es-0.42.zip"}, + {"id": "vosk-model-es-0.42", "name": "Spanish", "size": "1.4G", "url": "https://alphacephei.com/vosk/models/vosk-model-es-0.42.zip"}, + {"id": "vosk-model-small-pt-0.3", "name": "Portuguese (Small)", "size": "31M", "url": "https://alphacephei.com/vosk/models/vosk-model-small-pt-0.3.zip"}, + {"id": "vosk-model-pt-fb-v0.1.1-20220516_2113", "name": "Portuguese", "size": "1.6G", "url": "https://alphacephei.com/vosk/models/vosk-model-pt-fb-v0.1.1-20220516_2113.zip"}, + {"id": "vosk-model-el-gr-0.7", "name": "Greek", "size": "1.1G", "url": "https://alphacephei.com/vosk/models/vosk-model-el-gr-0.7.zip"}, + {"id": "vosk-model-small-tr-0.3", "name": "Turkish (Small)", "size": "35M", "url": "https://alphacephei.com/vosk/models/vosk-model-small-tr-0.3.zip"}, + {"id": "vosk-model-small-vn-0.4", "name": "Vietnamese (Small)", "size": "32M", "url": "https://alphacephei.com/vosk/models/vosk-model-small-vn-0.4.zip"}, + {"id": "vosk-model-vn-0.4", "name": "Vietnamese", "size": "78M", "url": "https://alphacephei.com/vosk/models/vosk-model-vn-0.4.zip"}, + {"id": "vosk-model-small-it-0.22", "name": "Italian (Small)", "size": "48M", "url": "https://alphacephei.com/vosk/models/vosk-model-small-it-0.22.zip"}, + {"id": "vosk-model-it-0.22", "name": "Italian", "size": "1.2G", "url": "https://alphacephei.com/vosk/models/vosk-model-it-0.22.zip"}, + {"id": "vosk-model-small-nl-0.22", "name": "Dutch (Small)", "size": "39M", "url": "https://alphacephei.com/vosk/models/vosk-model-small-nl-0.22.zip"}, + {"id": "vosk-model-nl-spraakherkenning-0.6", "name": "Dutch", "size": "860M", "url": "https://alphacephei.com/vosk/models/vosk-model-nl-spraakherkenning-0.6.zip"}, + {"id": "vosk-model-nl-spraakherkenning-0.6-lgraph", "name": "Dutch (LGraph)", "size": "100M", "url": "https://alphacephei.com/vosk/models/vosk-model-nl-spraakherkenning-0.6-lgraph.zip"}, + {"id": "vosk-model-small-ca-0.4", "name": "Catalan (Small)", "size": "42M", "url": "https://alphacephei.com/vosk/models/vosk-model-small-ca-0.4.zip"}, + {"id": "vosk-model-ar-mgb2-0.4", "name": "Arabic (mgb2)", "size": "318M", "url": "https://alphacephei.com/vosk/models/vosk-model-ar-mgb2-0.4.zip"}, + {"id": "vosk-model-ar-0.22-linto-1.1.0", "name": "Arabic (Linto)", "size": "1.3G", "url": "https://alphacephei.com/vosk/models/vosk-model-ar-0.22-linto-1.1.0.zip"}, + {"id": "vosk-model-small-ar-tn-0.1-linto", "name": "Arabic Tunisian (Small)", "size": "158M", "url": "https://alphacephei.com/vosk/models/vosk-model-small-ar-tn-0.1-linto.zip"}, + {"id": "vosk-model-ar-tn-0.1-linto", "name": "Arabic Tunisian", "size": "517M", "url": "https://alphacephei.com/vosk/models/vosk-model-ar-tn-0.1-linto.zip"}, + {"id": "vosk-model-fa-0.42", "name": "Farsi", "size": "1.6G", "url": "https://alphacephei.com/vosk/models/vosk-model-fa-0.42.zip"}, + {"id": "vosk-model-small-fa-0.42", "name": "Farsi (Small)", "size": "53M", "url": "https://alphacephei.com/vosk/models/vosk-model-small-fa-0.42.zip"}, + {"id": "vosk-model-fa-0.5", "name": "Farsi (0.5)", "size": "1G", "url": "https://alphacephei.com/vosk/models/vosk-model-fa-0.5.zip"}, + {"id": "vosk-model-small-fa-0.5", "name": "Farsi (Small 0.5)", "size": "60M", "url": "https://alphacephei.com/vosk/models/vosk-model-small-fa-0.5.zip"}, + {"id": "vosk-model-tl-ph-generic-0.6", "name": "Filipino", "size": "320M", "url": "https://alphacephei.com/vosk/models/vosk-model-tl-ph-generic-0.6.zip"}, + {"id": "vosk-model-small-uk-v3-nano", "name": "Ukrainian (Nano)", "size": "73M", "url": "https://alphacephei.com/vosk/models/vosk-model-small-uk-v3-nano.zip"}, + {"id": "vosk-model-small-uk-v3-small", "name": "Ukrainian (Small)", "size": "133M", "url": "https://alphacephei.com/vosk/models/vosk-model-small-uk-v3-small.zip"}, + {"id": "vosk-model-uk-v3", "name": "Ukrainian", "size": "343M", "url": "https://alphacephei.com/vosk/models/vosk-model-uk-v3.zip"}, + {"id": "vosk-model-uk-v3-lgraph", "name": "Ukrainian (LGraph)", "size": "325M", "url": "https://alphacephei.com/vosk/models/vosk-model-uk-v3-lgraph.zip"}, + {"id": "vosk-model-small-kz-0.42", "name": "Kazakh (Small)", "size": "58M", "url": "https://alphacephei.com/vosk/models/vosk-model-small-kz-0.42.zip"}, + {"id": "vosk-model-kz-0.42", "name": "Kazakh", "size": "1.3G", "url": "https://alphacephei.com/vosk/models/vosk-model-kz-0.42.zip"}, + {"id": "vosk-model-small-sv-rhasspy-0.15", "name": "Swedish (Small)", "size": "289M", "url": "https://alphacephei.com/vosk/models/vosk-model-small-sv-rhasspy-0.15.zip"}, + {"id": "vosk-model-small-ja-0.22", "name": "Japanese (Small)", "size": "48M", "url": "https://alphacephei.com/vosk/models/vosk-model-small-ja-0.22.zip"}, + {"id": "vosk-model-ja-0.22", "name": "Japanese", "size": "1Gb", "url": "https://alphacephei.com/vosk/models/vosk-model-ja-0.22.zip"}, + {"id": "vosk-model-small-eo-0.42", "name": "Esperanto (Small)", "size": "42M", "url": "https://alphacephei.com/vosk/models/vosk-model-small-eo-0.42.zip"}, + {"id": "vosk-model-small-hi-0.22", "name": "Hindi (Small)", "size": "42M", "url": "https://alphacephei.com/vosk/models/vosk-model-small-hi-0.22.zip"}, + {"id": "vosk-model-hi-0.22", "name": "Hindi", "size": "1.5Gb", "url": "https://alphacephei.com/vosk/models/vosk-model-hi-0.22.zip"}, + {"id": "vosk-model-small-cs-0.4-rhasspy", "name": "Czech (Small)", "size": "44M", "url": "https://alphacephei.com/vosk/models/vosk-model-small-cs-0.4-rhasspy.zip"}, + {"id": "vosk-model-small-pl-0.22", "name": "Polish (Small)", "size": "50M", "url": "https://alphacephei.com/vosk/models/vosk-model-small-pl-0.22.zip"}, + {"id": "vosk-model-small-uz-0.22", "name": "Uzbek (Small)", "size": "49M", "url": "https://alphacephei.com/vosk/models/vosk-model-small-uz-0.22.zip"}, + {"id": "vosk-model-small-ko-0.22", "name": "Korean (Small)", "size": "82M", "url": "https://alphacephei.com/vosk/models/vosk-model-small-ko-0.22.zip"}, + {"id": "vosk-model-br-0.8", "name": "Breton", "size": "70M", "url": "https://alphacephei.com/vosk/models/vosk-model-br-0.8.zip"}, + {"id": "vosk-model-gu-0.42", "name": "Gujarati", "size": "700M", "url": "https://alphacephei.com/vosk/models/vosk-model-gu-0.42.zip"}, + {"id": "vosk-model-small-gu-0.42", "name": "Gujarati (Small)", "size": "100M", "url": "https://alphacephei.com/vosk/models/vosk-model-small-gu-0.42.zip"}, + {"id": "vosk-model-tg-0.22", "name": "Tajik", "size": "327M", "url": "https://alphacephei.com/vosk/models/vosk-model-tg-0.22.zip"}, + {"id": "vosk-model-small-tg-0.22", "name": "Tajik (Small)", "size": "50M", "url": "https://alphacephei.com/vosk/models/vosk-model-small-tg-0.22.zip"}, + {"id": "vosk-model-small-te-0.42", "name": "Telugu (Small)", "size": "58M", "url": "https://alphacephei.com/vosk/models/vosk-model-small-te-0.42.zip"}, + {"id": "vosk-model-small-ky-0.42", "name": "Kyrgyz (Small)", "size": "49M", "url": "https://alphacephei.com/vosk/models/vosk-model-small-ky-0.42.zip"}, + {"id": "vosk-model-ky-0.42", "name": "Kyrgyz", "size": "1.1G", "url": "https://alphacephei.com/vosk/models/vosk-model-ky-0.42.zip"}, + {"id": "vosk-model-small-ka-0.42", "name": "Georgian (Small)", "size": "45M", "url": "https://alphacephei.com/vosk/models/vosk-model-small-ka-0.42.zip"}, + {"id": "vosk-model-ka-0.42", "name": "Georgian", "size": "700M", "url": "https://alphacephei.com/vosk/models/vosk-model-ka-0.42.zip"} + ] + + +def get_model_download_status(): + """Returns the current download status for UI polling.""" + return download_status + + +def download_voice_model(model_id, url): + """ + Initiates a background thread to download and extract a voice model. + """ + global download_status + if download_status["in_progress"]: + return {"status": "error", "message": "Download already in progress"} + + download_status = { + "in_progress": True, + "progress": 0, + "message": "Starting download...", + "error": "", + "model_id": model_id + } + + def do_download(): + import zipfile + import shutil + temp_zip = None + temp_extract_dir = None + try: + models_dir = get_voice_models_dir() + target_path = models_dir / model_id + + if target_path.exists(): + download_status["in_progress"] = False + download_status["message"] = "Model already installed" + download_status["progress"] = 100 + return + + log.info(f"[VOICE] Downloading model from {url}") + download_status["message"] = "Downloading..." + + # Use a temporary file to avoid memory exhaustion for large models + temp_zip = models_dir / f"{model_id}.zip.tmp" + if temp_zip.exists(): + temp_zip.unlink() + + # Using urllib3 for download + response = http.request('GET', url, preload_content=False) + if response.status != 200: + raise Exception(f"Server returned status {response.status}") + + content_length = response.getheader('Content-Length') + total_size = int(content_length) if content_length else None + + if total_size: + # Check available disk space (need roughly 2.5x the zip size for download + extraction + safety) + try: + _, _, free = shutil.disk_usage(str(models_dir)) + free_mb = free / (1024 * 1024) + required_mb = (total_size * 2.5) / (1024 * 1024) + + log.info(f"[VOICE] Space check for {model_id}: Required: {required_mb:.1f} MB, Available: {free_mb:.1f} MB") + + if free < total_size * 2.5: + raise Exception(f"Insufficient storage. Have {free_mb:.1f} MB, need at least {required_mb:.1f} MB available.") + except Exception as disk_err: + if isinstance(disk_err, Exception) and "Insufficient storage" in str(disk_err): + raise disk_err + log.warning(f"[VOICE] Could not check disk space: {disk_err}") + # Continue anyway if check fails, as disk_usage might not work on all filesystems + + downloaded = 0 + with open(temp_zip, 'wb') as f: + for chunk in response.stream(1024 * 64): + f.write(chunk) + downloaded += len(chunk) + if total_size: + progress = int((downloaded / total_size) * 80) # 80% for download + download_status["progress"] = progress + send("download_progress", progress) + + download_status["message"] = "Extracting..." + send("download_message", "Extracting...") + download_status["progress"] = 85 + send("download_progress", 85) + + # Extract to a temporary directory to ensure atomic installation + temp_extract_dir = models_dir / f"{model_id}.extract.tmp" + if temp_extract_dir.exists(): + shutil.rmtree(temp_extract_dir) + temp_extract_dir.mkdir(parents=True, exist_ok=True) + + with zipfile.ZipFile(temp_zip) as z: + z.extractall(temp_extract_dir) + + # Vosk models usually have a single folder inside the zip + # We want to find the directory containing the actual model files ('am' and 'graph') + model_folder = None + for root, dirs, files in os.walk(temp_extract_dir): + if 'am' in dirs and 'graph' in dirs: + model_folder = Path(root) + break + + if not model_folder: + # Fallback: look for any subdirectory + subdirs = [d for d in temp_extract_dir.iterdir() if d.is_dir()] + if len(subdirs) == 1: + model_folder = subdirs[0] + else: + model_folder = temp_extract_dir + + # Move to final location (atomic move on same filesystem) + if target_path.exists(): + shutil.rmtree(target_path) + shutil.move(str(model_folder), str(target_path)) + + download_status["progress"] = 100 + download_status["message"] = "Installation complete" + download_status["in_progress"] = False + send("download_progress", 100) + send("download_completed", True) + log.info(f"[VOICE] Successfully installed model {model_id}") + + except Exception as e: + log.exception(f"[VOICE] Download failed: {e}") + download_status["in_progress"] = False + download_status["error"] = str(e) + download_status["message"] = "Failed" + send("download_error", str(e)) + finally: + # Cleanup temporary files + if temp_zip and temp_zip.exists(): + try: + temp_zip.unlink() + except Exception: + pass + if temp_extract_dir and temp_extract_dir.exists(): + try: + shutil.rmtree(temp_extract_dir) + except Exception: + pass + + threading.Thread(target=do_download, daemon=True).start() + return {"status": "started"} + + +def delete_voice_model(model_path): + """ + Deletes a voice model from the user data directory. + Cannot delete bundled models in the app directory. + """ + try: + path = Path(model_path) + + # If relative, it might be a bundled model or a legacy relative path + if not path.is_absolute(): + # Check if it's relative to user models dir + user_models_dir = get_voice_models_dir() + potential_path = user_models_dir / model_path + if potential_path.exists(): + path = potential_path + else: + # Check if it's relative to root (bundled models) + potential_path = root_dir / model_path + if potential_path.exists(): + path = potential_path + + if not path.exists(): + return {"status": "error", "message": "Model path not found"} + + # Security check: only allow deleting from the user models directory + user_models_dir = get_voice_models_dir() + if user_models_dir in path.parents: + import shutil + if path.is_dir(): + shutil.rmtree(path) + else: + path.unlink() + log.info(f"[VOICE] Deleted user model: {model_path}") + return {"status": "success"} + + # Check if it's in the app dir + app_models_dir = root_dir / "voice_to_text" + if app_models_dir in path.parents or path == app_models_dir: + log.warning(f"[VOICE] Attempted to delete bundled model: {model_path}") + return {"status": "error", "message": "Cannot delete bundled system models"} + + return {"status": "error", "message": "Permission denied"} + except Exception as e: + log.exception(f"[VOICE] Failed to delete model {model_path}: {e}") + return {"status": "error", "message": str(e)} + + +def resolve_settings_db_path(db_name="UBTMS_SettingsDB", app_id="ubtms"): + """Finds a specific QML database by its name (hash).""" + import hashlib + db_hash = hashlib.md5(db_name.encode()).hexdigest() + target_filename = f"{db_hash}.sqlite" + + user_home = Path.home() + db_paths = [ + user_home / ".local" / "share" / app_id / "Databases", + user_home / ".clickable" / "home" / ".local" / "share" / app_id / "Databases" + ] + + for db_dir in db_paths: + target = db_dir / target_filename + if target.exists(): + return str(target) + return None + + +def run_voice_recognition(): + """ + Runs voice recognition in a background thread to avoid blocking the UI. + Uses the offline Vosk engine. + """ + def do_recognition(): + try: + log.info("[VOICE] Starting offline voice recognition thread") + + # Fetch the active model path from settings + # First try the specific settings DB + db_path = resolve_settings_db_path("UBTMS_SettingsDB") + if not db_path: + # Fallback to main app DB + db_path = resolve_qml_db_path() + + active_model_rel_path = "" + if db_path: + active_model_rel_path = get_setting(db_path, "active_voice_model", "") + + # Resolve relative path if necessary + root_dir = Path(__file__).parent.parent.resolve() + if not active_model_rel_path: + log.error("[VOICE] No voice model configured") + send("voice_recognition_error", "No voice model configured. Please download one in Settings.") + return + + if not os.path.isabs(active_model_rel_path): + model_path = root_dir / active_model_rel_path + else: + model_path = Path(active_model_rel_path) + + if not model_path.exists(): + log.error(f"[VOICE] Model path does not exist: {model_path}") + send("voice_recognition_error", "Selected voice model not found. Please check your settings.") + return + + # Paths to search for bundled libraries + base_voice_path = Path(__file__).parent.parent / "voice_to_text" + lib_path = base_voice_path / "lib" + + # Pre-load libatomic if it exists in our bundle (fixes arm64 dependency issue) + atomic_lib = lib_path / "libatomic.so.1" + if atomic_lib.exists(): + try: + ctypes.CDLL(str(atomic_lib)) + log.info(f"[VOICE] Pre-loaded {atomic_lib}") + except Exception as e: + log.warning(f"[VOICE] Could not pre-load libatomic: {e}") + + # Add bundled libs to environment for nested dependencies + env_path = str(lib_path) + if "LD_LIBRARY_PATH" in os.environ: + os.environ["LD_LIBRARY_PATH"] = f"{env_path}:{os.environ['LD_LIBRARY_PATH']}" + else: + os.environ["LD_LIBRARY_PATH"] = env_path + + from voice_to_text.voice2text import recognize_from_mic, list_microphones + + # Reset the stop event + _voice_stop_event.clear() + + # Log available mics for debug + log.info(f"[VOICE] mics: {list_microphones()}") + + def handle_partial(txt): + if txt: + send("voice_recognition_partial", txt) + + text, error = recognize_from_mic(stop_event=_voice_stop_event, partial_callback=handle_partial, model_path=str(model_path)) + if text: + log.info(f"[VOICE] Recognized text: {text}") + send("voice_recognition_result", text) + else: + log.warning(f"[VOICE] Recognition failed: {error or 'No speech detected'}") + send("voice_recognition_error", error or "No speech detected") + except Exception as e: + log.exception(f"[VOICE] Error during voice recognition: {e}") + send("voice_recognition_error", f"System Error: {str(e)}") + + thread = threading.Thread(target=do_recognition) + thread.daemon = True + thread.start() + return True diff --git a/ubtms.apparmor b/ubtms.apparmor index aa1477b4..bf976a61 100644 --- a/ubtms.apparmor +++ b/ubtms.apparmor @@ -1,5 +1,5 @@ { - "policy_groups": ["networking","content_exchange","content_exchange_source","webview", "push-notification-client"], + "policy_groups": ["networking","content_exchange","content_exchange_source","webview", "push-notification-client", "audio"], "policy_version": 20.04, "template": "unconfined" } diff --git a/voice_to_text/__init__.py b/voice_to_text/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/voice_to_text/requirements.txt b/voice_to_text/requirements.txt new file mode 100644 index 00000000..19f2a86d --- /dev/null +++ b/voice_to_text/requirements.txt @@ -0,0 +1,10 @@ +certifi==2024.2.2 +cffi==1.17.1 +charset-normalizer==3.4.7 +idna==3.13 +requests==2.31.0 +srt==3.5.3 +tqdm==4.67.3 +urllib3==1.26.18 +vosk==0.3.45 +websockets==13.1 diff --git a/voice_to_text/voice2text.py b/voice_to_text/voice2text.py new file mode 100644 index 00000000..4478a5e6 --- /dev/null +++ b/voice_to_text/voice2text.py @@ -0,0 +1,131 @@ +import os +import sys +import subprocess +import json +import wave +import logging +import shutil +from pathlib import Path + +# Use the app's logger +logger = logging.getLogger("odoo_sync") + +# Attempt to import vosk. It will be in sys.path if added by backend.py +try: + # pyrefly: ignore [missing-import] + from vosk import Model, KaldiRecognizer +except ImportError: + pass + +def recognize_from_mic(verbose=True, stop_event=None, timeout=30, partial_callback=None, model_path=None): + """ + Records audio using arecord and recognizes it using Vosk (offline). + Returns (text, error_message). + + If stop_event is provided, it will stop recording when the event is set. + """ + audio_path = None + try: + # Paths + base_path = Path(__file__).parent.resolve() + + if model_path: + model_path = Path(model_path) + else: + model_path = base_path / "model" + + if not model_path.exists(): + return None, f"Vosk model not found at {model_path}" + + # Load the model and initialize recognizer + if verbose: logger.info(f"Loading Vosk model from {model_path} for live processing...") + model = Model(str(model_path)) + rec = KaldiRecognizer(model, 16000) + rec.SetWords(True) + + try: + arecord_cmd = "arecord" + use_ffmpeg = False + + for p in ["/usr/bin/arecord", "/bin/arecord", "/usr/local/bin/arecord"]: + if os.path.exists(p): + arecord_cmd = p + break + else: + if shutil.which("ffmpeg"): + arecord_cmd = "ffmpeg" + use_ffmpeg = True + + logger.info(f"[VOICE] Executing live recording: {arecord_cmd}") + + if use_ffmpeg: + # Output as s16le raw PCM to stdout ("-") + cmd = [arecord_cmd, "-y", "-f", "alsa", "-i", "default", "-ac", "1", "-ar", "16000", "-f", "s16le", "-"] + else: + cmd = [arecord_cmd, "-f", "S16_LE", "-r", "16000", "-c", "1", "-"] + + import time + process = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.DEVNULL) + + start_time = time.time() + max_duration = timeout + + results = [] + + # Read from stdout in chunks + # `read(4000)` might block until 4000 bytes are available, which is fine for live streams. + while process.poll() is None: + if stop_event and stop_event.is_set(): + logger.info("[VOICE] Stop signal received, terminating record process.") + process.terminate() + break + if (time.time() - start_time) > max_duration: + logger.info("[VOICE] Max duration reached, stopping.") + process.terminate() + break + + # We use a non-blocking-ish approach or just read. + # read 4000 bytes (125ms of 16kHz 16-bit mono) + data = process.stdout.read(4000) + if len(data) == 0: + break + + if rec.AcceptWaveform(data): + res = json.loads(rec.Result()) + if res.get("text"): + results.append(res["text"]) + if partial_callback: + combined = " ".join(results).strip() + partial_callback(combined) + else: + res = json.loads(rec.PartialResult()) + if res.get("partial"): + current_partial = res["partial"] + if partial_callback: + combined = " ".join(results + [current_partial]).strip() + partial_callback(combined) + + process.wait() # Ensure it's fully closed + + except (FileNotFoundError, Exception) as e: + logger.exception(f"[VOICE] System error running {arecord_cmd}: {e}") + return None, f"Recording tool error: {str(e)}" + + # Capture final bit of speech + res = json.loads(rec.FinalResult()) + if res.get("text"): + results.append(res["text"]) + + text = " ".join(results).strip() + if text: + return text, None + else: + return None, "No speech detected" + + except Exception as e: + return None, f"Deep Error: {str(e)}" + +def list_microphones(): + """Returns a list of available microphone names.""" + # Since we use arecord's default, we just return a placeholder. + return ["System Default (via arecord)"] From fa441932d554084bf1f64e3734d54be29bb60a3d Mon Sep 17 00:00:00 2001 From: Suraj Yadav Date: Wed, 20 May 2026 10:20:43 +0530 Subject: [PATCH 07/67] feat: Refactor MyTasks components and add MyTasksClosedIndicator for improved task management --- qml/MyTasks.qml | 635 +----------------- .../components/MyTasksClosedIndicator.qml | 55 ++ qml/features/tasks/pages/MyTasksPage.qml | 487 ++++++++++++++ 3 files changed, 566 insertions(+), 611 deletions(-) create mode 100644 qml/features/tasks/components/MyTasksClosedIndicator.qml create mode 100644 qml/features/tasks/pages/MyTasksPage.qml diff --git a/qml/MyTasks.qml b/qml/MyTasks.qml index 3bc30b58..90bc9099 100644 --- a/qml/MyTasks.qml +++ b/qml/MyTasks.qml @@ -1,615 +1,28 @@ /* -* MIT License -* -* Copyright (c) 2025 CIT-Services -* -* Permission is hereby granted, free of charge, to any person obtaining a copy -* of this software and associated documentation files (the "Software"), to deal -* in the Software without restriction, including without limitation the rights -* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -* copies of the Software, and to permit persons to whom the Software is -* furnished to do so, subject to the following conditions: -* -* The above copyright notice and this permission notice shall be included in all -* copies or substantial portions of the Software. -* -* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -* SOFTWARE. -*/ + * MIT License + * + * Copyright (c) 2025 CIT-Services + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ import QtQuick 2.9 -import QtQuick.Controls 2.2 -import Lomiri.Components 1.3 -import QtQuick.Window 2.2 -import QtQml.Models 2.3 -import "../models/timesheet.js" as Model -import "../models/timesheet.js" as Timesheet -import "../models/project.js" as Project -import "../models/task.js" as Task -import "../models/utils.js" as Utils -import "../models/accounts.js" as Account -import "../models/global.js" as Global -import "components" -import "features/tasks/components" +import "features/tasks/pages" -Page { - property bool isMultiColumn: typeof apLayout !== "undefined" ? apLayout.columns > 1 : false - id: myTasksPage - title: i18n.dtr("ubtms", "My Tasks") - - header: PageHeader { - id: myTasksHeader - StyleHints { - foregroundColor: "white" - backgroundColor: LomiriColors.orange - dividerColor: LomiriColors.slate - } - - leadingActionBar.actions: [ - Action { - id: drawerAction - iconName: "navigation-menu" - text: i18n.dtr("ubtms", "Menu") - visible: !isMultiColumn - onTriggered: { - apLayout.openGlobalDrawer() - } - } - ] - title: myTasksPage.title - - trailingActionBar.numberOfSlots: 5 - - trailingActionBar.actions: [ - Action { - iconName: "add" - text: "New" - onTriggered: { - apLayout.addPageToNextColumn(myTasksPage, Qt.resolvedUrl("features/tasks/pages/Tasks.qml"), { - "recordid": 0, - "isReadOnly": false - }); - } - }, - Action { - iconName: myTasksList.flatViewMode ? "view-list-symbolic" : "view-grid-symbolic" - text: myTasksList.flatViewMode ? i18n.dtr("ubtms", "Tree View") : i18n.dtr("ubtms", "Flat View") - onTriggered: { - myTasksList.toggleFlatView(); - } - }, - Action { - iconName: "search" - text: "Search" - onTriggered: { - myTaskListHeader.toggleSearchVisibility(); - } - }, - Action { - iconName: "help" - text: i18n.dtr("ubtms", "Stage Help") - onTriggered: { - notifPopup.open( - i18n.dtr("ubtms", "Personal Stages Help"), - i18n.dtr("ubtms", "If personal stages are not visible, please check the following:

1) Ensure stages exist in CURQ:
Ensure the stages are available in the CURQ instance under 'My Tasks'.

2) Verify the app's Default DB:
In the app, confirm that you are checked in to the correct database as Default, as My Tasks displays tasks based on the selected Default DB."), - "info" - ); - } - }, - Action { - iconName: showFoldedTasks ? "close" : "filters" - text: showFoldedTasks ? "Hide Closed" : "Show Closed" - onTriggered: { - showFoldedTasks = !showFoldedTasks; - // Refresh the task list with the new filter (paginated) - if (currentUserOdooId > 0) { - startPaginatedLoad(); - } - } - } - ] - } - - // Properties for filter and search state - property var personalStages: [] - property var currentPersonalStageId: undefined // undefined = not initialized, null = "All", 0 = "No Stage", >0 = specific stage - property string currentSearchQuery: "" - property bool showFoldedTasks: false // Toggle for showing closed/folded tasks - - // Properties for current user filtering - property int currentUserOdooId: -1 - property int selectedAccountId: -1 // Tracks the currently selected account, -1 means use default - - // Loading state property - property bool isLoading: false - - // Timer for deferred loading - gives UI time to render loading indicator - Timer { - id: loadingTimer - interval: 50 // 50ms delay to ensure UI renders - repeat: false - property var loadingCallback: null - onTriggered: { - if (loadingCallback) { - loadingCallback(); - loadingCallback = null; - } - isLoading = false; - } - } - - // Helper function to load tasks with loading indicator - function loadTasksWithIndicator(callback) { - isLoading = true; - loadingTimer.loadingCallback = callback; - loadingTimer.start(); - } - - // Paginated loading function: fetches a page of tasks from DB - function loadPersonalStagesDelegate(limit, offset) { - var effectiveAccountId = getEffectiveAccountId(); - if (currentUserOdooId <= 0) { - myTasksList.hasMoreItems = false; - myTasksList.isLoadingMore = false; - myTasksList.isLoading = false; - return; - } - - var result = Task.getTasksByPersonalStagePaginated( - currentPersonalStageId, - [currentUserOdooId], - effectiveAccountId, - showFoldedTasks, - currentSearchQuery && currentSearchQuery.trim() !== "" ? currentSearchQuery : null, - limit, - offset - ); - - var tasks = result.tasks; - myTasksList.hasMoreItems = result.hasMore; - - var isAppend = (offset > 0); - myTasksList.updateDisplayedTasks(tasks, isAppend); - myTasksList.isLoadingMore = false; - myTasksList.isLoading = false; - } - - // Convenience function to reset pagination and load the first page - function startPaginatedLoad() { - myTasksList.currentOffset = 0; - myTasksList.hasMoreItems = true; - myTasksList.isLoadingMore = false; - loadPersonalStagesDelegate(myTasksList.pageSize, 0); - } - - // Function to get the effective account ID (handles -1 for "All Accounts") - function getEffectiveAccountId() { - if (selectedAccountId === -1 || selectedAccountId < 0) { - var defaultId = Account.getDefaultAccountId(); - //console.log("MyTasks: selectedAccountId is", selectedAccountId, "- falling back to default account:", defaultId); - return defaultId; - } - return selectedAccountId; - } - - // Function to load personal stages for the current user - function loadPersonalStages() { - var effectiveAccountId = getEffectiveAccountId(); - if (currentUserOdooId <= 0 || effectiveAccountId < 0) { - personalStages = []; - return; - } - - var stages = Task.getPersonalStagesForUser(currentUserOdooId, effectiveAccountId); // Start with loaded stages - var allStages = []; - for (var i = 0; i < stages.length; i++) { - allStages.push(stages[i]); - } - - // Add "All" option at the end - allStages.push({ - odoo_record_id: null, - name: "All", - sequence: 9999 - }); - - personalStages = allStages; - - // console.log("loadPersonalStages: personalStages.length =", personalStages.length); - // for (var i = 0; i < personalStages.length; i++) { - // console.log(" Stage", i, ":", personalStages[i].name, "ID:", personalStages[i].odoo_record_id); - // } - - // Update the ListHeader with dynamic labels (preserves current filter) - updateListHeaderWithStages(); - - // Only set initial filter on first load (when currentPersonalStageId is undefined) - if (currentPersonalStageId === undefined && personalStages.length > 0) { - currentPersonalStageId = personalStages[0].odoo_record_id; - // console.log("loadPersonalStages: Initial currentPersonalStageId set to", currentPersonalStageId, "(first stage)"); - } - } - - // Function to update ListHeader with personal stage names - function updateListHeaderWithStages() { - if (personalStages.length === 0) { - return; - } - - // Build dynamic filter model for all stages - var filterModel = []; - for (var i = 0; i < personalStages.length; i++) { - var stage = personalStages[i]; - filterModel.push({ - label: stage.name, - filterKey: String(stage.odoo_record_id) - }); - } - - // Update the filter model without resetting the current filter - myTaskListHeader.filterModel = filterModel; - - // Only set currentFilter if it hasn't been set yet or if the current stage is valid - if (currentPersonalStageId !== null && currentPersonalStageId !== undefined) { - myTaskListHeader.currentFilter = String(currentPersonalStageId); - } else if (myTaskListHeader.currentFilter === "" && filterModel.length > 0) { - myTaskListHeader.currentFilter = filterModel[0].filterKey; - } - } - - // Function to get current user's odoo_record_id for the selected account - function updateCurrentUser() { - var effectiveAccountId = getEffectiveAccountId(); - if (effectiveAccountId >= 0) { - currentUserOdooId = Account.getCurrentUserOdooId(effectiveAccountId); - } else { - currentUserOdooId = -1; - } - } - - function clearCurrentTasks() { - personalStages = []; - currentPersonalStageId = undefined; - myTaskListHeader.filterModel = []; - myTaskListHeader.currentFilter = ""; - myTasksList.currentOffset = 0; - myTasksList.hasMoreItems = false; - myTasksList.isLoadingMore = false; - myTasksList.isLoading = false; - myTasksList.updateDisplayedTasks([], false); - } - - // Function to handle account selection changes - function handleAccountChange(accountId) { - //console.log("MyTasks: Account changed to", accountId); - - // Normalize account ID to number - var idNum = -1; - try { - if (typeof accountId !== "undefined" && accountId !== null) { - var maybeNum = Number(accountId); - idNum = isNaN(maybeNum) ? -1 : maybeNum; - } - } catch (e) { - idNum = -1; - } - - selectedAccountId = idNum; - - // Reset the personal stage selection - currentPersonalStageId = undefined; - - // Update current user for the new account - updateCurrentUser(); - - if (currentUserOdooId <= 0) { - clearCurrentTasks(); - return; - } - - // Reload personal stages for the new account - loadPersonalStages(); - - // Refresh the task list with the first personal stage (paginated) - if (currentUserOdooId > 0 && personalStages.length > 0 && currentPersonalStageId !== undefined) { - loadTasksWithIndicator(function() { - startPaginatedLoad(); - }); - } else { - clearCurrentTasks(); - } - } - - // Add the ListHeader component - ListHeader { - id: myTaskListHeader - anchors.top: myTasksHeader.bottom - anchors.left: parent.left - anchors.right: parent.right - - // Dynamic filter model will be set by updateListHeaderWithStages() - filterModel: [] - - showSearchBox: false - currentFilter: "" - - onFilterSelected: { - // Update the ListHeader's currentFilter so the UI highlight moves - myTaskListHeader.currentFilter = filterKey; - - // Parse filterKey to get personal stage ID - // filterKey is string: "null" for All, "0" for No Stage, or actual stage ID - var stageId; - if (filterKey === "null") { - stageId = null; // Show all tasks - } else { - stageId = parseInt(filterKey); - } - - myTasksPage.currentPersonalStageId = stageId; - myTasksPage.currentSearchQuery = ""; - - // Update current user before applying filter - updateCurrentUser(); - - if (currentUserOdooId > 0) { - loadTasksWithIndicator(function() { - startPaginatedLoad(); - }); - } - } - - onCustomSearch: { - myTasksPage.currentSearchQuery = query; - - // Update current user before applying search - updateCurrentUser(); - - if (currentUserOdooId > 0) { - // Search uses the paginated function with search query pushed to SQL - loadTasksWithIndicator(function() { - startPaginatedLoad(); - }); - } - } - } - - // Visual indicator when showing folded tasks - Rectangle { - id: foldedTasksIndicator - visible: showFoldedTasks - anchors.top: myTaskListHeader.bottom - anchors.left: parent.left - anchors.right: parent.right - height: units.gu(4) - color: theme.name === "Ubuntu.Components.Themes.SuruDark" ? "#2d5016" : "#dff0d8" - border.color: theme.name === "Ubuntu.Components.Themes.SuruDark" ? "#4caf50" : "#5cb85c" - border.width: 1 - - Row { - anchors.centerIn: parent - spacing: units.gu(1) - - Icon { - name: "info" - width: units.gu(2) - height: units.gu(2) - color: theme.name === "Ubuntu.Components.Themes.SuruDark" ? "#4caf50" : "#3c763d" - anchors.verticalCenter: parent.verticalCenter - } - - Text { - text: i18n.dtr("ubtms", "Showing closed/completed tasks") - color: theme.name === "Ubuntu.Components.Themes.SuruDark" ? "#4caf50" : "#3c763d" - font.pixelSize: units.gu(1.5) - font.bold: true - anchors.verticalCenter: parent.verticalCenter - } - } - } - - LomiriShape { - anchors.top: showFoldedTasks ? foldedTasksIndicator.bottom : myTaskListHeader.bottom - anchors.bottom: parent.bottom - anchors.left: parent.left - anchors.right: parent.right - anchors.topMargin: units.gu(1) - clip: true - - TaskList { - id: myTasksList - anchors.fill: parent - clip: true - - // Delegate for pagination - loadDelegate: loadPersonalStagesDelegate - - // MyTasks does NOT filter by account selection - // It ALWAYS uses the default account set in Settings - filterByAccount: false - - // Enable assignee filtering to show only current user's tasks - filterByAssignees: true - selectedAssigneeIds: [] - - // Set context flag so TaskDetailsCard knows we're in MyTasks - isMyTasksContext: true - - onTaskEditRequested: { - apLayout.addPageToNextColumn(myTasksPage, Qt.resolvedUrl("features/tasks/pages/Tasks.qml"), { - "recordid": recordId, - "isReadOnly": false - }); - } - onTaskSelected: { - apLayout.addPageToNextColumn(myTasksPage, Qt.resolvedUrl("features/tasks/pages/Tasks.qml"), { - "recordid": recordId, - "isReadOnly": true - }); - } - onTaskTimesheetRequested: { - let result = Timesheet.createTimesheetFromTask(localId); - if (result.success) { - apLayout.addPageToNextColumn(myTasksPage, Qt.resolvedUrl("features/timesheets/pages/Timesheet.qml"), { - "recordid": result.id, - "isReadOnly": false - }); - } else { - notifPopup.open("Error", "Unable to create timesheet", "error"); - } - } - onTaskDeleteRequested: { - var check = Task.checkTaskHasChildren(recordId); - if (check.hasChildren) { - notifPopup.open("Blocked", "This task has child tasks. Please delete them first.", "warning"); - } else { - var result = Task.markTaskAsDeleted(recordId); - if (!result.success) { - notifPopup.open("Error", result.message, "error"); - } else { - notifPopup.open("Deleted", result.message, "success"); - pageStack.removePages(myTasksPage); - apLayout.addPageToCurrentColumn(myTasksPage, Qt.resolvedUrl("MyTasks.qml")); - } - } - } - } - - Text { - id: labelNoTask - anchors.centerIn: parent - font.pixelSize: units.gu(2) - visible: false - text:i18n.dtr("ubtms", "No Tasks Assigned to You") - } - } - - NotificationPopup { - id: notifPopup - width: units.gu(80) - height: units.gu(80) - } - - DialerMenu { - id: fabMenu - anchors.fill: parent - z: 9999 - menuModel: [ - { - label: i18n.dtr("ubtms", "Create") - }, - ] - onMenuItemSelected: { - if (index === 0) { - apLayout.addPageToNextColumn(myTasksPage, Qt.resolvedUrl("features/tasks/pages/Tasks.qml"), { - "recordid": 0, - "isReadOnly": false - }); - } - } - } - - - - // Listen directly to the picker as well, because MyTasks is often opened - // as a dynamic page and should react immediately to account changes. - Connections { - target: accountPicker - - onAccepted: function (id, name) { - handleAccountChange(id); - } - } - - Connections { - target: typeof mainView !== 'undefined' ? mainView : null - - function onAccountDataRefreshRequested(accountId) { - // console.log("🔄 MyTasks: Refreshing data for account:", accountId); - if (accountId >= -1 && accountId !== selectedAccountId) { - handleAccountChange(accountId); - } - } - - function onGlobalAccountChanged(accountId, accountName) { - // console.log("🔄 MyTasks: Global account changed to:", accountId, accountName); - if (accountId >= -1 && accountId !== selectedAccountId) { - handleAccountChange(accountId); - } - } - } - - onVisibleChanged: { - if (visible) { - // Update navigation tracking - Global.setLastVisitedPage("MyTasks"); - - // Sync with mainView's current account (primary source of truth) - if (typeof mainView !== 'undefined' && mainView !== null) { - if (typeof mainView.currentAccountId !== 'undefined') { - var acctId = mainView.currentAccountId; - if (acctId !== selectedAccountId && acctId >= -1) { - //console.log("MyTasks: Syncing with mainView.currentAccountId on visible:", acctId); - handleAccountChange(acctId); - return; // handleAccountChange will refresh everything - } - } - } - - // Refresh user data and personal stages when page becomes visible - updateCurrentUser(); - loadPersonalStages(); - - // Apply current personal stage filter (paginated) - if (currentUserOdooId > 0) { - startPaginatedLoad(); - } - } - } - - Component.onCompleted: { - // Sync with mainView's current account (this persists across page loads) - if (typeof mainView !== 'undefined' && mainView !== null) { - if (typeof mainView.currentAccountId !== 'undefined') { - selectedAccountId = mainView.currentAccountId; - //console.log("MyTasks: Initialized with mainView.currentAccountId:", selectedAccountId); - } - } - - - - // Final fallback: use default account - if (selectedAccountId === -1) { - selectedAccountId = Account.getDefaultAccountId(); - //console.log("MyTasks: No account selection found, using default account:", selectedAccountId); - } - - // Get current user from selected account - updateCurrentUser(); - - // Load personal stages for the current user - if (currentUserOdooId > 0) { - loadPersonalStages(); - - // Apply initial personal stage filter (first stage in the list) - // Note: "All" is now at the end, so first stage is a specific personal stage - if (personalStages.length > 0 && currentPersonalStageId !== undefined) { - loadTasksWithIndicator(function() { - startPaginatedLoad(); - }); - } - } - } - - // Loading indicator - LoadingIndicator { - anchors.fill: parent - visible: isLoading - message: i18n.dtr("ubtms", "Loading tasks...") - } -} +MyTasksPage {} diff --git a/qml/features/tasks/components/MyTasksClosedIndicator.qml b/qml/features/tasks/components/MyTasksClosedIndicator.qml new file mode 100644 index 00000000..44f833b1 --- /dev/null +++ b/qml/features/tasks/components/MyTasksClosedIndicator.qml @@ -0,0 +1,55 @@ +/* + * MIT License + * + * Copyright (c) 2025 CIT-Services + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +import QtQuick 2.9 +import Lomiri.Components 1.3 + +Rectangle { + id: root + + color: theme.name === "Ubuntu.Components.Themes.SuruDark" ? "#2d5016" : "#dff0d8" + border.color: theme.name === "Ubuntu.Components.Themes.SuruDark" ? "#4caf50" : "#5cb85c" + border.width: 1 + + Row { + anchors.centerIn: parent + spacing: units.gu(1) + + Icon { + name: "info" + width: units.gu(2) + height: units.gu(2) + color: theme.name === "Ubuntu.Components.Themes.SuruDark" ? "#4caf50" : "#3c763d" + anchors.verticalCenter: parent.verticalCenter + } + + Text { + text: i18n.dtr("ubtms", "Showing closed/completed tasks") + color: theme.name === "Ubuntu.Components.Themes.SuruDark" ? "#4caf50" : "#3c763d" + font.pixelSize: units.gu(1.5) + font.bold: true + anchors.verticalCenter: parent.verticalCenter + } + } +} diff --git a/qml/features/tasks/pages/MyTasksPage.qml b/qml/features/tasks/pages/MyTasksPage.qml new file mode 100644 index 00000000..4314fc59 --- /dev/null +++ b/qml/features/tasks/pages/MyTasksPage.qml @@ -0,0 +1,487 @@ +/* + * MIT License + * + * Copyright (c) 2025 CIT-Services + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +import QtQuick 2.9 +import QtQuick.Controls 2.2 +import Lomiri.Components 1.3 +import "../../../../models/timesheet.js" as Timesheet +import "../../../../models/task.js" as Task +import "../../../../models/accounts.js" as Account +import "../../../../models/global.js" as Global +import "../../../components" +import "../components" + +Page { + id: myTasksPage + + property bool isMultiColumn: typeof apLayout !== "undefined" ? apLayout.columns > 1 : false + property var personalStages: [] + property var currentPersonalStageId: undefined + property string currentSearchQuery: "" + property bool showFoldedTasks: false + property int currentUserOdooId: -1 + property int selectedAccountId: -1 + property bool isLoading: false + + title: i18n.dtr("ubtms", "My Tasks") + + header: PageHeader { + id: myTasksHeader + + StyleHints { + foregroundColor: "white" + backgroundColor: LomiriColors.orange + dividerColor: LomiriColors.slate + } + + leadingActionBar.actions: [ + Action { + id: drawerAction + iconName: "navigation-menu" + text: i18n.dtr("ubtms", "Menu") + visible: !isMultiColumn + onTriggered: apLayout.openGlobalDrawer() + } + ] + + title: myTasksPage.title + trailingActionBar.numberOfSlots: 5 + trailingActionBar.actions: [ + Action { + iconName: "add" + text: "New" + onTriggered: { + apLayout.addPageToNextColumn(myTasksPage, Qt.resolvedUrl("Tasks.qml"), { + "recordid": 0, + "isReadOnly": false + }); + } + }, + Action { + iconName: myTasksList.flatViewMode ? "view-list-symbolic" : "view-grid-symbolic" + text: myTasksList.flatViewMode ? i18n.dtr("ubtms", "Tree View") : i18n.dtr("ubtms", "Flat View") + onTriggered: myTasksList.toggleFlatView() + }, + Action { + iconName: "search" + text: "Search" + onTriggered: myTaskListHeader.toggleSearchVisibility() + }, + Action { + iconName: "help" + text: i18n.dtr("ubtms", "Stage Help") + onTriggered: { + notifPopup.open( + i18n.dtr("ubtms", "Personal Stages Help"), + i18n.dtr("ubtms", "If personal stages are not visible, please check the following:

1) Ensure stages exist in CURQ:
Ensure the stages are available in the CURQ instance under 'My Tasks'.

2) Verify the app's Default DB:
In the app, confirm that you are checked in to the correct database as Default, as My Tasks displays tasks based on the selected Default DB."), + "info" + ); + } + }, + Action { + iconName: showFoldedTasks ? "close" : "filters" + text: showFoldedTasks ? "Hide Closed" : "Show Closed" + onTriggered: { + showFoldedTasks = !showFoldedTasks; + if (currentUserOdooId > 0) { + startPaginatedLoad(); + } + } + } + ] + } + + Timer { + id: loadingTimer + interval: 50 + repeat: false + + property var loadingCallback: null + + onTriggered: { + if (loadingCallback) { + loadingCallback(); + loadingCallback = null; + } + isLoading = false; + } + } + + function loadTasksWithIndicator(callback) { + isLoading = true; + loadingTimer.loadingCallback = callback; + loadingTimer.start(); + } + + function loadPersonalStagesDelegate(limit, offset) { + var effectiveAccountId = getEffectiveAccountId(); + if (currentUserOdooId <= 0) { + myTasksList.hasMoreItems = false; + myTasksList.isLoadingMore = false; + myTasksList.isLoading = false; + return; + } + + var result = Task.getTasksByPersonalStagePaginated( + currentPersonalStageId, + [currentUserOdooId], + effectiveAccountId, + showFoldedTasks, + currentSearchQuery && currentSearchQuery.trim() !== "" ? currentSearchQuery : null, + limit, + offset + ); + + myTasksList.hasMoreItems = result.hasMore; + myTasksList.updateDisplayedTasks(result.tasks, offset > 0); + myTasksList.isLoadingMore = false; + myTasksList.isLoading = false; + } + + function startPaginatedLoad() { + myTasksList.currentOffset = 0; + myTasksList.hasMoreItems = true; + myTasksList.isLoadingMore = false; + loadPersonalStagesDelegate(myTasksList.pageSize, 0); + } + + function getEffectiveAccountId() { + if (selectedAccountId === -1 || selectedAccountId < 0) { + return Account.getDefaultAccountId(); + } + return selectedAccountId; + } + + function loadPersonalStages() { + var effectiveAccountId = getEffectiveAccountId(); + if (currentUserOdooId <= 0 || effectiveAccountId < 0) { + personalStages = []; + return; + } + + var stages = Task.getPersonalStagesForUser(currentUserOdooId, effectiveAccountId); + var allStages = []; + for (var i = 0; i < stages.length; i++) { + allStages.push(stages[i]); + } + + allStages.push({ + odoo_record_id: null, + name: "All", + sequence: 9999 + }); + + personalStages = allStages; + updateListHeaderWithStages(); + + if (currentPersonalStageId === undefined && personalStages.length > 0) { + currentPersonalStageId = personalStages[0].odoo_record_id; + } + } + + function updateListHeaderWithStages() { + if (personalStages.length === 0) { + return; + } + + var filterModel = []; + for (var i = 0; i < personalStages.length; i++) { + var stage = personalStages[i]; + filterModel.push({ + label: stage.name, + filterKey: String(stage.odoo_record_id) + }); + } + + myTaskListHeader.filterModel = filterModel; + + if (currentPersonalStageId !== null && currentPersonalStageId !== undefined) { + myTaskListHeader.currentFilter = String(currentPersonalStageId); + } else if (myTaskListHeader.currentFilter === "" && filterModel.length > 0) { + myTaskListHeader.currentFilter = filterModel[0].filterKey; + } + } + + function updateCurrentUser() { + var effectiveAccountId = getEffectiveAccountId(); + currentUserOdooId = effectiveAccountId >= 0 ? Account.getCurrentUserOdooId(effectiveAccountId) : -1; + } + + function clearCurrentTasks() { + personalStages = []; + currentPersonalStageId = undefined; + myTaskListHeader.filterModel = []; + myTaskListHeader.currentFilter = ""; + myTasksList.currentOffset = 0; + myTasksList.hasMoreItems = false; + myTasksList.isLoadingMore = false; + myTasksList.isLoading = false; + myTasksList.updateDisplayedTasks([], false); + } + + function handleAccountChange(accountId) { + var idNum = -1; + try { + if (typeof accountId !== "undefined" && accountId !== null) { + var maybeNum = Number(accountId); + idNum = isNaN(maybeNum) ? -1 : maybeNum; + } + } catch (e) { + idNum = -1; + } + + selectedAccountId = idNum; + currentPersonalStageId = undefined; + updateCurrentUser(); + + if (currentUserOdooId <= 0) { + clearCurrentTasks(); + return; + } + + loadPersonalStages(); + + if (currentUserOdooId > 0 && personalStages.length > 0 && currentPersonalStageId !== undefined) { + loadTasksWithIndicator(function() { + startPaginatedLoad(); + }); + } else { + clearCurrentTasks(); + } + } + + ListHeader { + id: myTaskListHeader + anchors.top: myTasksHeader.bottom + anchors.left: parent.left + anchors.right: parent.right + + filterModel: [] + showSearchBox: false + currentFilter: "" + + onFilterSelected: { + myTaskListHeader.currentFilter = filterKey; + + var stageId = filterKey === "null" ? null : parseInt(filterKey); + myTasksPage.currentPersonalStageId = stageId; + myTasksPage.currentSearchQuery = ""; + + updateCurrentUser(); + if (currentUserOdooId > 0) { + loadTasksWithIndicator(function() { + startPaginatedLoad(); + }); + } + } + + onCustomSearch: { + myTasksPage.currentSearchQuery = query; + updateCurrentUser(); + + if (currentUserOdooId > 0) { + loadTasksWithIndicator(function() { + startPaginatedLoad(); + }); + } + } + } + + MyTasksClosedIndicator { + id: foldedTasksIndicator + visible: showFoldedTasks + anchors.top: myTaskListHeader.bottom + anchors.left: parent.left + anchors.right: parent.right + height: units.gu(4) + } + + LomiriShape { + anchors.top: showFoldedTasks ? foldedTasksIndicator.bottom : myTaskListHeader.bottom + anchors.bottom: parent.bottom + anchors.left: parent.left + anchors.right: parent.right + anchors.topMargin: units.gu(1) + clip: true + + TaskList { + id: myTasksList + anchors.fill: parent + clip: true + loadDelegate: loadPersonalStagesDelegate + filterByAccount: false + filterByAssignees: true + selectedAssigneeIds: [] + isMyTasksContext: true + + onTaskEditRequested: { + apLayout.addPageToNextColumn(myTasksPage, Qt.resolvedUrl("Tasks.qml"), { + "recordid": recordId, + "isReadOnly": false + }); + } + + onTaskSelected: { + apLayout.addPageToNextColumn(myTasksPage, Qt.resolvedUrl("Tasks.qml"), { + "recordid": recordId, + "isReadOnly": true + }); + } + + onTaskTimesheetRequested: { + var result = Timesheet.createTimesheetFromTask(localId); + if (result.success) { + apLayout.addPageToNextColumn(myTasksPage, Qt.resolvedUrl("../../timesheets/pages/Timesheet.qml"), { + "recordid": result.id, + "isReadOnly": false + }); + } else { + notifPopup.open("Error", "Unable to create timesheet", "error"); + } + } + + onTaskDeleteRequested: { + var check = Task.checkTaskHasChildren(recordId); + if (check.hasChildren) { + notifPopup.open("Blocked", "This task has child tasks. Please delete them first.", "warning"); + } else { + var result = Task.markTaskAsDeleted(recordId); + if (!result.success) { + notifPopup.open("Error", result.message, "error"); + } else { + notifPopup.open("Deleted", result.message, "success"); + pageStack.removePages(myTasksPage); + apLayout.addPageToCurrentColumn(myTasksPage, Qt.resolvedUrl("MyTasksPage.qml")); + } + } + } + } + + Text { + id: labelNoTask + anchors.centerIn: parent + font.pixelSize: units.gu(2) + visible: false + text: i18n.dtr("ubtms", "No Tasks Assigned to You") + } + } + + NotificationPopup { + id: notifPopup + width: units.gu(80) + height: units.gu(80) + } + + DialerMenu { + id: fabMenu + anchors.fill: parent + z: 9999 + menuModel: [ + { + label: i18n.dtr("ubtms", "Create") + } + ] + + onMenuItemSelected: { + if (index === 0) { + apLayout.addPageToNextColumn(myTasksPage, Qt.resolvedUrl("Tasks.qml"), { + "recordid": 0, + "isReadOnly": false + }); + } + } + } + + Connections { + target: accountPicker + + onAccepted: function(id, name) { + handleAccountChange(id); + } + } + + Connections { + target: typeof mainView !== "undefined" ? mainView : null + + function onAccountDataRefreshRequested(accountId) { + if (accountId >= -1 && accountId !== selectedAccountId) { + handleAccountChange(accountId); + } + } + + function onGlobalAccountChanged(accountId, accountName) { + if (accountId >= -1 && accountId !== selectedAccountId) { + handleAccountChange(accountId); + } + } + } + + onVisibleChanged: { + if (visible) { + Global.setLastVisitedPage("MyTasks"); + + if (typeof mainView !== "undefined" && mainView !== null && typeof mainView.currentAccountId !== "undefined") { + var acctId = mainView.currentAccountId; + if (acctId !== selectedAccountId && acctId >= -1) { + handleAccountChange(acctId); + return; + } + } + + updateCurrentUser(); + loadPersonalStages(); + + if (currentUserOdooId > 0) { + startPaginatedLoad(); + } + } + } + + Component.onCompleted: { + if (typeof mainView !== "undefined" && mainView !== null && typeof mainView.currentAccountId !== "undefined") { + selectedAccountId = mainView.currentAccountId; + } + + if (selectedAccountId === -1) { + selectedAccountId = Account.getDefaultAccountId(); + } + + updateCurrentUser(); + + if (currentUserOdooId > 0) { + loadPersonalStages(); + if (personalStages.length > 0 && currentPersonalStageId !== undefined) { + loadTasksWithIndicator(function() { + startPaginatedLoad(); + }); + } + } + } + + LoadingIndicator { + anchors.fill: parent + visible: isLoading + message: i18n.dtr("ubtms", "Loading tasks...") + } +} From 657e8aad7f140df5560a27bd2921c1563b234a7e Mon Sep 17 00:00:00 2001 From: Suraj Yadav Date: Fri, 22 May 2026 10:22:23 +0530 Subject: [PATCH 08/67] feat: Refactor navigation structure and enhance MyTasks integration for improved task management --- qml/Menu.qml | 97 +------------------ qml/app/AppLayout.qml | 28 +++++- qml/app/navigation/MenuPage.qml | 116 +++++++++++++++++++++++ qml/app/navigation/NavigationRoutes.js | 4 +- qml/features/tasks/pages/MyTasksPage.qml | 35 ++++--- 5 files changed, 164 insertions(+), 116 deletions(-) create mode 100644 qml/app/navigation/MenuPage.qml diff --git a/qml/Menu.qml b/qml/Menu.qml index 3d258d33..5ffbb091 100644 --- a/qml/Menu.qml +++ b/qml/Menu.qml @@ -23,99 +23,6 @@ */ import QtQuick 2.7 -import Lomiri.Components 1.3 -import QtCharts 2.0 -import QtQuick.Layouts 1.11 -import Qt.labs.settings 1.0 -import "../models/Main.js" as Model -import "../models/timesheet.js" as TimesheetModel -import "../models/accounts.js" as Account -import "components" -import "app/navigation/NavigationRoutes.js" as NavigationRoutes +import "app/navigation" -Page { - id: listpage - title: i18n.dtr("ubtms", "Menu") - property bool isMultiColumn: apLayout.columns > 1 - property var navigationController - anchors.fill: parent - header: PageHeader { - id: header - title: listpage.title - StyleHints { - foregroundColor: "white" - - backgroundColor: LomiriColors.orange - dividerColor: LomiriColors.slate - } - trailingActionBar.actions: [ - Action { - iconName: "account" - text: i18n.dtr("ubtms", "Switch Accounts") - onTriggered: { - accountPicker.open(accountPicker.selectedAccountId); - } - }, - Action { - iconSource: theme.name === "Ubuntu.Components.Themes.SuruDark" ? "images/daymode.png" : "images/darkmode.png" - text: theme.name === "Ubuntu.Components.Themes.SuruDark" ? i18n.dtr("ubtms", "Light Mode") : i18n.dtr("ubtms","Dark Mode") - onTriggered: { - Theme.name = theme.name === "Ubuntu.Components.Themes.SuruDark" ? "Ubuntu.Components.Themes.Ambiance" : "Ubuntu.Components.Themes.SuruDark"; - } - } - ] - } - - readonly property bool isDark: theme.name === "Ubuntu.Components.Themes.SuruDark" - - Rectangle { - anchors.top: header.bottom - anchors.left: parent.left - anchors.right: parent.right - anchors.bottom: parent.bottom - color: isDark ? "#111" : "#f2f2f7" - - Flickable { - anchors.fill: parent - contentHeight: menuColumn.height + units.gu(4) - clip: true - - Column { - id: menuColumn - width: parent.width - anchors.top: parent.top - // anchors.topMargin: units.gu(2) - - - - Rectangle { - width: parent.width - height: mainSection.height - color: isDark ? "#1e1e1e" : "#ffffff" - - Column { - id: mainSection - width: parent.width - NavigationMenuList { - width: parent.width - menuItems: NavigationRoutes.menuItems() - selectedPageUrl: apLayout && apLayout.currentMenuPageUrl ? apLayout.currentMenuPageUrl : "" - onItemSelected: function(item) { - if (navigationController && typeof navigationController.navigateMenuItem === "function") { - navigationController.navigateMenuItem(item); - } else if (apLayout && typeof apLayout.setPageGlobal === "function") { - apLayout.setPageGlobal(item.pageUrl, item.pageNum); - } - } - } - - } - } - - - - - } - } - } -} +MenuPage {} diff --git a/qml/app/AppLayout.qml b/qml/app/AppLayout.qml index 412d7c27..914f4ce2 100644 --- a/qml/app/AppLayout.qml +++ b/qml/app/AppLayout.qml @@ -3,6 +3,7 @@ import Lomiri.Components 1.3 import QtQuick.Window 2.2 import QtQuick.Layouts 1.11 import "../" +import "navigation" as AppNavigation import "pages" as AppPages import "../features/dashboard/pages" as DashboardPages import "../features/settings/pages" as SettingsPages @@ -77,7 +78,7 @@ AdaptivePageLayout { id: splash_page } - Menu { + AppNavigation.MenuPage { id: menu_page navigationController: apLayout.navigationController } @@ -151,6 +152,20 @@ AdaptivePageLayout { } } + TaskPages.MyTasksPage { + id: my_tasks_page + + Connections { + target: rootApp + onAccountDataRefreshRequested: function(accountId) { + console.debug("🔄 Refreshing My Tasks data for account:", accountId); + if (my_tasks_page.visible && typeof my_tasks_page.refreshData === "function") { + my_tasks_page.refreshData(); + } + } + } + } + Project_Page { id: project_page @@ -233,6 +248,8 @@ AdaptivePageLayout { targetPage = activity_page; else if (pageKey === "task") targetPage = task_page; + else if (pageKey === "my_tasks") + targetPage = my_tasks_page; else if (pageKey === "project") targetPage = project_page; else if (pageKey === "updates") @@ -275,14 +292,14 @@ AdaptivePageLayout { } } - setCurrentPage(pageNum); + setCurrentPage(pageNum, url); if (globalDrawer) { globalDrawer.close(); } } - function setCurrentPage(page) { + function setCurrentPage(page, url) { console.debug("📄 Setting current page to:", page); switch (page) { case 0: @@ -301,7 +318,7 @@ AdaptivePageLayout { thirdPage = null; break; case 3: - currentPage = task_page; + currentPage = String(url || "").indexOf("MyTasks") >= 0 ? my_tasks_page : task_page; thirdPage = null; break; case 4: @@ -401,6 +418,9 @@ AdaptivePageLayout { if (task_page && typeof task_page.getTaskList === "function") { task_page.getTaskList(task_page.currentFilter || "today", ""); } + if (my_tasks_page && typeof my_tasks_page.refreshData === "function") { + my_tasks_page.refreshData(); + } if (project_page && project_page.projectlist && typeof project_page.projectlist.refresh === "function") { project_page.projectlist.refresh(); } diff --git a/qml/app/navigation/MenuPage.qml b/qml/app/navigation/MenuPage.qml new file mode 100644 index 00000000..7d721da8 --- /dev/null +++ b/qml/app/navigation/MenuPage.qml @@ -0,0 +1,116 @@ +/* + * MIT License + * + * Copyright (c) 2025 CIT-Services + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +import QtQuick 2.7 +import Lomiri.Components 1.3 +import QtCharts 2.0 +import QtQuick.Layouts 1.11 +import Qt.labs.settings 1.0 +import "../../components" +import "NavigationRoutes.js" as NavigationRoutes + +Page { + id: listpage + + property bool isMultiColumn: apLayout.columns > 1 + property var navigationController + + title: i18n.dtr("ubtms", "Menu") + anchors.fill: parent + + header: PageHeader { + id: header + title: listpage.title + + StyleHints { + foregroundColor: "white" + backgroundColor: LomiriColors.orange + dividerColor: LomiriColors.slate + } + + trailingActionBar.actions: [ + Action { + iconName: "account" + text: i18n.dtr("ubtms", "Switch Accounts") + onTriggered: { + accountPicker.open(accountPicker.selectedAccountId); + } + }, + Action { + iconSource: theme.name === "Ubuntu.Components.Themes.SuruDark" ? "../../images/daymode.png" : "../../images/darkmode.png" + text: theme.name === "Ubuntu.Components.Themes.SuruDark" ? i18n.dtr("ubtms", "Light Mode") : i18n.dtr("ubtms", "Dark Mode") + onTriggered: { + Theme.name = theme.name === "Ubuntu.Components.Themes.SuruDark" ? "Ubuntu.Components.Themes.Ambiance" : "Ubuntu.Components.Themes.SuruDark"; + } + } + ] + } + + readonly property bool isDark: theme.name === "Ubuntu.Components.Themes.SuruDark" + + Rectangle { + anchors.top: header.bottom + anchors.left: parent.left + anchors.right: parent.right + anchors.bottom: parent.bottom + color: isDark ? "#111" : "#f2f2f7" + + Flickable { + anchors.fill: parent + contentHeight: menuColumn.height + units.gu(4) + clip: true + + Column { + id: menuColumn + width: parent.width + anchors.top: parent.top + + Rectangle { + width: parent.width + height: mainSection.height + color: isDark ? "#1e1e1e" : "#ffffff" + + Column { + id: mainSection + width: parent.width + + NavigationMenuList { + width: parent.width + menuItems: NavigationRoutes.menuItems() + selectedPageUrl: apLayout && apLayout.currentMenuPageUrl ? apLayout.currentMenuPageUrl : "" + + onItemSelected: function(item) { + if (navigationController && typeof navigationController.navigateMenuItem === "function") { + navigationController.navigateMenuItem(item); + } else if (apLayout && typeof apLayout.setPageGlobal === "function") { + apLayout.setPageGlobal(item.pageUrl, item.pageNum); + } + } + } + } + } + } + } + } +} diff --git a/qml/app/navigation/NavigationRoutes.js b/qml/app/navigation/NavigationRoutes.js index ae5ddb21..990d4a9e 100644 --- a/qml/app/navigation/NavigationRoutes.js +++ b/qml/app/navigation/NavigationRoutes.js @@ -4,7 +4,7 @@ var _menuItems = [ { textKey: "Dashboard", iconName: "home", iconColor: "#3498db", pageUrl: "features/dashboard/pages/Dashboard.qml", pageNum: 0 }, { textKey: "Timesheet", iconName: "alarm-clock", iconColor: "#e67e22", pageUrl: "features/timesheets/pages/Timesheet_Page.qml", pageNum: 1 }, { textKey: "Activities", iconName: "calendar", iconColor: "#e74c3c", pageUrl: "Activity_Page.qml", pageNum: 2 }, - { textKey: "My Tasks", iconName: "scope-manager", iconColor: "#2ecc71", pageUrl: "MyTasks.qml", pageNum: 3 }, + { textKey: "My Tasks", iconName: "scope-manager", iconColor: "#2ecc71", pageUrl: "features/tasks/pages/MyTasksPage.qml", pageNum: 3 }, { textKey: "All Tasks", iconName: "view-list-symbolic", iconColor: "#1abc9c", pageUrl: "features/tasks/pages/Task_Page.qml", pageNum: 3 }, { textKey: "Projects", iconName: "folder-symbolic", iconColor: "#9b59b6", pageUrl: "Project_Page.qml", pageNum: 4 }, { textKey: "Project Updates", iconName: "history", iconColor: "#f39c12", pageUrl: "Updates_Page.qml", pageNum: 5 }, @@ -32,7 +32,7 @@ function resolvePageKey(pageNum, pageUrl) { if (pageNum === 2) return "activity"; if (pageNum === 3) - return String(pageUrl || "").indexOf("MyTasks") === -1 ? "task" : "dynamic"; + return String(pageUrl || "").indexOf("MyTasks") === -1 ? "task" : "my_tasks"; if (pageNum === 4) return "project"; if (pageNum === 5) diff --git a/qml/features/tasks/pages/MyTasksPage.qml b/qml/features/tasks/pages/MyTasksPage.qml index 4314fc59..59b01c5b 100644 --- a/qml/features/tasks/pages/MyTasksPage.qml +++ b/qml/features/tasks/pages/MyTasksPage.qml @@ -271,6 +271,25 @@ Page { } } + function refreshData() { + if (typeof mainView !== "undefined" && mainView !== null && typeof mainView.currentAccountId !== "undefined") { + var acctId = mainView.currentAccountId; + if (acctId !== selectedAccountId && acctId >= -1) { + handleAccountChange(acctId); + return; + } + } + + updateCurrentUser(); + loadPersonalStages(); + + if (currentUserOdooId > 0) { + startPaginatedLoad(); + } else { + clearCurrentTasks(); + } + } + ListHeader { id: myTaskListHeader anchors.top: myTasksHeader.bottom @@ -440,21 +459,7 @@ Page { onVisibleChanged: { if (visible) { Global.setLastVisitedPage("MyTasks"); - - if (typeof mainView !== "undefined" && mainView !== null && typeof mainView.currentAccountId !== "undefined") { - var acctId = mainView.currentAccountId; - if (acctId !== selectedAccountId && acctId >= -1) { - handleAccountChange(acctId); - return; - } - } - - updateCurrentUser(); - loadPersonalStages(); - - if (currentUserOdooId > 0) { - startPaginatedLoad(); - } + refreshData(); } } From 5e527ae05e8d45e8f1acaa623d858bc013444d3e Mon Sep 17 00:00:00 2001 From: Suraj Yadav Date: Fri, 22 May 2026 12:44:07 +0530 Subject: [PATCH 09/67] Add Updates and Updates_Page QML files for project update management - Introduced Updates.qml for handling project update details, including form fields for title, description, status, and progress. - Implemented draft handling for unsaved changes and auto-save functionality. - Added navigation and back handling with unsaved changes warning. - Created Updates_Page.qml for displaying a list of project updates with filtering and searching capabilities. - Integrated account selection and project filtering for updates. - Added loading indicators and notifications for user feedback during operations. --- qml/Menu.qml | 28 ---------------- qml/MyTasks.qml | 28 ---------------- qml/app/AppLayout.qml | 11 ++++--- qml/app/navigation/NavigationRoutes.js | 14 ++++---- qml/{Aboutus.qml => app/pages/AboutPage.qml} | 6 ++-- .../activities/pages}/Activities.qml | 26 +++++++-------- .../activities/pages}/Activity_Page.qml | 16 +++++----- qml/features/dashboard/pages/Dashboard.qml | 8 ++--- .../projects/pages}/Project_Page.qml | 12 +++---- .../projects/pages}/Projects.qml | 32 +++++++++---------- qml/features/tasks/pages/Tasks.qml | 4 +-- qml/{ => features/updates/pages}/Updates.qml | 16 +++++----- .../updates/pages}/Updates_Page.qml | 12 +++---- 13 files changed, 80 insertions(+), 133 deletions(-) delete mode 100644 qml/Menu.qml delete mode 100644 qml/MyTasks.qml rename qml/{Aboutus.qml => app/pages/AboutPage.qml} (95%) rename qml/{ => features/activities/pages}/Activities.qml (98%) rename qml/{ => features/activities/pages}/Activity_Page.qml (98%) rename qml/{ => features/projects/pages}/Project_Page.qml (94%) rename qml/{ => features/projects/pages}/Projects.qml (98%) rename qml/{ => features/updates/pages}/Updates.qml (98%) rename qml/{ => features/updates/pages}/Updates_Page.qml (97%) diff --git a/qml/Menu.qml b/qml/Menu.qml deleted file mode 100644 index 5ffbb091..00000000 --- a/qml/Menu.qml +++ /dev/null @@ -1,28 +0,0 @@ -/* - * MIT License - * - * Copyright (c) 2025 CIT-Services - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -import QtQuick 2.7 -import "app/navigation" - -MenuPage {} diff --git a/qml/MyTasks.qml b/qml/MyTasks.qml deleted file mode 100644 index 90bc9099..00000000 --- a/qml/MyTasks.qml +++ /dev/null @@ -1,28 +0,0 @@ -/* - * MIT License - * - * Copyright (c) 2025 CIT-Services - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -import QtQuick 2.9 -import "features/tasks/pages" - -MyTasksPage {} diff --git a/qml/app/AppLayout.qml b/qml/app/AppLayout.qml index 914f4ce2..0c723699 100644 --- a/qml/app/AppLayout.qml +++ b/qml/app/AppLayout.qml @@ -5,10 +5,13 @@ import QtQuick.Layouts 1.11 import "../" import "navigation" as AppNavigation import "pages" as AppPages +import "../features/activities/pages" as ActivityPages import "../features/dashboard/pages" as DashboardPages +import "../features/projects/pages" as ProjectPages import "../features/settings/pages" as SettingsPages import "../features/tasks/pages" as TaskPages import "../features/timesheets/pages" as TimesheetPages +import "../features/updates/pages" as UpdatePages import "navigation/NavigationRoutes.js" as NavigationRoutes AdaptivePageLayout { @@ -124,7 +127,7 @@ AdaptivePageLayout { } } - Activity_Page { + ActivityPages.Activity_Page { id: activity_page Connections { @@ -166,7 +169,7 @@ AdaptivePageLayout { } } - Project_Page { + ProjectPages.Project_Page { id: project_page Connections { @@ -180,11 +183,11 @@ AdaptivePageLayout { } } - Updates_Page { + UpdatePages.Updates_Page { id: updates_page } - Aboutus { + AppPages.AboutPage { id: aboutus_page } diff --git a/qml/app/navigation/NavigationRoutes.js b/qml/app/navigation/NavigationRoutes.js index 990d4a9e..48efe5f9 100644 --- a/qml/app/navigation/NavigationRoutes.js +++ b/qml/app/navigation/NavigationRoutes.js @@ -3,20 +3,20 @@ var _menuItems = [ { textKey: "Dashboard", iconName: "home", iconColor: "#3498db", pageUrl: "features/dashboard/pages/Dashboard.qml", pageNum: 0 }, { textKey: "Timesheet", iconName: "alarm-clock", iconColor: "#e67e22", pageUrl: "features/timesheets/pages/Timesheet_Page.qml", pageNum: 1 }, - { textKey: "Activities", iconName: "calendar", iconColor: "#e74c3c", pageUrl: "Activity_Page.qml", pageNum: 2 }, + { textKey: "Activities", iconName: "calendar", iconColor: "#e74c3c", pageUrl: "features/activities/pages/Activity_Page.qml", pageNum: 2 }, { textKey: "My Tasks", iconName: "scope-manager", iconColor: "#2ecc71", pageUrl: "features/tasks/pages/MyTasksPage.qml", pageNum: 3 }, { textKey: "All Tasks", iconName: "view-list-symbolic", iconColor: "#1abc9c", pageUrl: "features/tasks/pages/Task_Page.qml", pageNum: 3 }, - { textKey: "Projects", iconName: "folder-symbolic", iconColor: "#9b59b6", pageUrl: "Project_Page.qml", pageNum: 4 }, - { textKey: "Project Updates", iconName: "history", iconColor: "#f39c12", pageUrl: "Updates_Page.qml", pageNum: 5 }, - { textKey: "About Us", iconName: "info", iconColor: "#2980b9", pageUrl: "Aboutus.qml", pageNum: 7 }, + { textKey: "Projects", iconName: "folder-symbolic", iconColor: "#9b59b6", pageUrl: "features/projects/pages/Project_Page.qml", pageNum: 4 }, + { textKey: "Project Updates", iconName: "history", iconColor: "#f39c12", pageUrl: "features/updates/pages/Updates_Page.qml", pageNum: 5 }, + { textKey: "About Us", iconName: "info", iconColor: "#2980b9", pageUrl: "app/pages/AboutPage.qml", pageNum: 7 }, { textKey: "Settings", iconName: "settings", iconColor: "#7f8c8d", pageUrl: "features/settings/pages/Settings_Page.qml", pageNum: 6, showDivider: false } ]; var _deepLinkPages = { "Task": "features/tasks/pages/Tasks.qml", - "Activity": "Activities.qml", - "ProjectUpdate": "Updates.qml", - "Project": "Projects.qml", + "Activity": "features/activities/pages/Activities.qml", + "ProjectUpdate": "features/updates/pages/Updates.qml", + "Project": "features/projects/pages/Projects.qml", "Timesheet": "features/timesheets/pages/Timesheet.qml" }; diff --git a/qml/Aboutus.qml b/qml/app/pages/AboutPage.qml similarity index 95% rename from qml/Aboutus.qml rename to qml/app/pages/AboutPage.qml index e5a0824b..b7136fc6 100644 --- a/qml/Aboutus.qml +++ b/qml/app/pages/AboutPage.qml @@ -27,8 +27,8 @@ import Lomiri.Components 1.3 import QtCharts 2.0 import QtQuick.Layouts 1.11 import Qt.labs.settings 1.0 -import "../models/Main.js" as Model -import "../models/constants.js" as AppConst +import "../../../models/Main.js" as Model +import "../../../models/constants.js" as AppConst Page { id: aboutPage @@ -39,7 +39,7 @@ Page { Component.onCompleted: { var xhr = new XMLHttpRequest(); - xhr.open("GET", Qt.resolvedUrl("release_notes.txt")); + xhr.open("GET", Qt.resolvedUrl("../../release_notes.txt")); xhr.onreadystatechange = function () { if (xhr.readyState === XMLHttpRequest.DONE) { releaseNotesHtml = (xhr.status === 200) ? xhr.responseText : "

Release notes could not be loaded.

"; diff --git a/qml/Activities.qml b/qml/features/activities/pages/Activities.qml similarity index 98% rename from qml/Activities.qml rename to qml/features/activities/pages/Activities.qml index 1e7b242a..e8e768a7 100644 --- a/qml/Activities.qml +++ b/qml/features/activities/pages/Activities.qml @@ -6,14 +6,14 @@ import Qt.labs.settings 1.0 import Lomiri.Components 1.3 import Lomiri.Components.Popups 1.3 import Lomiri.Components.Pickers 1.3 -import "../models/utils.js" as Utils -import "../models/activity.js" as Activity -import "../models/accounts.js" as Accounts -import "../models/task.js" as Task -import "../models/project.js" as Project -import "../models/global.js" as Global -import "components" -import "components/richtext" +import "../../../../models/utils.js" as Utils +import "../../../../models/activity.js" as Activity +import "../../../../models/accounts.js" as Accounts +import "../../../../models/task.js" as Task +import "../../../../models/project.js" as Project +import "../../../../models/global.js" as Global +import "../../../components" +import "../../../components/richtext" Page { id: activityDetailsPage @@ -88,7 +88,7 @@ Page { } trailingActionBar.actions: [ Action { - iconSource: "images/save.svg" + iconSource: "../../../images/save.svg" visible: !isReadOnly text: i18n.dtr("ubtms", "Save") onTriggered: { @@ -338,7 +338,7 @@ Page { // Get the local task id from odoo_record_id var taskLocalId = Task.getLocalIdFromOdooId(taskOdooRecordId, currentActivity.account_id); if (taskLocalId > 0) { - apLayout.addPageToNextColumn(activityDetailsPage, Qt.resolvedUrl("features/tasks/pages/Tasks.qml"), { + apLayout.addPageToNextColumn(activityDetailsPage, Qt.resolvedUrl("../../tasks/pages/Tasks.qml"), { "recordid": taskLocalId, "isReadOnly": true, "editVisible": false @@ -362,7 +362,7 @@ Page { // Get the local project id from odoo_record_id var projectLocalId = Project.getLocalIdFromOdooId(projectOdooRecordId, currentActivity.account_id); if (projectLocalId > 0) { - apLayout.addPageToNextColumn(activityDetailsPage, Qt.resolvedUrl("Projects.qml"), { + apLayout.addPageToNextColumn(activityDetailsPage, Qt.resolvedUrl("../../projects/pages/Projects.qml"), { "recordid": projectLocalId, "isReadOnly": true }); @@ -380,7 +380,7 @@ Page { // Get the local update id from odoo_record_id var updateLocalId = Project.getUpdateLocalIdFromOdooId(updateOdooRecordId, currentActivity.account_id); if (updateLocalId > 0) { - apLayout.addPageToNextColumn(activityDetailsPage, Qt.resolvedUrl("Updates.qml"), { + apLayout.addPageToNextColumn(activityDetailsPage, Qt.resolvedUrl("../../updates/pages/Updates.qml"), { "recordid": updateLocalId, "accountid": currentActivity.account_id, "isReadOnly": true @@ -764,7 +764,7 @@ Page { Global.description_context = "activity_notes"; navigatingToReadMore = true; notes.liveSyncActive = true; - apLayout.addPageToNextColumn(activityDetailsPage, Qt.resolvedUrl("ReadMorePage.qml"), { + apLayout.addPageToNextColumn(activityDetailsPage, Qt.resolvedUrl("../../../ReadMorePage.qml"), { isReadOnly: isReadOnly, parentDraftHandler: draftHandler //useRichText: false diff --git a/qml/Activity_Page.qml b/qml/features/activities/pages/Activity_Page.qml similarity index 98% rename from qml/Activity_Page.qml rename to qml/features/activities/pages/Activity_Page.qml index 9776f5bb..d4bf5d7e 100644 --- a/qml/Activity_Page.qml +++ b/qml/features/activities/pages/Activity_Page.qml @@ -26,14 +26,14 @@ import QtQuick 2.7 import QtQuick.Controls 2.2 import Lomiri.Components 1.3 import QtQuick.Window 2.2 -import "../models/timesheet.js" as Model -import "../models/project.js" as Project -import "../models/task.js" as Task -import "../models/activity.js" as Activity -import "../models/utils.js" as Utils -import "../models/accounts.js" as Accounts -import "../models/global.js" as Global -import "components" +import "../../../../models/timesheet.js" as Model +import "../../../../models/project.js" as Project +import "../../../../models/task.js" as Task +import "../../../../models/activity.js" as Activity +import "../../../../models/utils.js" as Utils +import "../../../../models/accounts.js" as Accounts +import "../../../../models/global.js" as Global +import "../../../components" Page { property bool isMultiColumn: typeof apLayout !== "undefined" ? apLayout.columns > 1 : false diff --git a/qml/features/dashboard/pages/Dashboard.qml b/qml/features/dashboard/pages/Dashboard.qml index 3ade33fb..e87ec552 100644 --- a/qml/features/dashboard/pages/Dashboard.qml +++ b/qml/features/dashboard/pages/Dashboard.qml @@ -242,7 +242,7 @@ Page { } } if (index === 2) { - apLayout.addPageToNextColumn(mainPage, Qt.resolvedUrl("../../../Activities.qml"), { + apLayout.addPageToNextColumn(mainPage, Qt.resolvedUrl("../../activities/pages/Activities.qml"), { "isReadOnly": false }); } @@ -515,20 +515,20 @@ Page { "isReadOnly": true }); } else if (navType === "Activity" && recordId > 0) { - apLayout.addPageToNextColumn(mainPage, Qt.resolvedUrl("../../../Activities.qml"), { + apLayout.addPageToNextColumn(mainPage, Qt.resolvedUrl("../../activities/pages/Activities.qml"), { "recordid": recordId, "accountid": accountId, "isReadOnly": true }); } else if (navType === "ProjectUpdate" && recordId > 0) { - apLayout.addPageToNextColumn(mainPage, Qt.resolvedUrl("../../../Updates.qml"), { + apLayout.addPageToNextColumn(mainPage, Qt.resolvedUrl("../../updates/pages/Updates.qml"), { "recordid": recordId, "accountid": accountId, "isOdooRecordId": true, "isReadOnly": true }); } else if (navType === "Project" && recordId > 0) { - apLayout.addPageToNextColumn(mainPage, Qt.resolvedUrl("../../../Projects.qml"), { + apLayout.addPageToNextColumn(mainPage, Qt.resolvedUrl("../../projects/pages/Projects.qml"), { "recordid": recordId, "isReadOnly": true }); diff --git a/qml/Project_Page.qml b/qml/features/projects/pages/Project_Page.qml similarity index 94% rename from qml/Project_Page.qml rename to qml/features/projects/pages/Project_Page.qml index db6c1a29..ff0682ca 100644 --- a/qml/Project_Page.qml +++ b/qml/features/projects/pages/Project_Page.qml @@ -30,12 +30,12 @@ import Ubuntu.Components 1.3 as Ubuntu import QtQuick.LocalStorage 2.7 import Lomiri.Components.ListItems 1.3 as ListItem -import "../models/project.js" as Project -import "../models/utils.js" as Utils -import "../models/accounts.js" as Account -import "../models/global.js" as Global +import "../../../../models/project.js" as Project +import "../../../../models/utils.js" as Utils +import "../../../../models/accounts.js" as Account +import "../../../../models/global.js" as Global -import "components" +import "../../../components" Page { property bool isMultiColumn: typeof apLayout !== "undefined" ? apLayout.columns > 1 : false @@ -109,7 +109,7 @@ Page { onProjectTimesheetRequested: localId => { let result = Timesheet.createTimesheetFromProject(localId); if (result.success) { - apLayout.addPageToNextColumn(project, Qt.resolvedUrl("features/timesheets/pages/Timesheet.qml"), { + apLayout.addPageToNextColumn(project, Qt.resolvedUrl("../../timesheets/pages/Timesheet.qml"), { "recordid": result.id, "isReadOnly": false }); diff --git a/qml/Projects.qml b/qml/features/projects/pages/Projects.qml similarity index 98% rename from qml/Projects.qml rename to qml/features/projects/pages/Projects.qml index 57be5860..929dad0d 100644 --- a/qml/Projects.qml +++ b/qml/features/projects/pages/Projects.qml @@ -30,14 +30,14 @@ import Lomiri.Components 1.3 import Lomiri.Components.Popups 1.3 import Lomiri.Components.Pickers 1.3 import QtCharts 2.0 -import "../models/task.js" as Task -import "../models/utils.js" as Utils -import "../models/accounts.js" as Accounts -import "../models/activity.js" as Activity -import "../models/project.js" as Project -import "../models/global.js" as Global -import "components" -import "components/richtext" +import "../../../../models/task.js" as Task +import "../../../../models/utils.js" as Utils +import "../../../../models/accounts.js" as Accounts +import "../../../../models/activity.js" as Activity +import "../../../../models/project.js" as Project +import "../../../../models/global.js" as Global +import "../../../components" +import "../../../components/richtext" Page { id: projectCreate @@ -64,7 +64,7 @@ Page { trailingActionBar.actions: [ Action { - iconSource: "images/save.svg" + iconSource: "../../../images/save.svg" text: i18n.dtr("ubtms", "Save") visible: !isReadOnly onTriggered: { @@ -625,7 +625,7 @@ Page { Global.richTextSaveCallback = saveProjectDescriptionFromEditor; navigatingToReadMore = true; description_text.liveSyncActive = true; - apLayout.addPageToNextColumn(projectCreate, Qt.resolvedUrl("ReadMorePage.qml"), { + apLayout.addPageToNextColumn(projectCreate, Qt.resolvedUrl("../../../ReadMorePage.qml"), { isReadOnly: isReadOnly, parentDraftHandler: draftHandler, parentFormPage: projectCreate, @@ -735,7 +735,7 @@ Page { let project = Project.getProjectDetails(recordid); let result = Activity.createActivityFromProjectOrTask(true, project.account_id, project.odoo_record_id); if (result.success) { - apLayout.addPageToNextColumn(projectCreate, Qt.resolvedUrl("Activities.qml"), { + apLayout.addPageToNextColumn(projectCreate, Qt.resolvedUrl("../../activities/pages/Activities.qml"), { "recordid": result.record_id, "accountid": project.account_id, "isReadOnly": false @@ -759,7 +759,7 @@ Page { text: i18n.dtr("ubtms","View") onClicked: { let project = Project.getProjectDetails(recordid); - apLayout.addPageToNextColumn(projectCreate, Qt.resolvedUrl("Activity_Page.qml"), { + apLayout.addPageToNextColumn(projectCreate, Qt.resolvedUrl("../../activities/pages/Activity_Page.qml"), { "filterByProject": true, "projectOdooRecordId": project.odoo_record_id, "projectAccountId": project.account_id, @@ -795,7 +795,7 @@ Page { let isSubProject = project.parent_id && project.parent_id > 0; let parentProjectId = isSubProject ? project.parent_id : -1; - apLayout.addPageToNextColumn(projectCreate, Qt.resolvedUrl("features/tasks/pages/Tasks.qml"), { + apLayout.addPageToNextColumn(projectCreate, Qt.resolvedUrl("../../tasks/pages/Tasks.qml"), { "recordid": 0, "isReadOnly": false, "prefilledAccountId": project.account_id, @@ -820,7 +820,7 @@ Page { text: i18n.dtr("ubtms","View") onClicked: { let project = Project.getProjectDetails(recordid); - apLayout.addPageToNextColumn(projectCreate, Qt.resolvedUrl("features/tasks/pages/Task_Page.qml"), { + apLayout.addPageToNextColumn(projectCreate, Qt.resolvedUrl("../../tasks/pages/Task_Page.qml"), { "filterByProject": true, "projectOdooRecordId": project.odoo_record_id, "projectAccountId": project.account_id, @@ -862,7 +862,7 @@ Page { } Global.createUpdateCallback = null; }; - apLayout.addPageToNextColumn(projectCreate, Qt.resolvedUrl("components/CreateUpdatePage.qml"), { + apLayout.addPageToNextColumn(projectCreate, Qt.resolvedUrl("../../../components/CreateUpdatePage.qml"), { "projectId": project.odoo_record_id, "accountId": project.account_id }); @@ -882,7 +882,7 @@ Page { text: i18n.dtr("ubtms","View") onClicked: { let project = Project.getProjectDetails(recordid); - apLayout.addPageToNextColumn(projectCreate, Qt.resolvedUrl("Updates_Page.qml"), { + apLayout.addPageToNextColumn(projectCreate, Qt.resolvedUrl("../../updates/pages/Updates_Page.qml"), { "filterByProject": true, "projectOdooRecordId": project.odoo_record_id, "projectAccountId": project.account_id, diff --git a/qml/features/tasks/pages/Tasks.qml b/qml/features/tasks/pages/Tasks.qml index f7a6d45e..d45bf77e 100644 --- a/qml/features/tasks/pages/Tasks.qml +++ b/qml/features/tasks/pages/Tasks.qml @@ -819,7 +819,7 @@ Page { onCreateActivityRequested: { let result = Activity.createActivityFromProjectOrTask(false, currentTask.account_id, currentTask.odoo_record_id); if (result.success) { - apLayout.addPageToNextColumn(taskCreate, Qt.resolvedUrl("../../../Activities.qml"), { + apLayout.addPageToNextColumn(taskCreate, Qt.resolvedUrl("../../activities/pages/Activities.qml"), { "recordid": result.record_id, "accountid": currentTask.account_id, "isReadOnly": false @@ -830,7 +830,7 @@ Page { } onViewActivitiesRequested: { console.log("Viewing activities for task:", currentTask.id, "odoo_record_id:", currentTask.odoo_record_id); - apLayout.addPageToNextColumn(taskCreate, Qt.resolvedUrl("../../../Activity_Page.qml"), { + apLayout.addPageToNextColumn(taskCreate, Qt.resolvedUrl("../../activities/pages/Activity_Page.qml"), { "filterByTasks": true, "taskOdooRecordId": currentTask.odoo_record_id, "projectAccountId": currentTask.account_id, diff --git a/qml/Updates.qml b/qml/features/updates/pages/Updates.qml similarity index 98% rename from qml/Updates.qml rename to qml/features/updates/pages/Updates.qml index ae00ddc1..42167673 100644 --- a/qml/Updates.qml +++ b/qml/features/updates/pages/Updates.qml @@ -30,12 +30,12 @@ import Qt.labs.settings 1.0 import Lomiri.Components 1.3 import Lomiri.Components.Popups 1.3 import Lomiri.Components.Pickers 1.3 -import "../models/utils.js" as Utils -import "../models/project.js" as Project -import "../models/accounts.js" as Accounts -import "../models/global.js" as Global -import "components" -import "components/richtext" +import "../../../../models/utils.js" as Utils +import "../../../../models/project.js" as Project +import "../../../../models/accounts.js" as Accounts +import "../../../../models/global.js" as Global +import "../../../components" +import "../../../components/richtext" Page { id: updateDetailsPage @@ -118,7 +118,7 @@ Page { } trailingActionBar.actions: [ Action { - iconSource: "images/save.svg" + iconSource: "../../../images/save.svg" visible: !isReadOnly text: i18n.dtr("ubtms", "Save") onTriggered: { @@ -545,7 +545,7 @@ Page { Global.description_context = "update_description"; navigatingToReadMore = true; description_text.liveSyncActive = true; - apLayout.addPageToNextColumn(updateDetailsPage, Qt.resolvedUrl("ReadMorePage.qml"), { + apLayout.addPageToNextColumn(updateDetailsPage, Qt.resolvedUrl("../../../ReadMorePage.qml"), { isReadOnly: isReadOnly, parentDraftHandler: draftHandler }); diff --git a/qml/Updates_Page.qml b/qml/features/updates/pages/Updates_Page.qml similarity index 97% rename from qml/Updates_Page.qml rename to qml/features/updates/pages/Updates_Page.qml index ea3429a1..d81df487 100644 --- a/qml/Updates_Page.qml +++ b/qml/features/updates/pages/Updates_Page.qml @@ -27,11 +27,11 @@ import Lomiri.Components 1.3 import QtQuick.Window 2.2 import Ubuntu.Components 1.3 as Ubuntu import QtQuick.LocalStorage 2.7 -import "../models/project.js" as Project -import "../models/accounts.js" as Account -import "../models/global.js" as Global -import "components" -import "../models/timer_service.js" as TimerService +import "../../../../models/project.js" as Project +import "../../../../models/accounts.js" as Account +import "../../../../models/global.js" as Global +import "../../../components" +import "../../../../models/timer_service.js" as TimerService Page { property bool isMultiColumn: typeof apLayout !== "undefined" ? apLayout.columns > 1 : false @@ -336,7 +336,7 @@ Page { onShowDescription: { Global.description_temporary_holder = description; Global.description_context = "update_description"; - apLayout.addPageToNextColumn(updates, Qt.resolvedUrl("ReadMorePage.qml"), { + apLayout.addPageToNextColumn(updates, Qt.resolvedUrl("../../../ReadMorePage.qml"), { "isReadOnly": true }); } From cc959bfd69279842e691ce403d03e06582fd24e1 Mon Sep 17 00:00:00 2001 From: Suraj Yadav Date: Wed, 3 Jun 2026 10:15:34 +0530 Subject: [PATCH 10/67] Refactor account management and logging features - Removed the old DatePicker.qml and SyncLog.qml files. - Introduced a new Account_Page.qml for account creation and editing, including validation and sync settings. - Updated references in Settings_Accounts.qml to point to the new Account_Page.qml. - Added a new SyncLog.qml file to handle sync log display and copying functionality. - Improved error handling and user feedback in account management processes. --- qml/DatePicker.qml | 215 ------------------ .../settings/pages}/Account_Page.qml | 10 +- .../settings/pages/Settings_Accounts.qml | 8 +- qml/{ => features/settings/pages}/SyncLog.qml | 2 +- 4 files changed, 10 insertions(+), 225 deletions(-) delete mode 100644 qml/DatePicker.qml rename qml/{ => features/settings/pages}/Account_Page.qml (99%) rename qml/{ => features/settings/pages}/SyncLog.qml (99%) diff --git a/qml/DatePicker.qml b/qml/DatePicker.qml deleted file mode 100644 index 92166004..00000000 --- a/qml/DatePicker.qml +++ /dev/null @@ -1,215 +0,0 @@ -/* - * MIT License - * - * Copyright (c) 2025 CIT-Services - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -import QtQuick 2.0 -import QtQuick.Controls 2.2 -import QtQuick.Window 2.2 - -ListView { - id: root - property int selectedYear: 2024 - - signal clicked(date date) - - property date selectedDate: new Date() - function isDesktop() { - if (Screen.width > 1300) { - return true; - } else { - return false; - } - } - width: isDesktop() ? 450 : 600 - height: isDesktop() ? 450 : 600 - snapMode: ListView.SnapOneItem - orientation: Qt.Horizontal - clip: true - anchors.margins: 0 - - model: 500 * 12 - - function set(year, month) { - selectedYear = year; - selectedDate = new Date(year, month, selectedDate.getDate()); - var index = year * 12 + month; - listView.currentIndex = index; - } - - Item { - width: isDesktop() ? 400 : 600 - height: isDesktop() ? 345 : 600 - anchors.centerIn: parent - Row { - spacing: 10 - anchors { - horizontalCenter: parent.horizontalCenter - top: parent.top - topMargin: isDesktop() ? 0 : 80 - } - - ComboBox { - id: yearSelector - width: isDesktop() ? 200 : 300 - height: isDesktop() ? 30 : 57 - textRole: "yearText" - model: ListModel { - Component.onCompleted: { - var currentYear = new Date().getFullYear(); - for (var i = currentYear; i < currentYear + 10; ++i) { - append({ - "yearText": i.toString() - }); - } - } - } - - onCurrentTextChanged: { - selectedYear = parseInt(currentText); - } - } - - Button { - width: isDesktop() ? 80 : 100 - height: isDesktop() ? 30 : 50 - - background: Rectangle { - color: "#FB634E" - radius: 10 - border.color: "#FB634E" - border.width: 2 - anchors.fill: parent - } - contentItem: Text { - anchors.fill: parent - text: "Go" - color: "#fff" - font.pixelSize: isDesktop() ? 20 : 30 - horizontalAlignment: Text.AlignHCenter - verticalAlignment: Text.AlignVCenter - } - - onClicked: { - var selectedYear = parseInt(yearSelector.currentText); - root.set(selectedYear, root.selectedDate.getMonth()); - } - } - } - } - - delegate: Item { - property int month: index % 12 - property int firstDay: new Date(selectedYear, month, 1).getDay() - - width: root.width - height: root.height - - Rectangle { - width: parent.width - height: isDesktop() ? 390 : 600 - color: "#121944" - border.color: "#121944" - } - - y: 10 - - Column { - spacing: isDesktop() ? 40 : 60 - - Item { - width: root.width - height: isDesktop() ? root.height - grid.height - 100 : root.height - grid.height - 70 - - Text { - anchors { - horizontalCenter: parent.horizontalCenter - top: parent.top - centerIn: parent - } - - color: "#fff" - text: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'][month] + ' ' + selectedYear - font { - pixelSize: 0.5 * grid.cellHeight - } - } - } - - Grid { - id: grid - - width: root.width - height: (isDesktop() ? 0.675 : 0.745) * root.height - property real cellWidth: width / columns - property real cellHeight: height / rows - - columns: 7 - rows: 7 - - Repeater { - model: grid.columns * grid.rows - - delegate: Rectangle { - property int day: index - 7 - property int date: day - firstDay + 1 - - width: grid.cellWidth - height: grid.cellHeight - border.width: 0.3 * radius - border.color: new Date(selectedYear, month, date).toDateString() == selectedDate.toDateString() && text.text && day >= 0 ? 'black' : 'transparent' - radius: 0.02 * root.height - opacity: !mouseArea.pressed ? 1 : 0.3 - - Text { - id: text - - anchors.centerIn: parent - font.pixelSize: 0.5 * parent.height - font.bold: new Date(selectedYear, month, date).toDateString() == new Date().toDateString() - text: { - if (day < 0) - ['S', 'M', 'T', 'W', 'T', 'F', 'S'][index]; - else if (new Date(selectedYear, month, date).getMonth() == month) - date; - else - ''; - } - } - - MouseArea { - id: mouseArea - - anchors.fill: parent - enabled: text.text && day >= 0 - - onClicked: { - selectedDate = new Date(selectedYear, month, date); - root.clicked(selectedDate); - } - } - } - } - } - } - } -} diff --git a/qml/Account_Page.qml b/qml/features/settings/pages/Account_Page.qml similarity index 99% rename from qml/Account_Page.qml rename to qml/features/settings/pages/Account_Page.qml index 8127f684..7e711cc0 100644 --- a/qml/Account_Page.qml +++ b/qml/features/settings/pages/Account_Page.qml @@ -28,9 +28,9 @@ import Lomiri.Components 1.3 import QtQuick.Window 2.2 import QtQuick.LocalStorage 2.7 as Sql import io.thp.pyotherside 1.4 -import "../models/accounts.js" as Accounts -import "../models/utils.js" as Utils -import "components" +import "../../../../models/accounts.js" as Accounts +import "../../../../models/utils.js" as Utils +import "../../../components" Page { id: createAccountPage @@ -63,7 +63,7 @@ Page { } trailingActionBar.actions: [ Action { - iconSource: "images/save.svg" + iconSource: "../../../images/save.svg" visible: !isReadOnly text: i18n.dtr("ubtms","Save") @@ -326,7 +326,7 @@ Page { id: python Component.onCompleted: { - addImportPath(Qt.resolvedUrl('../src/')); + addImportPath(Qt.resolvedUrl('../../../../src/')); importModule_sync("backend"); } diff --git a/qml/features/settings/pages/Settings_Accounts.qml b/qml/features/settings/pages/Settings_Accounts.qml index b351a6fa..79d0e6ea 100644 --- a/qml/features/settings/pages/Settings_Accounts.qml +++ b/qml/features/settings/pages/Settings_Accounts.qml @@ -45,7 +45,7 @@ Page { Action { iconName: "add" onTriggered: { - apLayout.addPageToNextColumn(accountsSettingsPage, Qt.resolvedUrl('../../../Account_Page.qml')); + apLayout.addPageToNextColumn(accountsSettingsPage, Qt.resolvedUrl('Account_Page.qml')); } } ] @@ -277,7 +277,7 @@ Page { onClicked: { if (model.id !== 0) { - apLayout.addPageToNextColumn(accountsSettingsPage, Qt.resolvedUrl('../../../Account_Page.qml'), { + apLayout.addPageToNextColumn(accountsSettingsPage, Qt.resolvedUrl('Account_Page.qml'), { "accountId": model.id }); } @@ -290,7 +290,7 @@ Page { iconName: "edit" enabled: model.id !== 0 onTriggered: { - apLayout.addPageToNextColumn(accountsSettingsPage, Qt.resolvedUrl('../../../Account_Page.qml'), { + apLayout.addPageToNextColumn(accountsSettingsPage, Qt.resolvedUrl('Account_Page.qml'), { "accountId": model.id, "openInEditMode": true }); @@ -307,7 +307,7 @@ Page { text: i18n.dtr("ubtms", "Log") enabled: model.id !== 0 onTriggered: { - apLayout.addPageToNextColumn(accountsSettingsPage, Qt.resolvedUrl("../../../SyncLog.qml"), { + apLayout.addPageToNextColumn(accountsSettingsPage, Qt.resolvedUrl("SyncLog.qml"), { "recordid": model.id }); } diff --git a/qml/SyncLog.qml b/qml/features/settings/pages/SyncLog.qml similarity index 99% rename from qml/SyncLog.qml rename to qml/features/settings/pages/SyncLog.qml index dec3b928..ea83b3a1 100644 --- a/qml/SyncLog.qml +++ b/qml/features/settings/pages/SyncLog.qml @@ -1,6 +1,6 @@ import QtQuick 2.7 import Lomiri.Components 1.3 -import "../models/accounts.js" as Accounts +import "../../../../models/accounts.js" as Accounts Page { id: syncLogPage From 9e2376d16dd8664264ba9ecae40923ca2f871a57 Mon Sep 17 00:00:00 2001 From: Suraj Yadav Date: Wed, 3 Jun 2026 10:28:25 +0530 Subject: [PATCH 11/67] Refactor code structure for improved readability and maintainability --- qml/UbuntuNumberAnimation.qml | 7 ------- qml/app/pages/AboutPage.qml | 2 +- qml/app/pages/Splash.qml | 2 +- qml/{ => app/pages}/release_notes.txt | 0 qml/{ => components/base}/UbuntuShape.qml | 0 qml/components/dialogs/CreateUpdateDialog.qml | 2 +- qml/components/qmldir | 1 + qml/{ => components/richtext}/ReadMorePage.qml | 4 +--- qml/components/workflow/CreateUpdatePage.qml | 2 +- qml/features/activities/pages/Activities.qml | 2 +- qml/features/dashboard/pages/TaskDetailPage.qml | 1 + qml/features/projects/pages/Projects.qml | 2 +- qml/features/tasks/pages/Tasks.qml | 2 +- qml/features/timesheets/pages/Timesheet.qml | 2 +- qml/features/updates/pages/Updates.qml | 2 +- qml/features/updates/pages/Updates_Page.qml | 2 +- qml/{ => images}/logo.png | Bin 17 files changed, 13 insertions(+), 20 deletions(-) delete mode 100644 qml/UbuntuNumberAnimation.qml rename qml/{ => app/pages}/release_notes.txt (100%) rename qml/{ => components/base}/UbuntuShape.qml (100%) rename qml/{ => components/richtext}/ReadMorePage.qml (99%) rename qml/{ => images}/logo.png (100%) diff --git a/qml/UbuntuNumberAnimation.qml b/qml/UbuntuNumberAnimation.qml deleted file mode 100644 index c9959e57..00000000 --- a/qml/UbuntuNumberAnimation.qml +++ /dev/null @@ -1,7 +0,0 @@ -// Fixed-duration animation helper matching the requested UbuntuNumberAnimation behavior. -import QtQuick 2.12 -import Lomiri.Components 1.3 - -NumberAnimation { - duration: 150 -} diff --git a/qml/app/pages/AboutPage.qml b/qml/app/pages/AboutPage.qml index b7136fc6..259c131f 100644 --- a/qml/app/pages/AboutPage.qml +++ b/qml/app/pages/AboutPage.qml @@ -39,7 +39,7 @@ Page { Component.onCompleted: { var xhr = new XMLHttpRequest(); - xhr.open("GET", Qt.resolvedUrl("../../release_notes.txt")); + xhr.open("GET", Qt.resolvedUrl("release_notes.txt")); xhr.onreadystatechange = function () { if (xhr.readyState === XMLHttpRequest.DONE) { releaseNotesHtml = (xhr.status === 200) ? xhr.responseText : "

Release notes could not be loaded.

"; diff --git a/qml/app/pages/Splash.qml b/qml/app/pages/Splash.qml index fd96e41d..34d44379 100644 --- a/qml/app/pages/Splash.qml +++ b/qml/app/pages/Splash.qml @@ -54,7 +54,7 @@ Page { anchors.centerIn: parent width: units.gu(30) height: units.gu(30) - source: "../../logo.png" + source: "../../images/logo.png" opacity: 0.3 // Animate the opacity to fade in diff --git a/qml/release_notes.txt b/qml/app/pages/release_notes.txt similarity index 100% rename from qml/release_notes.txt rename to qml/app/pages/release_notes.txt diff --git a/qml/UbuntuShape.qml b/qml/components/base/UbuntuShape.qml similarity index 100% rename from qml/UbuntuShape.qml rename to qml/components/base/UbuntuShape.qml diff --git a/qml/components/dialogs/CreateUpdateDialog.qml b/qml/components/dialogs/CreateUpdateDialog.qml index f6a60004..9324e11d 100644 --- a/qml/components/dialogs/CreateUpdateDialog.qml +++ b/qml/components/dialogs/CreateUpdateDialog.qml @@ -116,7 +116,7 @@ Item { // Access apLayout (global AdaptivePageLayout) and add ReadMorePage // apLayout is the global ID from TSApp.qml if (typeof apLayout !== "undefined" && apLayout) { - apLayout.addPageToNextColumn(popupWrapper.parentPage || createUpdateDialog, Qt.resolvedUrl("../ReadMorePage.qml"), { + apLayout.addPageToNextColumn(popupWrapper.parentPage || createUpdateDialog, Qt.resolvedUrl("../richtext/ReadMorePage.qml"), { isReadOnly: false }); } else { diff --git a/qml/components/qmldir b/qml/components/qmldir index 5963a662..2748ef70 100644 --- a/qml/components/qmldir +++ b/qml/components/qmldir @@ -47,6 +47,7 @@ TSCombobox 1.0 base/TSCombobox.qml TSIconButton 1.0 base/TSIconButton.qml TSLabel 1.0 base/TSLabel.qml TSProgressbar 1.0 base/TSProgressbar.qml +UbuntuShape 1.0 base/UbuntuShape.qml TasksForDayWidget 1.0 cards/TasksForDayWidget.qml TimePickerPopup 1.0 dialogs/TimePickerPopup.qml TreeSelector 1.0 selectors/TreeSelector.qml diff --git a/qml/ReadMorePage.qml b/qml/components/richtext/ReadMorePage.qml similarity index 99% rename from qml/ReadMorePage.qml rename to qml/components/richtext/ReadMorePage.qml index 3d146995..383cd133 100644 --- a/qml/ReadMorePage.qml +++ b/qml/components/richtext/ReadMorePage.qml @@ -1,8 +1,6 @@ import QtQuick 2.7 import Lomiri.Components 1.3 -import "../models/global.js" as Global -import "components" -import "components/richtext" +import "../../../models/global.js" as Global Page { id: readmepage diff --git a/qml/components/workflow/CreateUpdatePage.qml b/qml/components/workflow/CreateUpdatePage.qml index 35041c7e..854edd5a 100644 --- a/qml/components/workflow/CreateUpdatePage.qml +++ b/qml/components/workflow/CreateUpdatePage.qml @@ -334,7 +334,7 @@ Page { descriptionField.liveSyncActive = true; if (typeof apLayout !== "undefined" && apLayout) { - apLayout.addPageToNextColumn(createUpdatePage, Qt.resolvedUrl("../ReadMorePage.qml"), { + apLayout.addPageToNextColumn(createUpdatePage, Qt.resolvedUrl("../richtext/ReadMorePage.qml"), { isReadOnly: false, parentDraftHandler: draftHandler }); diff --git a/qml/features/activities/pages/Activities.qml b/qml/features/activities/pages/Activities.qml index e8e768a7..69e210d3 100644 --- a/qml/features/activities/pages/Activities.qml +++ b/qml/features/activities/pages/Activities.qml @@ -764,7 +764,7 @@ Page { Global.description_context = "activity_notes"; navigatingToReadMore = true; notes.liveSyncActive = true; - apLayout.addPageToNextColumn(activityDetailsPage, Qt.resolvedUrl("../../../ReadMorePage.qml"), { + apLayout.addPageToNextColumn(activityDetailsPage, Qt.resolvedUrl("../../../components/richtext/ReadMorePage.qml"), { isReadOnly: isReadOnly, parentDraftHandler: draftHandler //useRichText: false diff --git a/qml/features/dashboard/pages/TaskDetailPage.qml b/qml/features/dashboard/pages/TaskDetailPage.qml index b8f87169..56e6fdbd 100644 --- a/qml/features/dashboard/pages/TaskDetailPage.qml +++ b/qml/features/dashboard/pages/TaskDetailPage.qml @@ -2,6 +2,7 @@ import QtQuick 2.12 import Lomiri.Components 1.3 import QtQuick.Layouts 1.12 +import "../../../components/base" import "../js/chartUtils.js" as ChartUtils Page { diff --git a/qml/features/projects/pages/Projects.qml b/qml/features/projects/pages/Projects.qml index 929dad0d..4a18d0c7 100644 --- a/qml/features/projects/pages/Projects.qml +++ b/qml/features/projects/pages/Projects.qml @@ -625,7 +625,7 @@ Page { Global.richTextSaveCallback = saveProjectDescriptionFromEditor; navigatingToReadMore = true; description_text.liveSyncActive = true; - apLayout.addPageToNextColumn(projectCreate, Qt.resolvedUrl("../../../ReadMorePage.qml"), { + apLayout.addPageToNextColumn(projectCreate, Qt.resolvedUrl("../../../components/richtext/ReadMorePage.qml"), { isReadOnly: isReadOnly, parentDraftHandler: draftHandler, parentFormPage: projectCreate, diff --git a/qml/features/tasks/pages/Tasks.qml b/qml/features/tasks/pages/Tasks.qml index d45bf77e..4878daa3 100644 --- a/qml/features/tasks/pages/Tasks.qml +++ b/qml/features/tasks/pages/Tasks.qml @@ -778,7 +778,7 @@ Page { var contentToPass = getFormattedText(); Global.description_temporary_holder = contentToPass; description_text.liveSyncActive = true; - apLayout.addPageToNextColumn(taskCreate, Qt.resolvedUrl("../../../ReadMorePage.qml"), { + apLayout.addPageToNextColumn(taskCreate, Qt.resolvedUrl("../../../components/richtext/ReadMorePage.qml"), { isReadOnly: isReadOnly, parentDraftHandler: draftHandler // Pass draft handler reference }); diff --git a/qml/features/timesheets/pages/Timesheet.qml b/qml/features/timesheets/pages/Timesheet.qml index 9df46116..b63121ac 100644 --- a/qml/features/timesheets/pages/Timesheet.qml +++ b/qml/features/timesheets/pages/Timesheet.qml @@ -796,7 +796,7 @@ Page { //set the data to a global store and pass the key to the page Global.description_temporary_holder = getFormattedText(); description_text.liveSyncActive = true; - apLayout.addPageToNextColumn(timeSheet, Qt.resolvedUrl("../../../ReadMorePage.qml"), { + apLayout.addPageToNextColumn(timeSheet, Qt.resolvedUrl("../../../components/richtext/ReadMorePage.qml"), { isReadOnly: isReadOnly, useRichText: false, parentDraftHandler: draftHandler // Pass draft handler reference diff --git a/qml/features/updates/pages/Updates.qml b/qml/features/updates/pages/Updates.qml index 42167673..d448acd9 100644 --- a/qml/features/updates/pages/Updates.qml +++ b/qml/features/updates/pages/Updates.qml @@ -545,7 +545,7 @@ Page { Global.description_context = "update_description"; navigatingToReadMore = true; description_text.liveSyncActive = true; - apLayout.addPageToNextColumn(updateDetailsPage, Qt.resolvedUrl("../../../ReadMorePage.qml"), { + apLayout.addPageToNextColumn(updateDetailsPage, Qt.resolvedUrl("../../../components/richtext/ReadMorePage.qml"), { isReadOnly: isReadOnly, parentDraftHandler: draftHandler }); diff --git a/qml/features/updates/pages/Updates_Page.qml b/qml/features/updates/pages/Updates_Page.qml index d81df487..8db8a2f0 100644 --- a/qml/features/updates/pages/Updates_Page.qml +++ b/qml/features/updates/pages/Updates_Page.qml @@ -336,7 +336,7 @@ Page { onShowDescription: { Global.description_temporary_holder = description; Global.description_context = "update_description"; - apLayout.addPageToNextColumn(updates, Qt.resolvedUrl("../../../ReadMorePage.qml"), { + apLayout.addPageToNextColumn(updates, Qt.resolvedUrl("../../../components/richtext/ReadMorePage.qml"), { "isReadOnly": true }); } diff --git a/qml/logo.png b/qml/images/logo.png similarity index 100% rename from qml/logo.png rename to qml/images/logo.png From 7cbd6f940f8a958318e1d3e5f454077241158355 Mon Sep 17 00:00:00 2001 From: Suraj Yadav Date: Wed, 3 Jun 2026 10:30:22 +0530 Subject: [PATCH 12/67] chore: Remove outdated refactor documentation and scripts to streamline project structure --- README.md | 16 -- docs/HLD.drawio | 148 ------------------ .../refactor/phase-1-architecture-contract.md | 144 ----------------- docs/refactor/phase-1-naming-map.md | 50 ------ docs/refactor/phase-1-smoke-checklist.md | 65 -------- scripts/refactor_phase1_checks.sh | 136 ---------------- 6 files changed, 559 deletions(-) delete mode 100644 docs/HLD.drawio delete mode 100644 docs/refactor/phase-1-architecture-contract.md delete mode 100644 docs/refactor/phase-1-naming-map.md delete mode 100644 docs/refactor/phase-1-smoke-checklist.md delete mode 100755 scripts/refactor_phase1_checks.sh diff --git a/README.md b/README.md index 635ea878..eaa267aa 100644 --- a/README.md +++ b/README.md @@ -49,20 +49,6 @@ clickable install ``` to install the app on the connected device. -## Refactor guardrails - -Phase 1 refactor guardrails and naming contract are documented here: - -- docs/refactor/phase-1-architecture-contract.md -- docs/refactor/phase-1-naming-map.md -- docs/refactor/phase-1-smoke-checklist.md - -Migration check helper: - -```bash -./scripts/refactor_phase1_checks.sh report -``` - ## License @@ -93,8 +79,6 @@ Migration check helper: ## Contributing - [Pull Request Guidelines](docs/PR-GUIDELINES.md) -- [High Level Architecture](docs/HLD.drawio) -- [Phase 1 Refactor Docs](docs/refactor/) ## References * https://clickable-ut.dev/en/latest/ diff --git a/docs/HLD.drawio b/docs/HLD.drawio deleted file mode 100644 index 70aba329..00000000 --- a/docs/HLD.drawio +++ /dev/null @@ -1,148 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/refactor/phase-1-architecture-contract.md b/docs/refactor/phase-1-architecture-contract.md deleted file mode 100644 index f2cf0238..00000000 --- a/docs/refactor/phase-1-architecture-contract.md +++ /dev/null @@ -1,144 +0,0 @@ -# Refactor Phase 1: Architecture Contract - -Status: Active - -## Purpose - -This document freezes the migration contract before large file moves begin. The contract is intentionally strict to keep refactor chunks mergeable, reviewable, and behavior-safe. - -Core rule for all migration chunks: - -- Move first. -- Keep behavior unchanged. -- Keep old entry paths as compatibility wrappers until explicit removal gates pass. - -## Target Tree - -### QML - -- qml/TSApp.qml remains app entrypoint. -- qml/app/ remains shell/bootstrap only. -- qml/app/navigation/ stores route definitions, menu model, and navigation coordination. -- qml/features//pages/ stores feature pages. -- qml/features//components/ stores feature-owned components. -- qml/shared/components/ stores reusable cross-feature components. -- qml/shared/richtext/ stores shared rich-text stack. -- qml/legacy/ stores quarantined, non-primary artifacts. - -### JS Models - -- models/core/ contains shared low-level modules: - - database.js - - dbinit.js - - utils.js - - constants.js - - global.js -- models/features/ contains feature model modules: - - accounts.js - - tasks.js - - timesheets.js - - projects.js - - activities.js - - notifications.js - - draft_manager.js -- models/services/ contains service modules: - - timer_service.js - -### Python - -- src/ubtms/ is the source-of-truth package. -- src/ubtms/core/ contains config/logging/shared helpers. -- src/ubtms/integrations/ contains Odoo client integration. -- src/ubtms/sync/ contains sync-in and sync-out flows. -- src/ubtms/backend/ contains pyotherside-facing backend API. -- src/ubtms/daemon/ contains daemon/runtime modules. - -Compatibility wrappers remain at: - -- src/backend.py -- src/daemon.py -- src/cli.py - -## Naming Rules - -- QML pages use PascalCase and Page suffix where applicable. -- Feature list/editor split uses ListPage and EditorPage. -- Feature directory names are lowercase plurals where practical: - - tasks - - timesheets - - projects - - activities - - updates -- Shared components use intent-based names, not feature names. -- JS module files are lowercase and pluralized by domain in models/features. - -Canonical rename mapping is frozen in: - -- docs/refactor/phase-1-naming-map.md - -## Wrapper Policy - -### QML wrapper policy - -Old top-level page paths remain importable during migration. Wrapper files must: - -- Instantiate or forward to the new page path only. -- Contain no business logic. -- Contain no data-loading logic. -- Keep existing external properties/signals expected by callers. - -### JS wrapper policy - -Legacy flat model paths remain importable during migration. Wrapper files must: - -- Preserve existing exported function names. -- Forward to new module locations. -- Avoid behavior changes. - -### Python wrapper policy - -Entry modules remain importable during migration: - -- backend -- daemon -- cli - -They must re-export from package modules and preserve current call surface used by QML bridge and scripts. - -## Routing Contract - -- Route and menu definitions must live in qml/app/navigation/. -- App shell may consume route definitions but should not hardcode route registry data. -- During transition, existing pageNum compatibility stays intact. -- Deep-link routing and menu routing must share the same route mapping source. - -## Import Contract During Migration - -- No new feature code should import from deprecated flat roots once a layered path exists. -- Old imports may stay only in wrappers or untouched legacy code until feature chunk migration. -- New moves must be path-stable: update internal imports in same chunk. - -## Chunk Acceptance Gates - -Each migration chunk is mergeable only if all are true: - -1. App starts successfully. -2. Smoke checklist in docs/refactor/phase-1-smoke-checklist.md passes. -3. Legacy wrappers for moved files are thin wrappers only. -4. No unexpected route regressions in drawer/deep-link navigation. -5. No new imports introduced to deprecated module paths for already-migrated layers. - -## Wrapper Removal Gates - -A wrapper family can be removed only when all are true: - -1. Grep shows zero references to old paths. -2. Smoke checklist passes after removal. -3. One additional follow-up check confirms no runtime route/import fallback is used. - -## Non-Goals for Phase 1 - -- No broad runtime refactors. -- No behavior changes to business logic. -- No pyotherside module rename. -- No asset churn. diff --git a/docs/refactor/phase-1-naming-map.md b/docs/refactor/phase-1-naming-map.md deleted file mode 100644 index d9f294f5..00000000 --- a/docs/refactor/phase-1-naming-map.md +++ /dev/null @@ -1,50 +0,0 @@ -# Refactor Phase 1: Frozen Naming Map - -Status: Frozen for migration start - -This mapping is fixed before large moves begin. - -## QML Page Rename Map - -| Legacy path | New page name | Target path | -| --- | --- | --- | -| qml/Task_Page.qml | TaskListPage.qml | qml/features/tasks/pages/TaskListPage.qml | -| qml/Tasks.qml | TaskEditorPage.qml | qml/features/tasks/pages/TaskEditorPage.qml | -| qml/MyTasks.qml | MyTasksPage.qml | qml/features/tasks/pages/MyTasksPage.qml | -| qml/Timesheet_Page.qml | TimesheetListPage.qml | qml/features/timesheets/pages/TimesheetListPage.qml | -| qml/Timesheet.qml | TimesheetEditorPage.qml | qml/features/timesheets/pages/TimesheetEditorPage.qml | -| qml/Project_Page.qml | ProjectListPage.qml | qml/features/projects/pages/ProjectListPage.qml | -| qml/Projects.qml | ProjectEditorPage.qml | qml/features/projects/pages/ProjectEditorPage.qml | -| qml/Activity_Page.qml | ActivityListPage.qml | qml/features/activities/pages/ActivityListPage.qml | -| qml/Activities.qml | ActivityEditorPage.qml | qml/features/activities/pages/ActivityEditorPage.qml | -| qml/Updates_Page.qml | UpdateListPage.qml | qml/features/updates/pages/UpdateListPage.qml | -| qml/Updates.qml | UpdateEditorPage.qml | qml/features/updates/pages/UpdateEditorPage.qml | -| qml/Aboutus.qml | AboutPage.qml | qml/app/pages/AboutPage.qml | -| qml/Splash.qml | SplashPage.qml | qml/app/pages/SplashPage.qml | -| qml/Menu.qml | MenuPage.qml | qml/app/navigation/MenuPage.qml | -| qml/Dashboard.qml | DashboardPage.qml | qml/features/dashboard/pages/DashboardPage.qml | -| qml/Dashboard2.qml | Dashboard2.qml | qml/features/dashboard/pages/Dashboard2.qml | - -## Legacy Dashboard Quarantine Plan - -- qml/Dashboard3.qml -> qml/legacy/dashboard/Dashboard3.qml -- qml/Charts1.qml -> qml/legacy/dashboard/Charts1.qml -- qml/Charts2.qml -> qml/legacy/dashboard/Charts2.qml - -Keep with active dashboard flow until usage is refactored: - -- qml/Charts3.qml -- qml/Charts4.qml - -## Compatibility Wrapper Rule - -For each moved page above: - -- Keep the original legacy file path. -- Convert it into a thin wrapper that forwards to the target path. -- Do not add new logic inside wrapper files. - -## Change Control Rule - -- Do not modify this map within the same chunk that performs broad moves. -- If a rename must change, update this map in a separate guardrail patch first. diff --git a/docs/refactor/phase-1-smoke-checklist.md b/docs/refactor/phase-1-smoke-checklist.md deleted file mode 100644 index 5f146ae0..00000000 --- a/docs/refactor/phase-1-smoke-checklist.md +++ /dev/null @@ -1,65 +0,0 @@ -# Refactor Smoke Checklist - -Run this checklist after each migration chunk. - -## App Startup And Layout - -- App launches on desktop. -- 1-column startup works. -- 2-column startup works. -- 3-column startup works. - -## Navigation - -- Drawer navigation opens every top-level page. -- Menu navigation opens every top-level page. -- Deep-link navigation works for: - - Task - - Activity - - ProjectUpdate - - Project - - Timesheet - -## Data Refresh And Account Switching - -- Account switch triggers visible-page refresh. -- Dashboard refresh still works. -- Timesheet list and editor refresh still work. -- Task list and editor refresh still work. -- Activity list and editor refresh still work. -- Project list and editor refresh still work. -- Update list and editor refresh still work. - -## CRUD Flows - -- Task create/edit/view works. -- Timesheet create/edit/view works. -- Project create/edit/view works. -- Activity create/edit/view works. -- Update create/edit/view works. - -## Drafts, Settings, And Notifications - -- Unsaved draft restore flow works. -- Theme/settings pages work. -- Notification badge still updates. -- Daemon startup and notification initialization still work. - -## Python Import Smoke - -Run: - -- python3 -c "import sys; sys.path.insert(0, 'src'); import backend; print('ok backend')" -- python3 -c "import sys; sys.path.insert(0, 'src'); import daemon; print('ok daemon')" -- python3 -c "import sys; sys.path.insert(0, 'src'); import cli; print('ok cli')" - -When package migration begins, add: - -- python3 -c "import sys; sys.path.insert(0, 'src'); import ubtms; print('ok ubtms')" - -## Reference Audit Gates - -Before removing wrappers, confirm: - -- grep shows zero references to old wrapper paths. -- no new imports were added to deprecated paths in migrated layers. diff --git a/scripts/refactor_phase1_checks.sh b/scripts/refactor_phase1_checks.sh deleted file mode 100755 index 68d63639..00000000 --- a/scripts/refactor_phase1_checks.sh +++ /dev/null @@ -1,136 +0,0 @@ -#!/usr/bin/env bash -set -euo pipefail - -# Phase-1 migration checks -# Modes: -# report (default): print findings and warnings only -# strict: fail on defined gate violations - -MODE="${1:-report}" -ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" - -if command -v rg >/dev/null 2>&1; then - SEARCH_TOOL="rg" -else - SEARCH_TOOL="grep" -fi - -if [[ "$MODE" != "report" && "$MODE" != "strict" ]]; then - echo "Usage: $0 [report|strict]" - exit 2 -fi - -fail_count=0 -warn_count=0 - -say() { - printf '%s\n' "$*" -} - -warn() { - warn_count=$((warn_count + 1)) - say "[WARN] $*" -} - -fail() { - fail_count=$((fail_count + 1)) - say "[FAIL] $*" -} - -pass() { - say "[PASS] $*" -} - -search_count_qml() { - local pattern="$1" - if [[ "$SEARCH_TOOL" == "rg" ]]; then - (rg -n --no-heading "$pattern" "$ROOT_DIR/qml" || true) | wc -l | tr -d ' ' - else - (grep -R -n -E "$pattern" "$ROOT_DIR/qml" || true) | wc -l | tr -d ' ' - fi -} - -search_count_qml_excluding_app() { - local pattern="$1" - if [[ "$SEARCH_TOOL" == "rg" ]]; then - ((rg -n --no-heading "$pattern" "$ROOT_DIR/qml" || true) | (rg -v "/qml/app/" || true)) | wc -l | tr -d ' ' - else - ((grep -R -n -E "$pattern" "$ROOT_DIR/qml" || true) | (grep -v "/qml/app/" || true)) | wc -l | tr -d ' ' - fi -} - -say "Running Phase-1 checks in mode: $MODE" - -# 1) Guardrail docs exist -for f in \ - "$ROOT_DIR/docs/refactor/phase-1-architecture-contract.md" \ - "$ROOT_DIR/docs/refactor/phase-1-naming-map.md" \ - "$ROOT_DIR/docs/refactor/phase-1-smoke-checklist.md"; do - if [[ -f "$f" ]]; then - pass "Found $(realpath --relative-to="$ROOT_DIR" "$f")" - else - fail "Missing $(realpath --relative-to="$ROOT_DIR" "$f")" - fi -done - -# 2) Detect direct AppLayout routing calls outside app shell (report baseline) -route_calls=$(search_count_qml_excluding_app "apLayout\\.(setPageGlobal|addPageToNextColumn|removePages)\\(") - -if [[ "$route_calls" -gt 0 ]]; then - if [[ "$MODE" == "strict" ]]; then - fail "Found $route_calls direct AppLayout routing calls outside qml/app" - else - warn "Found $route_calls direct AppLayout routing calls outside qml/app (expected before extraction)" - fi -else - pass "No direct AppLayout routing calls outside qml/app" -fi - -# 3) Legacy model imports baseline -legacy_imports=$(search_count_qml 'import[[:space:]]+"[^"]*/models/(task|timesheet|project|activity)\.js"') -if [[ "$legacy_imports" -gt 0 ]]; then - if [[ "$MODE" == "strict" ]]; then - fail "Found $legacy_imports legacy flat model imports" - else - warn "Found $legacy_imports legacy flat model imports (expected before model split)" - fi -else - pass "No legacy flat model imports found" -fi - -# 4) Python compatibility entrypoints present -for py in "$ROOT_DIR/src/backend.py" "$ROOT_DIR/src/daemon.py" "$ROOT_DIR/src/cli.py"; do - if [[ -f "$py" ]]; then - pass "Found $(realpath --relative-to="$ROOT_DIR" "$py")" - else - fail "Missing $(realpath --relative-to="$ROOT_DIR" "$py")" - fi -done - -# 5) Optional import smoke (non-fatal in report mode) -run_import_smoke() { - local module="$1" - local strict_fail="${2:-yes}" - if python3 -c "import sys; sys.path.insert(0, '$ROOT_DIR/src'); import $module" >/dev/null 2>&1; then - pass "Python import ok: $module" - else - if [[ "$MODE" == "strict" && "$strict_fail" == "yes" ]]; then - fail "Python import failed: $module" - else - warn "Python import failed: $module" - fi - fi -} - -run_import_smoke backend -run_import_smoke daemon -run_import_smoke cli no - -say "" -say "Summary: fails=$fail_count warnings=$warn_count" - -if [[ "$MODE" == "strict" && "$fail_count" -gt 0 ]]; then - exit 1 -fi - -exit 0 From d1445aed98239a4afc17a03c2badd7bd4340bf04 Mon Sep 17 00:00:00 2001 From: Suraj Yadav Date: Wed, 3 Jun 2026 14:10:20 +0530 Subject: [PATCH 13/67] docs: Add Technical File Organization document for improved repository navigation --- README.md | 2 +- docs/TECHNICAL-FILE-ORGANIZATION.md | 314 ++++++++++++++++++++++++++++ 2 files changed, 315 insertions(+), 1 deletion(-) create mode 100644 docs/TECHNICAL-FILE-ORGANIZATION.md diff --git a/README.md b/README.md index eaa267aa..e0756bb8 100644 --- a/README.md +++ b/README.md @@ -79,8 +79,8 @@ to install the app on the connected device. ## Contributing - [Pull Request Guidelines](docs/PR-GUIDELINES.md) +- [Technical File Organization](docs/TECHNICAL-FILE-ORGANIZATION.md) ## References * https://clickable-ut.dev/en/latest/ * Location of DB : ~/.clickable/home/.local/share/ubtms/Databases - diff --git a/docs/TECHNICAL-FILE-ORGANIZATION.md b/docs/TECHNICAL-FILE-ORGANIZATION.md new file mode 100644 index 00000000..9f2fed0f --- /dev/null +++ b/docs/TECHNICAL-FILE-ORGANIZATION.md @@ -0,0 +1,314 @@ +# Technical File Organization + +This document explains how files are currently stored in the `timemanagement` project and how new files should be placed going forward. + +Its goal is to make the repository easier to navigate, reduce misplaced files, and keep imports, packaging, and maintenance predictable. + +## 1. Storage Principles + +The repository is organized by responsibility: + +- `qml/` contains the UI layer. +- `models/` contains JavaScript data and state helpers used by QML. +- `src/` contains Python backend, sync, daemon, and utility logic. +- `assets/` contains package-level branding assets. +- `docs/` contains project documentation. +- `scripts/` contains local maintenance and validation scripts. + +Within each area, files should be grouped by feature first and by technical role second. + +## 2. Current Repository Layout + +### Root-Level Infrastructure + +The repository root contains build, packaging, and launcher files such as: + +- `CMakeLists.txt` +- `clickable.yaml` +- `manifest.json.in` +- `ubtms.desktop.in` +- AppArmor and push-helper configuration files +- helper entrypoints such as `start-daemon.sh` and `push-helper.py` + +These should remain at the root unless the build system is changed. + +### QML UI Layer + +`qml/` is the main frontend tree. It is already split into several stable areas: + +- `qml/app/` + - application shell, startup, navigation, drawer, and top-level pages +- `qml/components/` + - reusable shared UI components +- `qml/features/` + - feature-specific pages, feature widgets, and feature-local JavaScript +- `qml/images/` + - runtime image assets used directly by the QML UI + +#### `qml/app/` + +Use this folder for application-wide UI infrastructure: + +- `qml/app/AppLayout.qml` +- `qml/app/GlobalWidgets.qml` +- `qml/app/StartupManager.qml` +- `qml/app/SystemIntegrationManager.qml` +- `qml/app/navigation/` +- `qml/app/pages/` + +Files belong here when they are part of the overall app shell rather than a specific business feature. + +Examples: + +- splash screen +- about page +- navigation controller +- route definitions + +#### `qml/components/` + +Use `qml/components/` for reusable building blocks shared across multiple features. + +Current subgroups include: + +- `base/` for low-level reusable primitives +- `cards/` for reusable content cards +- `dialogs/` for shared dialogs and popups +- `feedback/` for notifications, loading states, and status UI +- `navigation/` for shared navigation widgets +- `pickers/` for date/time and selection pickers +- `richtext/` for rich-text editing and preview components +- `selectors/` for entity selection controls +- `system/` for bridge/system-level UI helpers +- `visualization/` for charts and visual widgets +- `workflow/` for multi-step or form-support flows + +Rule: + +- If a QML file is used by more than one feature, it should normally live under `qml/components/`. + +Examples: + +- `qml/components/richtext/ReadMorePage.qml` +- `qml/components/base/UbuntuShape.qml` +- `qml/components/dialogs/CreateUpdateDialog.qml` + +#### `qml/features/` + +Use `qml/features/` for business-domain functionality. + +Current feature folders are: + +- `activities/` +- `dashboard/` +- `projects/` +- `settings/` +- `tasks/` +- `timesheets/` +- `updates/` + +Each feature should keep its own files close together. The current pattern is: + +- `pages/` for top-level screens +- `components/` for feature-local widgets +- `js/` for feature-local JavaScript helpers +- `charts/` where a feature owns custom chart QML + +Rule: + +- If a file is only used inside one feature, keep it inside that feature instead of placing it in `qml/components/`. + +Examples: + +- `qml/features/tasks/pages/Tasks.qml` +- `qml/features/tasks/components/TaskList.qml` +- `qml/features/dashboard/js/chartUtils.js` + +#### `qml/images/` + +Use `qml/images/` for images loaded by the QML interface at runtime. + +This includes: + +- icons +- logos used in pages +- PNG/SVG assets referenced by `Image { source: ... }` + +Example: + +- `qml/images/logo.png` + +Rule: + +- If an asset is referenced by QML during app runtime, prefer `qml/images/`. + +### JavaScript Model Layer + +`models/` contains shared JavaScript modules imported by QML. + +Examples: + +- `models/Main.js` +- `models/global.js` +- `models/task.js` +- `models/timesheet.js` +- `models/database.js` + +Rule: + +- Shared app state, data access helpers, and cross-feature JS modules belong in `models/`. +- Feature-specific JS should stay inside `qml/features//js/` unless it becomes broadly shared. + +Important note: + +- QML files imported from `qml/` often reference `models/` through relative imports. +- When moving a QML file, its `import "../../../models/..."` style paths must be rechecked carefully. + +### Python Backend Layer + +`src/` contains Python code for: + +- backend bridging +- Odoo/CURQ sync +- daemon logic +- configuration +- logging +- helper tools + +Examples: + +- `src/backend.py` +- `src/daemon.py` +- `src/odoo_client.py` +- `src/sync_from_odoo.py` +- `src/sync_to_odoo.py` + +Rule: + +- App runtime Python belongs in `src/`. +- Development-only helper scripts should go in `scripts/` instead of `src/` unless they are intentionally shipped with the app. + +### Assets + +`assets/` contains package-level or source-branding assets that are not primarily organized as QML runtime UI images. + +Examples: + +- `assets/logo.svg` +- `assets/logo.png` +- generated logo variants + +Rule: + +- Keep original branding/source artwork in `assets/`. +- Keep QML-consumed UI copies in `qml/images/` when they are used directly by the frontend. + +### Documentation + +`docs/` stores project documentation such as: + +- contribution process +- architecture notes +- technical conventions +- future refactor notes + +Rule: + +- Add technical repository conventions here instead of only describing them in PRs or commit messages. + +### Scripts + +`scripts/` contains maintenance utilities for developers. + +Examples: + +- unused-code checks +- refactor checks +- validation helpers + +Rule: + +- Scripts that are for developer workflow and not shipped app behavior should live here. + +## 3. Where New Files Should Go + +Use the following placement rules when adding new files. + +### New QML Page + +- App-wide page: `qml/app/pages/` +- Feature page: `qml/features//pages/` +- Shared workflow/editor page used across features: `qml/components//` + +### New Reusable QML Component + +- Put it in the most specific shared subgroup under `qml/components/` +- If no subgroup fits, create one only when there is a clear category with more than one likely component + +### New Feature-Specific QML Component + +- Put it under `qml/features//components/` + +### New JavaScript Helper + +- Shared across features: `models/` +- Used only by one feature: `qml/features//js/` + +### New Image or Icon + +- Used directly by QML: `qml/images/` +- Source artwork or packaging asset: `assets/` + +### New Python Module + +- Runtime/backend logic: `src/` +- Developer utility or validation script: `scripts/` + +### New Documentation + +- Project/process/architecture/reference docs: `docs/` + +## 4. Current State Summary + +The repository is already mostly organized around a good long-term structure: + +- shared UI lives under `qml/components/` +- business screens live under `qml/features/` +- app shell code lives under `qml/app/` +- shared JS models live under `models/` +- backend Python lives under `src/` + +Recent cleanup also moved previously loose QML files into more relevant locations: + +- `ReadMorePage.qml` into `qml/components/richtext/` +- `UbuntuShape.qml` into `qml/components/base/` +- `release_notes.txt` into `qml/app/pages/` +- runtime `logo.png` into `qml/images/` + +This direction should be preserved for future work. + +## 5. Known Conventions and Exceptions + +- `qml/components/qmldir` and similar `qmldir` files must be updated when shared components are added or moved. +- Relative imports in QML are sensitive to file moves, especially imports from `models/`. +- Some assets may exist in both `assets/` and `qml/images/` for different purposes: + - `assets/` as source/package artwork + - `qml/images/` as runtime UI assets +- Top-level build and packaging files should not be moved casually because `CMakeLists.txt`, Clickable, and packaging metadata depend on them. + +## 6. Recommended Rule of Thumb + +Before creating a new file, ask: + +1. Is this app-wide, feature-specific, or shared? +2. Is this runtime UI, shared model logic, backend code, documentation, or developer tooling? +3. Will another feature reuse this file soon? + +If the answer is clear, the correct folder is usually clear as well. + +When in doubt: + +- prefer `qml/features//...` for feature-owned code +- promote to `qml/components/...` only after reuse is real +- keep shared non-UI logic in `models/` +- keep backend/runtime Python in `src/` From 3e8ea21954a0ec2a2fafa3055a628bfa595bfb1b Mon Sep 17 00:00:00 2001 From: Suraj Yadav Date: Wed, 3 Jun 2026 16:58:15 +0530 Subject: [PATCH 14/67] feat: Add ModelDownloadTimerWidget for enhanced download management --- docs/TECHNICAL-FILE-ORGANIZATION.md | 1 + qml/components/qmldir | 1 + qml/components/{ => system}/ModelDownloadTimerWidget.qml | 0 3 files changed, 2 insertions(+) rename qml/components/{ => system}/ModelDownloadTimerWidget.qml (100%) diff --git a/docs/TECHNICAL-FILE-ORGANIZATION.md b/docs/TECHNICAL-FILE-ORGANIZATION.md index 9f2fed0f..79340fea 100644 --- a/docs/TECHNICAL-FILE-ORGANIZATION.md +++ b/docs/TECHNICAL-FILE-ORGANIZATION.md @@ -92,6 +92,7 @@ Examples: - `qml/components/richtext/ReadMorePage.qml` - `qml/components/base/UbuntuShape.qml` - `qml/components/dialogs/CreateUpdateDialog.qml` +- `qml/components/system/ModelDownloadTimerWidget.qml` #### `qml/features/` diff --git a/qml/components/qmldir b/qml/components/qmldir index 2748ef70..a458502c 100644 --- a/qml/components/qmldir +++ b/qml/components/qmldir @@ -25,6 +25,7 @@ InlineOptionSelector 1.0 selectors/InlineOptionSelector.qml ListHeader 1.0 navigation/ListHeader.qml LoadMoreFooter 1.0 feedback/LoadMoreFooter.qml LoadingIndicator 1.0 feedback/LoadingIndicator.qml +ModelDownloadTimerWidget 1.0 system/ModelDownloadTimerWidget.qml MultiAssigneeSelector 1.0 selectors/MultiAssigneeSelector.qml NavigationMenuList 1.0 navigation/NavigationMenuList.qml NotificationBell 1.0 feedback/NotificationBell.qml diff --git a/qml/components/ModelDownloadTimerWidget.qml b/qml/components/system/ModelDownloadTimerWidget.qml similarity index 100% rename from qml/components/ModelDownloadTimerWidget.qml rename to qml/components/system/ModelDownloadTimerWidget.qml From 956214c335865668d797348a13982990bbbbe7a7 Mon Sep 17 00:00:00 2001 From: Suraj Yadav Date: Thu, 4 Jun 2026 17:45:50 +0530 Subject: [PATCH 15/67] Refactor code structure and remove redundant sections for improved readability and maintainability --- .github/workflows/deploy-docs.yml | 58 + .gitignore | 5 +- README.md | 88 +- website/README.md | 18 + .../contributing/documentation-governance.md | 30 + website/docs/contributing/getting-started.md | 33 + .../contributing/pull-request-guidelines.md | 49 + website/docs/technical/architecture.md | 37 + website/docs/technical/build-and-packaging.md | 51 + website/docs/technical/release-process.md | 32 + .../docs/technical/repository-organization.md | 51 + website/docs/user/features.md | 35 + website/docs/user/install-and-run.md | 48 + website/docs/user/overview.md | 34 + website/docs/user/setup-and-sync.md | 37 + website/docs/user/troubleshooting.md | 40 + website/docusaurus.config.js | 112 + website/package-lock.json | 18411 ++++++++++++++++ website/package.json | 20 + website/sidebars.js | 36 + website/src/css/custom.css | 32 + website/src/pages/index.js | 158 + website/src/pages/index.module.css | 161 + website/static/img/logo-mark.png | 24 + website/static/img/logo.png | Bin 0 -> 57616 bytes website/static/img/social-card.png | Bin 0 -> 57616 bytes 26 files changed, 19533 insertions(+), 67 deletions(-) create mode 100644 .github/workflows/deploy-docs.yml create mode 100644 website/README.md create mode 100644 website/docs/contributing/documentation-governance.md create mode 100644 website/docs/contributing/getting-started.md create mode 100644 website/docs/contributing/pull-request-guidelines.md create mode 100644 website/docs/technical/architecture.md create mode 100644 website/docs/technical/build-and-packaging.md create mode 100644 website/docs/technical/release-process.md create mode 100644 website/docs/technical/repository-organization.md create mode 100644 website/docs/user/features.md create mode 100644 website/docs/user/install-and-run.md create mode 100644 website/docs/user/overview.md create mode 100644 website/docs/user/setup-and-sync.md create mode 100644 website/docs/user/troubleshooting.md create mode 100644 website/docusaurus.config.js create mode 100644 website/package-lock.json create mode 100644 website/package.json create mode 100644 website/sidebars.js create mode 100644 website/src/css/custom.css create mode 100644 website/src/pages/index.js create mode 100644 website/src/pages/index.module.css create mode 100644 website/static/img/logo-mark.png create mode 100644 website/static/img/logo.png create mode 100644 website/static/img/social-card.png diff --git a/.github/workflows/deploy-docs.yml b/.github/workflows/deploy-docs.yml new file mode 100644 index 00000000..4b874a1c --- /dev/null +++ b/.github/workflows/deploy-docs.yml @@ -0,0 +1,58 @@ +name: Deploy Documentation + +on: + push: + branches: + - main + workflow_dispatch: + +permissions: + contents: read + pages: write + id-token: write + +concurrency: + group: pages + cancel-in-progress: true + +jobs: + build: + runs-on: ubuntu-latest + defaults: + run: + working-directory: website + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Setup Node + uses: actions/setup-node@v4 + with: + node-version: 20 + cache: npm + cache-dependency-path: website/package-lock.json + + - name: Setup Pages + uses: actions/configure-pages@v5 + + - name: Install dependencies + run: npm ci + + - name: Build site + run: npm run build + + - name: Upload artifact + uses: actions/upload-pages-artifact@v3 + with: + path: website/build + + deploy: + environment: + name: github-pages + url: ${{ steps.deployment.outputs.page_url }} + needs: build + runs-on: ubuntu-latest + steps: + - name: Deploy to GitHub Pages + id: deployment + uses: actions/deploy-pages@v4 diff --git a/.gitignore b/.gitignore index b3e132a7..d012d491 100644 --- a/.gitignore +++ b/.gitignore @@ -3,4 +3,7 @@ build *.pot .agent voice_to_text/lib/ -.clickable \ No newline at end of file +.clickable +website/node_modules +website/.docusaurus +website/build diff --git a/README.md b/README.md index e0756bb8..57404ca9 100644 --- a/README.md +++ b/README.md @@ -1,86 +1,42 @@ -# Time Management +# TimeManagement -Time Management +TimeManagement is a desktop and Ubuntu Touch project for task, timesheet, dashboard, and sync-oriented workflows. -This guide explains how to install `clickable`, build the `TimeManagement` project, and run it on both desktop and Ubuntu Touch devices. +## Documentation site -## Prerequisites +The project now includes a Docusaurus website in `website/` that is intended to become the main home for: -- Ubuntu or Debian-based system -- Git -- Python 3 -- Docker (for cross-compilation and device builds) +- product-facing overview content +- user and setup documentation +- technical architecture and repository guidance +- contributor workflow documentation -## Install Clickable +Planned published URL: -Follow the official steps to install `clickable`: +- `https://citopenrep.github.io/timemanagement/` -```bash -# Install required dependencies -sudo apt update -sudo apt install git python3 python3-pip - -# Install Clickable using pip -pip3 install --user clickable-ut - -# Add Clickable to your PATH -echo 'export PATH=$PATH:~/.local/bin' >> ~/.bashrc -source ~/.bashrc -``` - -Verify installation: +## Local docs development ```bash -clickable --version +cd website +npm install +npm run start ``` +## App build and run -## Build the project -To build the project, clone this repo and then you can run - -```bash -clickable desktop -``` - -The above command will run the project on desktop +For the current application workflow: ```bash +clickable desktop clickable install ``` -to install the app on the connected device. - - -## License -/* - * MIT License - * - * Copyright (c) 2025 CIT-Services - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ +## Existing source docs -## Contributing +The legacy Markdown docs in `docs/` remain available during the migration into the Docusaurus site. -- [Pull Request Guidelines](docs/PR-GUIDELINES.md) -- [Technical File Organization](docs/TECHNICAL-FILE-ORGANIZATION.md) +## Repository references -## References -* https://clickable-ut.dev/en/latest/ -* Location of DB : ~/.clickable/home/.local/share/ubtms/Databases +- [Technical file organization](docs/TECHNICAL-FILE-ORGANIZATION.md) +- [Pull request guidelines](docs/PR-GUIDELINES.md) diff --git a/website/README.md b/website/README.md new file mode 100644 index 00000000..0b678334 --- /dev/null +++ b/website/README.md @@ -0,0 +1,18 @@ +# TimeManagement Website + +This directory contains the Docusaurus-based product website and documentation portal for the project. + +## Local development + +```bash +cd website +npm install +npm run start +``` + +## Production build + +```bash +cd website +npm run build +``` diff --git a/website/docs/contributing/documentation-governance.md b/website/docs/contributing/documentation-governance.md new file mode 100644 index 00000000..260aebf7 --- /dev/null +++ b/website/docs/contributing/documentation-governance.md @@ -0,0 +1,30 @@ +title: Documentation Governance +sidebar_label: Documentation Governance +--- + +# Documentation Governance + +The Docusaurus site becomes the primary public documentation surface for the project. + +## Rules of thumb + +- update user docs when behavior visible to users changes +- update technical docs when code ownership, architecture, or build flow changes +- update contributor docs when workflow or review expectations change +- keep the homepage focused on product narrative, not deep implementation detail + +## Ownership model + +Recommended lightweight ownership: + +- one maintainer owns information architecture and homepage consistency +- feature authors own correctness of feature-specific pages +- reviewers check documentation impact as part of PR review + +## Content lifecycle + +During the migration period: + +- the root `README.md` stays short and points to the site +- legacy files under `docs/` remain as source material +- curated, audience-oriented guidance lives in `website/docs/` diff --git a/website/docs/contributing/getting-started.md b/website/docs/contributing/getting-started.md new file mode 100644 index 00000000..add0c634 --- /dev/null +++ b/website/docs/contributing/getting-started.md @@ -0,0 +1,33 @@ +title: Contributor Getting Started +sidebar_label: Getting Started +--- + +# Contributor Getting Started + +This section is for engineers and collaborators who need local setup guidance plus the project rules for shipping changes safely. + +## First steps + +1. Clone the repository. +2. Verify the app build path with `clickable desktop`. +3. Review the technical docs to understand the QML, JavaScript, and Python split. +4. Review the PR guidance before opening changes. + +## Working on the docs site + +The docs site is now part of the repository: + +```bash +cd website +npm install +npm run start +``` + +## Contribution expectations + +Contributors should update documentation when changes are: + +- user-visible +- architecture-visible +- setup-related +- release-impacting diff --git a/website/docs/contributing/pull-request-guidelines.md b/website/docs/contributing/pull-request-guidelines.md new file mode 100644 index 00000000..2d810406 --- /dev/null +++ b/website/docs/contributing/pull-request-guidelines.md @@ -0,0 +1,49 @@ +title: Pull Request Guidelines +sidebar_label: Pull Request Guidelines +--- + +# Pull Request Guidelines + +This page migrates the current repository PR guidance into the site. + +## Branch strategy + +- branch from `main` +- use branch names such as `feature/add-timesheet-export` +- keep work scoped to one logical change where possible + +## Before opening a PR + +### Code quality + +- code should pass the relevant app build and review steps +- no hardcoded credentials, URLs, or API keys +- no debug logging left in production code +- follow existing code style and conventions + +### Testing + +- test on desktop with `clickable desktop` +- test on device when possible with `clickable install` +- for CLI-oriented Python changes, verify with `python3 -m py_compile ` + +### Documentation + +- update relevant docs when adding or changing functionality +- add inline comments only where code is non-obvious +- update naming or architecture contracts when applicable + +## PR description + +Every PR should include: + +- summary +- change type +- testing notes +- screenshots for UI changes + +## Current source + +The original project source remains in the repository during migration: + +- [Pull Request Guidelines Source](https://github.com/CITOpenRep/timemanagement/blob/main/docs/PR-GUIDELINES.md) diff --git a/website/docs/technical/architecture.md b/website/docs/technical/architecture.md new file mode 100644 index 00000000..15fd3685 --- /dev/null +++ b/website/docs/technical/architecture.md @@ -0,0 +1,37 @@ +title: Architecture Overview +sidebar_label: Architecture +--- + +# Architecture Overview + +TimeManagement is a desktop and Ubuntu Touch application composed from three main layers: + +- QML for interface and app shell behavior +- JavaScript modules in `models/` for shared client-side state and helpers +- Python services in `src/` for backend, sync, daemon, configuration, and utility logic + +## High-level flow + +At a high level: + +1. QML pages and components render the product interface. +2. Shared JavaScript modules support client-side state and feature logic. +3. Python modules handle backend operations, sync routines, and system-facing behavior. + +## Key technical directories + +- `qml/`: application UI, shared components, images, and feature pages +- `models/`: JavaScript modules imported into QML +- `src/`: Python backend and sync logic +- `assets/`: branding and package-level artwork +- `docs/`: source documentation kept in the main repository +- `website/`: Docusaurus-based website and documentation portal + +## Documentation intent + +This technical section should answer: + +- where code belongs +- how features are split across the stack +- how the project is built and packaged +- how contributors should reason about changes that span QML, JS, and Python diff --git a/website/docs/technical/build-and-packaging.md b/website/docs/technical/build-and-packaging.md new file mode 100644 index 00000000..3c98a0d2 --- /dev/null +++ b/website/docs/technical/build-and-packaging.md @@ -0,0 +1,51 @@ +title: Build and Packaging +sidebar_label: Build and Packaging +--- + +# Build and Packaging + +The app build and the Docusaurus site build are intentionally separate. + +## Application build + +The current app build is driven by project files such as: + +- `clickable.yaml` +- `CMakeLists.txt` +- `manifest.json.in` +- desktop and device launcher metadata at the repository root + +For application testing, the contributor workflow still centers on: + +```bash +clickable desktop +clickable build +clickable review +``` + +## Website build + +The documentation site lives in `website/` and uses Docusaurus. + +Typical local workflow: + +```bash +cd website +npm install +npm run start +``` + +Production build: + +```bash +cd website +npm run build +``` + +## Separation of concerns + +This separation keeps: + +- documentation deployment independent from app packaging +- website dependencies out of the runtime app stack +- docs iteration fast without affecting Clickable or CMake behavior diff --git a/website/docs/technical/release-process.md b/website/docs/technical/release-process.md new file mode 100644 index 00000000..5a63e04b --- /dev/null +++ b/website/docs/technical/release-process.md @@ -0,0 +1,32 @@ +title: Release Process +sidebar_label: Release Process +--- + +# Release Process + +The documentation site should now be part of the release conversation, even though it does not ship inside the app binary. + +## Release expectations + +Each release should verify: + +- install and setup steps still match reality +- feature documentation reflects user-visible changes +- technical docs reflect architecture-visible changes +- release notes or changelog entries are updated + +## Recommended release checklist additions + +- confirm the Docusaurus site builds cleanly +- review broken links before publishing +- update homepage messaging when a release changes the product story +- make sure GitHub Pages deployment succeeds after merge + +## Future evolution + +As the project matures, this section can expand to include: + +- tagged release notes +- docs versioning strategy +- deprecation guidance +- upgrade notes between app releases diff --git a/website/docs/technical/repository-organization.md b/website/docs/technical/repository-organization.md new file mode 100644 index 00000000..55c1f075 --- /dev/null +++ b/website/docs/technical/repository-organization.md @@ -0,0 +1,51 @@ +title: Repository Organization +sidebar_label: Repository Organization +--- + +# Repository Organization + +This page is the Docusaurus migration of the repository organization guidance. + +## Storage principles + +The repository is organized by responsibility: + +- `qml/` contains the UI layer +- `models/` contains JavaScript data and state helpers used by QML +- `src/` contains Python backend, sync, daemon, and utility logic +- `assets/` contains package-level branding assets +- `docs/` contains source documentation +- `scripts/` contains local maintenance and validation scripts + +Within each area, files should be grouped by feature first and by technical role second. + +## QML UI layer + +The `qml/` tree is already split into stable areas: + +- `qml/app/` for shell, startup, navigation, and app-level pages +- `qml/components/` for shared UI building blocks +- `qml/features/` for business-domain features with local pages and components +- `qml/images/` for runtime UI image assets + +## JavaScript model layer + +The `models/` directory contains reusable JavaScript modules imported by QML. + +Use `models/` for cross-feature helpers and shared app state. Keep feature-specific JavaScript inside feature folders unless it becomes broadly shared. + +## Python backend layer + +The `src/` directory contains runtime Python for: + +- backend bridging +- daemon logic +- remote sync behavior +- configuration and logging +- helper tools that ship with the app + +## Documentation note + +The original longer source for this guidance remains in the repository during migration: + +- [Technical File Organization Source](https://github.com/CITOpenRep/timemanagement/blob/main/docs/TECHNICAL-FILE-ORGANIZATION.md) diff --git a/website/docs/user/features.md b/website/docs/user/features.md new file mode 100644 index 00000000..94cbac89 --- /dev/null +++ b/website/docs/user/features.md @@ -0,0 +1,35 @@ +title: Features and Workflows +sidebar_label: Features +--- + +# Features and Workflows + +The QML interface is organized by feature area. That makes it possible to describe the product in the same language the repository uses. + +## Main feature groups + +- `timesheets`: work logging and time entry screens +- `tasks`: task-oriented views and editing flows +- `dashboard`: charts, summaries, and overview screens +- `projects`: project-focused pages +- `activities`: activity views +- `updates`: change and update surfaces +- `settings`: accounts, sync, notifications, theme, and voice-model settings + +## Why this matters to users + +This feature organization helps with: + +- onboarding and training material +- screenshot-based guides +- issue reporting with more precise page references +- future release notes grouped by product area + +## Suggested future additions + +This page is a good place to add: + +- workflow screenshots +- short videos or GIFs +- page-by-page capability summaries +- platform-specific notes when desktop and device behavior differs diff --git a/website/docs/user/install-and-run.md b/website/docs/user/install-and-run.md new file mode 100644 index 00000000..454381d2 --- /dev/null +++ b/website/docs/user/install-and-run.md @@ -0,0 +1,48 @@ +title: Install and Run +sidebar_label: Install and Run +--- + +# Install and Run + +This guide explains the current developer-friendly path for building and running TimeManagement. + +## Prerequisites + +- Ubuntu or another Debian-based environment +- Git +- Python 3 +- Docker for Clickable-driven device and cross-build workflows + +## Install Clickable + +Follow the current project prerequisites: + +```bash +sudo apt update +sudo apt install git python3 python3-pip +pip3 install --user clickable-ut +echo 'export PATH=$PATH:~/.local/bin' >> ~/.bashrc +source ~/.bashrc +clickable --version +``` + +## Run on desktop + +Clone the repository and start the desktop app with: + +```bash +clickable desktop +``` + +## Install on a connected device + +Use: + +```bash +clickable install +``` + +## Notes + +- The current repository is desktop and Ubuntu Touch oriented rather than a web app. +- Local database files are typically stored under `~/.clickable/home/.local/share/ubtms/Databases`. diff --git a/website/docs/user/overview.md b/website/docs/user/overview.md new file mode 100644 index 00000000..12908738 --- /dev/null +++ b/website/docs/user/overview.md @@ -0,0 +1,34 @@ +title: User Documentation Overview +sidebar_label: Overview +--- + +# User Documentation Overview + +TimeManagement is organized to help end users, project leads, and support teams find the right information quickly. + +Use this section when you want to: + +- understand what the app does +- install or run it on desktop or Ubuntu Touch +- configure accounts and sync behavior +- learn where key workflows live in the app +- troubleshoot common setup and runtime issues + +## What the product covers + +The current project combines several work-management flows: + +- task-oriented work tracking +- timesheet capture +- project and activity views +- dashboard and reporting-style screens +- background services and sync behavior for remote systems such as Odoo + +## Recommended reading path + +If you are new to the project, read these pages in order: + +1. [Install and run](./install-and-run.md) +2. [Setup and sync](./setup-and-sync.md) +3. [Features and workflows](./features.md) +4. [Troubleshooting](./troubleshooting.md) diff --git a/website/docs/user/setup-and-sync.md b/website/docs/user/setup-and-sync.md new file mode 100644 index 00000000..e00413b7 --- /dev/null +++ b/website/docs/user/setup-and-sync.md @@ -0,0 +1,37 @@ +title: Setup and Sync +sidebar_label: Setup and Sync +--- + +# Setup and Sync + +TimeManagement includes Python backend services and sync-related modules that support account-driven workflows. + +## Setup areas to expect + +Users and maintainers should expect setup work around: + +- account configuration +- remote service credentials +- background daemon behavior +- field mapping and synchronization + +## Relevant code areas + +The current implementation spreads sync responsibilities across the Python backend: + +- `src/odoo_client.py` +- `src/sync_from_odoo.py` +- `src/sync_to_odoo.py` +- `src/tool_field_sync.py` +- `src/config.py` + +## Documentation expectations + +As the product documentation expands, this page should become the stable entry point for: + +- account onboarding +- sync prerequisites +- remote system troubleshooting +- known limits and operational notes + +For now, pair this page with [Troubleshooting](./troubleshooting.md) and the technical architecture docs. diff --git a/website/docs/user/troubleshooting.md b/website/docs/user/troubleshooting.md new file mode 100644 index 00000000..e4fd3730 --- /dev/null +++ b/website/docs/user/troubleshooting.md @@ -0,0 +1,40 @@ +title: Troubleshooting +sidebar_label: Troubleshooting +--- + +# Troubleshooting + +Use this page as the first stop for common issues until dedicated support runbooks are added. + +## Build and startup + +Check these first: + +- `clickable --version` returns successfully +- Docker is available when your build flow depends on it +- `clickable desktop` runs from the repository root + +## Sync-related issues + +If sync behavior is failing: + +- review account and endpoint settings +- inspect Python sync modules under `src/` +- review daemon-related code paths such as `src/daemon.py` and `src/daemon_bootstrap.py` + +## Database notes + +The repository references a local application database path under: + +```text +~/.clickable/home/.local/share/ubtms/Databases +``` + +## When to escalate + +Open a GitHub issue when: + +- the app no longer starts on desktop +- device installation fails consistently +- sync behavior regresses after an upgrade +- a feature-specific screen breaks in one of the known QML feature areas diff --git a/website/docusaurus.config.js b/website/docusaurus.config.js new file mode 100644 index 00000000..923b7af4 --- /dev/null +++ b/website/docusaurus.config.js @@ -0,0 +1,112 @@ +const config = { + title: "TimeManagement", + tagline: "A practical time, task, and sync workspace for Ubuntu Touch and desktop users", + favicon: "img/logo.png", + url: "https://citopenrep.github.io", + baseUrl: "/timemanagement/", + organizationName: "CITOpenRep", + projectName: "timemanagement", + trailingSlash: false, + onBrokenLinks: "throw", + markdown: { + hooks: { + onBrokenMarkdownLinks: "warn" + } + }, + i18n: { + defaultLocale: "en", + locales: ["en"] + }, + presets: [ + [ + "classic", + { + docs: { + path: "docs", + routeBasePath: "docs", + sidebarPath: require.resolve("./sidebars.js"), + editUrl: "https://github.com/CITOpenRep/timemanagement/tree/main/website/" + }, + blog: false, + theme: { + customCss: require.resolve("./src/css/custom.css") + } + } + ] + ], + themeConfig: { + image: "img/social-card.png", + navbar: { + title: "TimeManagement", + logo: { + alt: "TimeManagement logo", + src: "img/logo.png" + }, + items: [ + { + to: "/docs/user/overview", + label: "Docs", + position: "left" + }, + { + to: "/docs/technical/architecture", + label: "Technical", + position: "left" + }, + { + to: "/docs/contributing/getting-started", + label: "Contributing", + position: "left" + }, + { + href: "https://github.com/CITOpenRep/timemanagement", + label: "GitHub", + position: "right" + } + ] + }, + footer: { + style: "dark", + links: [ + { + title: "Docs", + items: [ + { + label: "User Docs", + to: "/docs/user/overview" + }, + { + label: "Technical Docs", + to: "/docs/technical/architecture" + }, + { + label: "Contributing", + to: "/docs/contributing/getting-started" + } + ] + }, + { + title: "Project", + items: [ + { + label: "Repository", + href: "https://github.com/CITOpenRep/timemanagement" + }, + { + label: "Issues", + href: "https://github.com/CITOpenRep/timemanagement/issues" + } + ] + } + ], + copyright: `Copyright ${new Date().getFullYear()} CIT-Services` + }, + prism: { + theme: require("prism-react-renderer").themes.github, + darkTheme: require("prism-react-renderer").themes.vsDark + } + }, + themes: [] +}; + +module.exports = config; diff --git a/website/package-lock.json b/website/package-lock.json new file mode 100644 index 00000000..c6f9f569 --- /dev/null +++ b/website/package-lock.json @@ -0,0 +1,18411 @@ +{ + "name": "timemanagement-website", + "version": "0.1.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "timemanagement-website", + "version": "0.1.0", + "dependencies": { + "@docusaurus/core": "^3.9.2", + "@docusaurus/preset-classic": "^3.9.2", + "@mdx-js/react": "^3.1.0", + "clsx": "^2.1.1", + "prism-react-renderer": "^2.4.1", + "react": "^19.1.0", + "react-dom": "^19.1.0" + } + }, + "node_modules/@algolia/abtesting": { + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/@algolia/abtesting/-/abtesting-1.19.0.tgz", + "integrity": "sha512-Lhnez3hhXHk25lfxLAMxvkP4fmN3+1RgADhD2ssMDBYuAsDVReeyP+3SGRx+ntq8ijMrLqUyfvO72TB6jsTteQ==", + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.53.0", + "@algolia/requester-browser-xhr": "5.53.0", + "@algolia/requester-fetch": "5.53.0", + "@algolia/requester-node-http": "5.53.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/autocomplete-core": { + "version": "1.19.8", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-core/-/autocomplete-core-1.19.8.tgz", + "integrity": "sha512-3YEorYg44niXcm7gkft3nXYItHd44e8tmh4D33CTszPgP0QWkaLEaFywiNyJBo7UL/mqObA/G9RYuU7R8tN1IA==", + "license": "MIT", + "dependencies": { + "@algolia/autocomplete-plugin-algolia-insights": "1.19.8", + "@algolia/autocomplete-shared": "1.19.8" + } + }, + "node_modules/@algolia/autocomplete-plugin-algolia-insights": { + "version": "1.19.8", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-plugin-algolia-insights/-/autocomplete-plugin-algolia-insights-1.19.8.tgz", + "integrity": "sha512-ZvJWO8ZZJDpc1LNM2TTBdmQsZBLMR4rU5iNR2OYvEeFBiaf/0ESnRSSLQbryarJY4SVxtoz6A2ZtDMNM+iQEAA==", + "license": "MIT", + "dependencies": { + "@algolia/autocomplete-shared": "1.19.8" + }, + "peerDependencies": { + "search-insights": ">= 1 < 3" + } + }, + "node_modules/@algolia/autocomplete-shared": { + "version": "1.19.8", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-shared/-/autocomplete-shared-1.19.8.tgz", + "integrity": "sha512-h5hf2t8ejF6vlOgvLaZzQbWs5SyH2z4PAWygNAvvD/2RI29hdQ54ldUGwqVuj9Srs+n8XUKTPUqb7fvhBhQrnQ==", + "license": "MIT", + "peerDependencies": { + "@algolia/client-search": ">= 4.9.1 < 6", + "algoliasearch": ">= 4.9.1 < 6" + } + }, + "node_modules/@algolia/client-abtesting": { + "version": "5.53.0", + "resolved": "https://registry.npmjs.org/@algolia/client-abtesting/-/client-abtesting-5.53.0.tgz", + "integrity": "sha512-0ZjA5Hcmaoz5Lj6OG0zhfIyeqzJZnLW2CRJA1W17UwMFGRtZAJ9yJKRvPEDA6gkpsIoQxORTSW6sWFiuYncPNQ==", + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.53.0", + "@algolia/requester-browser-xhr": "5.53.0", + "@algolia/requester-fetch": "5.53.0", + "@algolia/requester-node-http": "5.53.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/client-analytics": { + "version": "5.53.0", + "resolved": "https://registry.npmjs.org/@algolia/client-analytics/-/client-analytics-5.53.0.tgz", + "integrity": "sha512-kWNodP75iiEaOtemC9F/hlxNBG5E2QUjN1BusnE6m2b4l7Qh/BUO3fGCVsmKJI65VO4VKGGmT43ICvHtTcJ2JQ==", + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.53.0", + "@algolia/requester-browser-xhr": "5.53.0", + "@algolia/requester-fetch": "5.53.0", + "@algolia/requester-node-http": "5.53.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/client-common": { + "version": "5.53.0", + "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-5.53.0.tgz", + "integrity": "sha512-YPN45TXD9Wrse185t/Ta7nktZsqpv97oOjCzp2sblHnCL6rBc9TDeJAg1IGl2UpdwnSD05Zu/5wLB4watOUMyg==", + "license": "MIT", + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/client-insights": { + "version": "5.53.0", + "resolved": "https://registry.npmjs.org/@algolia/client-insights/-/client-insights-5.53.0.tgz", + "integrity": "sha512-qAcYTDJE6m924FDDUQvdD6vh7DYaqOeSpFS74IP37/JRV0v4cGBauyxTF2WzDnokUylQDbqreoFIJZfg0Fitmw==", + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.53.0", + "@algolia/requester-browser-xhr": "5.53.0", + "@algolia/requester-fetch": "5.53.0", + "@algolia/requester-node-http": "5.53.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/client-personalization": { + "version": "5.53.0", + "resolved": "https://registry.npmjs.org/@algolia/client-personalization/-/client-personalization-5.53.0.tgz", + "integrity": "sha512-fQaY+DkSJOpuUVUe8MQTwrdiKAqkJGhpDarB08duBn/sUv7Bkib6MDRQauCcWTWTe4HIW+EbwQP9R4kci1V/Yw==", + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.53.0", + "@algolia/requester-browser-xhr": "5.53.0", + "@algolia/requester-fetch": "5.53.0", + "@algolia/requester-node-http": "5.53.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/client-query-suggestions": { + "version": "5.53.0", + "resolved": "https://registry.npmjs.org/@algolia/client-query-suggestions/-/client-query-suggestions-5.53.0.tgz", + "integrity": "sha512-o72tsiEZGfeS/dxL9IADfzcZWGEwKDEe5CvtrBuT//3JR+SHuTtHRI2ZTf7D7bcKagcbojvO8hnkHdfoakSlYg==", + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.53.0", + "@algolia/requester-browser-xhr": "5.53.0", + "@algolia/requester-fetch": "5.53.0", + "@algolia/requester-node-http": "5.53.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/client-search": { + "version": "5.53.0", + "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-5.53.0.tgz", + "integrity": "sha512-Ds16IyPm/dNJPCU8OzApo2gwGrgWT5BYHhE3NFwZbpCveqyvPDB9sZDDkJ5DsdOGT2aC+R3i0/M1OVXF2qdgPg==", + "license": "MIT", + "peer": true, + "dependencies": { + "@algolia/client-common": "5.53.0", + "@algolia/requester-browser-xhr": "5.53.0", + "@algolia/requester-fetch": "5.53.0", + "@algolia/requester-node-http": "5.53.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/events": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@algolia/events/-/events-4.0.1.tgz", + "integrity": "sha512-FQzvOCgoFXAbf5Y6mYozw2aj5KCJoA3m4heImceldzPSMbdyS4atVjJzXKMsfX3wnZTFYwkkt8/z8UesLHlSBQ==", + "license": "MIT" + }, + "node_modules/@algolia/ingestion": { + "version": "1.53.0", + "resolved": "https://registry.npmjs.org/@algolia/ingestion/-/ingestion-1.53.0.tgz", + "integrity": "sha512-oNbT6z4NwD8Pou9VPINGlN/tlG1afESh2EbxqnP6rwl95xKVD/Zlciis1PpNeO/9U/rrajc1+7DcfKi03tX1KQ==", + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.53.0", + "@algolia/requester-browser-xhr": "5.53.0", + "@algolia/requester-fetch": "5.53.0", + "@algolia/requester-node-http": "5.53.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/monitoring": { + "version": "1.53.0", + "resolved": "https://registry.npmjs.org/@algolia/monitoring/-/monitoring-1.53.0.tgz", + "integrity": "sha512-G+KZb/yd+qAOFn/cEvTGeLxQm8aP3a0od50l3z/ylccY+/o4YG3TNcjU1tFQHW4mXC137GPyR7W70R0kRQDLnA==", + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.53.0", + "@algolia/requester-browser-xhr": "5.53.0", + "@algolia/requester-fetch": "5.53.0", + "@algolia/requester-node-http": "5.53.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/recommend": { + "version": "5.53.0", + "resolved": "https://registry.npmjs.org/@algolia/recommend/-/recommend-5.53.0.tgz", + "integrity": "sha512-6aVfYd55Un6IUgPLbo84WfgFZlS3L0vA1ttzXL5vahHewUJ8jYgd89TzlWRTeej7w70mb9RWsVlFYGmJ/diQww==", + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.53.0", + "@algolia/requester-browser-xhr": "5.53.0", + "@algolia/requester-fetch": "5.53.0", + "@algolia/requester-node-http": "5.53.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/requester-browser-xhr": { + "version": "5.53.0", + "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-5.53.0.tgz", + "integrity": "sha512-ke27DqgzCOlt+RbeEdCxtXxMQOnAOi8ujr2wid0DmDKzR95Kw/f9sBsuhBxtjevCqJRJszfRTLY0B1pbO6IhkA==", + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.53.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/requester-fetch": { + "version": "5.53.0", + "resolved": "https://registry.npmjs.org/@algolia/requester-fetch/-/requester-fetch-5.53.0.tgz", + "integrity": "sha512-GngiOqt2Gq4oLno6yXQVj9om+qSO9SWAoduoTOEg79dKZ62brB8OOIvSJG/vDNoanYi6a7Al9uDZwXvi+bcVTg==", + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.53.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/requester-node-http": { + "version": "5.53.0", + "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-5.53.0.tgz", + "integrity": "sha512-6mF9LZMUk0QqWvrnxkxBqhswwz6Xfiwy6/gmTzL5HrlhdVG3ITAqGV2k3XmVThP1h0Ulc3VQwiNCD7/Nr4JNlQ==", + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.53.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.7.tgz", + "integrity": "sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw==", + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.29.7", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.29.7.tgz", + "integrity": "sha512-locTkQyKvwIEgBzVrn8693ebc97F2U8ZHjbXwDXJ5Fn2TCpNwTlKcaKLkdHop5c/icOFE7qt7Q9JC5hnKNa6Gg==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.29.7.tgz", + "integrity": "sha512-RgHBCvtjbOK2gXSNBNIkNoEc9qoVEtau3hj8gEqKQuL3HZAibKarWFEI3Lfm6EYKkLalOh8eSrj9b+ch9H/VBA==", + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/code-frame": "^7.29.7", + "@babel/generator": "^7.29.7", + "@babel/helper-compilation-targets": "^7.29.7", + "@babel/helper-module-transforms": "^7.29.7", + "@babel/helpers": "^7.29.7", + "@babel/parser": "^7.29.7", + "@babel/template": "^7.29.7", + "@babel/traverse": "^7.29.7", + "@babel/types": "^7.29.7", + "@jridgewell/remapping": "^2.3.5", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/core/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/generator": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.7.tgz", + "integrity": "sha512-DkXD5OJQaAQIdZ1bt3UZdEnHAn9Imd3IVBdX03UFe+ony9Ojw5pzr9YVKGDY1jt+Gcn/FnGkNf8r+Vj5NOJWtQ==", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.29.7", + "@babel/types": "^7.29.7", + "@jridgewell/gen-mapping": "^0.3.12", + "@jridgewell/trace-mapping": "^0.3.28", + "jsesc": "^3.0.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-annotate-as-pure": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.29.7.tgz", + "integrity": "sha512-OoK6239jHPuSQOoS0kfTVKn0b/rVTk0seKq4Gd2UMLtmOVLjDC0ki3e+c90Trqv2gMfvJFqkiljrr568+qddiw==", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.29.7.tgz", + "integrity": "sha512-wem6WaBj4NaVYVdNhLPPVacES6ZJ+KBBfSkTMD3YZxbP3rm3Di85tJU5ljaUNhaOynt+Aj0xruhYuzQBt8n71g==", + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.29.7", + "@babel/helper-validator-option": "^7.29.7", + "browserslist": "^4.24.0", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-create-class-features-plugin": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.29.7.tgz", + "integrity": "sha512-IY3ZD9Tmooqr3TUhc3DUWxiuo8xx1DWLhd5M7hQ+ZWJamqM2BbalrBJb2MisSLoYorOj75U03qULCxQTY9r3hg==", + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.29.7", + "@babel/helper-member-expression-to-functions": "^7.29.7", + "@babel/helper-optimise-call-expression": "^7.29.7", + "@babel/helper-replace-supers": "^7.29.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.29.7", + "@babel/traverse": "^7.29.7", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-create-class-features-plugin/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-create-regexp-features-plugin": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.29.7.tgz", + "integrity": "sha512-907Uymvqgg1dwUA+7IGwFAOSYzQOuzPXKNJ1yxzwPffzkYFg2q2eHi1fIOs6sXkG9NbIUMunnUlkYsfRFNvomg==", + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.29.7", + "regexpu-core": "^6.3.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-create-regexp-features-plugin/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-define-polyfill-provider": { + "version": "0.6.8", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.8.tgz", + "integrity": "sha512-47UwBLPpQi1NoWzLuHNjRoHlYXMwIJoBf7MFou6viC/sIHWYygpvr0B6IAyh5sBdA2nr2LPIRww8lfaUVQINBA==", + "license": "MIT", + "dependencies": { + "@babel/helper-compilation-targets": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6", + "debug": "^4.4.3", + "lodash.debounce": "^4.0.8", + "resolve": "^1.22.11" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/@babel/helper-globals": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.29.7.tgz", + "integrity": "sha512-3nQVUAtvkKH9zahfWgw96Jc/uFOmjACE1kQz82E2lqWmHBgjzbNlsC22nuQTfahmWeQtTq5nQ/4Nnd2A1wj4zA==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-member-expression-to-functions": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.29.7.tgz", + "integrity": "sha512-j+7JYmk1JYDtACIGj0QJqqWZjoUpMoEikQGADMaHgCMCSDqd2+P32rfcibUNrGOMWrlzK1WJBdxrB3JJQZwWtg==", + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.29.7", + "@babel/types": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.29.7.tgz", + "integrity": "sha512-ejHwrQQYcm9xnTivShn2IDOlIzInN34AXskvq9QicvCtEzq1Vzclu/tKF8Jq1Cg8JG2GL6/EmjgsCT7lXepE3g==", + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.29.7", + "@babel/types": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.29.7.tgz", + "integrity": "sha512-UPUVSyXbOh627KiCIGQSgwWzGeBKLkaJ9PJEdrngIwMSzxLR4jS4+f1f1jb7VzBbg8nFLaYotvVPFCTqdrmTAg==", + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.29.7", + "@babel/helper-validator-identifier": "^7.29.7", + "@babel/traverse": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-optimise-call-expression": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.29.7.tgz", + "integrity": "sha512-+kmGVjcT9RGYzoDwdwEqEvGgKe3BYq+O1iGzjFubaNgZHwYHP6lsF2Yghf4kEuv9BV7tYDZ913aBW9am6YKong==", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.29.7.tgz", + "integrity": "sha512-G7sHYigPY17oO5SYWnfD/0MTBwVR781S/JI643e/JhUYgVgWE/61SoW3NH9KWUKyKq5LVh3npif99Wkt6j86Jw==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-remap-async-to-generator": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.29.7.tgz", + "integrity": "sha512-16AMiW26DbXWBbr3B8wNozKM0ydMLB892vaOaJW/fPJdnT8vJk5sdkQcU/isqUxyCE0cEoa8wZOcbgDuC4b6Og==", + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.29.7", + "@babel/helper-wrap-function": "^7.29.7", + "@babel/traverse": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-replace-supers": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.29.7.tgz", + "integrity": "sha512-atfGXWSeCiF4DnKZIfmJfQRkSw9b9gNNXR1kqKjbhG4pGYCOnkp8OcTB8E3NXjBu8NpheSnOeNKz8KT7UNFTmQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-member-expression-to-functions": "^7.29.7", + "@babel/helper-optimise-call-expression": "^7.29.7", + "@babel/traverse": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.29.7.tgz", + "integrity": "sha512-brcMGQaVzIeUb+6/bs1Av0f8YuNNjKY2JyvfRCsFuFsdKccEQ5Ges2y74D74NZ1Rz8lKJ9ksJkfqwQFJ/iNEyQ==", + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.29.7", + "@babel/types": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.29.7.tgz", + "integrity": "sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.29.7.tgz", + "integrity": "sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.29.7.tgz", + "integrity": "sha512-N9ZErrD+yW5geCDtBqnOoxmR8+tNKiGuxKlDpuJxfsqpa2dFcexaziGAE/qoHLiDDreVNMupxGmSoNlyvsA3gw==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-wrap-function": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.29.7.tgz", + "integrity": "sha512-iES0Skag9ERIF68aXadpO6dbXa03mNWK3sEqJaMnLNs/eC3l0lkImdfoy6Y09/SfkpawdAB4RjQ7PVA7TcVGdw==", + "license": "MIT", + "dependencies": { + "@babel/template": "^7.29.7", + "@babel/traverse": "^7.29.7", + "@babel/types": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.29.7.tgz", + "integrity": "sha512-1k2lAGRMfHTcwuNYcCNUmaUffmQv8KWMfh2iJUUeRlwlwH4FdNG7mfPI10NPfLHJFThE4Tyr4mv7kTNZOiPuBg==", + "license": "MIT", + "dependencies": { + "@babel/template": "^7.29.7", + "@babel/types": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.7.tgz", + "integrity": "sha512-hnORnjP/1P/zFEndoeX+n+t1RwWRJiJpM/jO7FW32Kn9r5+sJB2JWOdYo4L6k78j15eCwY3Gm/7364B1EMwtNg==", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.29.7" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-firefox-class-in-computed-class-key": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.29.7.tgz", + "integrity": "sha512-j8SrR0zLZrRsC09DlszEx8FpMiwukKffYXMK0d5LmOglO7vGG6sz/BR/20yHqWH+Lnn31JTt2PE3hIWNgM2J6w==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7", + "@babel/traverse": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-safari-class-field-initializer-scope": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-class-field-initializer-scope/-/plugin-bugfix-safari-class-field-initializer-scope-7.29.7.tgz", + "integrity": "sha512-r8j8escF+U2FUHo0KOhPUdMzUO+jp9fInva6+ACVAF3Y97Ev+5iNZwiqTghmzNeWwDkOPlYuTcfb1vDaoZKmAQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.29.7.tgz", + "integrity": "sha512-GE1TFSiuFeGsCxmYXZl8HwoPrVlwe4rHPFE8weieGKZqnDORK+Ar3vgWMgW+AOxQ6/2TgLSKx9p6W7O4rC6qgQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-safari-rest-destructuring-rhs-array": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-rest-destructuring-rhs-array/-/plugin-bugfix-safari-rest-destructuring-rhs-array-7.29.7.tgz", + "integrity": "sha512-oBNVCvnO5tND+xSopWvV8WNGfpTfgP4Zr/YXXSj8zfmcPktp5Ku/aZlsIowgSD4fjmgHn6sGmB9APVsU5zOdhA==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.29.7.tgz", + "integrity": "sha512-QQt9qKHZ2sg/kivaLr7lnQr8HVrQDdBNSfCsTjiDxRuX/K5ORyKq+Bu8Xr0cDE3Dfkv0cw28Ve0EKyKMvulkOw==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.29.7", + "@babel/plugin-transform-optional-chaining": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.13.0" + } + }, + "node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.29.7.tgz", + "integrity": "sha512-pn6QacGLgvCcwc+syUhKE/qSjV2D1IHDB84RNxWYSt1mW3K/SCtjinZ2p0cETJxAWBjPy3K/1lHwG5BjjPxNlw==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7", + "@babel/traverse": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-proposal-private-property-in-object": { + "version": "7.21.0-placeholder-for-preset-env.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz", + "integrity": "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-dynamic-import": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", + "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-assertions": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.29.7.tgz", + "integrity": "sha512-/An1OCBN93thpBAGyfsK2pcf0jvju1SAtKkL2Ny++B5Sy6sqgzXDQH1cZxWbF96Wuk+bn41MDA9bLd4VVAw6rw==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-attributes": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.29.7.tgz", + "integrity": "sha512-zGYcYfq/WmZ4V+kBIXQon9dSSc8ircGZqw9ZaNhhGj9nZkeBu1jHLBDQqYYi5WA9uawvA2sIMbry2nCFhf5Djg==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-jsx": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.29.7.tgz", + "integrity": "sha512-TSu8+mHCoEaaCDEZ0I3+6mvTBYR4PCxQwf2z9/r5Tbztv6NaLR3B9thGTTxX2WGuGHJqRiAbKPeGTJ5XWXVg6A==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-typescript": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.29.7.tgz", + "integrity": "sha512-ngr+82Sh0xMz25TPCZi+nC2iTzjfCdWS2ONXTp/PtSCHCgaCNBpdMqgvJ2ccdLlClVZ7sisIgB914j/JFe+RZA==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-unicode-sets-regex": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz", + "integrity": "sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==", + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-arrow-functions": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.29.7.tgz", + "integrity": "sha512-N7zArUXWzAMzm+/N0uPBeVB3Fam5lMxtUwMmDK5f/IBBS7a7p1qeUoxd/6CckXoxUdgsntq1Dh8xNW06maZbDQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-async-generator-functions": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.29.7.tgz", + "integrity": "sha512-d98gXZkgswvkyohMBABkhm3GeXhYj8psWfwQ2C7gtfrKGTykQa/iOIi+JJhwMjPlZ6Vm2XN+DCf3Es1EoG4ZLA==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7", + "@babel/helper-remap-async-to-generator": "^7.29.7", + "@babel/traverse": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-async-to-generator": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.29.7.tgz", + "integrity": "sha512-pcUb2SS+RMo9TWVBwKGI5ShtoG7R+zBsFmCKDa6fe8c+hPr3XJlZgoE5j6i8W7gDjhyvy+85vmYexanvXh3d1w==", + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.29.7", + "@babel/helper-plugin-utils": "^7.29.7", + "@babel/helper-remap-async-to-generator": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-block-scoped-functions": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.29.7.tgz", + "integrity": "sha512-cUSmjh72N+rN4PrkFlN1dJwNCwjVp5d38/CQrEsFggkD10UiFlBFgdH3tv5dNsLuHY+3S8db2xCHjhZcv5WgvA==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-block-scoping": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.29.7.tgz", + "integrity": "sha512-ONyr4+AZhKh8yKWInVxU9AXA9EbsyeLcL6V0dJy6M2/62vuvpGm29zzuymbTpdc451GEpDIdAyPLP3r+P61yKQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-class-properties": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.29.7.tgz", + "integrity": "sha512-GtcpjFvanPfzNQi3eTitsCqtRRmmqzpy/A+yhTR1HaZo1Ly3EA8ZXxlPyHdR8/IuRMYc3E4wdGBewB2QKQjAaA==", + "license": "MIT", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.29.7", + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-class-static-block": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.29.7.tgz", + "integrity": "sha512-kibJgmEdX2iMwsHY2tSZNDgj8PwIlCQz7FK9KuGKO8zsuoUwSEhoNnNVp/emKWrbY4HeO6kkXfdMqRKKKXBm2A==", + "license": "MIT", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.29.7", + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.12.0" + } + }, + "node_modules/@babel/plugin-transform-classes": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.29.7.tgz", + "integrity": "sha512-qV0OGGBVacduzQHE649JyCneOFI/maT+YKsO+K4Yi3xv2wTPNjM/W2o2gdzMwEAZz7fXNTHAe0NcSg30bIN69g==", + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.29.7", + "@babel/helper-compilation-targets": "^7.29.7", + "@babel/helper-globals": "^7.29.7", + "@babel/helper-plugin-utils": "^7.29.7", + "@babel/helper-replace-supers": "^7.29.7", + "@babel/traverse": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-computed-properties": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.29.7.tgz", + "integrity": "sha512-RK7/IyU5phpuCdBAuig5VkzG/EnbDaui5SQGdU9BFrHdV+mV4cUjLMQ9lJDjLNtWHsqtiefpGZUXQP2BiTYMsA==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7", + "@babel/template": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-destructuring": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.29.7.tgz", + "integrity": "sha512-iPX8aD6H9zV5s7ZsqTdNocPN/MGQ5sSMnElKrktxjJRMnB2jN/1p2+R7GkfD6CAYoVFqy5A4XnSIUeGgJzIWpg==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7", + "@babel/traverse": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-dotall-regex": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.29.7.tgz", + "integrity": "sha512-3qc18hsD2RdZiyJNDNc7HQpv6xbncwh8FYtxNFFzclSyh/trPD9KkVR9BDECUjDLvb7yJVF15GfYUuC+LMkkiQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.29.7", + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-duplicate-keys": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.29.7.tgz", + "integrity": "sha512-6IvRRriEMqnBwD6chtxdLpMYCHWEzN+oL5cyQtjykya19UgzbmKhxmhZgKC/LHxS2nYr9Q/qYPZ5Lr6jOL9+yQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-duplicate-named-capturing-groups-regex": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-named-capturing-groups-regex/-/plugin-transform-duplicate-named-capturing-groups-regex-7.29.7.tgz", + "integrity": "sha512-2wiIyo2BjtgU7HufSeDnL9L2O7zr8jmhFKuSr65VpRkUiRKRNpb0mdlk56+XPPKoIrfHqzbMuglDvZun0RISsA==", + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.29.7", + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-dynamic-import": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.29.7.tgz", + "integrity": "sha512-giOlEm/EFjfjr+te9NsdjkUo2v4f8rS/SXPumRVHAtbNcyNlvtREkU1dZzaIDclNpnaVhlCqRdFKhJBjBikzLg==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-explicit-resource-management": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-explicit-resource-management/-/plugin-transform-explicit-resource-management-7.29.7.tgz", + "integrity": "sha512-Rstj7coNz8sE+7Ju7ihpHLI564lsK5pUpNNlvptCIC/16E/S5hbl6n3kESPKdNRmqEWlpn5xpS5Q2dvXBsySLw==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7", + "@babel/plugin-transform-destructuring": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-exponentiation-operator": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.29.7.tgz", + "integrity": "sha512-zFpMOTLZBdW5LfObqcSbL6kefg4R4eLdmvS0wbN9M6D5Mym/sKm9toOoWyVOa+xDjvCnuWcHls2YonXwHvH3CQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-export-namespace-from": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.29.7.tgz", + "integrity": "sha512-24B2nOy2TeJSMheqwPD4DDQOV/elLSIlKxjZt4i05H5AgdPdWR3n18HnNrcJ+j76WJd9gbwb9jPjNYUy6RautA==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-for-of": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.29.7.tgz", + "integrity": "sha512-zeSIHh0+E1Um1WJRXCFlHQYu2ieJNdivLLjlBEp+dIBu3S51n+SZZmIXjxnItw6pz56Cn+KvK68BIBVsxq2JiQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-function-name": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.29.7.tgz", + "integrity": "sha512-otRWaHXE6fbAGkePvaj/kvs3HsqXfPhlnzwSOlnFgbqCPMd975dW+4wZ00WFBt+/YlBGcJwNrARQTOJOb4ZrIg==", + "license": "MIT", + "dependencies": { + "@babel/helper-compilation-targets": "^7.29.7", + "@babel/helper-plugin-utils": "^7.29.7", + "@babel/traverse": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-json-strings": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.29.7.tgz", + "integrity": "sha512-RRnE2+eon1rJAq8MnoF1b5kTpY1vU88twHcvcKMrsqP/jxIRqDVs9iJB5fqPuqyeFAW0wJo4MlUIPpQCq/aRsg==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-literals": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.29.7.tgz", + "integrity": "sha512-DZ/oLP21ZuWx1vKqnoNv6/tvEK48AQOBRai40CX9dTjGluvT/YZCyY3rryDtyUqCEoyNroy5KKPwX2iQCiRvyw==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-logical-assignment-operators": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.29.7.tgz", + "integrity": "sha512-A0H91hh6W8MFRkp5TqJmMr39jzGD1A1E1Ysiv2O06Sfbhkapm+XyIzxWCEh5kqwOZ1/8QZ0dY3SeQ7XBqfJd5Q==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-member-expression-literals": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.29.7.tgz", + "integrity": "sha512-hl1kwFZCCiDyfH25Xmco9jTrkPgnS9pmOzSG7W5I4SaGbLeqKv417hcU2RKmaxoPEgsoJh7ZPOrnPGq99bHoUg==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-amd": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.29.7.tgz", + "integrity": "sha512-fxtQoH3m5ywUSIfaH0FGCzWu4McsYon5bD3K4XnskC7f+OyQMj7rsOMi4NvvmJ83WwBAg4UCe+ov4VZlqEvyew==", + "license": "MIT", + "dependencies": { + "@babel/helper-module-transforms": "^7.29.7", + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-commonjs": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.29.7.tgz", + "integrity": "sha512-j0vCldybPC5b5dwCQOJ21uKtHzt7hxLygJTg9eF1ScfaikEDNfzn94XoW5Fi+seBR0nCyL23xaBFFkq7dTM8XQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-module-transforms": "^7.29.7", + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-systemjs": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.29.7.tgz", + "integrity": "sha512-TM2ZcQLoG2/y4HODiStCo10DibYhWhGWAwVv+EQKmG/7GFl0N+AAmUiXOMKM+aiJ9XBJ9AHVZBvTzMnJ2sM3cQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-module-transforms": "^7.29.7", + "@babel/helper-plugin-utils": "^7.29.7", + "@babel/helper-validator-identifier": "^7.29.7", + "@babel/traverse": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-umd": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.29.7.tgz", + "integrity": "sha512-B4UkaTK3QpgCwJnrxKfMPKdo92CN7OKXAlpAAnM3UPu0Q0lCCk57ylA9AJbRy2v8dDKOPAAWcoR6CMyeoHwRCA==", + "license": "MIT", + "dependencies": { + "@babel/helper-module-transforms": "^7.29.7", + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.29.7.tgz", + "integrity": "sha512-vuFoLwr4qnv2xbZ16SQd6uPcH5FNrLHhk/Jzo++0XJFcaDsr4gjJVg6j398oMHiC+83k/GiBzviwF5KBJkPUtQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.29.7", + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-new-target": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.29.7.tgz", + "integrity": "sha512-fEo41GmsOUhOBlw8ioo6zvjX5Xc2Lqkzlyfqbpsk3eB6TReV18uhxZ0esfEokVbY2+PVJAQHNKxER6lGrzNd3A==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.29.7.tgz", + "integrity": "sha512-idmp1dFaekP9GbcMvG24Kvw2BfhFZjHnNJCkV4WuIY4PskJzwI3f1N5OdgYke38T7rftO6ERulFRn2cFeZwRkg==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-numeric-separator": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.29.7.tgz", + "integrity": "sha512-zR7fv/z14OjgHl4AgRtkDBvBMhIzCxqV/qN/2BCRC7LjFwvuzjYe7gDWxC4Wl/SNsLM6SE1IWvRPYMgSJaUvNw==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-object-rest-spread": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.29.7.tgz", + "integrity": "sha512-Ld98jn4c0smUywL57m7SgsHq3OpThOa6LqZJif3G6jYOovPleoFhVrBJ1WegRApSFB2wu4+RelAj9AC9G08Z4A==", + "license": "MIT", + "dependencies": { + "@babel/helper-compilation-targets": "^7.29.7", + "@babel/helper-plugin-utils": "^7.29.7", + "@babel/plugin-transform-destructuring": "^7.29.7", + "@babel/plugin-transform-parameters": "^7.29.7", + "@babel/traverse": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-object-super": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.29.7.tgz", + "integrity": "sha512-Ea/diGcw0twB5IlZPO5sgET6fJsLJqPABqTuFWIR+iMPGPZJkATEIWx0wa+aEQ5UY1CBQyP/gkAiLEqn1vBiQA==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7", + "@babel/helper-replace-supers": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-optional-catch-binding": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.29.7.tgz", + "integrity": "sha512-sLsyndxK2VwX6yNUOakMb7Sh553ZTe/vVM1XJ+9Z5aW1ytsc8xOIwmyk05NNjN60vkc5/KqoTH6hB4V41LJhng==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-optional-chaining": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.29.7.tgz", + "integrity": "sha512-6GM1dhvK3gNODkXcEcMCOLEDCLSoZ/sBbro2Ax8HURyasQ4NshagQixkRFdh5niI6E4gmA/jYI/4aT7rRos3ZQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-parameters": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.29.7.tgz", + "integrity": "sha512-ZDOBqV/qLYJI0YElr8DcENEyARsFQeESqWXH6gZlghYXuPPjvweuDhP4VyEi4BlUBlLRFZVjxoZDMjxhLW766g==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-private-methods": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.29.7.tgz", + "integrity": "sha512-/6Rz4DK1ETDEM/bWHsPHcaEe7ZaT1EqSXjtSP/L0DijOYuaUhiRiOKcwpZ8P7zR4xXEHc2ITdiCgBm9Tpyv9ug==", + "license": "MIT", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.29.7", + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-private-property-in-object": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.29.7.tgz", + "integrity": "sha512-+BNo06dnrzdNNqCm1X6YUaVv0DKk8Q+JYcoZfOkLhYWNCXzlwTSRq8zGWayT1csjcpNXV9CQTBRRbmTLZac5cA==", + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.29.7", + "@babel/helper-create-class-features-plugin": "^7.29.7", + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-property-literals": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.29.7.tgz", + "integrity": "sha512-bOMRLQuI0A5ZqHq3OWJ89/rXpJ/NJrbVhXiP4zwPGMs6kpcVsuTUNjwoE30K0Qm3mf48a/TnRYYD6vPNqcg6jA==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-constant-elements": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.29.7.tgz", + "integrity": "sha512-J0wGhKan+rIiE2OhfhRptySLrJ6SjQYM6b6N1FMlhyhCcw1Mig8vQjWchyB+bgHGDvaWo6Diu6CLRMra2uMtmg==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-display-name": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.29.7.tgz", + "integrity": "sha512-+1wdDMGNb4UPeY3Q4L5yLiYe6TXPXubs4NjrgRFw13hPRLJfEMw2Q5OXkee6/IfdqePIeW4Jjwe3aBh7SdKz4Q==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.29.7.tgz", + "integrity": "sha512-WsZulLVBUHXVj2cUcPVx6UE21TpalB6bHbSFErKT0Ib++ax24jjXe73FqlWvdylFOjiuPHYi6VCcgRad1ItN+A==", + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.29.7", + "@babel/helper-module-imports": "^7.29.7", + "@babel/helper-plugin-utils": "^7.29.7", + "@babel/plugin-syntax-jsx": "^7.29.7", + "@babel/types": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-development": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.29.7.tgz", + "integrity": "sha512-Xfy3UVMF04+ypnFbkhvfqtmvwfe92qwQdbGZVonhE+6v35GzlofmOnA1szaZqzb9xYWr0nl1e5EMmzi0DNON1g==", + "license": "MIT", + "dependencies": { + "@babel/plugin-transform-react-jsx": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-pure-annotations": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.29.7.tgz", + "integrity": "sha512-H5E+HBgDpr6Q5t+Aj11tL7XkIui1jhbIoArVQnqjgXo5/3YxkN7ZEBcWF4RQlB0T4rrxJQbXS6kiFV6B7XTqUA==", + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.29.7", + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-regenerator": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.29.7.tgz", + "integrity": "sha512-rNNFV0DBAJp988xW2DOntfDoYn1eR8GGF5AT5vYc+rjyfaQkM242c9tZUHHPe7KYaiJizXPWhQTzzdbXySyhBw==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-regexp-modifiers": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regexp-modifiers/-/plugin-transform-regexp-modifiers-7.29.7.tgz", + "integrity": "sha512-mB5Fs0VWrJ42ZCmc8114v60qetdaUVNkj9PmSZRmanCZM3S9hm0CFRLjRmYIsuXav14l2jvZ+4T8iiCGnhj3nQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.29.7", + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-reserved-words": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.29.7.tgz", + "integrity": "sha512-5+YhdpVgmfSmwZyLMftfaiffLRMHjzIRHFHHLdibcSyJm2pasMrKHrO3Ptrt2DRshjvpgjEJJ1zVW14WPq/6QA==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-runtime": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.29.7.tgz", + "integrity": "sha512-xmAscdE/AsqRW7vutbPNoUmu/nF5SrLKPs7aoJgEjo35lLKA/Bc0i2rMv/hr1+Y0o1bQCiVtith3u2vdgRL39Q==", + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.29.7", + "@babel/helper-plugin-utils": "^7.29.7", + "babel-plugin-polyfill-corejs2": "^0.4.14", + "babel-plugin-polyfill-corejs3": "^0.13.0", + "babel-plugin-polyfill-regenerator": "^0.6.5", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-runtime/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/plugin-transform-shorthand-properties": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.29.7.tgz", + "integrity": "sha512-I+WYbGBAiCn7nA6xBrlgPH+MB7HWb4u8pv5S0Pv7OtwNvIFvCCb24YlttKEeUFVurfBCEaOTnuhlqsb7f0Z5Dg==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-spread": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.29.7.tgz", + "integrity": "sha512-/u5K1QWada7tbYNqTjMh96718g9NTwh9tfPJMsSmVsQwGT447FskV+KcfeXkXq2GWki4EM/MuTdmBec+hOuVTQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-sticky-regex": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.29.7.tgz", + "integrity": "sha512-BCHzNYJGe9l7EpwwDBN/ztlL2NYFFq8hp9ddjtUEM9f2O7S7kKV/lL6Fwo7IF7NSkYhPK2vO+86nIGltA90MsA==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-template-literals": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.29.7.tgz", + "integrity": "sha512-NCSEJ4sLFU2gqAub45HYh4fus2yQ36rr6ei6vpU7NdoJqCpxvEG8E6eJpscGyXP3VHD2Ny+fSXr04k1hoUrFqA==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-typeof-symbol": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.29.7.tgz", + "integrity": "sha512-223mNGoTkBiTEWFoK+Q6Go3tueMRclO8vxxxxquNCYuNI4jWOofFKJRRDu6SDrB8Sgo1UEGW9T4GAQ8ZyRso1A==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-typescript": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.29.7.tgz", + "integrity": "sha512-jK52h8LaLc7JarhQV2ofeFMts4H7vnOXnqZNA6fYglBTZewRBE51KWt3BUltW1P+KoPsYkHoJeXePuz4zo2LMw==", + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.29.7", + "@babel/helper-create-class-features-plugin": "^7.29.7", + "@babel/helper-plugin-utils": "^7.29.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.29.7", + "@babel/plugin-syntax-typescript": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-escapes": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.29.7.tgz", + "integrity": "sha512-jCfXxSjf94lf4E0hKE0AByxF6F3/pVFqRdUUNkDJhsY0m1ZKjnN6ZYyMeHNpzflxb/0q5b7t3p+BE+SLF1WOtA==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-property-regex": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.29.7.tgz", + "integrity": "sha512-OgZ+zoAJgZLUCunsTRQ5LAjOywDv5zzZ2/hQ5aMw1pGXyY2rtE8/chXYUmu3AlVHKpm10KEdG9aMwbI/K76ZGw==", + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.29.7", + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-regex": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.29.7.tgz", + "integrity": "sha512-7D/x/23/d/3VqZ0QA+LGbZMlGwZjztBygSWWWsfTPoQ1oQ6Q1P6Mr3d0kk42XabyUVw+fha3LqdRsFqeKqvCyA==", + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.29.7", + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-sets-regex": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.29.7.tgz", + "integrity": "sha512-BLOhLht9DOJwIxlmp91wHvkXv1lguuHS3/FwUO8HL1H0u8s4hR1gASVFyilu9iGtcTRYqjTZmlsFFeQletntEg==", + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.29.7", + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/preset-env": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.29.7.tgz", + "integrity": "sha512-GYzX36n1nsciIb0uyH0GHwxwtNwPQIcpxSeiVLDtG/B7jB5xXgchnmL1f/jCX5o+pwnaDBtO60ONSJhEBJfxYA==", + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.29.7", + "@babel/helper-compilation-targets": "^7.29.7", + "@babel/helper-plugin-utils": "^7.29.7", + "@babel/helper-validator-option": "^7.29.7", + "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.29.7", + "@babel/plugin-bugfix-safari-class-field-initializer-scope": "^7.29.7", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.29.7", + "@babel/plugin-bugfix-safari-rest-destructuring-rhs-array": "^7.29.7", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.29.7", + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.29.7", + "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", + "@babel/plugin-syntax-import-assertions": "^7.29.7", + "@babel/plugin-syntax-import-attributes": "^7.29.7", + "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", + "@babel/plugin-transform-arrow-functions": "^7.29.7", + "@babel/plugin-transform-async-generator-functions": "^7.29.7", + "@babel/plugin-transform-async-to-generator": "^7.29.7", + "@babel/plugin-transform-block-scoped-functions": "^7.29.7", + "@babel/plugin-transform-block-scoping": "^7.29.7", + "@babel/plugin-transform-class-properties": "^7.29.7", + "@babel/plugin-transform-class-static-block": "^7.29.7", + "@babel/plugin-transform-classes": "^7.29.7", + "@babel/plugin-transform-computed-properties": "^7.29.7", + "@babel/plugin-transform-destructuring": "^7.29.7", + "@babel/plugin-transform-dotall-regex": "^7.29.7", + "@babel/plugin-transform-duplicate-keys": "^7.29.7", + "@babel/plugin-transform-duplicate-named-capturing-groups-regex": "^7.29.7", + "@babel/plugin-transform-dynamic-import": "^7.29.7", + "@babel/plugin-transform-explicit-resource-management": "^7.29.7", + "@babel/plugin-transform-exponentiation-operator": "^7.29.7", + "@babel/plugin-transform-export-namespace-from": "^7.29.7", + "@babel/plugin-transform-for-of": "^7.29.7", + "@babel/plugin-transform-function-name": "^7.29.7", + "@babel/plugin-transform-json-strings": "^7.29.7", + "@babel/plugin-transform-literals": "^7.29.7", + "@babel/plugin-transform-logical-assignment-operators": "^7.29.7", + "@babel/plugin-transform-member-expression-literals": "^7.29.7", + "@babel/plugin-transform-modules-amd": "^7.29.7", + "@babel/plugin-transform-modules-commonjs": "^7.29.7", + "@babel/plugin-transform-modules-systemjs": "^7.29.7", + "@babel/plugin-transform-modules-umd": "^7.29.7", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.29.7", + "@babel/plugin-transform-new-target": "^7.29.7", + "@babel/plugin-transform-nullish-coalescing-operator": "^7.29.7", + "@babel/plugin-transform-numeric-separator": "^7.29.7", + "@babel/plugin-transform-object-rest-spread": "^7.29.7", + "@babel/plugin-transform-object-super": "^7.29.7", + "@babel/plugin-transform-optional-catch-binding": "^7.29.7", + "@babel/plugin-transform-optional-chaining": "^7.29.7", + "@babel/plugin-transform-parameters": "^7.29.7", + "@babel/plugin-transform-private-methods": "^7.29.7", + "@babel/plugin-transform-private-property-in-object": "^7.29.7", + "@babel/plugin-transform-property-literals": "^7.29.7", + "@babel/plugin-transform-regenerator": "^7.29.7", + "@babel/plugin-transform-regexp-modifiers": "^7.29.7", + "@babel/plugin-transform-reserved-words": "^7.29.7", + "@babel/plugin-transform-shorthand-properties": "^7.29.7", + "@babel/plugin-transform-spread": "^7.29.7", + "@babel/plugin-transform-sticky-regex": "^7.29.7", + "@babel/plugin-transform-template-literals": "^7.29.7", + "@babel/plugin-transform-typeof-symbol": "^7.29.7", + "@babel/plugin-transform-unicode-escapes": "^7.29.7", + "@babel/plugin-transform-unicode-property-regex": "^7.29.7", + "@babel/plugin-transform-unicode-regex": "^7.29.7", + "@babel/plugin-transform-unicode-sets-regex": "^7.29.7", + "@babel/preset-modules": "0.1.6-no-external-plugins", + "babel-plugin-polyfill-corejs2": "^0.4.15", + "babel-plugin-polyfill-corejs3": "^0.14.0", + "babel-plugin-polyfill-regenerator": "^0.6.6", + "core-js-compat": "^3.48.0", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-env/node_modules/babel-plugin-polyfill-corejs3": { + "version": "0.14.2", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.14.2.tgz", + "integrity": "sha512-coWpDLJ410R781Npmn/SIBZEsAetR4xVi0SxLMXPaMO4lSf1MwnkGYMtkFxew0Dn8B3/CpbpYxN0JCgg8mn67g==", + "license": "MIT", + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.6.8", + "core-js-compat": "^3.48.0" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/@babel/preset-env/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/preset-modules": { + "version": "0.1.6-no-external-plugins", + "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz", + "integrity": "sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/types": "^7.4.4", + "esutils": "^2.0.2" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/@babel/preset-react": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.29.7.tgz", + "integrity": "sha512-C+PV1TFUPTmBQGoPBL8j2QmLpZ117YTCwxIZeJOM96GbYMFSc7/pOXU5lVykwnZxyTqQxRsvoRk6f2FktZgGHA==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7", + "@babel/helper-validator-option": "^7.29.7", + "@babel/plugin-transform-react-display-name": "^7.29.7", + "@babel/plugin-transform-react-jsx": "^7.29.7", + "@babel/plugin-transform-react-jsx-development": "^7.29.7", + "@babel/plugin-transform-react-pure-annotations": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-typescript": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.29.7.tgz", + "integrity": "sha512-/Foi8vKY2EVbed/1eZx0gJEEwHAIxogrySI7rULcRIvhZzbvoE/b5qG5Ghc0WKAFKOHA9SD1x7RsFlOYdutIiQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7", + "@babel/helper-validator-option": "^7.29.7", + "@babel/plugin-syntax-jsx": "^7.29.7", + "@babel/plugin-transform-modules-commonjs": "^7.29.7", + "@babel/plugin-transform-typescript": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/runtime": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.29.7.tgz", + "integrity": "sha512-Nq8OhGWiZIZGV6hLHoyAKLLcJihP/xFeBMGJoUrxTX2psI8dCifzLhZISFb+VWS3wFMRDmCGw5R+dOySCqPLhw==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/template": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.29.7.tgz", + "integrity": "sha512-puq+Gf35oI24FeN11LkoUQFqv9uwNeWpxXZi/Ji3rRIoKAzKnxRaZ+Gkj0vKS9ZCiTESfng1N9LyOyXvo+m+Gg==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.7", + "@babel/parser": "^7.29.7", + "@babel/types": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.7.tgz", + "integrity": "sha512-EhlfNQtZ+NK22w5BM61ciuiq1m58ed33Wr1Xan//ZRTy6hgjnwyCffRYwzsGXdASJSUJ1guZILsErh1eQcl+zw==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.7", + "@babel/generator": "^7.29.7", + "@babel/helper-globals": "^7.29.7", + "@babel/parser": "^7.29.7", + "@babel/template": "^7.29.7", + "@babel/types": "^7.29.7", + "debug": "^4.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.7.tgz", + "integrity": "sha512-4zBIxpPzowiZpusoFkyGVwakdRJUyuH5PxQ/PrqghfdFWWasvnCdPfQXHrenDai+gyLARulZjZowCOj6fjT4pA==", + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.29.7", + "@babel/helper-validator-identifier": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@colors/colors": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", + "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==", + "license": "MIT", + "optional": true, + "engines": { + "node": ">=0.1.90" + } + }, + "node_modules/@csstools/cascade-layer-name-parser": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@csstools/cascade-layer-name-parser/-/cascade-layer-name-parser-2.0.5.tgz", + "integrity": "sha512-p1ko5eHgV+MgXFVa4STPKpvPxr6ReS8oS2jzTukjR74i5zJNyWO1ZM1m8YKBXnzDKWfBN1ztLYlHxbVemDD88A==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4" + } + }, + "node_modules/@csstools/color-helpers": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@csstools/color-helpers/-/color-helpers-5.1.0.tgz", + "integrity": "sha512-S11EXWJyy0Mz5SYvRmY8nJYTFFd1LCNV+7cXyAgQtOOuzb4EsgfqDufL+9esx72/eLhsRdGZwaldu/h+E4t4BA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=18" + } + }, + "node_modules/@csstools/css-calc": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@csstools/css-calc/-/css-calc-2.1.4.tgz", + "integrity": "sha512-3N8oaj+0juUw/1H3YwmDDJXCgTB1gKU6Hc/bB502u9zR0q2vd786XJH9QfrKIEgFlZmhZiq6epXl4rHqhzsIgQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4" + } + }, + "node_modules/@csstools/css-color-parser": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@csstools/css-color-parser/-/css-color-parser-3.1.0.tgz", + "integrity": "sha512-nbtKwh3a6xNVIp/VRuXV64yTKnb1IjTAEEh3irzS+HkKjAOYLTGNb9pmVNntZ8iVBHcWDA2Dof0QtPgFI1BaTA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "dependencies": { + "@csstools/color-helpers": "^5.1.0", + "@csstools/css-calc": "^2.1.4" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4" + } + }, + "node_modules/@csstools/css-parser-algorithms": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-3.0.5.tgz", + "integrity": "sha512-DaDeUkXZKjdGhgYaHNJTV9pV7Y9B3b644jCLs9Upc3VeNGg6LWARAT6O+Q+/COo+2gg/bM5rhpMAtf70WqfBdQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "peer": true, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@csstools/css-tokenizer": "^3.0.4" + } + }, + "node_modules/@csstools/css-tokenizer": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-3.0.4.tgz", + "integrity": "sha512-Vd/9EVDiu6PPJt9yAh6roZP6El1xHrdvIVGjyBsHR0RYwNHgL7FJPyIIW4fANJNG6FtyZfvlRPpFI4ZM/lubvw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "peer": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/@csstools/media-query-list-parser": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@csstools/media-query-list-parser/-/media-query-list-parser-4.0.3.tgz", + "integrity": "sha512-HAYH7d3TLRHDOUQK4mZKf9k9Ph/m8Akstg66ywKR4SFAigjs3yBiUeZtFxywiTm5moZMAp/5W/ZuFnNXXYLuuQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4" + } + }, + "node_modules/@csstools/postcss-alpha-function": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-alpha-function/-/postcss-alpha-function-1.0.1.tgz", + "integrity": "sha512-isfLLwksH3yHkFXfCI2Gcaqg7wGGHZZwunoJzEZk0yKYIokgre6hYVFibKL3SYAoR1kBXova8LB+JoO5vZzi9w==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-color-parser": "^3.1.0", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/postcss-progressive-custom-properties": "^4.2.1", + "@csstools/utilities": "^2.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-cascade-layers": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/@csstools/postcss-cascade-layers/-/postcss-cascade-layers-5.0.2.tgz", + "integrity": "sha512-nWBE08nhO8uWl6kSAeCx4im7QfVko3zLrtgWZY4/bP87zrSPpSyN/3W3TDqz1jJuH+kbKOHXg5rJnK+ZVYcFFg==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/selector-specificity": "^5.0.0", + "postcss-selector-parser": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-cascade-layers/node_modules/@csstools/selector-specificity": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-5.0.0.tgz", + "integrity": "sha512-PCqQV3c4CoVm3kdPhyeZ07VmBRdH2EpMFA/pd9OASpOEC3aXNGoqPDAZ80D0cLpMBxnmk0+yNhGsEx31hq7Gtw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss-selector-parser": "^7.0.0" + } + }, + "node_modules/@csstools/postcss-cascade-layers/node_modules/postcss-selector-parser": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", + "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", + "license": "MIT", + "peer": true, + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@csstools/postcss-color-function": { + "version": "4.0.12", + "resolved": "https://registry.npmjs.org/@csstools/postcss-color-function/-/postcss-color-function-4.0.12.tgz", + "integrity": "sha512-yx3cljQKRaSBc2hfh8rMZFZzChaFgwmO2JfFgFr1vMcF3C/uyy5I4RFIBOIWGq1D+XbKCG789CGkG6zzkLpagA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-color-parser": "^3.1.0", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/postcss-progressive-custom-properties": "^4.2.1", + "@csstools/utilities": "^2.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-color-function-display-p3-linear": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-color-function-display-p3-linear/-/postcss-color-function-display-p3-linear-1.0.1.tgz", + "integrity": "sha512-E5qusdzhlmO1TztYzDIi8XPdPoYOjoTY6HBYBCYSj+Gn4gQRBlvjgPQXzfzuPQqt8EhkC/SzPKObg4Mbn8/xMg==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-color-parser": "^3.1.0", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/postcss-progressive-custom-properties": "^4.2.1", + "@csstools/utilities": "^2.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-color-mix-function": { + "version": "3.0.12", + "resolved": "https://registry.npmjs.org/@csstools/postcss-color-mix-function/-/postcss-color-mix-function-3.0.12.tgz", + "integrity": "sha512-4STERZfCP5Jcs13P1U5pTvI9SkgLgfMUMhdXW8IlJWkzOOOqhZIjcNhWtNJZes2nkBDsIKJ0CJtFtuaZ00moag==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-color-parser": "^3.1.0", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/postcss-progressive-custom-properties": "^4.2.1", + "@csstools/utilities": "^2.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-color-mix-variadic-function-arguments": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@csstools/postcss-color-mix-variadic-function-arguments/-/postcss-color-mix-variadic-function-arguments-1.0.2.tgz", + "integrity": "sha512-rM67Gp9lRAkTo+X31DUqMEq+iK+EFqsidfecmhrteErxJZb6tUoJBVQca1Vn1GpDql1s1rD1pKcuYzMsg7Z1KQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-color-parser": "^3.1.0", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/postcss-progressive-custom-properties": "^4.2.1", + "@csstools/utilities": "^2.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-content-alt-text": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/@csstools/postcss-content-alt-text/-/postcss-content-alt-text-2.0.8.tgz", + "integrity": "sha512-9SfEW9QCxEpTlNMnpSqFaHyzsiRpZ5J5+KqCu1u5/eEJAWsMhzT40qf0FIbeeglEvrGRMdDzAxMIz3wqoGSb+Q==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/postcss-progressive-custom-properties": "^4.2.1", + "@csstools/utilities": "^2.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-contrast-color-function": { + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/@csstools/postcss-contrast-color-function/-/postcss-contrast-color-function-2.0.12.tgz", + "integrity": "sha512-YbwWckjK3qwKjeYz/CijgcS7WDUCtKTd8ShLztm3/i5dhh4NaqzsbYnhm4bjrpFpnLZ31jVcbK8YL77z3GBPzA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-color-parser": "^3.1.0", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/postcss-progressive-custom-properties": "^4.2.1", + "@csstools/utilities": "^2.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-exponential-functions": { + "version": "2.0.9", + "resolved": "https://registry.npmjs.org/@csstools/postcss-exponential-functions/-/postcss-exponential-functions-2.0.9.tgz", + "integrity": "sha512-abg2W/PI3HXwS/CZshSa79kNWNZHdJPMBXeZNyPQFbbj8sKO3jXxOt/wF7juJVjyDTc6JrvaUZYFcSBZBhaxjw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-calc": "^2.1.4", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-font-format-keywords": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-font-format-keywords/-/postcss-font-format-keywords-4.0.0.tgz", + "integrity": "sha512-usBzw9aCRDvchpok6C+4TXC57btc4bJtmKQWOHQxOVKen1ZfVqBUuCZ/wuqdX5GHsD0NRSr9XTP+5ID1ZZQBXw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/utilities": "^2.0.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-gamut-mapping": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/@csstools/postcss-gamut-mapping/-/postcss-gamut-mapping-2.0.11.tgz", + "integrity": "sha512-fCpCUgZNE2piVJKC76zFsgVW1apF6dpYsqGyH8SIeCcM4pTEsRTWTLCaJIMKFEundsCKwY1rwfhtrio04RJ4Dw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-color-parser": "^3.1.0", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-gradients-interpolation-method": { + "version": "5.0.12", + "resolved": "https://registry.npmjs.org/@csstools/postcss-gradients-interpolation-method/-/postcss-gradients-interpolation-method-5.0.12.tgz", + "integrity": "sha512-jugzjwkUY0wtNrZlFeyXzimUL3hN4xMvoPnIXxoZqxDvjZRiSh+itgHcVUWzJ2VwD/VAMEgCLvtaJHX+4Vj3Ow==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-color-parser": "^3.1.0", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/postcss-progressive-custom-properties": "^4.2.1", + "@csstools/utilities": "^2.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-hwb-function": { + "version": "4.0.12", + "resolved": "https://registry.npmjs.org/@csstools/postcss-hwb-function/-/postcss-hwb-function-4.0.12.tgz", + "integrity": "sha512-mL/+88Z53KrE4JdePYFJAQWFrcADEqsLprExCM04GDNgHIztwFzj0Mbhd/yxMBngq0NIlz58VVxjt5abNs1VhA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-color-parser": "^3.1.0", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/postcss-progressive-custom-properties": "^4.2.1", + "@csstools/utilities": "^2.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-ic-unit": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@csstools/postcss-ic-unit/-/postcss-ic-unit-4.0.4.tgz", + "integrity": "sha512-yQ4VmossuOAql65sCPppVO1yfb7hDscf4GseF0VCA/DTDaBc0Wtf8MTqVPfjGYlT5+2buokG0Gp7y0atYZpwjg==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/postcss-progressive-custom-properties": "^4.2.1", + "@csstools/utilities": "^2.0.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-initial": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-initial/-/postcss-initial-2.0.1.tgz", + "integrity": "sha512-L1wLVMSAZ4wovznquK0xmC7QSctzO4D0Is590bxpGqhqjboLXYA16dWZpfwImkdOgACdQ9PqXsuRroW6qPlEsg==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-is-pseudo-class": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/@csstools/postcss-is-pseudo-class/-/postcss-is-pseudo-class-5.0.3.tgz", + "integrity": "sha512-jS/TY4SpG4gszAtIg7Qnf3AS2pjcUM5SzxpApOrlndMeGhIbaTzWBzzP/IApXoNWEW7OhcjkRT48jnAUIFXhAQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/selector-specificity": "^5.0.0", + "postcss-selector-parser": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-is-pseudo-class/node_modules/@csstools/selector-specificity": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-5.0.0.tgz", + "integrity": "sha512-PCqQV3c4CoVm3kdPhyeZ07VmBRdH2EpMFA/pd9OASpOEC3aXNGoqPDAZ80D0cLpMBxnmk0+yNhGsEx31hq7Gtw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss-selector-parser": "^7.0.0" + } + }, + "node_modules/@csstools/postcss-is-pseudo-class/node_modules/postcss-selector-parser": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", + "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", + "license": "MIT", + "peer": true, + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@csstools/postcss-light-dark-function": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/@csstools/postcss-light-dark-function/-/postcss-light-dark-function-2.0.11.tgz", + "integrity": "sha512-fNJcKXJdPM3Lyrbmgw2OBbaioU7yuKZtiXClf4sGdQttitijYlZMD5K7HrC/eF83VRWRrYq6OZ0Lx92leV2LFA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/postcss-progressive-custom-properties": "^4.2.1", + "@csstools/utilities": "^2.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-logical-float-and-clear": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-logical-float-and-clear/-/postcss-logical-float-and-clear-3.0.0.tgz", + "integrity": "sha512-SEmaHMszwakI2rqKRJgE+8rpotFfne1ZS6bZqBoQIicFyV+xT1UF42eORPxJkVJVrH9C0ctUgwMSn3BLOIZldQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-logical-overflow": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-logical-overflow/-/postcss-logical-overflow-2.0.0.tgz", + "integrity": "sha512-spzR1MInxPuXKEX2csMamshR4LRaSZ3UXVaRGjeQxl70ySxOhMpP2252RAFsg8QyyBXBzuVOOdx1+bVO5bPIzA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-logical-overscroll-behavior": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-logical-overscroll-behavior/-/postcss-logical-overscroll-behavior-2.0.0.tgz", + "integrity": "sha512-e/webMjoGOSYfqLunyzByZj5KKe5oyVg/YSbie99VEaSDE2kimFm0q1f6t/6Jo+VVCQ/jbe2Xy+uX+C4xzWs4w==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-logical-resize": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-logical-resize/-/postcss-logical-resize-3.0.0.tgz", + "integrity": "sha512-DFbHQOFW/+I+MY4Ycd/QN6Dg4Hcbb50elIJCfnwkRTCX05G11SwViI5BbBlg9iHRl4ytB7pmY5ieAFk3ws7yyg==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-logical-viewport-units": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@csstools/postcss-logical-viewport-units/-/postcss-logical-viewport-units-3.0.4.tgz", + "integrity": "sha512-q+eHV1haXA4w9xBwZLKjVKAWn3W2CMqmpNpZUk5kRprvSiBEGMgrNH3/sJZ8UA3JgyHaOt3jwT9uFa4wLX4EqQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/utilities": "^2.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-media-minmax": { + "version": "2.0.9", + "resolved": "https://registry.npmjs.org/@csstools/postcss-media-minmax/-/postcss-media-minmax-2.0.9.tgz", + "integrity": "sha512-af9Qw3uS3JhYLnCbqtZ9crTvvkR+0Se+bBqSr7ykAnl9yKhk6895z9rf+2F4dClIDJWxgn0iZZ1PSdkhrbs2ig==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "dependencies": { + "@csstools/css-calc": "^2.1.4", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/media-query-list-parser": "^4.0.3" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-media-queries-aspect-ratio-number-values": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@csstools/postcss-media-queries-aspect-ratio-number-values/-/postcss-media-queries-aspect-ratio-number-values-3.0.5.tgz", + "integrity": "sha512-zhAe31xaaXOY2Px8IYfoVTB3wglbJUVigGphFLj6exb7cjZRH9A6adyE22XfFK3P2PzwRk0VDeTJmaxpluyrDg==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/media-query-list-parser": "^4.0.3" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-nested-calc": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-nested-calc/-/postcss-nested-calc-4.0.0.tgz", + "integrity": "sha512-jMYDdqrQQxE7k9+KjstC3NbsmC063n1FTPLCgCRS2/qHUbHM0mNy9pIn4QIiQGs9I/Bg98vMqw7mJXBxa0N88A==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/utilities": "^2.0.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-normalize-display-values": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-normalize-display-values/-/postcss-normalize-display-values-4.0.1.tgz", + "integrity": "sha512-TQUGBuRvxdc7TgNSTevYqrL8oItxiwPDixk20qCB5me/W8uF7BPbhRrAvFuhEoywQp/woRsUZ6SJ+sU5idZAIA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-oklab-function": { + "version": "4.0.12", + "resolved": "https://registry.npmjs.org/@csstools/postcss-oklab-function/-/postcss-oklab-function-4.0.12.tgz", + "integrity": "sha512-HhlSmnE1NKBhXsTnNGjxvhryKtO7tJd1w42DKOGFD6jSHtYOrsJTQDKPMwvOfrzUAk8t7GcpIfRyM7ssqHpFjg==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-color-parser": "^3.1.0", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/postcss-progressive-custom-properties": "^4.2.1", + "@csstools/utilities": "^2.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-position-area-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-position-area-property/-/postcss-position-area-property-1.0.0.tgz", + "integrity": "sha512-fUP6KR8qV2NuUZV3Cw8itx0Ep90aRjAZxAEzC3vrl6yjFv+pFsQbR18UuQctEKmA72K9O27CoYiKEgXxkqjg8Q==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-progressive-custom-properties": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-progressive-custom-properties/-/postcss-progressive-custom-properties-4.2.1.tgz", + "integrity": "sha512-uPiiXf7IEKtUQXsxu6uWtOlRMXd2QWWy5fhxHDnPdXKCQckPP3E34ZgDoZ62r2iT+UOgWsSbM4NvHE5m3mAEdw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-property-rule-prelude-list": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-property-rule-prelude-list/-/postcss-property-rule-prelude-list-1.0.0.tgz", + "integrity": "sha512-IxuQjUXq19fobgmSSvUDO7fVwijDJaZMvWQugxfEUxmjBeDCVaDuMpsZ31MsTm5xbnhA+ElDi0+rQ7sQQGisFA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-random-function": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-random-function/-/postcss-random-function-2.0.1.tgz", + "integrity": "sha512-q+FQaNiRBhnoSNo+GzqGOIBKoHQ43lYz0ICrV+UudfWnEF6ksS6DsBIJSISKQT2Bvu3g4k6r7t0zYrk5pDlo8w==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-calc": "^2.1.4", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-relative-color-syntax": { + "version": "3.0.12", + "resolved": "https://registry.npmjs.org/@csstools/postcss-relative-color-syntax/-/postcss-relative-color-syntax-3.0.12.tgz", + "integrity": "sha512-0RLIeONxu/mtxRtf3o41Lq2ghLimw0w9ByLWnnEVuy89exmEEq8bynveBxNW3nyHqLAFEeNtVEmC1QK9MZ8Huw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-color-parser": "^3.1.0", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/postcss-progressive-custom-properties": "^4.2.1", + "@csstools/utilities": "^2.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-scope-pseudo-class": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-scope-pseudo-class/-/postcss-scope-pseudo-class-4.0.1.tgz", + "integrity": "sha512-IMi9FwtH6LMNuLea1bjVMQAsUhFxJnyLSgOp/cpv5hrzWmrUYU5fm0EguNDIIOHUqzXode8F/1qkC/tEo/qN8Q==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "postcss-selector-parser": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-scope-pseudo-class/node_modules/postcss-selector-parser": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", + "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@csstools/postcss-sign-functions": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/@csstools/postcss-sign-functions/-/postcss-sign-functions-1.1.4.tgz", + "integrity": "sha512-P97h1XqRPcfcJndFdG95Gv/6ZzxUBBISem0IDqPZ7WMvc/wlO+yU0c5D/OCpZ5TJoTt63Ok3knGk64N+o6L2Pg==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-calc": "^2.1.4", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-stepped-value-functions": { + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/@csstools/postcss-stepped-value-functions/-/postcss-stepped-value-functions-4.0.9.tgz", + "integrity": "sha512-h9btycWrsex4dNLeQfyU3y3w40LMQooJWFMm/SK9lrKguHDcFl4VMkncKKoXi2z5rM9YGWbUQABI8BT2UydIcA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-calc": "^2.1.4", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-syntax-descriptor-syntax-production": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-syntax-descriptor-syntax-production/-/postcss-syntax-descriptor-syntax-production-1.0.1.tgz", + "integrity": "sha512-GneqQWefjM//f4hJ/Kbox0C6f2T7+pi4/fqTqOFGTL3EjnvOReTqO1qUQ30CaUjkwjYq9qZ41hzarrAxCc4gow==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-tokenizer": "^3.0.4" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-system-ui-font-family": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-system-ui-font-family/-/postcss-system-ui-font-family-1.0.0.tgz", + "integrity": "sha512-s3xdBvfWYfoPSBsikDXbuorcMG1nN1M6GdU0qBsGfcmNR0A/qhloQZpTxjA3Xsyrk1VJvwb2pOfiOT3at/DuIQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-text-decoration-shorthand": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@csstools/postcss-text-decoration-shorthand/-/postcss-text-decoration-shorthand-4.0.3.tgz", + "integrity": "sha512-KSkGgZfx0kQjRIYnpsD7X2Om9BUXX/Kii77VBifQW9Ih929hK0KNjVngHDH0bFB9GmfWcR9vJYJJRvw/NQjkrA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/color-helpers": "^5.1.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-trigonometric-functions": { + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/@csstools/postcss-trigonometric-functions/-/postcss-trigonometric-functions-4.0.9.tgz", + "integrity": "sha512-Hnh5zJUdpNrJqK9v1/E3BbrQhaDTj5YiX7P61TOvUhoDHnUmsNNxcDAgkQ32RrcWx9GVUvfUNPcUkn8R3vIX6A==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-calc": "^2.1.4", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-unset-value": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-unset-value/-/postcss-unset-value-4.0.0.tgz", + "integrity": "sha512-cBz3tOCI5Fw6NIFEwU3RiwK6mn3nKegjpJuzCndoGq3BZPkUjnsq7uQmIeMNeMbMk7YD2MfKcgCpZwX5jyXqCA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/utilities": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@csstools/utilities/-/utilities-2.0.0.tgz", + "integrity": "sha512-5VdOr0Z71u+Yp3ozOx8T11N703wIFGVRgOWbOZMKgglPJsWA54MRIoMNVMa7shUToIhx5J8vX4sOZgD2XiihiQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@discoveryjs/json-ext": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz", + "integrity": "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==", + "license": "MIT", + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/@docsearch/core": { + "version": "4.6.3", + "resolved": "https://registry.npmjs.org/@docsearch/core/-/core-4.6.3.tgz", + "integrity": "sha512-rUOujwIpxJRgD7+kicVsI3D5sqBvdiRTquzWBpTEXZs8ZXfGbfzpus5HqumaNYTppN2HvH8E2yNuRwYdHJeOlA==", + "license": "MIT", + "peerDependencies": { + "@types/react": ">= 16.8.0 < 20.0.0", + "react": ">= 16.8.0 < 20.0.0", + "react-dom": ">= 16.8.0 < 20.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "react": { + "optional": true + }, + "react-dom": { + "optional": true + } + } + }, + "node_modules/@docsearch/css": { + "version": "4.6.3", + "resolved": "https://registry.npmjs.org/@docsearch/css/-/css-4.6.3.tgz", + "integrity": "sha512-nlOwcXcsNAptQl4vlL4MA78qNJKO0Qlds5GuBjCoePgkebTXLSf8Qt1oyZ3YBshYupKXG9VRGEsk1zr23d+bzQ==", + "license": "MIT" + }, + "node_modules/@docsearch/react": { + "version": "4.6.3", + "resolved": "https://registry.npmjs.org/@docsearch/react/-/react-4.6.3.tgz", + "integrity": "sha512-Bg2wdDsoQVlNCcEKuEJAU04tvHCqgx8rIu+uIoM4pRtcx3TBKJuXutJik3LTA8LRc9YEyHkrYUrmcC0D7BYf+g==", + "license": "MIT", + "dependencies": { + "@algolia/autocomplete-core": "1.19.2", + "@docsearch/core": "4.6.3", + "@docsearch/css": "4.6.3" + }, + "peerDependencies": { + "@types/react": ">= 16.8.0 < 20.0.0", + "react": ">= 16.8.0 < 20.0.0", + "react-dom": ">= 16.8.0 < 20.0.0", + "search-insights": ">= 1 < 3" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "react": { + "optional": true + }, + "react-dom": { + "optional": true + }, + "search-insights": { + "optional": true + } + } + }, + "node_modules/@docsearch/react/node_modules/@algolia/autocomplete-core": { + "version": "1.19.2", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-core/-/autocomplete-core-1.19.2.tgz", + "integrity": "sha512-mKv7RyuAzXvwmq+0XRK8HqZXt9iZ5Kkm2huLjgn5JoCPtDy+oh9yxUMfDDaVCw0oyzZ1isdJBc7l9nuCyyR7Nw==", + "license": "MIT", + "dependencies": { + "@algolia/autocomplete-plugin-algolia-insights": "1.19.2", + "@algolia/autocomplete-shared": "1.19.2" + } + }, + "node_modules/@docsearch/react/node_modules/@algolia/autocomplete-plugin-algolia-insights": { + "version": "1.19.2", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-plugin-algolia-insights/-/autocomplete-plugin-algolia-insights-1.19.2.tgz", + "integrity": "sha512-TjxbcC/r4vwmnZaPwrHtkXNeqvlpdyR+oR9Wi2XyfORkiGkLTVhX2j+O9SaCCINbKoDfc+c2PB8NjfOnz7+oKg==", + "license": "MIT", + "dependencies": { + "@algolia/autocomplete-shared": "1.19.2" + }, + "peerDependencies": { + "search-insights": ">= 1 < 3" + } + }, + "node_modules/@docsearch/react/node_modules/@algolia/autocomplete-shared": { + "version": "1.19.2", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-shared/-/autocomplete-shared-1.19.2.tgz", + "integrity": "sha512-jEazxZTVD2nLrC+wYlVHQgpBoBB5KPStrJxLzsIFl6Kqd1AlG9sIAGl39V5tECLpIQzB3Qa2T6ZPJ1ChkwMK/w==", + "license": "MIT", + "peerDependencies": { + "@algolia/client-search": ">= 4.9.1 < 6", + "algoliasearch": ">= 4.9.1 < 6" + } + }, + "node_modules/@docusaurus/babel": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/@docusaurus/babel/-/babel-3.10.1.tgz", + "integrity": "sha512-DZzFO1K3v/GoEt1fx1DiYHF4en+PuhtQf1AkQJa5zu3CoeKSpr5cpQRUlz3jr0m44wyzmSXu9bVpfir+N4+8bg==", + "license": "MIT", + "dependencies": { + "@babel/core": "^7.25.9", + "@babel/generator": "^7.25.9", + "@babel/plugin-syntax-dynamic-import": "^7.8.3", + "@babel/plugin-transform-runtime": "^7.25.9", + "@babel/preset-env": "^7.25.9", + "@babel/preset-react": "^7.25.9", + "@babel/preset-typescript": "^7.25.9", + "@babel/runtime": "^7.25.9", + "@babel/traverse": "^7.25.9", + "@docusaurus/logger": "3.10.1", + "@docusaurus/utils": "3.10.1", + "babel-plugin-dynamic-import-node": "^2.3.3", + "fs-extra": "^11.1.1", + "tslib": "^2.6.0" + }, + "engines": { + "node": ">=20.0" + } + }, + "node_modules/@docusaurus/bundler": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/@docusaurus/bundler/-/bundler-3.10.1.tgz", + "integrity": "sha512-HIqQPvbqnnQRe4NsBd1774KRarjXqS6wHsWELtyuSs1gCfvixJO2jUGH/OEBtr1Gvzpw+ze5CjGMvSJ8UE1KUw==", + "license": "MIT", + "dependencies": { + "@babel/core": "^7.25.9", + "@docusaurus/babel": "3.10.1", + "@docusaurus/cssnano-preset": "3.10.1", + "@docusaurus/logger": "3.10.1", + "@docusaurus/types": "3.10.1", + "@docusaurus/utils": "3.10.1", + "babel-loader": "^9.2.1", + "clean-css": "^5.3.3", + "copy-webpack-plugin": "^11.0.0", + "css-loader": "^6.11.0", + "css-minimizer-webpack-plugin": "^5.0.1", + "cssnano": "^6.1.2", + "file-loader": "^6.2.0", + "html-minifier-terser": "^7.2.0", + "mini-css-extract-plugin": "^2.9.2", + "null-loader": "^4.0.1", + "postcss": "^8.5.4", + "postcss-loader": "^7.3.4", + "postcss-preset-env": "^10.2.1", + "terser-webpack-plugin": "^5.3.9", + "tslib": "^2.6.0", + "url-loader": "^4.1.1", + "webpack": "^5.95.0", + "webpackbar": "^7.0.0" + }, + "engines": { + "node": ">=20.0" + }, + "peerDependencies": { + "@docusaurus/faster": "*" + }, + "peerDependenciesMeta": { + "@docusaurus/faster": { + "optional": true + } + } + }, + "node_modules/@docusaurus/core": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/@docusaurus/core/-/core-3.10.1.tgz", + "integrity": "sha512-3pf2fXXw0eVk8WnC3T4LIigRDupcpvngpKo9Vy7mYyBhuddc0klDUuZAIfzMoK6z05pdlk6EFC/vBSX43+1O5w==", + "license": "MIT", + "dependencies": { + "@docusaurus/babel": "3.10.1", + "@docusaurus/bundler": "3.10.1", + "@docusaurus/logger": "3.10.1", + "@docusaurus/mdx-loader": "3.10.1", + "@docusaurus/utils": "3.10.1", + "@docusaurus/utils-common": "3.10.1", + "@docusaurus/utils-validation": "3.10.1", + "boxen": "^6.2.1", + "chalk": "^4.1.2", + "chokidar": "^3.5.3", + "cli-table3": "^0.6.3", + "combine-promises": "^1.1.0", + "commander": "^5.1.0", + "core-js": "^3.31.1", + "detect-port": "^1.5.1", + "escape-html": "^1.0.3", + "eta": "^2.2.0", + "eval": "^0.1.8", + "execa": "^5.1.1", + "fs-extra": "^11.1.1", + "html-tags": "^3.3.1", + "html-webpack-plugin": "^5.6.0", + "leven": "^3.1.0", + "lodash": "^4.17.21", + "open": "^8.4.0", + "p-map": "^4.0.0", + "prompts": "^2.4.2", + "react-helmet-async": "npm:@slorber/react-helmet-async@1.3.0", + "react-loadable": "npm:@docusaurus/react-loadable@6.0.0", + "react-loadable-ssr-addon-v5-slorber": "^1.0.3", + "react-router": "^5.3.4", + "react-router-config": "^5.1.1", + "react-router-dom": "^5.3.4", + "semver": "^7.5.4", + "serve-handler": "^6.1.7", + "tinypool": "^1.0.2", + "tslib": "^2.6.0", + "update-notifier": "^6.0.2", + "webpack": "^5.95.0", + "webpack-bundle-analyzer": "^4.10.2", + "webpack-dev-server": "^5.2.2", + "webpack-merge": "^6.0.1" + }, + "bin": { + "docusaurus": "bin/docusaurus.mjs" + }, + "engines": { + "node": ">=20.0" + }, + "peerDependencies": { + "@docusaurus/faster": "*", + "@mdx-js/react": "^3.0.0", + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@docusaurus/faster": { + "optional": true + } + } + }, + "node_modules/@docusaurus/cssnano-preset": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/@docusaurus/cssnano-preset/-/cssnano-preset-3.10.1.tgz", + "integrity": "sha512-eNfHGcTKCSq6xmcavAkX3RRclHaE2xRCMParlDXLdXVP01/a2e/jKXMj/0ULnLFQSNwwuI62L0Ge8J+nZsR7UQ==", + "license": "MIT", + "dependencies": { + "cssnano-preset-advanced": "^6.1.2", + "postcss": "^8.5.4", + "postcss-sort-media-queries": "^5.2.0", + "tslib": "^2.6.0" + }, + "engines": { + "node": ">=20.0" + } + }, + "node_modules/@docusaurus/logger": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/@docusaurus/logger/-/logger-3.10.1.tgz", + "integrity": "sha512-oPjNFnfJsRCkePVjkGrxWGq4MvJKRQT0r9jOP0eRBTZ7Wr9FAbzdP/Gjs0I2Ss6YRkPoEgygKG112OkE6skvJw==", + "license": "MIT", + "dependencies": { + "chalk": "^4.1.2", + "tslib": "^2.6.0" + }, + "engines": { + "node": ">=20.0" + } + }, + "node_modules/@docusaurus/mdx-loader": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/@docusaurus/mdx-loader/-/mdx-loader-3.10.1.tgz", + "integrity": "sha512-GRmeb/wQ+iXRrFwcHBfgQhrJxGElgCsoTWZYDhccjsZVne1p8MK/EpQVIloXttz76TCe78kKD5AEG9n1xc1oxQ==", + "license": "MIT", + "dependencies": { + "@docusaurus/logger": "3.10.1", + "@docusaurus/utils": "3.10.1", + "@docusaurus/utils-validation": "3.10.1", + "@mdx-js/mdx": "^3.0.0", + "@slorber/remark-comment": "^1.0.0", + "escape-html": "^1.0.3", + "estree-util-value-to-estree": "^3.0.1", + "file-loader": "^6.2.0", + "fs-extra": "^11.1.1", + "image-size": "^2.0.2", + "mdast-util-mdx": "^3.0.0", + "mdast-util-to-string": "^4.0.0", + "rehype-raw": "^7.0.0", + "remark-directive": "^3.0.0", + "remark-emoji": "^4.0.0", + "remark-frontmatter": "^5.0.0", + "remark-gfm": "^4.0.0", + "stringify-object": "^3.3.0", + "tslib": "^2.6.0", + "unified": "^11.0.3", + "unist-util-visit": "^5.0.0", + "url-loader": "^4.1.1", + "vfile": "^6.0.1", + "webpack": "^5.88.1" + }, + "engines": { + "node": ">=20.0" + }, + "peerDependencies": { + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + } + }, + "node_modules/@docusaurus/module-type-aliases": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/@docusaurus/module-type-aliases/-/module-type-aliases-3.10.1.tgz", + "integrity": "sha512-YoOZKUdGlp8xSYhuAkGdSo5Ydkbq4V4eK3sD8v0a2hloxCWdQbNBhkc+Ko9QyjpESc0BYcIGM5iHVAy5hdFV6w==", + "license": "MIT", + "dependencies": { + "@docusaurus/types": "3.10.1", + "@types/history": "^4.7.11", + "@types/react": "*", + "@types/react-router-config": "*", + "@types/react-router-dom": "*", + "react-helmet-async": "npm:@slorber/react-helmet-async@1.3.0", + "react-loadable": "npm:@docusaurus/react-loadable@6.0.0" + }, + "peerDependencies": { + "react": "*", + "react-dom": "*" + } + }, + "node_modules/@docusaurus/plugin-content-blog": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-blog/-/plugin-content-blog-3.10.1.tgz", + "integrity": "sha512-mmkgE6Q2+K74tnkou7tXlpDLvoCU/qkSa2GSQ3XUiHWvcebCoDQzS670RR3tO8PmaWlIyWWISYWzZLuMfxunRA==", + "license": "MIT", + "dependencies": { + "@docusaurus/core": "3.10.1", + "@docusaurus/logger": "3.10.1", + "@docusaurus/mdx-loader": "3.10.1", + "@docusaurus/theme-common": "3.10.1", + "@docusaurus/types": "3.10.1", + "@docusaurus/utils": "3.10.1", + "@docusaurus/utils-common": "3.10.1", + "@docusaurus/utils-validation": "3.10.1", + "cheerio": "1.0.0-rc.12", + "combine-promises": "^1.1.0", + "feed": "^4.2.2", + "fs-extra": "^11.1.1", + "lodash": "^4.17.21", + "schema-dts": "^1.1.2", + "srcset": "^4.0.0", + "tslib": "^2.6.0", + "unist-util-visit": "^5.0.0", + "utility-types": "^3.10.0", + "webpack": "^5.88.1" + }, + "engines": { + "node": ">=20.0" + }, + "peerDependencies": { + "@docusaurus/plugin-content-docs": "*", + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + } + }, + "node_modules/@docusaurus/plugin-content-docs": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-docs/-/plugin-content-docs-3.10.1.tgz", + "integrity": "sha512-2jRVrtzjf8LClGTHQlwlwuD3wQXRx3WEoF7XUarJ8Ou+0onV+SLtejsyfY9JLpfUh9hPhXM4pbBGkyAY4Bi3HQ==", + "license": "MIT", + "peer": true, + "dependencies": { + "@docusaurus/core": "3.10.1", + "@docusaurus/logger": "3.10.1", + "@docusaurus/mdx-loader": "3.10.1", + "@docusaurus/module-type-aliases": "3.10.1", + "@docusaurus/theme-common": "3.10.1", + "@docusaurus/types": "3.10.1", + "@docusaurus/utils": "3.10.1", + "@docusaurus/utils-common": "3.10.1", + "@docusaurus/utils-validation": "3.10.1", + "@types/react-router-config": "^5.0.7", + "combine-promises": "^1.1.0", + "fs-extra": "^11.1.1", + "js-yaml": "^4.1.0", + "lodash": "^4.17.21", + "schema-dts": "^1.1.2", + "tslib": "^2.6.0", + "utility-types": "^3.10.0", + "webpack": "^5.88.1" + }, + "engines": { + "node": ">=20.0" + }, + "peerDependencies": { + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + } + }, + "node_modules/@docusaurus/plugin-content-pages": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-pages/-/plugin-content-pages-3.10.1.tgz", + "integrity": "sha512-huJpaRPMl42nsFwuCXvV8bVDj2MazuwRJIUylI/RSlmZeJssVoZXeCjVf1y+1Drtpa9SKcdGn8yoJ76IRJijtw==", + "license": "MIT", + "dependencies": { + "@docusaurus/core": "3.10.1", + "@docusaurus/mdx-loader": "3.10.1", + "@docusaurus/types": "3.10.1", + "@docusaurus/utils": "3.10.1", + "@docusaurus/utils-validation": "3.10.1", + "fs-extra": "^11.1.1", + "tslib": "^2.6.0", + "webpack": "^5.88.1" + }, + "engines": { + "node": ">=20.0" + }, + "peerDependencies": { + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + } + }, + "node_modules/@docusaurus/plugin-css-cascade-layers": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-css-cascade-layers/-/plugin-css-cascade-layers-3.10.1.tgz", + "integrity": "sha512-r//fn+MNHkE1wCof8T29VAQezt1enGCpsFxoziBbvLgBM4JfXN2P3rxrBaavHmvLvm7lYkpJeitcDthwnmWCTw==", + "license": "MIT", + "dependencies": { + "@docusaurus/core": "3.10.1", + "@docusaurus/types": "3.10.1", + "@docusaurus/utils": "3.10.1", + "@docusaurus/utils-validation": "3.10.1", + "tslib": "^2.6.0" + }, + "engines": { + "node": ">=20.0" + } + }, + "node_modules/@docusaurus/plugin-debug": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-debug/-/plugin-debug-3.10.1.tgz", + "integrity": "sha512-9KqOpKNfAyqGZykRb9LhIT/vyRF6sm/ykhjj/39JvaJahDS+jZJE0Z1Wfz9q3DUNDTMNN0Q7u/kk4rKKU+IJuA==", + "license": "MIT", + "dependencies": { + "@docusaurus/core": "3.10.1", + "@docusaurus/types": "3.10.1", + "@docusaurus/utils": "3.10.1", + "fs-extra": "^11.1.1", + "react-json-view-lite": "^2.3.0", + "tslib": "^2.6.0" + }, + "engines": { + "node": ">=20.0" + }, + "peerDependencies": { + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + } + }, + "node_modules/@docusaurus/plugin-google-analytics": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-analytics/-/plugin-google-analytics-3.10.1.tgz", + "integrity": "sha512-8o0P1KtmgdYQHH+oInitPpRWI0Of5XednAX4+DMhQNSmGSRNrsEEHg1ebv35m9AgRClfAytCJ5jA9KvcASTyuA==", + "license": "MIT", + "dependencies": { + "@docusaurus/core": "3.10.1", + "@docusaurus/types": "3.10.1", + "@docusaurus/utils-validation": "3.10.1", + "tslib": "^2.6.0" + }, + "engines": { + "node": ">=20.0" + }, + "peerDependencies": { + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + } + }, + "node_modules/@docusaurus/plugin-google-gtag": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-gtag/-/plugin-google-gtag-3.10.1.tgz", + "integrity": "sha512-pu3xIUo5o/zCMLfUY9BO5KOwSH0zIsAGyFRPvXHayFSA5XIhCU/SFuB0g0ZNjFn9niZLCaNvoeAuOGFJZq0fdw==", + "license": "MIT", + "dependencies": { + "@docusaurus/core": "3.10.1", + "@docusaurus/types": "3.10.1", + "@docusaurus/utils-validation": "3.10.1", + "@types/gtag.js": "^0.0.20", + "tslib": "^2.6.0" + }, + "engines": { + "node": ">=20.0" + }, + "peerDependencies": { + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + } + }, + "node_modules/@docusaurus/plugin-google-tag-manager": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-tag-manager/-/plugin-google-tag-manager-3.10.1.tgz", + "integrity": "sha512-f6fyGHiCm7kJHBtAisGQS5oNBnpnMTYQZxDXeVrnw/3zWU+LMA22pr6UHGYkBKDbN+qPC5QHG3NuOfzQLq3+Lw==", + "license": "MIT", + "dependencies": { + "@docusaurus/core": "3.10.1", + "@docusaurus/types": "3.10.1", + "@docusaurus/utils-validation": "3.10.1", + "tslib": "^2.6.0" + }, + "engines": { + "node": ">=20.0" + }, + "peerDependencies": { + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + } + }, + "node_modules/@docusaurus/plugin-sitemap": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-sitemap/-/plugin-sitemap-3.10.1.tgz", + "integrity": "sha512-C26MbmmqgdjkDq1htaZ3aD7LzEDKFWXfpyQpt0EOUThuq5nV77zDaedV20yHcVo9p+3ey9aZ4pbHA0D3QcZTzg==", + "license": "MIT", + "dependencies": { + "@docusaurus/core": "3.10.1", + "@docusaurus/logger": "3.10.1", + "@docusaurus/types": "3.10.1", + "@docusaurus/utils": "3.10.1", + "@docusaurus/utils-common": "3.10.1", + "@docusaurus/utils-validation": "3.10.1", + "fs-extra": "^11.1.1", + "sitemap": "^7.1.1", + "tslib": "^2.6.0" + }, + "engines": { + "node": ">=20.0" + }, + "peerDependencies": { + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + } + }, + "node_modules/@docusaurus/plugin-svgr": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-svgr/-/plugin-svgr-3.10.1.tgz", + "integrity": "sha512-6SFxsmjWFkVLDmBUvFK6i72QjUwqyQFe4Ovz+SUJophJjOyVG3ZZG5IQpBC/kX/Gfv1yWeU9nWauH6F6Q7QX/Q==", + "license": "MIT", + "dependencies": { + "@docusaurus/core": "3.10.1", + "@docusaurus/types": "3.10.1", + "@docusaurus/utils": "3.10.1", + "@docusaurus/utils-validation": "3.10.1", + "@svgr/core": "8.1.0", + "@svgr/webpack": "^8.1.0", + "tslib": "^2.6.0", + "webpack": "^5.88.1" + }, + "engines": { + "node": ">=20.0" + }, + "peerDependencies": { + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + } + }, + "node_modules/@docusaurus/preset-classic": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/@docusaurus/preset-classic/-/preset-classic-3.10.1.tgz", + "integrity": "sha512-YO/FL8v1zmbxoTso6mjMz/RDjhaTJxb1UpFFTDdY5847LLDCeyYiYlrhyTbgN1RIN3xnkLKZ9Lj1x8hUzI4JOg==", + "license": "MIT", + "dependencies": { + "@docusaurus/core": "3.10.1", + "@docusaurus/plugin-content-blog": "3.10.1", + "@docusaurus/plugin-content-docs": "3.10.1", + "@docusaurus/plugin-content-pages": "3.10.1", + "@docusaurus/plugin-css-cascade-layers": "3.10.1", + "@docusaurus/plugin-debug": "3.10.1", + "@docusaurus/plugin-google-analytics": "3.10.1", + "@docusaurus/plugin-google-gtag": "3.10.1", + "@docusaurus/plugin-google-tag-manager": "3.10.1", + "@docusaurus/plugin-sitemap": "3.10.1", + "@docusaurus/plugin-svgr": "3.10.1", + "@docusaurus/theme-classic": "3.10.1", + "@docusaurus/theme-common": "3.10.1", + "@docusaurus/theme-search-algolia": "3.10.1", + "@docusaurus/types": "3.10.1" + }, + "engines": { + "node": ">=20.0" + }, + "peerDependencies": { + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + } + }, + "node_modules/@docusaurus/theme-classic": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/@docusaurus/theme-classic/-/theme-classic-3.10.1.tgz", + "integrity": "sha512-VU1RK0qb2pab0si4r7HFK37cYco8VzqLj3u1PspVipSr/z/GPVKHO4/HXbnePqHoWDk8urjyGSeatH0NIMBM1A==", + "license": "MIT", + "dependencies": { + "@docusaurus/core": "3.10.1", + "@docusaurus/logger": "3.10.1", + "@docusaurus/mdx-loader": "3.10.1", + "@docusaurus/module-type-aliases": "3.10.1", + "@docusaurus/plugin-content-blog": "3.10.1", + "@docusaurus/plugin-content-docs": "3.10.1", + "@docusaurus/plugin-content-pages": "3.10.1", + "@docusaurus/theme-common": "3.10.1", + "@docusaurus/theme-translations": "3.10.1", + "@docusaurus/types": "3.10.1", + "@docusaurus/utils": "3.10.1", + "@docusaurus/utils-common": "3.10.1", + "@docusaurus/utils-validation": "3.10.1", + "@mdx-js/react": "^3.0.0", + "clsx": "^2.0.0", + "copy-text-to-clipboard": "^3.2.0", + "infima": "0.2.0-alpha.45", + "lodash": "^4.17.21", + "nprogress": "^0.2.0", + "postcss": "^8.5.4", + "prism-react-renderer": "^2.3.0", + "prismjs": "^1.29.0", + "react-router-dom": "^5.3.4", + "rtlcss": "^4.1.0", + "tslib": "^2.6.0", + "utility-types": "^3.10.0" + }, + "engines": { + "node": ">=20.0" + }, + "peerDependencies": { + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + } + }, + "node_modules/@docusaurus/theme-common": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/@docusaurus/theme-common/-/theme-common-3.10.1.tgz", + "integrity": "sha512-0YtmIeoNo1fIw65LO8+/1dPgmDV86UmhMkow37gzjytuiCSQm9xob6PJy0L4kuQEMTLfUOGvkXvZr7GPrHquMA==", + "license": "MIT", + "dependencies": { + "@docusaurus/mdx-loader": "3.10.1", + "@docusaurus/module-type-aliases": "3.10.1", + "@docusaurus/utils": "3.10.1", + "@docusaurus/utils-common": "3.10.1", + "@types/history": "^4.7.11", + "@types/react": "*", + "@types/react-router-config": "*", + "clsx": "^2.0.0", + "parse-numeric-range": "^1.3.0", + "prism-react-renderer": "^2.3.0", + "tslib": "^2.6.0", + "utility-types": "^3.10.0" + }, + "engines": { + "node": ">=20.0" + }, + "peerDependencies": { + "@docusaurus/plugin-content-docs": "*", + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + } + }, + "node_modules/@docusaurus/theme-search-algolia": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/@docusaurus/theme-search-algolia/-/theme-search-algolia-3.10.1.tgz", + "integrity": "sha512-OTaARARVZj2GvkJQjB+1jOIxntRaXea+G+fMsNqrZBAU1O1vJKDW22R7kECOHW27oJCLFN9HKaZeRrfAUyviug==", + "license": "MIT", + "dependencies": { + "@algolia/autocomplete-core": "^1.19.2", + "@docsearch/react": "^3.9.0 || ^4.3.2", + "@docusaurus/core": "3.10.1", + "@docusaurus/logger": "3.10.1", + "@docusaurus/plugin-content-docs": "3.10.1", + "@docusaurus/theme-common": "3.10.1", + "@docusaurus/theme-translations": "3.10.1", + "@docusaurus/utils": "3.10.1", + "@docusaurus/utils-validation": "3.10.1", + "algoliasearch": "^5.37.0", + "algoliasearch-helper": "^3.26.0", + "clsx": "^2.0.0", + "eta": "^2.2.0", + "fs-extra": "^11.1.1", + "lodash": "^4.17.21", + "tslib": "^2.6.0", + "utility-types": "^3.10.0" + }, + "engines": { + "node": ">=20.0" + }, + "peerDependencies": { + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + } + }, + "node_modules/@docusaurus/theme-translations": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/@docusaurus/theme-translations/-/theme-translations-3.10.1.tgz", + "integrity": "sha512-cLMyaKivjBVWKMJuWqyFVVgtqe8DPJNPkog0bn8W1MDVAKcPdxRFycBfC1We1RaNp7Rdk513bmtW78RR6OBxBw==", + "license": "MIT", + "dependencies": { + "fs-extra": "^11.1.1", + "tslib": "^2.6.0" + }, + "engines": { + "node": ">=20.0" + } + }, + "node_modules/@docusaurus/types": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/@docusaurus/types/-/types-3.10.1.tgz", + "integrity": "sha512-XYMK8k1szDCFMw2V+Xyen0g7Kee1sP3dtFnl7vkGkZOkeAJ/oPDQPL8iz4HBKOo/cwU8QeV6onVjMqtP+tFzsw==", + "license": "MIT", + "dependencies": { + "@mdx-js/mdx": "^3.0.0", + "@types/history": "^4.7.11", + "@types/mdast": "^4.0.2", + "@types/react": "*", + "commander": "^5.1.0", + "joi": "^17.9.2", + "react-helmet-async": "npm:@slorber/react-helmet-async@1.3.0", + "utility-types": "^3.10.0", + "webpack": "^5.95.0", + "webpack-merge": "^5.9.0" + }, + "peerDependencies": { + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + } + }, + "node_modules/@docusaurus/types/node_modules/webpack-merge": { + "version": "5.10.0", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.10.0.tgz", + "integrity": "sha512-+4zXKdx7UnO+1jaN4l2lHVD+mFvnlZQP/6ljaJVb4SZiwIKeUnrT5l0gkT8z+n4hKpC+jpOv6O9R+gLtag7pSA==", + "license": "MIT", + "dependencies": { + "clone-deep": "^4.0.1", + "flat": "^5.0.2", + "wildcard": "^2.0.0" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/@docusaurus/utils": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/@docusaurus/utils/-/utils-3.10.1.tgz", + "integrity": "sha512-3ojeJry9xBYdJO6qoyyzqeJFSJBVx2mXhyDzSdjwL2+URFQMf+h25gG38iswGImicK0ELjTd1EL2xzk8hf3QPw==", + "license": "MIT", + "dependencies": { + "@docusaurus/logger": "3.10.1", + "@docusaurus/types": "3.10.1", + "@docusaurus/utils-common": "3.10.1", + "escape-string-regexp": "^4.0.0", + "execa": "^5.1.1", + "file-loader": "^6.2.0", + "fs-extra": "^11.1.1", + "github-slugger": "^1.5.0", + "globby": "^11.1.0", + "gray-matter": "^4.0.3", + "jiti": "^1.20.0", + "js-yaml": "^4.1.0", + "lodash": "^4.17.21", + "micromatch": "^4.0.5", + "p-queue": "^6.6.2", + "prompts": "^2.4.2", + "resolve-pathname": "^3.0.0", + "tslib": "^2.6.0", + "url-loader": "^4.1.1", + "utility-types": "^3.10.0", + "webpack": "^5.88.1" + }, + "engines": { + "node": ">=20.0" + } + }, + "node_modules/@docusaurus/utils-common": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/@docusaurus/utils-common/-/utils-common-3.10.1.tgz", + "integrity": "sha512-5mFSgEADtnFxFH7RLw02QA5MpU5JVUCj0MPeIvi/aF4Fi45tQRIuTwXoXDqJ+1VfQJuYJGz3SI63wmGz4HvXzA==", + "license": "MIT", + "dependencies": { + "@docusaurus/types": "3.10.1", + "tslib": "^2.6.0" + }, + "engines": { + "node": ">=20.0" + } + }, + "node_modules/@docusaurus/utils-validation": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/@docusaurus/utils-validation/-/utils-validation-3.10.1.tgz", + "integrity": "sha512-cRv1X69jwaWv47waglllgZVWzeBFLhl53XT/XED/83BerVBTC5FTP8WTcVl8Z6sZOegDSwitu/wpCSPCDOT6lg==", + "license": "MIT", + "dependencies": { + "@docusaurus/logger": "3.10.1", + "@docusaurus/utils": "3.10.1", + "@docusaurus/utils-common": "3.10.1", + "fs-extra": "^11.2.0", + "joi": "^17.9.2", + "js-yaml": "^4.1.0", + "lodash": "^4.17.21", + "tslib": "^2.6.0" + }, + "engines": { + "node": ">=20.0" + } + }, + "node_modules/@hapi/hoek": { + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.3.0.tgz", + "integrity": "sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ==", + "license": "BSD-3-Clause" + }, + "node_modules/@hapi/topo": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-5.1.0.tgz", + "integrity": "sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg==", + "license": "BSD-3-Clause", + "dependencies": { + "@hapi/hoek": "^9.0.0" + } + }, + "node_modules/@jest/schemas": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", + "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", + "license": "MIT", + "dependencies": { + "@sinclair/typebox": "^0.27.8" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/types": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", + "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", + "license": "MIT", + "dependencies": { + "@jest/schemas": "^29.6.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/remapping": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/source-map": { + "version": "0.3.11", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.11.tgz", + "integrity": "sha512-ZMp1V8ZFcPG5dIWnQLr3NSI1MiCU7UETdS/A0G8V/XWHvJv3ZsFqutJn1Y5RPmAPX6F3BiE397OqveU/9NCuIA==", + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@jsonjoy.com/base64": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/base64/-/base64-1.1.2.tgz", + "integrity": "sha512-q6XAnWQDIMA3+FTiOYajoYqySkO+JSat0ytXGSuRdq9uXE7o92gzuQwQM14xaCRlBLGq3v5miDGC4vkVTn54xA==", + "license": "Apache-2.0", + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/buffers": { + "version": "17.67.0", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/buffers/-/buffers-17.67.0.tgz", + "integrity": "sha512-tfExRpYxBvi32vPs9ZHaTjSP4fHAfzSmcahOfNxtvGHcyJel+aibkPlGeBB+7AoC6hL7lXIE++8okecBxx7lcw==", + "license": "Apache-2.0", + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/codegen": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/codegen/-/codegen-1.0.0.tgz", + "integrity": "sha512-E8Oy+08cmCf0EK/NMxpaJZmOxPqM+6iSe2S4nlSBrPZOORoDJILxtbSUEDKQyTamm/BVAhIGllOBNU79/dwf0g==", + "license": "Apache-2.0", + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/fs-core": { + "version": "4.57.6", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/fs-core/-/fs-core-4.57.6.tgz", + "integrity": "sha512-uI++Wx6VkBJqVmkb4ZeExwAVpZiA2Do5NrEtXoDk0Pdvce3ytFXJoviT1sLOj16+qDIMnD5nWPfOhVpnDmRJKg==", + "license": "Apache-2.0", + "dependencies": { + "@jsonjoy.com/fs-node-builtins": "4.57.6", + "@jsonjoy.com/fs-node-utils": "4.57.6", + "thingies": "^2.5.0" + }, + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/fs-fsa": { + "version": "4.57.6", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/fs-fsa/-/fs-fsa-4.57.6.tgz", + "integrity": "sha512-pKkw/yC5CzSZKhIIUIsH1przOa+K5jGmZIg1sWaSF24JojyrUFbjcQv7QrcGAudriei6HQ6R0BFj+V8NbQinJw==", + "license": "Apache-2.0", + "dependencies": { + "@jsonjoy.com/fs-core": "4.57.6", + "@jsonjoy.com/fs-node-builtins": "4.57.6", + "@jsonjoy.com/fs-node-utils": "4.57.6", + "thingies": "^2.5.0" + }, + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/fs-node": { + "version": "4.57.6", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/fs-node/-/fs-node-4.57.6.tgz", + "integrity": "sha512-Kbn1jdkvDN4F2+BhoB6mMu7NCbhP0bgA5NcI1aJj/Q5UcU+I1JLLW+dEQean33iV4tXv35AzBVKPICnDltBpxw==", + "license": "Apache-2.0", + "dependencies": { + "@jsonjoy.com/fs-core": "4.57.6", + "@jsonjoy.com/fs-node-builtins": "4.57.6", + "@jsonjoy.com/fs-node-utils": "4.57.6", + "@jsonjoy.com/fs-print": "4.57.6", + "@jsonjoy.com/fs-snapshot": "4.57.6", + "glob-to-regex.js": "^1.0.0", + "thingies": "^2.5.0" + }, + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/fs-node-builtins": { + "version": "4.57.6", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/fs-node-builtins/-/fs-node-builtins-4.57.6.tgz", + "integrity": "sha512-V4DgEFT3Cg5S9fCMOZSCVdTxdJWWLBO0WnAazV7hnCM96u5zXHyW/ubDAfcSVwqjkMJ50W1Y44IXtxRoIwaCVg==", + "license": "Apache-2.0", + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/fs-node-to-fsa": { + "version": "4.57.6", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/fs-node-to-fsa/-/fs-node-to-fsa-4.57.6.tgz", + "integrity": "sha512-+JptNw3iifihxH2rEXrninDzX4FFVW8JD/wPR8GbJPAeL9CQUSblrlumOPB5gZuS7tYRX+PJPLtT7XzKoRhv/Q==", + "license": "Apache-2.0", + "dependencies": { + "@jsonjoy.com/fs-fsa": "4.57.6", + "@jsonjoy.com/fs-node-builtins": "4.57.6", + "@jsonjoy.com/fs-node-utils": "4.57.6" + }, + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/fs-node-utils": { + "version": "4.57.6", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/fs-node-utils/-/fs-node-utils-4.57.6.tgz", + "integrity": "sha512-foyUrfS7WmYEUzqYXSNxmJBcSj04TABrkpFabwO9SCDCpVCfJ+qG+2sk5FjfiflG2n0SDFZDCJ6vYlJAEpxJFg==", + "license": "Apache-2.0", + "dependencies": { + "@jsonjoy.com/fs-node-builtins": "4.57.6" + }, + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/fs-print": { + "version": "4.57.6", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/fs-print/-/fs-print-4.57.6.tgz", + "integrity": "sha512-96eAn4Dudtt67LTeuU47yUD+pg9/G/oKpI10zei9ljk3X3WK4lYKc+n3cpaPCAbKPzoyfxl0mXm8f8Y7BOSFXw==", + "license": "Apache-2.0", + "dependencies": { + "@jsonjoy.com/fs-node-utils": "4.57.6", + "tree-dump": "^1.1.0" + }, + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/fs-snapshot": { + "version": "4.57.6", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/fs-snapshot/-/fs-snapshot-4.57.6.tgz", + "integrity": "sha512-V57CMzbOgTzUWGOWQ8GzHQdpJP6JnrYVNCtTBNxVYEnlVRvo4uEJqHhtAT8vhDFrIuJOXLrTL1Fki4h5oI7xxg==", + "license": "Apache-2.0", + "dependencies": { + "@jsonjoy.com/buffers": "^17.65.0", + "@jsonjoy.com/fs-node-utils": "4.57.6", + "@jsonjoy.com/json-pack": "^17.65.0", + "@jsonjoy.com/util": "^17.65.0" + }, + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/fs-snapshot/node_modules/@jsonjoy.com/base64": { + "version": "17.67.0", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/base64/-/base64-17.67.0.tgz", + "integrity": "sha512-5SEsJGsm15aP8TQGkDfJvz9axgPwAEm98S5DxOuYe8e1EbfajcDmgeXXzccEjh+mLnjqEKrkBdjHWS5vFNwDdw==", + "license": "Apache-2.0", + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/fs-snapshot/node_modules/@jsonjoy.com/codegen": { + "version": "17.67.0", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/codegen/-/codegen-17.67.0.tgz", + "integrity": "sha512-idnkUplROpdBOV0HMcwhsCUS5TRUi9poagdGs70A6S4ux9+/aPuKbh8+UYRTLYQHtXvAdNfQWXDqZEx5k4Dj2Q==", + "license": "Apache-2.0", + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/fs-snapshot/node_modules/@jsonjoy.com/json-pack": { + "version": "17.67.0", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/json-pack/-/json-pack-17.67.0.tgz", + "integrity": "sha512-t0ejURcGaZsn1ClbJ/3kFqSOjlryd92eQY465IYrezsXmPcfHPE/av4twRSxf6WE+TkZgLY+71vCZbiIiFKA/w==", + "license": "Apache-2.0", + "dependencies": { + "@jsonjoy.com/base64": "17.67.0", + "@jsonjoy.com/buffers": "17.67.0", + "@jsonjoy.com/codegen": "17.67.0", + "@jsonjoy.com/json-pointer": "17.67.0", + "@jsonjoy.com/util": "17.67.0", + "hyperdyperid": "^1.2.0", + "thingies": "^2.5.0", + "tree-dump": "^1.1.0" + }, + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/fs-snapshot/node_modules/@jsonjoy.com/json-pointer": { + "version": "17.67.0", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/json-pointer/-/json-pointer-17.67.0.tgz", + "integrity": "sha512-+iqOFInH+QZGmSuaybBUNdh7yvNrXvqR+h3wjXm0N/3JK1EyyFAeGJvqnmQL61d1ARLlk/wJdFKSL+LHJ1eaUA==", + "license": "Apache-2.0", + "dependencies": { + "@jsonjoy.com/util": "17.67.0" + }, + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/fs-snapshot/node_modules/@jsonjoy.com/util": { + "version": "17.67.0", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/util/-/util-17.67.0.tgz", + "integrity": "sha512-6+8xBaz1rLSohlGh68D1pdw3AwDi9xydm8QNlAFkvnavCJYSze+pxoW2VKP8p308jtlMRLs5NTHfPlZLd4w7ew==", + "license": "Apache-2.0", + "dependencies": { + "@jsonjoy.com/buffers": "17.67.0", + "@jsonjoy.com/codegen": "17.67.0" + }, + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/json-pack": { + "version": "1.21.0", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/json-pack/-/json-pack-1.21.0.tgz", + "integrity": "sha512-+AKG+R2cfZMShzrF2uQw34v3zbeDYUqnQ+jg7ORic3BGtfw9p/+N6RJbq/kkV8JmYZaINknaEQ2m0/f693ZPpg==", + "license": "Apache-2.0", + "dependencies": { + "@jsonjoy.com/base64": "^1.1.2", + "@jsonjoy.com/buffers": "^1.2.0", + "@jsonjoy.com/codegen": "^1.0.0", + "@jsonjoy.com/json-pointer": "^1.0.2", + "@jsonjoy.com/util": "^1.9.0", + "hyperdyperid": "^1.2.0", + "thingies": "^2.5.0", + "tree-dump": "^1.1.0" + }, + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/json-pack/node_modules/@jsonjoy.com/buffers": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/buffers/-/buffers-1.2.1.tgz", + "integrity": "sha512-12cdlDwX4RUM3QxmUbVJWqZ/mrK6dFQH4Zxq6+r1YXKXYBNgZXndx2qbCJwh3+WWkCSn67IjnlG3XYTvmvYtgA==", + "license": "Apache-2.0", + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/json-pointer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/json-pointer/-/json-pointer-1.0.2.tgz", + "integrity": "sha512-Fsn6wM2zlDzY1U+v4Nc8bo3bVqgfNTGcn6dMgs6FjrEnt4ZCe60o6ByKRjOGlI2gow0aE/Q41QOigdTqkyK5fg==", + "license": "Apache-2.0", + "dependencies": { + "@jsonjoy.com/codegen": "^1.0.0", + "@jsonjoy.com/util": "^1.9.0" + }, + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/util": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/util/-/util-1.9.0.tgz", + "integrity": "sha512-pLuQo+VPRnN8hfPqUTLTHk126wuYdXVxE6aDmjSeV4NCAgyxWbiOIeNJVtID3h1Vzpoi9m4jXezf73I6LgabgQ==", + "license": "Apache-2.0", + "dependencies": { + "@jsonjoy.com/buffers": "^1.0.0", + "@jsonjoy.com/codegen": "^1.0.0" + }, + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/util/node_modules/@jsonjoy.com/buffers": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/buffers/-/buffers-1.2.1.tgz", + "integrity": "sha512-12cdlDwX4RUM3QxmUbVJWqZ/mrK6dFQH4Zxq6+r1YXKXYBNgZXndx2qbCJwh3+WWkCSn67IjnlG3XYTvmvYtgA==", + "license": "Apache-2.0", + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@leichtgewicht/ip-codec": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.5.tgz", + "integrity": "sha512-Vo+PSpZG2/fmgmiNzYK9qWRh8h/CHrwD0mo1h1DzL4yzHNSfWYujGTYsWGreD000gcgmZ7K4Ys6Tx9TxtsKdDw==", + "license": "MIT" + }, + "node_modules/@mdx-js/mdx": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@mdx-js/mdx/-/mdx-3.1.1.tgz", + "integrity": "sha512-f6ZO2ifpwAQIpzGWaBQT2TXxPv6z3RBzQKpVftEWN78Vl/YweF1uwussDx8ECAXVtr3Rs89fKyG9YlzUs9DyGQ==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/mdx": "^2.0.0", + "acorn": "^8.0.0", + "collapse-white-space": "^2.0.0", + "devlop": "^1.0.0", + "estree-util-is-identifier-name": "^3.0.0", + "estree-util-scope": "^1.0.0", + "estree-walker": "^3.0.0", + "hast-util-to-jsx-runtime": "^2.0.0", + "markdown-extensions": "^2.0.0", + "recma-build-jsx": "^1.0.0", + "recma-jsx": "^1.0.0", + "recma-stringify": "^1.0.0", + "rehype-recma": "^1.0.0", + "remark-mdx": "^3.0.0", + "remark-parse": "^11.0.0", + "remark-rehype": "^11.0.0", + "source-map": "^0.7.0", + "unified": "^11.0.0", + "unist-util-position-from-estree": "^2.0.0", + "unist-util-stringify-position": "^4.0.0", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/@mdx-js/react": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@mdx-js/react/-/react-3.1.1.tgz", + "integrity": "sha512-f++rKLQgUVYDAtECQ6fn/is15GkEH9+nZPM3MS0RcxVqoTfawHvDlSCH7JbMhAM6uJ32v3eXLvLmLvjGu7PTQw==", + "license": "MIT", + "peer": true, + "dependencies": { + "@types/mdx": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + }, + "peerDependencies": { + "@types/react": ">=16", + "react": ">=16" + } + }, + "node_modules/@noble/hashes": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.4.0.tgz", + "integrity": "sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg==", + "license": "MIT", + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "license": "MIT", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@peculiar/asn1-cms": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/@peculiar/asn1-cms/-/asn1-cms-2.7.0.tgz", + "integrity": "sha512-hew63shtzzvBcSHbhm+cyAmKe6AIfinT9hzEqSPjDC6opTTMKmTkQ0gHuN2KsWlvqiKw1S/fS94fhag/FJkioQ==", + "license": "MIT", + "dependencies": { + "@peculiar/asn1-schema": "^2.7.0", + "@peculiar/asn1-x509": "^2.7.0", + "@peculiar/asn1-x509-attr": "^2.7.0", + "asn1js": "^3.0.6", + "tslib": "^2.8.1" + } + }, + "node_modules/@peculiar/asn1-csr": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/@peculiar/asn1-csr/-/asn1-csr-2.7.0.tgz", + "integrity": "sha512-VVsAyGqErT9D1SY4aEqozThXMVI+ssVRiv2DDeYuvpBKLIgZ3hYs3Ay3u/VSoKq6ESFi9cf6rf3IOOzfwh7oMA==", + "license": "MIT", + "dependencies": { + "@peculiar/asn1-schema": "^2.7.0", + "@peculiar/asn1-x509": "^2.7.0", + "asn1js": "^3.0.6", + "tslib": "^2.8.1" + } + }, + "node_modules/@peculiar/asn1-ecc": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/@peculiar/asn1-ecc/-/asn1-ecc-2.7.0.tgz", + "integrity": "sha512-n7KEs/Q/wrB415cxy4fHOBhegp4NdJ15fkJPwcB/3/8iNBQC2L/N7SChJPKDJPZGYH0jD4Tg4/0vnHmwghnbKw==", + "license": "MIT", + "dependencies": { + "@peculiar/asn1-schema": "^2.7.0", + "@peculiar/asn1-x509": "^2.7.0", + "asn1js": "^3.0.6", + "tslib": "^2.8.1" + } + }, + "node_modules/@peculiar/asn1-pfx": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/@peculiar/asn1-pfx/-/asn1-pfx-2.7.0.tgz", + "integrity": "sha512-V/nrlQVmhg7lYAsM7E13UDL5erAwFv6kCIVFqNaMIHSVi7dngcT839JkRTkQBqznMG98l2XjxYk74ZztAohZzA==", + "license": "MIT", + "dependencies": { + "@peculiar/asn1-cms": "^2.7.0", + "@peculiar/asn1-pkcs8": "^2.7.0", + "@peculiar/asn1-rsa": "^2.7.0", + "@peculiar/asn1-schema": "^2.7.0", + "asn1js": "^3.0.6", + "tslib": "^2.8.1" + } + }, + "node_modules/@peculiar/asn1-pkcs8": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/@peculiar/asn1-pkcs8/-/asn1-pkcs8-2.7.0.tgz", + "integrity": "sha512-9GTl1nE8Mx1kTZ+7QyYatDyKsm34QcWRBFkY1iPvWC3X4Dona5s/tlLiQsx5WzVdZqiMBZNYT0buyw4/vbhnjw==", + "license": "MIT", + "dependencies": { + "@peculiar/asn1-schema": "^2.7.0", + "@peculiar/asn1-x509": "^2.7.0", + "asn1js": "^3.0.6", + "tslib": "^2.8.1" + } + }, + "node_modules/@peculiar/asn1-pkcs9": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/@peculiar/asn1-pkcs9/-/asn1-pkcs9-2.7.0.tgz", + "integrity": "sha512-Bh7m+OuIaSEllPQcSd9OSp93F4ROWH7sbITWV8MI+8dwsjE5111/87VxiWVvYFKyww3vp39geLv9ENqhwWHcew==", + "license": "MIT", + "dependencies": { + "@peculiar/asn1-cms": "^2.7.0", + "@peculiar/asn1-pfx": "^2.7.0", + "@peculiar/asn1-pkcs8": "^2.7.0", + "@peculiar/asn1-schema": "^2.7.0", + "@peculiar/asn1-x509": "^2.7.0", + "@peculiar/asn1-x509-attr": "^2.7.0", + "asn1js": "^3.0.6", + "tslib": "^2.8.1" + } + }, + "node_modules/@peculiar/asn1-rsa": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/@peculiar/asn1-rsa/-/asn1-rsa-2.7.0.tgz", + "integrity": "sha512-/qvENQrXyTZURjMqSeofHul0JJt2sNSzSwk36pl2olkHbaioMQgrASDZAlHXl0xUlnVbHj0uGgOrBMTb5x2aJQ==", + "license": "MIT", + "dependencies": { + "@peculiar/asn1-schema": "^2.7.0", + "@peculiar/asn1-x509": "^2.7.0", + "asn1js": "^3.0.6", + "tslib": "^2.8.1" + } + }, + "node_modules/@peculiar/asn1-schema": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/@peculiar/asn1-schema/-/asn1-schema-2.7.0.tgz", + "integrity": "sha512-W8ZfWzLmQnrcky+eh3tni4IozMdqBDiHWU0N+vve/UGjMaUs8c0L7A2oEdkBXS8rTpWDpK/aoI3DG/L/hxmxPg==", + "license": "MIT", + "dependencies": { + "@peculiar/utils": "^2.0.2", + "asn1js": "^3.0.6", + "tslib": "^2.8.1" + } + }, + "node_modules/@peculiar/asn1-x509": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/@peculiar/asn1-x509/-/asn1-x509-2.7.0.tgz", + "integrity": "sha512-mUn9RRrkGDnG4ALfunDmzyRW5dg+sWCj/pfnCCqEHYbkGxEpvUt6iVJv8Yw1cyp6SWZ26ZE5oSmI5SqEaen15g==", + "license": "MIT", + "dependencies": { + "@peculiar/asn1-schema": "^2.7.0", + "@peculiar/utils": "^2.0.2", + "asn1js": "^3.0.6", + "tslib": "^2.8.1" + } + }, + "node_modules/@peculiar/asn1-x509-attr": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/@peculiar/asn1-x509-attr/-/asn1-x509-attr-2.7.0.tgz", + "integrity": "sha512-NS8e7SOgXipkzUPLF/sce7ukpMpWjhxYsH0n6Y+bHYo4TTxOb95Zv7hqwSuL212mj5YxovjdOKQOgH1As3E94w==", + "license": "MIT", + "dependencies": { + "@peculiar/asn1-schema": "^2.7.0", + "@peculiar/asn1-x509": "^2.7.0", + "asn1js": "^3.0.6", + "tslib": "^2.8.1" + } + }, + "node_modules/@peculiar/utils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@peculiar/utils/-/utils-2.0.3.tgz", + "integrity": "sha512-+oL3HPFRIZ1St2K50lWCXiioIgSoxzz7R1J3uF6neO2yl1sgmpgY6XXJH4BdpoDkMWznQTeYF6oWNDZLCdQ4eQ==", + "license": "MIT", + "dependencies": { + "tslib": "^2.8.1" + } + }, + "node_modules/@peculiar/x509": { + "version": "1.14.3", + "resolved": "https://registry.npmjs.org/@peculiar/x509/-/x509-1.14.3.tgz", + "integrity": "sha512-C2Xj8FZ0uHWeCXXqX5B4/gVFQmtSkiuOolzAgutjTfseNOHT3pUjljDZsTSxXFGgio54bCzVFqmEOUrIVk8RDA==", + "license": "MIT", + "dependencies": { + "@peculiar/asn1-cms": "^2.6.0", + "@peculiar/asn1-csr": "^2.6.0", + "@peculiar/asn1-ecc": "^2.6.0", + "@peculiar/asn1-pkcs9": "^2.6.0", + "@peculiar/asn1-rsa": "^2.6.0", + "@peculiar/asn1-schema": "^2.6.0", + "@peculiar/asn1-x509": "^2.6.0", + "pvtsutils": "^1.3.6", + "reflect-metadata": "^0.2.2", + "tslib": "^2.8.1", + "tsyringe": "^4.10.0" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@pnpm/config.env-replace": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@pnpm/config.env-replace/-/config.env-replace-1.1.0.tgz", + "integrity": "sha512-htyl8TWnKL7K/ESFa1oW2UB5lVDxuF5DpM7tBi6Hu2LNL3mWkIzNLG6N4zoCUP1lCKNxWy/3iu8mS8MvToGd6w==", + "license": "MIT", + "engines": { + "node": ">=12.22.0" + } + }, + "node_modules/@pnpm/network.ca-file": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@pnpm/network.ca-file/-/network.ca-file-1.0.2.tgz", + "integrity": "sha512-YcPQ8a0jwYU9bTdJDpXjMi7Brhkr1mXsXrUJvjqM2mQDgkRiz8jFaQGOdaLxgjtUfQgZhKy/O3cG/YwmgKaxLA==", + "license": "MIT", + "dependencies": { + "graceful-fs": "4.2.10" + }, + "engines": { + "node": ">=12.22.0" + } + }, + "node_modules/@pnpm/network.ca-file/node_modules/graceful-fs": { + "version": "4.2.10", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", + "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", + "license": "ISC" + }, + "node_modules/@pnpm/npm-conf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@pnpm/npm-conf/-/npm-conf-3.0.2.tgz", + "integrity": "sha512-h104Kh26rR8tm+a3Qkc5S4VLYint3FE48as7+/5oCEcKR2idC/pF1G6AhIXKI+eHPJa/3J9i5z0Al47IeGHPkA==", + "license": "MIT", + "dependencies": { + "@pnpm/config.env-replace": "^1.1.0", + "@pnpm/network.ca-file": "^1.0.1", + "config-chain": "^1.1.11" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@polka/url": { + "version": "1.0.0-next.29", + "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.29.tgz", + "integrity": "sha512-wwQAWhWSuHaag8c4q/KN/vCoeOJYshAIvMQwD4GpSb3OiZklFfvAgmj0VCBBImRpuF/aFgIRzllXlVX93Jevww==", + "license": "MIT" + }, + "node_modules/@sideway/address": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@sideway/address/-/address-4.1.5.tgz", + "integrity": "sha512-IqO/DUQHUkPeixNQ8n0JA6102hT9CmaljNTPmQ1u8MEhBo/R4Q8eKLN/vGZxuebwOroDB4cbpjheD4+/sKFK4Q==", + "license": "BSD-3-Clause", + "dependencies": { + "@hapi/hoek": "^9.0.0" + } + }, + "node_modules/@sideway/formula": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@sideway/formula/-/formula-3.0.1.tgz", + "integrity": "sha512-/poHZJJVjx3L+zVD6g9KgHfYnb443oi7wLu/XKojDviHy6HOEOA6z1Trk5aR1dGcmPenJEgb2sK2I80LeS3MIg==", + "license": "BSD-3-Clause" + }, + "node_modules/@sideway/pinpoint": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@sideway/pinpoint/-/pinpoint-2.0.0.tgz", + "integrity": "sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==", + "license": "BSD-3-Clause" + }, + "node_modules/@sinclair/typebox": { + "version": "0.27.10", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.10.tgz", + "integrity": "sha512-MTBk/3jGLNB2tVxv6uLlFh1iu64iYOQ2PbdOSK3NW8JZsmlaOh2q6sdtKowBhfw8QFLmYNzTW4/oK4uATIi6ZA==", + "license": "MIT" + }, + "node_modules/@sindresorhus/is": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz", + "integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/is?sponsor=1" + } + }, + "node_modules/@slorber/remark-comment": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@slorber/remark-comment/-/remark-comment-1.0.0.tgz", + "integrity": "sha512-RCE24n7jsOj1M0UPvIQCHTe7fI0sFL4S2nwKVWwHyVr/wI/H8GosgsJGyhnsZoGFnD/P2hLf1mSbrrgSLN93NA==", + "license": "MIT", + "dependencies": { + "micromark-factory-space": "^1.0.0", + "micromark-util-character": "^1.1.0", + "micromark-util-symbol": "^1.0.1" + } + }, + "node_modules/@svgr/babel-plugin-add-jsx-attribute": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-8.0.0.tgz", + "integrity": "sha512-b9MIk7yhdS1pMCZM8VeNfUlSKVRhsHZNMl5O9SfaX0l0t5wjdgu4IDzGB8bpnGBBOjGST3rRFVsaaEtI4W6f7g==", + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-remove-jsx-attribute": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-8.0.0.tgz", + "integrity": "sha512-BcCkm/STipKvbCl6b7QFrMh/vx00vIP63k2eM66MfHJzPr6O2U0jYEViXkHJWqXqQYjdeA9cuCl5KWmlwjDvbA==", + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-remove-jsx-empty-expression": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-8.0.0.tgz", + "integrity": "sha512-5BcGCBfBxB5+XSDSWnhTThfI9jcO5f0Ai2V24gZpG+wXF14BzwxxdDb4g6trdOux0rhibGs385BeFMSmxtS3uA==", + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-replace-jsx-attribute-value": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-8.0.0.tgz", + "integrity": "sha512-KVQ+PtIjb1BuYT3ht8M5KbzWBhdAjjUPdlMtpuw/VjT8coTrItWX6Qafl9+ji831JaJcu6PJNKCV0bp01lBNzQ==", + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-svg-dynamic-title": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-8.0.0.tgz", + "integrity": "sha512-omNiKqwjNmOQJ2v6ge4SErBbkooV2aAWwaPFs2vUY7p7GhVkzRkJ00kILXQvRhA6miHnNpXv7MRnnSjdRjK8og==", + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-svg-em-dimensions": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-8.0.0.tgz", + "integrity": "sha512-mURHYnu6Iw3UBTbhGwE/vsngtCIbHE43xCRK7kCw4t01xyGqb2Pd+WXekRRoFOBIY29ZoOhUCTEweDMdrjfi9g==", + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-transform-react-native-svg": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-8.1.0.tgz", + "integrity": "sha512-Tx8T58CHo+7nwJ+EhUwx3LfdNSG9R2OKfaIXXs5soiy5HtgoAEkDay9LIimLOcG8dJQH1wPZp/cnAv6S9CrR1Q==", + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-transform-svg-component": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-8.0.0.tgz", + "integrity": "sha512-DFx8xa3cZXTdb/k3kfPeaixecQLgKh5NVBMwD0AQxOzcZawK4oo1Jh9LbrcACUivsCA7TLG8eeWgrDXjTMhRmw==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-preset": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-preset/-/babel-preset-8.1.0.tgz", + "integrity": "sha512-7EYDbHE7MxHpv4sxvnVPngw5fuR6pw79SkcrILHJ/iMpuKySNCl5W1qcwPEpU+LgyRXOaAFgH0KhwD18wwg6ug==", + "license": "MIT", + "dependencies": { + "@svgr/babel-plugin-add-jsx-attribute": "8.0.0", + "@svgr/babel-plugin-remove-jsx-attribute": "8.0.0", + "@svgr/babel-plugin-remove-jsx-empty-expression": "8.0.0", + "@svgr/babel-plugin-replace-jsx-attribute-value": "8.0.0", + "@svgr/babel-plugin-svg-dynamic-title": "8.0.0", + "@svgr/babel-plugin-svg-em-dimensions": "8.0.0", + "@svgr/babel-plugin-transform-react-native-svg": "8.1.0", + "@svgr/babel-plugin-transform-svg-component": "8.0.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/core": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@svgr/core/-/core-8.1.0.tgz", + "integrity": "sha512-8QqtOQT5ACVlmsvKOJNEaWmRPmcojMOzCz4Hs2BGG/toAp/K38LcsMRyLp349glq5AzJbCEeimEoxaX6v/fLrA==", + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/core": "^7.21.3", + "@svgr/babel-preset": "8.1.0", + "camelcase": "^6.2.0", + "cosmiconfig": "^8.1.3", + "snake-case": "^3.0.4" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/hast-util-to-babel-ast": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-8.0.0.tgz", + "integrity": "sha512-EbDKwO9GpfWP4jN9sGdYwPBU0kdomaPIL2Eu4YwmgP+sJeXT+L7bMwJUBnhzfH8Q2qMBqZ4fJwpCyYsAN3mt2Q==", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.21.3", + "entities": "^4.4.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/plugin-jsx": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@svgr/plugin-jsx/-/plugin-jsx-8.1.0.tgz", + "integrity": "sha512-0xiIyBsLlr8quN+WyuxooNW9RJ0Dpr8uOnH/xrCVO8GLUcwHISwj1AG0k+LFzteTkAA0GbX0kj9q6Dk70PTiPA==", + "license": "MIT", + "dependencies": { + "@babel/core": "^7.21.3", + "@svgr/babel-preset": "8.1.0", + "@svgr/hast-util-to-babel-ast": "8.0.0", + "svg-parser": "^2.0.4" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@svgr/core": "*" + } + }, + "node_modules/@svgr/plugin-svgo": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@svgr/plugin-svgo/-/plugin-svgo-8.1.0.tgz", + "integrity": "sha512-Ywtl837OGO9pTLIN/onoWLmDQ4zFUycI1g76vuKGEz6evR/ZTJlJuz3G/fIkb6OVBJ2g0o6CGJzaEjfmEo3AHA==", + "license": "MIT", + "dependencies": { + "cosmiconfig": "^8.1.3", + "deepmerge": "^4.3.1", + "svgo": "^3.0.2" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@svgr/core": "*" + } + }, + "node_modules/@svgr/webpack": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@svgr/webpack/-/webpack-8.1.0.tgz", + "integrity": "sha512-LnhVjMWyMQV9ZmeEy26maJk+8HTIbd59cH4F2MJ439k9DqejRisfFNGAPvRYlKETuh9LrImlS8aKsBgKjMA8WA==", + "license": "MIT", + "dependencies": { + "@babel/core": "^7.21.3", + "@babel/plugin-transform-react-constant-elements": "^7.21.3", + "@babel/preset-env": "^7.20.2", + "@babel/preset-react": "^7.18.6", + "@babel/preset-typescript": "^7.21.0", + "@svgr/core": "8.1.0", + "@svgr/plugin-jsx": "8.1.0", + "@svgr/plugin-svgo": "8.1.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@szmarczak/http-timer": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-5.0.1.tgz", + "integrity": "sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw==", + "license": "MIT", + "dependencies": { + "defer-to-connect": "^2.0.1" + }, + "engines": { + "node": ">=14.16" + } + }, + "node_modules/@types/body-parser": { + "version": "1.19.6", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.6.tgz", + "integrity": "sha512-HLFeCYgz89uk22N5Qg3dvGvsv46B8GLvKKo1zKG4NybA8U2DiEO3w9lqGg29t/tfLRJpJ6iQxnVw4OnB7MoM9g==", + "license": "MIT", + "dependencies": { + "@types/connect": "*", + "@types/node": "*" + } + }, + "node_modules/@types/bonjour": { + "version": "3.5.13", + "resolved": "https://registry.npmjs.org/@types/bonjour/-/bonjour-3.5.13.tgz", + "integrity": "sha512-z9fJ5Im06zvUL548KvYNecEVlA7cVDkGUi6kZusb04mpyEFKCIZJvloCcmpmLaIahDpOQGHaHmG6imtPMmPXGQ==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/connect": { + "version": "3.4.38", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", + "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/connect-history-api-fallback": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.5.4.tgz", + "integrity": "sha512-n6Cr2xS1h4uAulPRdlw6Jl6s1oG8KrVilPN2yUITEs+K48EzMJJ3W1xy8K5eWuFvjp3R74AOIGSmp2UfBJ8HFw==", + "license": "MIT", + "dependencies": { + "@types/express-serve-static-core": "*", + "@types/node": "*" + } + }, + "node_modules/@types/debug": { + "version": "4.1.13", + "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.13.tgz", + "integrity": "sha512-KSVgmQmzMwPlmtljOomayoR89W4FynCAi3E8PPs7vmDVPe84hT+vGPKkJfThkmXs0x0jAaa9U8uW8bbfyS2fWw==", + "license": "MIT", + "dependencies": { + "@types/ms": "*" + } + }, + "node_modules/@types/estree": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.9.tgz", + "integrity": "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==", + "license": "MIT" + }, + "node_modules/@types/estree-jsx": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/estree-jsx/-/estree-jsx-1.0.5.tgz", + "integrity": "sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==", + "license": "MIT", + "dependencies": { + "@types/estree": "*" + } + }, + "node_modules/@types/express": { + "version": "4.17.25", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.25.tgz", + "integrity": "sha512-dVd04UKsfpINUnK0yBoYHDF3xu7xVH4BuDotC/xGuycx4CgbP48X/KF/586bcObxT0HENHXEU8Nqtu6NR+eKhw==", + "license": "MIT", + "dependencies": { + "@types/body-parser": "*", + "@types/express-serve-static-core": "^4.17.33", + "@types/qs": "*", + "@types/serve-static": "^1" + } + }, + "node_modules/@types/express-serve-static-core": { + "version": "4.19.8", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.19.8.tgz", + "integrity": "sha512-02S5fmqeoKzVZCHPZid4b8JH2eM5HzQLZWN2FohQEy/0eXTq8VXZfSN6Pcr3F6N9R/vNrj7cpgbhjie6m/1tCA==", + "license": "MIT", + "dependencies": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*", + "@types/send": "*" + } + }, + "node_modules/@types/gtag.js": { + "version": "0.0.20", + "resolved": "https://registry.npmjs.org/@types/gtag.js/-/gtag.js-0.0.20.tgz", + "integrity": "sha512-wwAbk3SA2QeU67unN7zPxjEHmPmlXwZXZvQEpbEUQuMCRGgKyE1m6XDuTUA9b6pCGb/GqJmdfMOY5LuDjJSbbg==", + "license": "MIT" + }, + "node_modules/@types/hast": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz", + "integrity": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==", + "license": "MIT", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/@types/history": { + "version": "4.7.11", + "resolved": "https://registry.npmjs.org/@types/history/-/history-4.7.11.tgz", + "integrity": "sha512-qjDJRrmvBMiTx+jyLxvLfJU7UznFuokDv4f3WRuriHKERccVpFU+8XMQUAbDzoiJCsmexxRExQeMwwCdamSKDA==", + "license": "MIT" + }, + "node_modules/@types/html-minifier-terser": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", + "integrity": "sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg==", + "license": "MIT" + }, + "node_modules/@types/http-cache-semantics": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.2.0.tgz", + "integrity": "sha512-L3LgimLHXtGkWikKnsPg0/VFx9OGZaC+eN1u4r+OB1XRqH3meBIAVC2zr1WdMH+RHmnRkqliQAOHNJ/E0j/e0Q==", + "license": "MIT" + }, + "node_modules/@types/http-errors": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.5.tgz", + "integrity": "sha512-r8Tayk8HJnX0FztbZN7oVqGccWgw98T/0neJphO91KkmOzug1KkofZURD4UaD5uH8AqcFLfdPErnBod0u71/qg==", + "license": "MIT" + }, + "node_modules/@types/http-proxy": { + "version": "1.17.17", + "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.17.tgz", + "integrity": "sha512-ED6LB+Z1AVylNTu7hdzuBqOgMnvG/ld6wGCG8wFnAzKX5uyW2K3WD52v0gnLCTK/VLpXtKckgWuyScYK6cSPaw==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/istanbul-lib-coverage": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", + "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==", + "license": "MIT" + }, + "node_modules/@types/istanbul-lib-report": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz", + "integrity": "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==", + "license": "MIT", + "dependencies": { + "@types/istanbul-lib-coverage": "*" + } + }, + "node_modules/@types/istanbul-reports": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", + "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", + "license": "MIT", + "dependencies": { + "@types/istanbul-lib-report": "*" + } + }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "license": "MIT" + }, + "node_modules/@types/mdast": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz", + "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==", + "license": "MIT", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/@types/mdx": { + "version": "2.0.13", + "resolved": "https://registry.npmjs.org/@types/mdx/-/mdx-2.0.13.tgz", + "integrity": "sha512-+OWZQfAYyio6YkJb3HLxDrvnx6SWWDbC0zVPfBRzUk0/nqoDyf6dNxQi3eArPe8rJ473nobTMQ/8Zk+LxJ+Yuw==", + "license": "MIT" + }, + "node_modules/@types/mime": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz", + "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==", + "license": "MIT" + }, + "node_modules/@types/ms": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@types/ms/-/ms-2.1.0.tgz", + "integrity": "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==", + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "25.9.1", + "resolved": "https://registry.npmjs.org/@types/node/-/node-25.9.1.tgz", + "integrity": "sha512-xfrlY7UD5rMJk3ZVJP8BNzS28J36YJg+xp+LPXV1TdWxr8uMH5A860QNxYDGQe/ylDSgjxE52Q9VnO7p75tJxg==", + "license": "MIT", + "dependencies": { + "undici-types": ">=7.24.0 <7.24.7" + } + }, + "node_modules/@types/prismjs": { + "version": "1.26.6", + "resolved": "https://registry.npmjs.org/@types/prismjs/-/prismjs-1.26.6.tgz", + "integrity": "sha512-vqlvI7qlMvcCBbVe0AKAb4f97//Hy0EBTaiW8AalRnG/xAN5zOiWWyrNqNXeq8+KAuvRewjCVY1+IPxk4RdNYw==", + "license": "MIT" + }, + "node_modules/@types/qs": { + "version": "6.15.1", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.15.1.tgz", + "integrity": "sha512-GZHUBZR9hckSUhrxmp1nG6NwdpM9fCunJwyThLW1X3AyHgd9IlHb6VANpQQqDr2o/qQp6McZ3y/IA2rVzKzSbw==", + "license": "MIT" + }, + "node_modules/@types/range-parser": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz", + "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==", + "license": "MIT" + }, + "node_modules/@types/react": { + "version": "19.2.16", + "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.16.tgz", + "integrity": "sha512-esJiCAnl0kfpNdE69f3So4WJUXy95dLZydX0KwK46riIHDzHM7O9Vtf9xCHW0PXIqvgqNrswl522kA/5yx+F4w==", + "license": "MIT", + "peer": true, + "dependencies": { + "csstype": "^3.2.2" + } + }, + "node_modules/@types/react-router": { + "version": "5.1.20", + "resolved": "https://registry.npmjs.org/@types/react-router/-/react-router-5.1.20.tgz", + "integrity": "sha512-jGjmu/ZqS7FjSH6owMcD5qpq19+1RS9DeVRqfl1FeBMxTDQAGwlMWOcs52NDoXaNKyG3d1cYQFMs9rCrb88o9Q==", + "license": "MIT", + "dependencies": { + "@types/history": "^4.7.11", + "@types/react": "*" + } + }, + "node_modules/@types/react-router-config": { + "version": "5.0.11", + "resolved": "https://registry.npmjs.org/@types/react-router-config/-/react-router-config-5.0.11.tgz", + "integrity": "sha512-WmSAg7WgqW7m4x8Mt4N6ZyKz0BubSj/2tVUMsAHp+Yd2AMwcSbeFq9WympT19p5heCFmF97R9eD5uUR/t4HEqw==", + "license": "MIT", + "dependencies": { + "@types/history": "^4.7.11", + "@types/react": "*", + "@types/react-router": "^5.1.0" + } + }, + "node_modules/@types/react-router-dom": { + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/@types/react-router-dom/-/react-router-dom-5.3.3.tgz", + "integrity": "sha512-kpqnYK4wcdm5UaWI3fLcELopqLrHgLqNsdpHauzlQktfkHL3npOSwtj1Uz9oKBAzs7lFtVkV8j83voAz2D8fhw==", + "license": "MIT", + "dependencies": { + "@types/history": "^4.7.11", + "@types/react": "*", + "@types/react-router": "*" + } + }, + "node_modules/@types/retry": { + "version": "0.12.2", + "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.2.tgz", + "integrity": "sha512-XISRgDJ2Tc5q4TRqvgJtzsRkFYNJzZrhTdtMoGVBttwzzQJkPnS3WWTFc7kuDRoPtPakl+T+OfdEUjYJj7Jbow==", + "license": "MIT" + }, + "node_modules/@types/sax": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/@types/sax/-/sax-1.2.7.tgz", + "integrity": "sha512-rO73L89PJxeYM3s3pPPjiPgVVcymqU490g0YO5n5By0k2Erzj6tay/4lr1CHAAU4JyOWd1rpQ8bCf6cZfHU96A==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/send": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@types/send/-/send-1.2.1.tgz", + "integrity": "sha512-arsCikDvlU99zl1g69TcAB3mzZPpxgw0UQnaHeC1Nwb015xp8bknZv5rIfri9xTOcMuaVgvabfIRA7PSZVuZIQ==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/serve-index": { + "version": "1.9.4", + "resolved": "https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.4.tgz", + "integrity": "sha512-qLpGZ/c2fhSs5gnYsQxtDEq3Oy8SXPClIXkW5ghvAvsNuVSA8k+gCONcUCS/UjLEYvYps+e8uBtfgXgvhwfNug==", + "license": "MIT", + "dependencies": { + "@types/express": "*" + } + }, + "node_modules/@types/serve-static": { + "version": "1.15.10", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.10.tgz", + "integrity": "sha512-tRs1dB+g8Itk72rlSI2ZrW6vZg0YrLI81iQSTkMmOqnqCaNr/8Ek4VwWcN5vZgCYWbg/JJSGBlUaYGAOP73qBw==", + "license": "MIT", + "dependencies": { + "@types/http-errors": "*", + "@types/node": "*", + "@types/send": "<1" + } + }, + "node_modules/@types/serve-static/node_modules/@types/send": { + "version": "0.17.6", + "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.6.tgz", + "integrity": "sha512-Uqt8rPBE8SY0RK8JB1EzVOIZ32uqy8HwdxCnoCOsYrvnswqmFZ/k+9Ikidlk/ImhsdvBsloHbAlewb2IEBV/Og==", + "license": "MIT", + "dependencies": { + "@types/mime": "^1", + "@types/node": "*" + } + }, + "node_modules/@types/sockjs": { + "version": "0.3.36", + "resolved": "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.36.tgz", + "integrity": "sha512-MK9V6NzAS1+Ud7JV9lJLFqW85VbC9dq3LmwZCuBe4wBDgKC0Kj/jd8Xl+nSviU+Qc3+m7umHHyHg//2KSa0a0Q==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/unist": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz", + "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==", + "license": "MIT" + }, + "node_modules/@types/ws": { + "version": "8.18.1", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.18.1.tgz", + "integrity": "sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/yargs": { + "version": "17.0.35", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.35.tgz", + "integrity": "sha512-qUHkeCyQFxMXg79wQfTtfndEC+N9ZZg76HJftDJp+qH2tV7Gj4OJi7l+PiWwJ+pWtW8GwSmqsDj/oymhrTWXjg==", + "license": "MIT", + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/@types/yargs-parser": { + "version": "21.0.3", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz", + "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==", + "license": "MIT" + }, + "node_modules/@ungap/structured-clone": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.1.tgz", + "integrity": "sha512-mUFwbeTqrVgDQxFveS+df2yfap6iuP20NAKAsBt5jDEoOTDew+zwLAOilHCeQJOVSvmgCX4ogqIrA0mnyr08yQ==", + "license": "ISC" + }, + "node_modules/@webassemblyjs/ast": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.14.1.tgz", + "integrity": "sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==", + "license": "MIT", + "dependencies": { + "@webassemblyjs/helper-numbers": "1.13.2", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2" + } + }, + "node_modules/@webassemblyjs/floating-point-hex-parser": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.13.2.tgz", + "integrity": "sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA==", + "license": "MIT" + }, + "node_modules/@webassemblyjs/helper-api-error": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.13.2.tgz", + "integrity": "sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ==", + "license": "MIT" + }, + "node_modules/@webassemblyjs/helper-buffer": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.14.1.tgz", + "integrity": "sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA==", + "license": "MIT" + }, + "node_modules/@webassemblyjs/helper-numbers": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.13.2.tgz", + "integrity": "sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA==", + "license": "MIT", + "dependencies": { + "@webassemblyjs/floating-point-hex-parser": "1.13.2", + "@webassemblyjs/helper-api-error": "1.13.2", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/helper-wasm-bytecode": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.13.2.tgz", + "integrity": "sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA==", + "license": "MIT" + }, + "node_modules/@webassemblyjs/helper-wasm-section": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.14.1.tgz", + "integrity": "sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw==", + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/wasm-gen": "1.14.1" + } + }, + "node_modules/@webassemblyjs/ieee754": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.13.2.tgz", + "integrity": "sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw==", + "license": "MIT", + "dependencies": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "node_modules/@webassemblyjs/leb128": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.13.2.tgz", + "integrity": "sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw==", + "license": "Apache-2.0", + "dependencies": { + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/utf8": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.13.2.tgz", + "integrity": "sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ==", + "license": "MIT" + }, + "node_modules/@webassemblyjs/wasm-edit": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.14.1.tgz", + "integrity": "sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ==", + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/helper-wasm-section": "1.14.1", + "@webassemblyjs/wasm-gen": "1.14.1", + "@webassemblyjs/wasm-opt": "1.14.1", + "@webassemblyjs/wasm-parser": "1.14.1", + "@webassemblyjs/wast-printer": "1.14.1" + } + }, + "node_modules/@webassemblyjs/wasm-gen": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.14.1.tgz", + "integrity": "sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg==", + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/ieee754": "1.13.2", + "@webassemblyjs/leb128": "1.13.2", + "@webassemblyjs/utf8": "1.13.2" + } + }, + "node_modules/@webassemblyjs/wasm-opt": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.14.1.tgz", + "integrity": "sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw==", + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/wasm-gen": "1.14.1", + "@webassemblyjs/wasm-parser": "1.14.1" + } + }, + "node_modules/@webassemblyjs/wasm-parser": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.14.1.tgz", + "integrity": "sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ==", + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-api-error": "1.13.2", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/ieee754": "1.13.2", + "@webassemblyjs/leb128": "1.13.2", + "@webassemblyjs/utf8": "1.13.2" + } + }, + "node_modules/@webassemblyjs/wast-printer": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.14.1.tgz", + "integrity": "sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw==", + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@xtuc/ieee754": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", + "license": "BSD-3-Clause" + }, + "node_modules/@xtuc/long": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", + "license": "Apache-2.0" + }, + "node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "license": "MIT", + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/accepts/node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/accepts/node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/accepts/node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/acorn": { + "version": "8.16.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.16.0.tgz", + "integrity": "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==", + "license": "MIT", + "peer": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-import-phases": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/acorn-import-phases/-/acorn-import-phases-1.0.4.tgz", + "integrity": "sha512-wKmbr/DDiIXzEOiWrTTUcDm24kQ2vGfZQvM2fwg2vXqR5uW6aapr7ObPtj1th32b9u90/Pf4AItvdTh42fBmVQ==", + "license": "MIT", + "engines": { + "node": ">=10.13.0" + }, + "peerDependencies": { + "acorn": "^8.14.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "license": "MIT", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/acorn-walk": { + "version": "8.3.5", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.5.tgz", + "integrity": "sha512-HEHNfbars9v4pgpW6SO1KSPkfoS0xVOM/9UzkJltjlsHZmJasxg8aXkuZa7SMf8vKGIBhpUsPluQSqhJFCqebw==", + "license": "MIT", + "dependencies": { + "acorn": "^8.11.0" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/address": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/address/-/address-1.2.2.tgz", + "integrity": "sha512-4B/qKCfeE/ODUaAUpSwfzazo5x29WD4r3vXiWsB7I2mSDAihwEqKO+g8GELZUQSSAo5e1XTYh3ZVfLyxBc12nA==", + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/aggregate-error": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", + "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", + "license": "MIT", + "dependencies": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ajv": { + "version": "8.20.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.20.0.tgz", + "integrity": "sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA==", + "license": "MIT", + "peer": true, + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-formats": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", + "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", + "license": "MIT", + "dependencies": { + "ajv": "^8.0.0" + }, + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, + "node_modules/ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3" + }, + "peerDependencies": { + "ajv": "^8.8.2" + } + }, + "node_modules/algoliasearch": { + "version": "5.53.0", + "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-5.53.0.tgz", + "integrity": "sha512-OGW1q6b91CRSSeiOnM8LxuR5NYJ2esvw66jUZ4IIvdv+ItNkx3pwLuyR+jaCdbGee4ov5WgUnyPryyh11xvByQ==", + "license": "MIT", + "peer": true, + "dependencies": { + "@algolia/abtesting": "1.19.0", + "@algolia/client-abtesting": "5.53.0", + "@algolia/client-analytics": "5.53.0", + "@algolia/client-common": "5.53.0", + "@algolia/client-insights": "5.53.0", + "@algolia/client-personalization": "5.53.0", + "@algolia/client-query-suggestions": "5.53.0", + "@algolia/client-search": "5.53.0", + "@algolia/ingestion": "1.53.0", + "@algolia/monitoring": "1.53.0", + "@algolia/recommend": "5.53.0", + "@algolia/requester-browser-xhr": "5.53.0", + "@algolia/requester-fetch": "5.53.0", + "@algolia/requester-node-http": "5.53.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/algoliasearch-helper": { + "version": "3.29.1", + "resolved": "https://registry.npmjs.org/algoliasearch-helper/-/algoliasearch-helper-3.29.1.tgz", + "integrity": "sha512-6ck2YFudF2Pje7szQoPBiRFTGfd+1I+0I/WfLPGn0bj1kvrFoOQmNyedNiDxTk3/r4IfSLDYk+RA4G7u8H6+yA==", + "license": "MIT", + "dependencies": { + "@algolia/events": "^4.0.1" + }, + "peerDependencies": { + "algoliasearch": ">= 3.1 < 6" + } + }, + "node_modules/ansi-align": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz", + "integrity": "sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==", + "license": "ISC", + "dependencies": { + "string-width": "^4.1.0" + } + }, + "node_modules/ansi-align/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "license": "MIT" + }, + "node_modules/ansi-align/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-html-community": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz", + "integrity": "sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==", + "engines": [ + "node >= 0.8.0" + ], + "license": "Apache-2.0", + "bin": { + "ansi-html": "bin/ansi-html" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/ansis": { + "version": "3.17.0", + "resolved": "https://registry.npmjs.org/ansis/-/ansis-3.17.0.tgz", + "integrity": "sha512-0qWUglt9JEqLFr3w1I1pbrChn1grhaiAR2ocX1PP/flRmxgtwTzPFFFnfIlD6aMOLQZgSuCRlidD70lvx8yhzg==", + "license": "ISC", + "engines": { + "node": ">=14" + } + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "license": "ISC", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/arg": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", + "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", + "license": "MIT" + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "license": "Python-2.0" + }, + "node_modules/array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", + "license": "MIT" + }, + "node_modules/array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/asn1js": { + "version": "3.0.10", + "resolved": "https://registry.npmjs.org/asn1js/-/asn1js-3.0.10.tgz", + "integrity": "sha512-S2s3aOytiKdFRdulw2qPE51MzjzVOisppcVv7jVFR+Kw0kxwvFrDcYA0h7Ndqbmj0HkMIXYWaoj7fli8kgx1eg==", + "license": "BSD-3-Clause", + "dependencies": { + "pvtsutils": "^1.3.6", + "pvutils": "^1.1.5", + "tslib": "^2.8.1" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/astring": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/astring/-/astring-1.9.0.tgz", + "integrity": "sha512-LElXdjswlqjWrPpJFg1Fx4wpkOCxj1TDHlSV4PlaRxHGWko024xICaa97ZkMfs6DRKlCguiAI+rbXv5GWwXIkg==", + "license": "MIT", + "bin": { + "astring": "bin/astring" + } + }, + "node_modules/autoprefixer": { + "version": "10.5.0", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.5.0.tgz", + "integrity": "sha512-FMhOoZV4+qR6aTUALKX2rEqGG+oyATvwBt9IIzVR5rMa2HRWPkxf+P+PAJLD1I/H5/II+HuZcBJYEFBpq39ong==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/autoprefixer" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "browserslist": "^4.28.2", + "caniuse-lite": "^1.0.30001787", + "fraction.js": "^5.3.4", + "picocolors": "^1.1.1", + "postcss-value-parser": "^4.2.0" + }, + "bin": { + "autoprefixer": "bin/autoprefixer" + }, + "engines": { + "node": "^10 || ^12 || >=14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/babel-loader": { + "version": "9.2.1", + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-9.2.1.tgz", + "integrity": "sha512-fqe8naHt46e0yIdkjUZYqddSXfej3AHajX+CSO5X7oy0EmPc6o5Xh+RClNoHjnieWz9AW4kZxW9yyFMhVB1QLA==", + "license": "MIT", + "dependencies": { + "find-cache-dir": "^4.0.0", + "schema-utils": "^4.0.0" + }, + "engines": { + "node": ">= 14.15.0" + }, + "peerDependencies": { + "@babel/core": "^7.12.0", + "webpack": ">=5" + } + }, + "node_modules/babel-plugin-dynamic-import-node": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz", + "integrity": "sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==", + "license": "MIT", + "dependencies": { + "object.assign": "^4.1.0" + } + }, + "node_modules/babel-plugin-polyfill-corejs2": { + "version": "0.4.17", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.17.tgz", + "integrity": "sha512-aTyf30K/rqAsNwN76zYrdtx8obu0E4KoUME29B1xj+B3WxgvWkp943vYQ+z8Mv3lw9xHXMHpvSPOBxzAkIa94w==", + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.28.6", + "@babel/helper-define-polyfill-provider": "^0.6.8", + "semver": "^6.3.1" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/babel-plugin-polyfill-corejs2/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/babel-plugin-polyfill-corejs3": { + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.13.0.tgz", + "integrity": "sha512-U+GNwMdSFgzVmfhNm8GJUX88AadB3uo9KpJqS3FaqNIPKgySuvMb+bHPsOmmuWyIcuqZj/pzt1RUIUZns4y2+A==", + "license": "MIT", + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.6.5", + "core-js-compat": "^3.43.0" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/babel-plugin-polyfill-regenerator": { + "version": "0.6.8", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.8.tgz", + "integrity": "sha512-M762rNHfSF1EV3SLtnCJXFoQbbIIz0OyRwnCmV0KPC7qosSfCO0QLTSuJX3ayAebubhE6oYBAYPrBA5ljowaZg==", + "license": "MIT", + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.6.8" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/bail": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/bail/-/bail-2.0.2.tgz", + "integrity": "sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "license": "MIT" + }, + "node_modules/baseline-browser-mapping": { + "version": "2.10.33", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.33.tgz", + "integrity": "sha512-bA6+tcSLpz2tIEdDXZPpPTIuxBcC4+w6SieaYyfigIa4h8GlFxbA17v22Vx3JUtuZQj9SgOsnbK+aTBzyDyEuw==", + "license": "Apache-2.0", + "bin": { + "baseline-browser-mapping": "dist/cli.cjs" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/batch": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", + "integrity": "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==", + "license": "MIT" + }, + "node_modules/big.js": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/binary-extensions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/body-parser": { + "version": "1.20.5", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.5.tgz", + "integrity": "sha512-3grm+/2tUOvu2cjJkvsIxrv/wVpfXQW4PsQHYm7yk4vfpu7Ekl6nEsYBoJUL6qDwZUx8wUhQ8tR2qz+ad9c9OA==", + "license": "MIT", + "dependencies": { + "bytes": "~3.1.2", + "content-type": "~1.0.5", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "~1.2.0", + "http-errors": "~2.0.1", + "iconv-lite": "~0.4.24", + "on-finished": "~2.4.1", + "qs": "~6.15.1", + "raw-body": "~2.5.3", + "type-is": "~1.6.18", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/body-parser/node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/body-parser/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/body-parser/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" + }, + "node_modules/bonjour-service": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.4.0.tgz", + "integrity": "sha512-fGQtj1qdR9vIKjFiWPQd52qIqwjaYqhcI40JEiDuvlZ86E7ZBPBwY9fPgHy9r2rYGIjiRfctNPYz6OQU73ww2w==", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "multicast-dns": "^7.2.5" + } + }, + "node_modules/boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", + "license": "ISC" + }, + "node_modules/boxen": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/boxen/-/boxen-6.2.1.tgz", + "integrity": "sha512-H4PEsJXfFI/Pt8sjDWbHlQPx4zL/bvSQjcilJmaulGt5mLDorHOHpmdXAJcBcmru7PhYSp/cDMWRko4ZUMFkSw==", + "license": "MIT", + "dependencies": { + "ansi-align": "^3.0.1", + "camelcase": "^6.2.0", + "chalk": "^4.1.2", + "cli-boxes": "^3.0.0", + "string-width": "^5.0.1", + "type-fest": "^2.5.0", + "widest-line": "^4.0.1", + "wrap-ansi": "^8.0.1" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/brace-expansion": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.15.tgz", + "integrity": "sha512-EwOCDEex4quD37XhqM3omwtMoJjr//isUZz1JopUNWms+4Z2ViyM/k1YIRePpoVNnQhENnxtFjLaxNHrT7xIUg==", + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "license": "MIT", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.28.2", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.2.tgz", + "integrity": "sha512-48xSriZYYg+8qXna9kwqjIVzuQxi+KYWp2+5nCYnYKPTr0LvD89Jqk2Or5ogxz0NUMfIjhh2lIUX/LyX9B4oIg==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "peer": true, + "dependencies": { + "baseline-browser-mapping": "^2.10.12", + "caniuse-lite": "^1.0.30001782", + "electron-to-chromium": "^1.5.328", + "node-releases": "^2.0.36", + "update-browserslist-db": "^1.2.3" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "license": "MIT" + }, + "node_modules/bundle-name": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bundle-name/-/bundle-name-4.1.0.tgz", + "integrity": "sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==", + "license": "MIT", + "dependencies": { + "run-applescript": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/bytes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", + "integrity": "sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/bytestreamjs": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/bytestreamjs/-/bytestreamjs-2.0.1.tgz", + "integrity": "sha512-U1Z/ob71V/bXfVABvNr/Kumf5VyeQRBEm6Txb0PQ6S7V5GpBM3w4Cbqz/xPDicR5tN0uvDifng8C+5qECeGwyQ==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/cacheable-lookup": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-7.0.0.tgz", + "integrity": "sha512-+qJyx4xiKra8mZrcwhjMRMUhD5NR1R8esPkzIYxX96JiecFoxAXFuz/GpR3+ev4PE1WamHip78wV0vcmPQtp8w==", + "license": "MIT", + "engines": { + "node": ">=14.16" + } + }, + "node_modules/cacheable-request": { + "version": "10.2.14", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-10.2.14.tgz", + "integrity": "sha512-zkDT5WAF4hSSoUgyfg5tFIxz8XQK+25W/TLVojJTMKBaxevLBBtLxgqguAuVQB8PVW79FVjHcU+GJ9tVbDZ9mQ==", + "license": "MIT", + "dependencies": { + "@types/http-cache-semantics": "^4.0.2", + "get-stream": "^6.0.1", + "http-cache-semantics": "^4.1.1", + "keyv": "^4.5.3", + "mimic-response": "^4.0.0", + "normalize-url": "^8.0.0", + "responselike": "^3.0.0" + }, + "engines": { + "node": ">=14.16" + } + }, + "node_modules/call-bind": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.9.tgz", + "integrity": "sha512-a/hy+pNsFUTR+Iz8TCJvXudKVLAnz/DyeSUo10I5yvFDQJBFU2s9uqQpoSrJlroHUKoKqzg+epxyP9lqFdzfBQ==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "get-intrinsic": "^1.3.0", + "set-function-length": "^1.2.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/call-bound": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/camel-case": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz", + "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==", + "license": "MIT", + "dependencies": { + "pascal-case": "^3.1.2", + "tslib": "^2.0.3" + } + }, + "node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/caniuse-api": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz", + "integrity": "sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==", + "license": "MIT", + "dependencies": { + "browserslist": "^4.0.0", + "caniuse-lite": "^1.0.0", + "lodash.memoize": "^4.1.2", + "lodash.uniq": "^4.5.0" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001793", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001793.tgz", + "integrity": "sha512-iwSsYWaCOoh26cV8NwNRViHlrfUvYsHDfRVcbtmw0Kg6PJIZZXwMkj1442FYLBGkeUf1juAsU3DTfxW579mrPA==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "CC-BY-4.0" + }, + "node_modules/ccount": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz", + "integrity": "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/char-regex": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", + "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/character-entities": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-2.0.2.tgz", + "integrity": "sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-entities-html4": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-2.1.0.tgz", + "integrity": "sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-entities-legacy": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz", + "integrity": "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-reference-invalid": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-2.0.1.tgz", + "integrity": "sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/cheerio": { + "version": "1.0.0-rc.12", + "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.12.tgz", + "integrity": "sha512-VqR8m68vM46BNnuZ5NtnGBKIE/DfN0cRIzg9n40EIq9NOv90ayxLBXA8fXC5gquFRGJSTRqBq25Jt2ECLR431Q==", + "license": "MIT", + "dependencies": { + "cheerio-select": "^2.1.0", + "dom-serializer": "^2.0.0", + "domhandler": "^5.0.3", + "domutils": "^3.0.1", + "htmlparser2": "^8.0.1", + "parse5": "^7.0.0", + "parse5-htmlparser2-tree-adapter": "^7.0.0" + }, + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/cheeriojs/cheerio?sponsor=1" + } + }, + "node_modules/cheerio-select": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cheerio-select/-/cheerio-select-2.1.0.tgz", + "integrity": "sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==", + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0", + "css-select": "^5.1.0", + "css-what": "^6.1.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3", + "domutils": "^3.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "license": "MIT", + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/chrome-trace-event": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.4.tgz", + "integrity": "sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==", + "license": "MIT", + "engines": { + "node": ">=6.0" + } + }, + "node_modules/ci-info": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", + "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/clean-css": { + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.3.3.tgz", + "integrity": "sha512-D5J+kHaVb/wKSFcyyV75uCn8fiY4sV38XJoe4CUyGQ+mOU/fMVYUdH1hJC+CJQ5uY3EnW27SbJYS4X8BiLrAFg==", + "license": "MIT", + "dependencies": { + "source-map": "~0.6.0" + }, + "engines": { + "node": ">= 10.0" + } + }, + "node_modules/clean-css/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/clean-stack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/cli-boxes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-3.0.0.tgz", + "integrity": "sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-table3": { + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.5.tgz", + "integrity": "sha512-+W/5efTR7y5HRD7gACw9yQjqMVvEMLBHmboM/kPWam+H+Hmyrgjh6YncVKK122YZkXrLudzTuAukUw9FnMf7IQ==", + "license": "MIT", + "dependencies": { + "string-width": "^4.2.0" + }, + "engines": { + "node": "10.* || >= 12.*" + }, + "optionalDependencies": { + "@colors/colors": "1.5.0" + } + }, + "node_modules/cli-table3/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "license": "MIT" + }, + "node_modules/cli-table3/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/clone-deep": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", + "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", + "license": "MIT", + "dependencies": { + "is-plain-object": "^2.0.4", + "kind-of": "^6.0.2", + "shallow-clone": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/clsx": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", + "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/collapse-white-space": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/collapse-white-space/-/collapse-white-space-2.1.0.tgz", + "integrity": "sha512-loKTxY1zCOuG4j9f6EPnuyyYkf58RnhhWTvRoZEokgB+WbdXehfjFviyOVYkqzEWz1Q5kRiZdBYS5SwxbQYwzw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "license": "MIT" + }, + "node_modules/colord": { + "version": "2.9.3", + "resolved": "https://registry.npmjs.org/colord/-/colord-2.9.3.tgz", + "integrity": "sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==", + "license": "MIT" + }, + "node_modules/colorette": { + "version": "2.0.20", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", + "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", + "license": "MIT" + }, + "node_modules/combine-promises": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/combine-promises/-/combine-promises-1.2.0.tgz", + "integrity": "sha512-VcQB1ziGD0NXrhKxiwyNbCDmRzs/OShMs2GqW2DlU2A/Sd0nQxE1oWDAE5O0ygSx5mgQOn9eIFh7yKPgFRVkPQ==", + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/comma-separated-tokens": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz", + "integrity": "sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/commander": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz", + "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==", + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/common-path-prefix": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/common-path-prefix/-/common-path-prefix-3.0.0.tgz", + "integrity": "sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w==", + "license": "ISC" + }, + "node_modules/compressible": { + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", + "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", + "license": "MIT", + "dependencies": { + "mime-db": ">= 1.43.0 < 2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/compressible/node_modules/mime-db": { + "version": "1.54.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", + "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/compression": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/compression/-/compression-1.8.1.tgz", + "integrity": "sha512-9mAqGPHLakhCLeNyxPkK4xVo746zQ/czLH1Ky+vkitMnWfWZps8r0qXuwhwizagCRttsL4lfG4pIOvaWLpAP0w==", + "license": "MIT", + "dependencies": { + "bytes": "3.1.2", + "compressible": "~2.0.18", + "debug": "2.6.9", + "negotiator": "~0.6.4", + "on-headers": "~1.1.0", + "safe-buffer": "5.2.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/compression/node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/compression/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/compression/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "license": "MIT" + }, + "node_modules/config-chain": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.13.tgz", + "integrity": "sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==", + "license": "MIT", + "dependencies": { + "ini": "^1.3.4", + "proto-list": "~1.2.1" + } + }, + "node_modules/config-chain/node_modules/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "license": "ISC" + }, + "node_modules/configstore": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/configstore/-/configstore-6.0.0.tgz", + "integrity": "sha512-cD31W1v3GqUlQvbBCGcXmd2Nj9SvLDOP1oQ0YFuLETufzSPaKp11rYBsSOm7rCsW3OnIRAFM3OxRhceaXNYHkA==", + "license": "BSD-2-Clause", + "dependencies": { + "dot-prop": "^6.0.1", + "graceful-fs": "^4.2.6", + "unique-string": "^3.0.0", + "write-file-atomic": "^3.0.3", + "xdg-basedir": "^5.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/yeoman/configstore?sponsor=1" + } + }, + "node_modules/connect-history-api-fallback": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz", + "integrity": "sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA==", + "license": "MIT", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/consola": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/consola/-/consola-3.4.2.tgz", + "integrity": "sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==", + "license": "MIT", + "engines": { + "node": "^14.18.0 || >=16.10.0" + } + }, + "node_modules/content-disposition": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz", + "integrity": "sha512-kRGRZw3bLlFISDBgwTSA1TMBFN6J6GWDeubmDE3AF+3+yXL8hTWv8r5rkLbqYXY4RjPk/EzHnClI3zQf1cFmHA==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "license": "MIT" + }, + "node_modules/cookie": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz", + "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.7.tgz", + "integrity": "sha512-NXdYc3dLr47pBkpUCHtKSwIOQXLVn8dZEuywboCOJY/osA0wFSLlSawr3KN8qXJEyX66FcONTH8EIlVuK0yyFA==", + "license": "MIT" + }, + "node_modules/copy-text-to-clipboard": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/copy-text-to-clipboard/-/copy-text-to-clipboard-3.2.2.tgz", + "integrity": "sha512-T6SqyLd1iLuqPA90J5N4cTalrtovCySh58iiZDGJ6FGznbclKh4UI+FGacQSgFzwKG77W7XT5gwbVEbd9cIH1A==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/copy-webpack-plugin": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-11.0.0.tgz", + "integrity": "sha512-fX2MWpamkW0hZxMEg0+mYnA40LTosOSa5TqZ9GYIBzyJa9C3QUaMPSE2xAi/buNr8u89SfD9wHSQVBzrRa/SOQ==", + "license": "MIT", + "dependencies": { + "fast-glob": "^3.2.11", + "glob-parent": "^6.0.1", + "globby": "^13.1.1", + "normalize-path": "^3.0.0", + "schema-utils": "^4.0.0", + "serialize-javascript": "^6.0.0" + }, + "engines": { + "node": ">= 14.15.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.1.0" + } + }, + "node_modules/copy-webpack-plugin/node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/copy-webpack-plugin/node_modules/globby": { + "version": "13.2.2", + "resolved": "https://registry.npmjs.org/globby/-/globby-13.2.2.tgz", + "integrity": "sha512-Y1zNGV+pzQdh7H39l9zgB4PJqjRNqydvdYCDG4HFXM4XuvSaQQlEc91IU1yALL8gUTDomgBAfz3XJdmUS+oo0w==", + "license": "MIT", + "dependencies": { + "dir-glob": "^3.0.1", + "fast-glob": "^3.3.0", + "ignore": "^5.2.4", + "merge2": "^1.4.1", + "slash": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/copy-webpack-plugin/node_modules/slash": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", + "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/core-js": { + "version": "3.49.0", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.49.0.tgz", + "integrity": "sha512-es1U2+YTtzpwkxVLwAFdSpaIMyQaq0PBgm3YD1W3Qpsn1NAmO3KSgZfu+oGSWVu6NvLHoHCV/aYcsE5wiB7ALg==", + "hasInstallScript": true, + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/core-js-compat": { + "version": "3.49.0", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.49.0.tgz", + "integrity": "sha512-VQXt1jr9cBz03b331DFDCCP90b3fanciLkgiOoy8SBHy06gNf+vQ1A3WFLqG7I8TipYIKeYK9wxd0tUrvHcOZA==", + "license": "MIT", + "dependencies": { + "browserslist": "^4.28.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", + "license": "MIT" + }, + "node_modules/cosmiconfig": { + "version": "8.3.6", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.3.6.tgz", + "integrity": "sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==", + "license": "MIT", + "dependencies": { + "import-fresh": "^3.3.0", + "js-yaml": "^4.1.0", + "parse-json": "^5.2.0", + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/d-fischer" + }, + "peerDependencies": { + "typescript": ">=4.9.5" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/crypto-random-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-4.0.0.tgz", + "integrity": "sha512-x8dy3RnvYdlUcPOjkEHqozhiwzKNSq7GcPuXFbnyMOCHxX8V3OgIg/pYuabl2sbUPfIJaeAQB7PMOK8DFIdoRA==", + "license": "MIT", + "dependencies": { + "type-fest": "^1.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/crypto-random-string/node_modules/type-fest": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz", + "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==", + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/css-blank-pseudo": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/css-blank-pseudo/-/css-blank-pseudo-7.0.1.tgz", + "integrity": "sha512-jf+twWGDf6LDoXDUode+nc7ZlrqfaNphrBIBrcmeP3D8yw1uPaix1gCC8LUQUGQ6CycuK2opkbFFWFuq/a94ag==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "postcss-selector-parser": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/css-blank-pseudo/node_modules/postcss-selector-parser": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", + "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/css-declaration-sorter": { + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-7.4.0.tgz", + "integrity": "sha512-LTuzjPoyA2vMGKKcaOqKSp7Ub2eGrNfKiZH4LpezxpNrsICGCSFvsQOI29psISxNZtaXibkC2CXzrQ5enMeGGw==", + "license": "ISC", + "engines": { + "node": "^14 || ^16 || >=18" + }, + "peerDependencies": { + "postcss": "^8.0.9" + } + }, + "node_modules/css-has-pseudo": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/css-has-pseudo/-/css-has-pseudo-7.0.3.tgz", + "integrity": "sha512-oG+vKuGyqe/xvEMoxAQrhi7uY16deJR3i7wwhBerVrGQKSqUC5GiOVxTpM9F9B9hw0J+eKeOWLH7E9gZ1Dr5rA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/selector-specificity": "^5.0.0", + "postcss-selector-parser": "^7.0.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/css-has-pseudo/node_modules/@csstools/selector-specificity": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-5.0.0.tgz", + "integrity": "sha512-PCqQV3c4CoVm3kdPhyeZ07VmBRdH2EpMFA/pd9OASpOEC3aXNGoqPDAZ80D0cLpMBxnmk0+yNhGsEx31hq7Gtw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss-selector-parser": "^7.0.0" + } + }, + "node_modules/css-has-pseudo/node_modules/postcss-selector-parser": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", + "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", + "license": "MIT", + "peer": true, + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/css-loader": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.11.0.tgz", + "integrity": "sha512-CTJ+AEQJjq5NzLga5pE39qdiSV56F8ywCIsqNIRF0r7BDgWsN25aazToqAFg7ZrtA/U016xudB3ffgweORxX7g==", + "license": "MIT", + "dependencies": { + "icss-utils": "^5.1.0", + "postcss": "^8.4.33", + "postcss-modules-extract-imports": "^3.1.0", + "postcss-modules-local-by-default": "^4.0.5", + "postcss-modules-scope": "^3.2.0", + "postcss-modules-values": "^4.0.0", + "postcss-value-parser": "^4.2.0", + "semver": "^7.5.4" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "@rspack/core": "0.x || 1.x", + "webpack": "^5.0.0" + }, + "peerDependenciesMeta": { + "@rspack/core": { + "optional": true + }, + "webpack": { + "optional": true + } + } + }, + "node_modules/css-minimizer-webpack-plugin": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/css-minimizer-webpack-plugin/-/css-minimizer-webpack-plugin-5.0.1.tgz", + "integrity": "sha512-3caImjKFQkS+ws1TGcFn0V1HyDJFq1Euy589JlD6/3rV2kj+w7r5G9WDMgSHvpvXHNZ2calVypZWuEDQd9wfLg==", + "license": "MIT", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.18", + "cssnano": "^6.0.1", + "jest-worker": "^29.4.3", + "postcss": "^8.4.24", + "schema-utils": "^4.0.1", + "serialize-javascript": "^6.0.1" + }, + "engines": { + "node": ">= 14.15.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" + }, + "peerDependenciesMeta": { + "@parcel/css": { + "optional": true + }, + "@swc/css": { + "optional": true + }, + "clean-css": { + "optional": true + }, + "csso": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "lightningcss": { + "optional": true + } + } + }, + "node_modules/css-prefers-color-scheme": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/css-prefers-color-scheme/-/css-prefers-color-scheme-10.0.0.tgz", + "integrity": "sha512-VCtXZAWivRglTZditUfB4StnsWr6YVZ2PRtuxQLKTNRdtAf8tpzaVPE9zXIF3VaSc7O70iK/j1+NXxyQCqdPjQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/css-select": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.2.2.tgz", + "integrity": "sha512-TizTzUddG/xYLA3NXodFM0fSbNizXjOKhqiQQwvhlspadZokn1KDy0NZFS0wuEubIYAV5/c1/lAr0TaaFXEXzw==", + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^6.1.0", + "domhandler": "^5.0.2", + "domutils": "^3.0.1", + "nth-check": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/css-tree": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.3.1.tgz", + "integrity": "sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==", + "license": "MIT", + "dependencies": { + "mdn-data": "2.0.30", + "source-map-js": "^1.0.1" + }, + "engines": { + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0" + } + }, + "node_modules/css-what": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.2.2.tgz", + "integrity": "sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA==", + "license": "BSD-2-Clause", + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/cssdb": { + "version": "8.9.0", + "resolved": "https://registry.npmjs.org/cssdb/-/cssdb-8.9.0.tgz", + "integrity": "sha512-J8jOU/hLjaXcO1LldOLraJSQpfLXRKof0I7mtbRyOy2AAXgqst0x9rlgi2qXeD6d0ou3ZLqcPAMqYVbpCbrxEw==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + } + ], + "license": "MIT-0" + }, + "node_modules/cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "license": "MIT", + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/cssnano": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-6.1.2.tgz", + "integrity": "sha512-rYk5UeX7VAM/u0lNqewCdasdtPK81CgX8wJFLEIXHbV2oldWRgJAsZrdhRXkV1NJzA2g850KiFm9mMU2HxNxMA==", + "license": "MIT", + "dependencies": { + "cssnano-preset-default": "^6.1.2", + "lilconfig": "^3.1.1" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/cssnano" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/cssnano-preset-advanced": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/cssnano-preset-advanced/-/cssnano-preset-advanced-6.1.2.tgz", + "integrity": "sha512-Nhao7eD8ph2DoHolEzQs5CfRpiEP0xa1HBdnFZ82kvqdmbwVBUr2r1QuQ4t1pi+D1ZpqpcO4T+wy/7RxzJ/WPQ==", + "license": "MIT", + "dependencies": { + "autoprefixer": "^10.4.19", + "browserslist": "^4.23.0", + "cssnano-preset-default": "^6.1.2", + "postcss-discard-unused": "^6.0.5", + "postcss-merge-idents": "^6.0.3", + "postcss-reduce-idents": "^6.0.3", + "postcss-zindex": "^6.0.2" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/cssnano-preset-default": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-6.1.2.tgz", + "integrity": "sha512-1C0C+eNaeN8OcHQa193aRgYexyJtU8XwbdieEjClw+J9d94E41LwT6ivKH0WT+fYwYWB0Zp3I3IZ7tI/BbUbrg==", + "license": "MIT", + "dependencies": { + "browserslist": "^4.23.0", + "css-declaration-sorter": "^7.2.0", + "cssnano-utils": "^4.0.2", + "postcss-calc": "^9.0.1", + "postcss-colormin": "^6.1.0", + "postcss-convert-values": "^6.1.0", + "postcss-discard-comments": "^6.0.2", + "postcss-discard-duplicates": "^6.0.3", + "postcss-discard-empty": "^6.0.3", + "postcss-discard-overridden": "^6.0.2", + "postcss-merge-longhand": "^6.0.5", + "postcss-merge-rules": "^6.1.1", + "postcss-minify-font-values": "^6.1.0", + "postcss-minify-gradients": "^6.0.3", + "postcss-minify-params": "^6.1.0", + "postcss-minify-selectors": "^6.0.4", + "postcss-normalize-charset": "^6.0.2", + "postcss-normalize-display-values": "^6.0.2", + "postcss-normalize-positions": "^6.0.2", + "postcss-normalize-repeat-style": "^6.0.2", + "postcss-normalize-string": "^6.0.2", + "postcss-normalize-timing-functions": "^6.0.2", + "postcss-normalize-unicode": "^6.1.0", + "postcss-normalize-url": "^6.0.2", + "postcss-normalize-whitespace": "^6.0.2", + "postcss-ordered-values": "^6.0.2", + "postcss-reduce-initial": "^6.1.0", + "postcss-reduce-transforms": "^6.0.2", + "postcss-svgo": "^6.0.3", + "postcss-unique-selectors": "^6.0.4" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/cssnano-utils": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/cssnano-utils/-/cssnano-utils-4.0.2.tgz", + "integrity": "sha512-ZR1jHg+wZ8o4c3zqf1SIUSTIvm/9mU343FMR6Obe/unskbvpGhZOo1J6d/r8D1pzkRQYuwbcH3hToOuoA2G7oQ==", + "license": "MIT", + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/csso": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/csso/-/csso-5.0.5.tgz", + "integrity": "sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ==", + "license": "MIT", + "dependencies": { + "css-tree": "~2.2.0" + }, + "engines": { + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0", + "npm": ">=7.0.0" + } + }, + "node_modules/csso/node_modules/css-tree": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.2.1.tgz", + "integrity": "sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA==", + "license": "MIT", + "dependencies": { + "mdn-data": "2.0.28", + "source-map-js": "^1.0.1" + }, + "engines": { + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0", + "npm": ">=7.0.0" + } + }, + "node_modules/csso/node_modules/mdn-data": { + "version": "2.0.28", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.28.tgz", + "integrity": "sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g==", + "license": "CC0-1.0" + }, + "node_modules/csstype": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", + "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", + "license": "MIT" + }, + "node_modules/debounce": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/debounce/-/debounce-1.2.1.tgz", + "integrity": "sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug==", + "license": "MIT" + }, + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decode-named-character-reference": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/decode-named-character-reference/-/decode-named-character-reference-1.3.0.tgz", + "integrity": "sha512-GtpQYB283KrPp6nRw50q3U9/VfOutZOe103qlN7BPP6Ad27xYnOIWv4lPzo8HCAL+mMZofJ9KEy30fq6MfaK6Q==", + "license": "MIT", + "dependencies": { + "character-entities": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/decompress-response": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", + "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", + "license": "MIT", + "dependencies": { + "mimic-response": "^3.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/decompress-response/node_modules/mimic-response": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", + "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", + "license": "MIT", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/deepmerge": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/default-browser": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/default-browser/-/default-browser-5.5.0.tgz", + "integrity": "sha512-H9LMLr5zwIbSxrmvikGuI/5KGhZ8E2zH3stkMgM5LpOWDutGM2JZaj460Udnf1a+946zc7YBgrqEWwbk7zHvGw==", + "license": "MIT", + "dependencies": { + "bundle-name": "^4.1.0", + "default-browser-id": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/default-browser-id": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/default-browser-id/-/default-browser-id-5.0.1.tgz", + "integrity": "sha512-x1VCxdX4t+8wVfd1so/9w+vQ4vx7lKd2Qp5tDRutErwmR85OgmfX7RlLRMWafRMY7hbEiXIbudNrjOAPa/hL8Q==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/defer-to-connect": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz", + "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==", + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/define-lazy-prop": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", + "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/define-properties": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", + "license": "MIT", + "dependencies": { + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/dequal": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", + "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "license": "MIT", + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/detect-node": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", + "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", + "license": "MIT" + }, + "node_modules/detect-port": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/detect-port/-/detect-port-1.6.1.tgz", + "integrity": "sha512-CmnVc+Hek2egPx1PeTFVta2W78xy2K/9Rkf6cC4T59S50tVnzKj+tnx5mmx5lwvCkujZ4uRrpRSuV+IVs3f90Q==", + "license": "MIT", + "dependencies": { + "address": "^1.0.1", + "debug": "4" + }, + "bin": { + "detect": "bin/detect-port.js", + "detect-port": "bin/detect-port.js" + }, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/devlop": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/devlop/-/devlop-1.1.0.tgz", + "integrity": "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==", + "license": "MIT", + "dependencies": { + "dequal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "license": "MIT", + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/dns-packet": { + "version": "5.6.1", + "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.6.1.tgz", + "integrity": "sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw==", + "license": "MIT", + "dependencies": { + "@leichtgewicht/ip-codec": "^2.0.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/dom-converter": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz", + "integrity": "sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==", + "license": "MIT", + "dependencies": { + "utila": "~0.4" + } + }, + "node_modules/dom-serializer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", + "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", + "license": "MIT", + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "entities": "^4.2.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "license": "BSD-2-Clause" + }, + "node_modules/domhandler": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", + "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", + "license": "BSD-2-Clause", + "dependencies": { + "domelementtype": "^2.3.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/domutils": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.2.2.tgz", + "integrity": "sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==", + "license": "BSD-2-Clause", + "dependencies": { + "dom-serializer": "^2.0.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "node_modules/dot-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz", + "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==", + "license": "MIT", + "dependencies": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/dot-prop": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-6.0.1.tgz", + "integrity": "sha512-tE7ztYzXHIeyvc7N+hR3oi7FIbf/NIjVP9hmAt3yMXzrQ072/fpjGLx2GxNxGxUl5V73MEqYzioOMoVhGMJ5cA==", + "license": "MIT", + "dependencies": { + "is-obj": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/dot-prop/node_modules/is-obj": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", + "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/duplexer": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", + "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==", + "license": "MIT" + }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "license": "MIT" + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", + "license": "MIT" + }, + "node_modules/electron-to-chromium": { + "version": "1.5.367", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.367.tgz", + "integrity": "sha512-4Mk/mrynCNQ+atY40D3UpmhLWB6AHMbYMlIrPhHcMF6x0L7O0b052FCAsxw1LlaR++UFuNg3D/A6XCuGDa0guQ==", + "license": "ISC" + }, + "node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "license": "MIT" + }, + "node_modules/emojilib": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/emojilib/-/emojilib-2.4.0.tgz", + "integrity": "sha512-5U0rVMU5Y2n2+ykNLQqMoqklN9ICBT/KsvC1Gz6vqHbz2AXXGkG+Pm5rMWk/8Vjrr/mY9985Hi8DYzn1F09Nyw==", + "license": "MIT" + }, + "node_modules/emojis-list": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/emoticon": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/emoticon/-/emoticon-4.1.0.tgz", + "integrity": "sha512-VWZfnxqwNcc51hIy/sbOdEem6D+cVtpPzEEtVAFdaas30+1dgkyaOQ4sQ6Bp0tOMqWO1v+HQfYaoodOkdhK6SQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/encodeurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/enhanced-resolve": { + "version": "5.22.2", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.22.2.tgz", + "integrity": "sha512-0rxICaFZ7NQho/sHely2bvOPRP0Eu2B0NZ9zM54YvRvWMn7jfz3DmnOZDR9LlXDdDcqntAVc6Hfy4gr/tdH/Ag==", + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.3.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/error-ex": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.4.tgz", + "integrity": "sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==", + "license": "MIT", + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-module-lexer": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-2.1.0.tgz", + "integrity": "sha512-n27zTYMjYu1aj4MjCWzSP7G9r75utsaoc8m61weK+W8JMBGGQybd43GstCXZ3WNmSFtGT9wi59qQTW6mhTR5LQ==", + "license": "MIT" + }, + "node_modules/es-object-atoms": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.2.tgz", + "integrity": "sha512-HWcBoN6NileqtSydK2FqHbS/LoDd2pqrnQHLyJzBj4kOp/ky2MWMN694xOfkK8/SnUsW2DH7EfyVlydKCsm1Zw==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/esast-util-from-estree": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/esast-util-from-estree/-/esast-util-from-estree-2.0.0.tgz", + "integrity": "sha512-4CyanoAudUSBAn5K13H4JhsMH6L9ZP7XbLVe/dKybkxMO7eDyLsT8UHl9TRNrU2Gr9nz+FovfSIjuXWJ81uVwQ==", + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "devlop": "^1.0.0", + "estree-util-visit": "^2.0.0", + "unist-util-position-from-estree": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/esast-util-from-js": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/esast-util-from-js/-/esast-util-from-js-2.0.1.tgz", + "integrity": "sha512-8Ja+rNJ0Lt56Pcf3TAmpBZjmx8ZcK5Ts4cAzIOjsjevg9oSXJnl6SUQ2EevU8tv3h6ZLWmoKL5H4fgWvdvfETw==", + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "acorn": "^8.0.0", + "esast-util-from-estree": "^2.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-goat": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-goat/-/escape-goat-4.0.0.tgz", + "integrity": "sha512-2Sd4ShcWxbx6OY1IHyla/CVNwvg7XwZVoXZHcSu9w9SReNP1EzzD5T8NWKIR38fIqEns9kDWKUQTXXAmlDrdPg==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", + "license": "MIT" + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "license": "BSD-2-Clause", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "license": "BSD-2-Clause", + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esrecurse/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estree-util-attach-comments": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/estree-util-attach-comments/-/estree-util-attach-comments-3.0.0.tgz", + "integrity": "sha512-cKUwm/HUcTDsYh/9FgnuFqpfquUbwIqwKM26BVCGDPVgvaCl/nDCCjUfiLlx6lsEZ3Z4RFxNbOQ60pkaEwFxGw==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/estree-util-build-jsx": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/estree-util-build-jsx/-/estree-util-build-jsx-3.0.1.tgz", + "integrity": "sha512-8U5eiL6BTrPxp/CHbs2yMgP8ftMhR5ww1eIKoWRMlqvltHF8fZn5LRDvTKuxD3DUn+shRbLGqXemcP51oFCsGQ==", + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "devlop": "^1.0.0", + "estree-util-is-identifier-name": "^3.0.0", + "estree-walker": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/estree-util-is-identifier-name": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/estree-util-is-identifier-name/-/estree-util-is-identifier-name-3.0.0.tgz", + "integrity": "sha512-hFtqIDZTIUZ9BXLb8y4pYGyk6+wekIivNVTcmvk8NoOh+VeRn5y6cEHzbURrWbfp1fIqdVipilzj+lfaadNZmg==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/estree-util-scope": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/estree-util-scope/-/estree-util-scope-1.0.0.tgz", + "integrity": "sha512-2CAASclonf+JFWBNJPndcOpA8EMJwa0Q8LUFJEKqXLW6+qBvbFZuF5gItbQOs/umBUkjviCSDCbBwU2cXbmrhQ==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "devlop": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/estree-util-to-js": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/estree-util-to-js/-/estree-util-to-js-2.0.0.tgz", + "integrity": "sha512-WDF+xj5rRWmD5tj6bIqRi6CkLIXbbNQUcxQHzGysQzvHmdYG2G7p/Tf0J0gpxGgkeMZNTIjT/AoSvC9Xehcgdg==", + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "astring": "^1.8.0", + "source-map": "^0.7.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/estree-util-value-to-estree": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/estree-util-value-to-estree/-/estree-util-value-to-estree-3.5.0.tgz", + "integrity": "sha512-aMV56R27Gv3QmfmF1MY12GWkGzzeAezAX+UplqHVASfjc9wNzI/X6hC0S9oxq61WT4aQesLGslWP9tKk6ghRZQ==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/remcohaszing" + } + }, + "node_modules/estree-util-visit": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/estree-util-visit/-/estree-util-visit-2.0.0.tgz", + "integrity": "sha512-m5KgiH85xAhhW8Wta0vShLcUvOsh3LLPI2YVwcbio1l7E09NTLL1EyMZFM1OyWowoH0skScNbhOPl4kcBgzTww==", + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/estree-walker": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", + "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eta": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/eta/-/eta-2.2.0.tgz", + "integrity": "sha512-UVQ72Rqjy/ZKQalzV5dCCJP80GrmPrMxh6NlNf+erV6ObL0ZFkhCstWRawS85z3smdr3d2wXPsZEY7rDPfGd2g==", + "license": "MIT", + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "url": "https://github.com/eta-dev/eta?sponsor=1" + } + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/eval": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/eval/-/eval-0.1.8.tgz", + "integrity": "sha512-EzV94NYKoO09GLXGjXj9JIlXijVck4ONSr5wiCWDvhsvj5jxSrzTmRU/9C1DyB6uToszLs8aifA6NQ7lEQdvFw==", + "dependencies": { + "@types/node": "*", + "require-like": ">= 0.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/eventemitter3": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", + "license": "MIT" + }, + "node_modules/events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "license": "MIT", + "engines": { + "node": ">=0.8.x" + } + }, + "node_modules/execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "license": "MIT", + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/express": { + "version": "4.22.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.22.2.tgz", + "integrity": "sha512-IuL+Elrou2ZvCFHs18/CIzy2Nzvo25nZ1/D2eIZlz7c+QUayAcYoiM2BthCjs+EBHVpjYjcuLDAiCWgeIX3X1Q==", + "license": "MIT", + "dependencies": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "~1.20.5", + "content-disposition": "~0.5.4", + "content-type": "~1.0.4", + "cookie": "~0.7.1", + "cookie-signature": "~1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "~1.3.1", + "fresh": "~0.5.2", + "http-errors": "~2.0.0", + "merge-descriptors": "1.0.3", + "methods": "~1.1.2", + "on-finished": "~2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "~0.1.12", + "proxy-addr": "~2.0.7", + "qs": "~6.15.1", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "~0.19.0", + "serve-static": "~1.16.2", + "setprototypeof": "1.2.0", + "statuses": "~2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/express/node_modules/content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "license": "MIT", + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/express/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/express/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" + }, + "node_modules/express/node_modules/path-to-regexp": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.13.tgz", + "integrity": "sha512-A/AGNMFN3c8bOlvV9RreMdrv7jsmF9XIfDeCd87+I8RNg6s78BhJxMu69NEMHBSJFxKidViTEdruRwEk/WIKqA==", + "license": "MIT" + }, + "node_modules/express/node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "license": "MIT" + }, + "node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "license": "MIT", + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "license": "MIT" + }, + "node_modules/fast-glob": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", + "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.8" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "license": "MIT" + }, + "node_modules/fast-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.2.tgz", + "integrity": "sha512-rVjf7ArG3LTk+FS6Yw81V1DLuZl1bRbNrev6Tmd/9RaroeeRRJhAt7jg/6YFxbvAQXUCavSoZhPPj6oOx+5KjQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "BSD-3-Clause" + }, + "node_modules/fastq": { + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.20.1.tgz", + "integrity": "sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==", + "license": "ISC", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/fault": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/fault/-/fault-2.0.1.tgz", + "integrity": "sha512-WtySTkS4OKev5JtpHXnib4Gxiurzh5NCGvWrFaZ34m6JehfTUhKZvn9njTfw48t6JumVQOmrKqpmGcdwxnhqBQ==", + "license": "MIT", + "dependencies": { + "format": "^0.2.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/faye-websocket": { + "version": "0.11.4", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz", + "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==", + "license": "Apache-2.0", + "dependencies": { + "websocket-driver": ">=0.5.1" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/feed": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/feed/-/feed-4.2.2.tgz", + "integrity": "sha512-u5/sxGfiMfZNtJ3OvQpXcvotFpYkL0n9u9mM2vkui2nGo8b4wvDkJ8gAkYqbA8QpGyFCv3RK0Z+Iv+9veCS9bQ==", + "license": "MIT", + "dependencies": { + "xml-js": "^1.6.11" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/file-loader": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-6.2.0.tgz", + "integrity": "sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw==", + "license": "MIT", + "dependencies": { + "loader-utils": "^2.0.0", + "schema-utils": "^3.0.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.0.0 || ^5.0.0" + } + }, + "node_modules/file-loader/node_modules/ajv": { + "version": "6.15.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.15.0.tgz", + "integrity": "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==", + "license": "MIT", + "peer": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/file-loader/node_modules/ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "license": "MIT", + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/file-loader/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "license": "MIT" + }, + "node_modules/file-loader/node_modules/schema-utils": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", + "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/finalhandler": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.2.tgz", + "integrity": "sha512-aA4RyPcd3badbdABGDuTXCMTtOneUCAYH/gxoYRTZlIJdF0YPWuGqiAsIrhNnnqdXGswYk6dGujem4w80UJFhg==", + "license": "MIT", + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "on-finished": "~2.4.1", + "parseurl": "~1.3.3", + "statuses": "~2.0.2", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/finalhandler/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/finalhandler/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" + }, + "node_modules/find-cache-dir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-4.0.0.tgz", + "integrity": "sha512-9ZonPT4ZAK4a+1pUPVPZJapbi7O5qbbJPdYw/NOQWZZbVLdDTYM3A4R9z/DpAM08IDaFGsvPgiGZ82WEwUDWjg==", + "license": "MIT", + "dependencies": { + "common-path-prefix": "^3.0.0", + "pkg-dir": "^7.0.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/find-up": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-6.3.0.tgz", + "integrity": "sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==", + "license": "MIT", + "dependencies": { + "locate-path": "^7.1.0", + "path-exists": "^5.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", + "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", + "license": "BSD-3-Clause", + "bin": { + "flat": "cli.js" + } + }, + "node_modules/follow-redirects": { + "version": "1.16.0", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.16.0.tgz", + "integrity": "sha512-y5rN/uOsadFT/JfYwhxRS5R7Qce+g3zG97+JrtFZlC9klX/W5hD7iiLzScI4nZqUS7DNUdhPgw4xI8W2LuXlUw==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "license": "MIT", + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/form-data-encoder": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/form-data-encoder/-/form-data-encoder-2.1.4.tgz", + "integrity": "sha512-yDYSgNMraqvnxiEXO4hi88+YZxaHC6QKzb5N84iRCTDeRO7ZALpir/lVmf/uXUhnwUr2O4HU8s/n6x+yNjQkHw==", + "license": "MIT", + "engines": { + "node": ">= 14.17" + } + }, + "node_modules/format": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/format/-/format-0.2.2.tgz", + "integrity": "sha512-wzsgA6WOq+09wrU1tsJ09udeR/YZRaeArL9e1wPbFg3GG2yDnC2ldKpxs4xunpFF9DgqCqOIra3bc1HWrJ37Ww==", + "engines": { + "node": ">=0.4.x" + } + }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fraction.js": { + "version": "5.3.4", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-5.3.4.tgz", + "integrity": "sha512-1X1NTtiJphryn/uLQz3whtY6jK3fTqoE3ohKs0tT+Ujr1W59oopxmoEh7Lu5p6vBaPbgoM0bzveAW4Qi5RyWDQ==", + "license": "MIT", + "engines": { + "node": "*" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/rawify" + } + }, + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fs-extra": { + "version": "11.3.5", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.5.tgz", + "integrity": "sha512-eKpRKAovdpZtR1WopLHxlBWvAgPny3c4gX1G5Jhwmmw4XJj0ifSD5qB5TOo8hmA0wlRKDAOAhEE1yVPgs6Fgcg==", + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=14.14" + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-own-enumerable-property-symbols": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz", + "integrity": "sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==", + "license": "ISC" + }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/github-slugger": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/github-slugger/-/github-slugger-1.5.0.tgz", + "integrity": "sha512-wIh+gKBI9Nshz2o46B0B3f5k/W+WI9ZAv6y5Dn5WJ5SK1t0TnDimB4WE5rmTD05ZAIn8HALCZVmCsvj0w0v0lw==", + "license": "ISC" + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/glob-to-regex.js": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/glob-to-regex.js/-/glob-to-regex.js-1.2.0.tgz", + "integrity": "sha512-QMwlOQKU/IzqMUOAZWubUOT8Qft+Y0KQWnX9nK3ch0CJg0tTp4TvGZsTfudYKv2NzoQSyPcnA6TYeIQ3jGichQ==", + "license": "Apache-2.0", + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/glob-to-regexp": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", + "license": "BSD-2-Clause" + }, + "node_modules/global-dirs": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-3.0.1.tgz", + "integrity": "sha512-NBcGGFbBA9s1VzD41QXDG+3++t9Mn5t1FpLdhESY6oKY4gYTFpX4wO3sqGUa0Srjtbfj3szX0RnemmrVRUdULA==", + "license": "MIT", + "dependencies": { + "ini": "2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "license": "MIT", + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/got": { + "version": "12.6.1", + "resolved": "https://registry.npmjs.org/got/-/got-12.6.1.tgz", + "integrity": "sha512-mThBblvlAF1d4O5oqyvN+ZxLAYwIJK7bpMxgYqPD9okW0C3qm5FFn7k811QrcuEBwaogR3ngOFoCfs6mRv7teQ==", + "license": "MIT", + "dependencies": { + "@sindresorhus/is": "^5.2.0", + "@szmarczak/http-timer": "^5.0.1", + "cacheable-lookup": "^7.0.0", + "cacheable-request": "^10.2.8", + "decompress-response": "^6.0.0", + "form-data-encoder": "^2.1.2", + "get-stream": "^6.0.1", + "http2-wrapper": "^2.1.10", + "lowercase-keys": "^3.0.0", + "p-cancelable": "^3.0.0", + "responselike": "^3.0.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sindresorhus/got?sponsor=1" + } + }, + "node_modules/got/node_modules/@sindresorhus/is": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-5.6.0.tgz", + "integrity": "sha512-TV7t8GKYaJWsn00tFDqBw8+Uqmr8A0fRU1tvTQhyZzGv0sJCGRQL3JGMI3ucuKo3XIZdUP+Lx7/gh2t3lewy7g==", + "license": "MIT", + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sindresorhus/is?sponsor=1" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "license": "ISC" + }, + "node_modules/gray-matter": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/gray-matter/-/gray-matter-4.0.3.tgz", + "integrity": "sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q==", + "license": "MIT", + "dependencies": { + "js-yaml": "^3.13.1", + "kind-of": "^6.0.2", + "section-matter": "^1.0.0", + "strip-bom-string": "^1.0.0" + }, + "engines": { + "node": ">=6.0" + } + }, + "node_modules/gray-matter/node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "license": "MIT", + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/gray-matter/node_modules/js-yaml": { + "version": "3.14.2", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.2.tgz", + "integrity": "sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg==", + "license": "MIT", + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/gzip-size": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-6.0.0.tgz", + "integrity": "sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q==", + "license": "MIT", + "dependencies": { + "duplexer": "^0.1.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/handle-thing": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", + "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==", + "license": "MIT" + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-yarn": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-yarn/-/has-yarn-3.0.0.tgz", + "integrity": "sha512-IrsVwUHhEULx3R8f/aA8AHuEzAorplsab/v8HBzEiIukwq5i/EC+xmOW+HfP1OaDP+2JkgT1yILHN2O3UFIbcA==", + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/hasown": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.4.tgz", + "integrity": "sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==", + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/hast-util-from-parse5": { + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/hast-util-from-parse5/-/hast-util-from-parse5-8.0.3.tgz", + "integrity": "sha512-3kxEVkEKt0zvcZ3hCRYI8rqrgwtlIOFMWkbclACvjlDw8Li9S2hk/d51OI0nr/gIpdMHNepwgOKqZ/sy0Clpyg==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "devlop": "^1.0.0", + "hastscript": "^9.0.0", + "property-information": "^7.0.0", + "vfile": "^6.0.0", + "vfile-location": "^5.0.0", + "web-namespaces": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-parse-selector": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/hast-util-parse-selector/-/hast-util-parse-selector-4.0.0.tgz", + "integrity": "sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-raw": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/hast-util-raw/-/hast-util-raw-9.1.0.tgz", + "integrity": "sha512-Y8/SBAHkZGoNkpzqqfCldijcuUKh7/su31kEBp67cFY09Wy0mTRgtsLYsiIxMJxlu0f6AA5SUTbDR8K0rxnbUw==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "@ungap/structured-clone": "^1.0.0", + "hast-util-from-parse5": "^8.0.0", + "hast-util-to-parse5": "^8.0.0", + "html-void-elements": "^3.0.0", + "mdast-util-to-hast": "^13.0.0", + "parse5": "^7.0.0", + "unist-util-position": "^5.0.0", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.0", + "web-namespaces": "^2.0.0", + "zwitch": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-to-estree": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/hast-util-to-estree/-/hast-util-to-estree-3.1.3.tgz", + "integrity": "sha512-48+B/rJWAp0jamNbAAf9M7Uf//UVqAoMmgXhBdxTDJLGKY+LRnZ99qcG+Qjl5HfMpYNzS5v4EAwVEF34LeAj7w==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "comma-separated-tokens": "^2.0.0", + "devlop": "^1.0.0", + "estree-util-attach-comments": "^3.0.0", + "estree-util-is-identifier-name": "^3.0.0", + "hast-util-whitespace": "^3.0.0", + "mdast-util-mdx-expression": "^2.0.0", + "mdast-util-mdx-jsx": "^3.0.0", + "mdast-util-mdxjs-esm": "^2.0.0", + "property-information": "^7.0.0", + "space-separated-tokens": "^2.0.0", + "style-to-js": "^1.0.0", + "unist-util-position": "^5.0.0", + "zwitch": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-to-jsx-runtime": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/hast-util-to-jsx-runtime/-/hast-util-to-jsx-runtime-2.3.6.tgz", + "integrity": "sha512-zl6s8LwNyo1P9uw+XJGvZtdFF1GdAkOg8ujOw+4Pyb76874fLps4ueHXDhXWdk6YHQ6OgUtinliG7RsYvCbbBg==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "comma-separated-tokens": "^2.0.0", + "devlop": "^1.0.0", + "estree-util-is-identifier-name": "^3.0.0", + "hast-util-whitespace": "^3.0.0", + "mdast-util-mdx-expression": "^2.0.0", + "mdast-util-mdx-jsx": "^3.0.0", + "mdast-util-mdxjs-esm": "^2.0.0", + "property-information": "^7.0.0", + "space-separated-tokens": "^2.0.0", + "style-to-js": "^1.0.0", + "unist-util-position": "^5.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-to-parse5": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/hast-util-to-parse5/-/hast-util-to-parse5-8.0.1.tgz", + "integrity": "sha512-MlWT6Pjt4CG9lFCjiz4BH7l9wmrMkfkJYCxFwKQic8+RTZgWPuWxwAfjJElsXkex7DJjfSJsQIt931ilUgmwdA==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "comma-separated-tokens": "^2.0.0", + "devlop": "^1.0.0", + "property-information": "^7.0.0", + "space-separated-tokens": "^2.0.0", + "web-namespaces": "^2.0.0", + "zwitch": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-whitespace": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-3.0.0.tgz", + "integrity": "sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hastscript": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/hastscript/-/hastscript-9.0.1.tgz", + "integrity": "sha512-g7df9rMFX/SPi34tyGCyUBREQoKkapwdY/T04Qn9TDWfHhAYt4/I0gMVirzK5wEzeUqIjEB+LXC/ypb7Aqno5w==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "comma-separated-tokens": "^2.0.0", + "hast-util-parse-selector": "^4.0.0", + "property-information": "^7.0.0", + "space-separated-tokens": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "license": "MIT", + "bin": { + "he": "bin/he" + } + }, + "node_modules/history": { + "version": "4.10.1", + "resolved": "https://registry.npmjs.org/history/-/history-4.10.1.tgz", + "integrity": "sha512-36nwAD620w12kuzPAsyINPWJqlNbij+hpK1k9XRloDtym8mxzGYl2c17LnV6IAGB2Dmg4tEa7G7DlawS0+qjew==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.1.2", + "loose-envify": "^1.2.0", + "resolve-pathname": "^3.0.0", + "tiny-invariant": "^1.0.2", + "tiny-warning": "^1.0.0", + "value-equal": "^1.0.1" + } + }, + "node_modules/hoist-non-react-statics": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", + "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==", + "license": "BSD-3-Clause", + "dependencies": { + "react-is": "^16.7.0" + } + }, + "node_modules/hpack.js": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", + "integrity": "sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==", + "license": "MIT", + "dependencies": { + "inherits": "^2.0.1", + "obuf": "^1.0.0", + "readable-stream": "^2.0.1", + "wbuf": "^1.1.0" + } + }, + "node_modules/hpack.js/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "license": "MIT" + }, + "node_modules/hpack.js/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "license": "MIT", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/hpack.js/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "license": "MIT" + }, + "node_modules/hpack.js/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "license": "MIT" + }, + "node_modules/html-minifier-terser": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-7.2.0.tgz", + "integrity": "sha512-tXgn3QfqPIpGl9o+K5tpcj3/MN4SfLtsx2GWwBC3SSd0tXQGyF3gsSqad8loJgKZGM3ZxbYDd5yhiBIdWpmvLA==", + "license": "MIT", + "dependencies": { + "camel-case": "^4.1.2", + "clean-css": "~5.3.2", + "commander": "^10.0.0", + "entities": "^4.4.0", + "param-case": "^3.0.4", + "relateurl": "^0.2.7", + "terser": "^5.15.1" + }, + "bin": { + "html-minifier-terser": "cli.js" + }, + "engines": { + "node": "^14.13.1 || >=16.0.0" + } + }, + "node_modules/html-minifier-terser/node_modules/commander": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", + "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==", + "license": "MIT", + "engines": { + "node": ">=14" + } + }, + "node_modules/html-tags": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-3.3.1.tgz", + "integrity": "sha512-ztqyC3kLto0e9WbNp0aeP+M3kTt+nbaIveGmUxAtZa+8iFgKLUOD4YKM5j+f3QD89bra7UeumolZHKuOXnTmeQ==", + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/html-void-elements": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/html-void-elements/-/html-void-elements-3.0.0.tgz", + "integrity": "sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/html-webpack-plugin": { + "version": "5.6.7", + "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-5.6.7.tgz", + "integrity": "sha512-md+vXtdCAe60s1k6AU3dUyMJnDxUyQAwfwPKoLisvgUF1IXjtlLsk2se54+qfL9Mdm26bbwvjJybpNx48NKRLw==", + "license": "MIT", + "dependencies": { + "@types/html-minifier-terser": "^6.0.0", + "html-minifier-terser": "^6.0.2", + "lodash": "^4.17.21", + "pretty-error": "^4.0.0", + "tapable": "^2.0.0" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/html-webpack-plugin" + }, + "peerDependencies": { + "@rspack/core": "0.x || 1.x", + "webpack": "^5.20.0" + }, + "peerDependenciesMeta": { + "@rspack/core": { + "optional": true + }, + "webpack": { + "optional": true + } + } + }, + "node_modules/html-webpack-plugin/node_modules/commander": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", + "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", + "license": "MIT", + "engines": { + "node": ">= 12" + } + }, + "node_modules/html-webpack-plugin/node_modules/html-minifier-terser": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", + "integrity": "sha512-YXxSlJBZTP7RS3tWnQw74ooKa6L9b9i9QYXY21eUEvhZ3u9XLfv6OnFsQq6RxkhHygsaUMvYsZRV5rU/OVNZxw==", + "license": "MIT", + "dependencies": { + "camel-case": "^4.1.2", + "clean-css": "^5.2.2", + "commander": "^8.3.0", + "he": "^1.2.0", + "param-case": "^3.0.4", + "relateurl": "^0.2.7", + "terser": "^5.10.0" + }, + "bin": { + "html-minifier-terser": "cli.js" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/htmlparser2": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.2.tgz", + "integrity": "sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==", + "funding": [ + "https://github.com/fb55/htmlparser2?sponsor=1", + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "license": "MIT", + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3", + "domutils": "^3.0.1", + "entities": "^4.4.0" + } + }, + "node_modules/http-cache-semantics": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.2.0.tgz", + "integrity": "sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ==", + "license": "BSD-2-Clause" + }, + "node_modules/http-deceiver": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", + "integrity": "sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==", + "license": "MIT" + }, + "node_modules/http-errors": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.1.tgz", + "integrity": "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==", + "license": "MIT", + "dependencies": { + "depd": "~2.0.0", + "inherits": "~2.0.4", + "setprototypeof": "~1.2.0", + "statuses": "~2.0.2", + "toidentifier": "~1.0.1" + }, + "engines": { + "node": ">= 0.8" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/http-parser-js": { + "version": "0.5.10", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.10.tgz", + "integrity": "sha512-Pysuw9XpUq5dVc/2SMHpuTY01RFl8fttgcyunjL7eEMhGM3cI4eOmiCycJDVCo/7O7ClfQD3SaI6ftDzqOXYMA==", + "license": "MIT" + }, + "node_modules/http-proxy": { + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", + "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", + "license": "MIT", + "dependencies": { + "eventemitter3": "^4.0.0", + "follow-redirects": "^1.0.0", + "requires-port": "^1.0.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/http-proxy-middleware": { + "version": "2.0.9", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.9.tgz", + "integrity": "sha512-c1IyJYLYppU574+YI7R4QyX2ystMtVXZwIdzazUIPIJsHuWNd+mho2j+bKoHftndicGj9yh+xjd+l0yj7VeT1Q==", + "license": "MIT", + "dependencies": { + "@types/http-proxy": "^1.17.8", + "http-proxy": "^1.18.1", + "is-glob": "^4.0.1", + "is-plain-obj": "^3.0.0", + "micromatch": "^4.0.2" + }, + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "@types/express": "^4.17.13" + }, + "peerDependenciesMeta": { + "@types/express": { + "optional": true + } + } + }, + "node_modules/http-proxy-middleware/node_modules/is-plain-obj": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz", + "integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/http2-wrapper": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-2.2.1.tgz", + "integrity": "sha512-V5nVw1PAOgfI3Lmeaj2Exmeg7fenjhRUgz1lPSezy1CuhPYbgQtbQj4jZfEAEMlaL+vupsvhjqCyjzob0yxsmQ==", + "license": "MIT", + "dependencies": { + "quick-lru": "^5.1.1", + "resolve-alpn": "^1.2.0" + }, + "engines": { + "node": ">=10.19.0" + } + }, + "node_modules/human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "license": "Apache-2.0", + "engines": { + "node": ">=10.17.0" + } + }, + "node_modules/hyperdyperid": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/hyperdyperid/-/hyperdyperid-1.2.0.tgz", + "integrity": "sha512-Y93lCzHYgGWdrJ66yIktxiaGULYc6oGiABxhcO5AufBeOyoIdZF7bIfLaOrbM0iGIOXQQgxxRrFEnb+Y6w1n4A==", + "license": "MIT", + "engines": { + "node": ">=10.18" + } + }, + "node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/icss-utils": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", + "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", + "license": "ISC", + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/image-size": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/image-size/-/image-size-2.0.2.tgz", + "integrity": "sha512-IRqXKlaXwgSMAMtpNzZa1ZAe8m+Sa1770Dhk8VkSsP9LS+iHD62Zd8FQKs8fbPiagBE7BzoFX23cxFnwshpV6w==", + "license": "MIT", + "bin": { + "image-size": "bin/image-size.js" + }, + "engines": { + "node": ">=16.x" + } + }, + "node_modules/import-fresh": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", + "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", + "license": "MIT", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/import-lazy": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-4.0.0.tgz", + "integrity": "sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "license": "MIT", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/infima": { + "version": "0.2.0-alpha.45", + "resolved": "https://registry.npmjs.org/infima/-/infima-0.2.0-alpha.45.tgz", + "integrity": "sha512-uyH0zfr1erU1OohLk0fT4Rrb94AOhguWNOcD9uGrSpRvNB+6gZXUoJX5J0NtvzBO10YZ9PgvA4NFgt+fYg8ojw==", + "license": "MIT", + "engines": { + "node": ">=12" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "license": "ISC" + }, + "node_modules/ini": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz", + "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==", + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/inline-style-parser": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.2.7.tgz", + "integrity": "sha512-Nb2ctOyNR8DqQoR0OwRG95uNWIC0C1lCgf5Naz5H6Ji72KZ8OcFZLz2P5sNgwlyoJ8Yif11oMuYs5pBQa86csA==", + "license": "MIT" + }, + "node_modules/invariant": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", + "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.0.0" + } + }, + "node_modules/ipaddr.js": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.4.0.tgz", + "integrity": "sha512-9VGk3HGanVE6JoZXHiCpnGy5X0jYDnN4EA4lntFPj+1vIWlFhIylq2CrrCOJH9EAhc5CYhq18F2Av2tgoAPsYQ==", + "license": "MIT", + "engines": { + "node": ">= 10" + } + }, + "node_modules/is-alphabetical": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-2.0.1.tgz", + "integrity": "sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-alphanumerical": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-2.0.1.tgz", + "integrity": "sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==", + "license": "MIT", + "dependencies": { + "is-alphabetical": "^2.0.0", + "is-decimal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "license": "MIT" + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "license": "MIT", + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-ci": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-3.0.1.tgz", + "integrity": "sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ==", + "license": "MIT", + "dependencies": { + "ci-info": "^3.2.0" + }, + "bin": { + "is-ci": "bin.js" + } + }, + "node_modules/is-core-module": { + "version": "2.16.2", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.2.tgz", + "integrity": "sha512-evOr8xfXKxE6qSR0hSXL2r3sd7ALj8+7jQEUvPYcm5sgZFdJ+AYzT6yNmJenvIYQBgIGwfwz08sL8zoL7yq2BA==", + "license": "MIT", + "dependencies": { + "hasown": "^2.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-decimal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-2.0.1.tgz", + "integrity": "sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-docker": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", + "license": "MIT", + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-hexadecimal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-2.0.1.tgz", + "integrity": "sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-inside-container": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-inside-container/-/is-inside-container-1.0.0.tgz", + "integrity": "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==", + "license": "MIT", + "dependencies": { + "is-docker": "^3.0.0" + }, + "bin": { + "is-inside-container": "cli.js" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-inside-container/node_modules/is-docker": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz", + "integrity": "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==", + "license": "MIT", + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-installed-globally": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.4.0.tgz", + "integrity": "sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ==", + "license": "MIT", + "dependencies": { + "global-dirs": "^3.0.0", + "is-path-inside": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-network-error": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/is-network-error/-/is-network-error-1.3.2.tgz", + "integrity": "sha512-PhBY86zaxNZUuWP6h13Vu5oFe0XY6/UlKzQnYFELzGVHygP3MxmvTfYSG7GN3aIab/iWudSMgjSnG9Dq+nHrgA==", + "license": "MIT", + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-npm": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-6.1.0.tgz", + "integrity": "sha512-O2z4/kNgyjhQwVR1Wpkbfc19JIhggF97NZNCpWTnjH7kVcZMUrnut9XSN7txI7VdyIYk5ZatOq3zvSuWpU8hoA==", + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", + "integrity": "sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-plain-obj": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz", + "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "license": "MIT", + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-regexp": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-1.0.0.tgz", + "integrity": "sha512-7zjFAPO4/gwyQAAgRRmqeEeyIICSdmCqa3tsVHMdBzaXXRiqopZL4Cyghg/XulGWrtABTpbnYYzzIRffLkP4oA==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", + "license": "MIT" + }, + "node_modules/is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "license": "MIT", + "dependencies": { + "is-docker": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-yarn-global": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/is-yarn-global/-/is-yarn-global-0.4.1.tgz", + "integrity": "sha512-/kppl+R+LO5VmhYSEWARUFjodS25D68gvj8W7z0I7OWhUla5xWu8KL6CtB2V0R6yqhnRgbcaREMr4EEM6htLPQ==", + "license": "MIT", + "engines": { + "node": ">=12" + } + }, + "node_modules/isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==", + "license": "MIT" + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "license": "ISC" + }, + "node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/jest-util": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", + "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-worker": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", + "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", + "license": "MIT", + "dependencies": { + "@types/node": "*", + "jest-util": "^29.7.0", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-worker/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/jiti": { + "version": "1.21.7", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.7.tgz", + "integrity": "sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==", + "license": "MIT", + "bin": { + "jiti": "bin/jiti.js" + } + }, + "node_modules/joi": { + "version": "17.13.3", + "resolved": "https://registry.npmjs.org/joi/-/joi-17.13.3.tgz", + "integrity": "sha512-otDA4ldcIx+ZXsKHWmp0YizCweVRZG96J10b0FevjfuncLO1oX59THoAmHkNubYJ+9gWsYsp5k8v4ib6oDv1fA==", + "license": "BSD-3-Clause", + "dependencies": { + "@hapi/hoek": "^9.3.0", + "@hapi/topo": "^5.1.0", + "@sideway/address": "^4.1.5", + "@sideway/formula": "^3.0.1", + "@sideway/pinpoint": "^2.0.0" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "license": "MIT" + }, + "node_modules/js-yaml": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.2.0.tgz", + "integrity": "sha512-ePWsvanv0DWuDRsW8dnt+R4jQ31SCRCQ7hhNcPXZPsoBZiemuZNYGf7adZdqX2D86j6rvKp3RpCxVTSb8WQlOw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/puzrin" + }, + { + "type": "github", + "url": "https://github.com/sponsors/nodeca" + } + ], + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsesc": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "license": "MIT" + }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "license": "MIT" + }, + "node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "license": "MIT" + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "license": "MIT", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jsonfile": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.1.tgz", + "integrity": "sha512-zwOTdL3rFQ/lRdBnntKVOX6k5cKJwEc1HdilT71BWEu7J41gXIB2MRp+vxduPSwZJPWBxEzv4yH1wYLJGUHX4Q==", + "license": "MIT", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "license": "MIT", + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/kleur": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/latest-version": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-7.0.0.tgz", + "integrity": "sha512-KvNT4XqAMzdcL6ka6Tl3i2lYeFDgXNCuIX+xNx6ZMVR1dFq+idXd9FLKNMOIx0t9mJ9/HudyX4oZWXZQ0UJHeg==", + "license": "MIT", + "dependencies": { + "package-json": "^8.1.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/launch-editor": { + "version": "2.14.1", + "resolved": "https://registry.npmjs.org/launch-editor/-/launch-editor-2.14.1.tgz", + "integrity": "sha512-QWBrQsMpH7gPr965dsKD/3cKWiNoTjpATQf++Xq63N6sKRGMwlVXz41O1IZTMfZQgBctD/K5Zt06+/I6pP6+HA==", + "license": "MIT", + "dependencies": { + "picocolors": "^1.1.1", + "shell-quote": "^1.8.4" + } + }, + "node_modules/leven": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", + "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/lilconfig": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz", + "integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==", + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antonk52" + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "license": "MIT" + }, + "node_modules/loader-runner": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.2.tgz", + "integrity": "sha512-DFEqQ3ihfS9blba08cLfYf1NRAIEm+dDjic073DRDc3/JspI/8wYmtDsHwd3+4hwvdxSK7PGaElfTmm0awWJ4w==", + "license": "MIT", + "engines": { + "node": ">=6.11.5" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/loader-utils": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", + "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", + "license": "MIT", + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + }, + "engines": { + "node": ">=8.9.0" + } + }, + "node_modules/locate-path": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-7.2.0.tgz", + "integrity": "sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==", + "license": "MIT", + "dependencies": { + "p-locate": "^6.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash": { + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.18.1.tgz", + "integrity": "sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q==", + "license": "MIT" + }, + "node_modules/lodash.debounce": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", + "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", + "license": "MIT" + }, + "node_modules/lodash.memoize": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", + "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==", + "license": "MIT" + }, + "node_modules/lodash.uniq": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", + "integrity": "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==", + "license": "MIT" + }, + "node_modules/longest-streak": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-3.1.0.tgz", + "integrity": "sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "license": "MIT", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "node_modules/lower-case": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", + "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", + "license": "MIT", + "dependencies": { + "tslib": "^2.0.3" + } + }, + "node_modules/lowercase-keys": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-3.0.0.tgz", + "integrity": "sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ==", + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "license": "ISC", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/markdown-extensions": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/markdown-extensions/-/markdown-extensions-2.0.0.tgz", + "integrity": "sha512-o5vL7aDWatOTX8LzaS1WMoaoxIiLRQJuIKKe2wAw6IeULDHaqbiqiggmx+pKvZDb1Sj+pE46Sn1T7lCqfFtg1Q==", + "license": "MIT", + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/markdown-table": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-3.0.4.tgz", + "integrity": "sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/mdast-util-directive": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-directive/-/mdast-util-directive-3.1.0.tgz", + "integrity": "sha512-I3fNFt+DHmpWCYAT7quoM6lHf9wuqtI+oCOfvILnoicNIqjh5E3dEJWiXuYME2gNe8vl1iMQwyUHa7bgFmak6Q==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "ccount": "^2.0.0", + "devlop": "^1.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0", + "parse-entities": "^4.0.0", + "stringify-entities": "^4.0.0", + "unist-util-visit-parents": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-find-and-replace": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/mdast-util-find-and-replace/-/mdast-util-find-and-replace-3.0.2.tgz", + "integrity": "sha512-Tmd1Vg/m3Xz43afeNxDIhWRtFZgM2VLyaf4vSTYwudTyeuTneoL3qtWMA5jeLyz/O1vDJmmV4QuScFCA2tBPwg==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "escape-string-regexp": "^5.0.0", + "unist-util-is": "^6.0.0", + "unist-util-visit-parents": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-find-and-replace/node_modules/escape-string-regexp": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", + "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/mdast-util-from-markdown": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.3.tgz", + "integrity": "sha512-W4mAWTvSlKvf8L6J+VN9yLSqQ9AOAAvHuoDAmPkz4dHf553m5gVj2ejadHJhoJmcmxEnOv6Pa8XJhpxE93kb8Q==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "mdast-util-to-string": "^4.0.0", + "micromark": "^4.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-decode-string": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "unist-util-stringify-position": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-from-markdown/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/mdast-util-frontmatter": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-frontmatter/-/mdast-util-frontmatter-2.0.1.tgz", + "integrity": "sha512-LRqI9+wdgC25P0URIJY9vwocIzCcksduHQ9OF2joxQoyTNVduwLAFUzjoopuRJbJAReaKrNQKAZKL3uCMugWJA==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "escape-string-regexp": "^5.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0", + "micromark-extension-frontmatter": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-frontmatter/node_modules/escape-string-regexp": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", + "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/mdast-util-gfm": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm/-/mdast-util-gfm-3.1.0.tgz", + "integrity": "sha512-0ulfdQOM3ysHhCJ1p06l0b0VKlhU0wuQs3thxZQagjcjPrlFRqY215uZGHHJan9GEAXd9MbfPjFJz+qMkVR6zQ==", + "license": "MIT", + "dependencies": { + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-gfm-autolink-literal": "^2.0.0", + "mdast-util-gfm-footnote": "^2.0.0", + "mdast-util-gfm-strikethrough": "^2.0.0", + "mdast-util-gfm-table": "^2.0.0", + "mdast-util-gfm-task-list-item": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-autolink-literal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-autolink-literal/-/mdast-util-gfm-autolink-literal-2.0.1.tgz", + "integrity": "sha512-5HVP2MKaP6L+G6YaxPNjuL0BPrq9orG3TsrZ9YXbA3vDw/ACI4MEsnoDpn6ZNm7GnZgtAcONJyPhOP8tNJQavQ==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "ccount": "^2.0.0", + "devlop": "^1.0.0", + "mdast-util-find-and-replace": "^3.0.0", + "micromark-util-character": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-autolink-literal/node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/mdast-util-gfm-autolink-literal/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/mdast-util-gfm-footnote": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-footnote/-/mdast-util-gfm-footnote-2.1.0.tgz", + "integrity": "sha512-sqpDWlsHn7Ac9GNZQMeUzPQSMzR6Wv0WKRNvQRg0KqHh02fpTz69Qc1QSseNX29bhz1ROIyNyxExfawVKTm1GQ==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "devlop": "^1.1.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-strikethrough": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-strikethrough/-/mdast-util-gfm-strikethrough-2.0.0.tgz", + "integrity": "sha512-mKKb915TF+OC5ptj5bJ7WFRPdYtuHv0yTRxK2tJvi+BDqbkiG7h7u/9SI89nRAYcmap2xHQL9D+QG/6wSrTtXg==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-table": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-table/-/mdast-util-gfm-table-2.0.0.tgz", + "integrity": "sha512-78UEvebzz/rJIxLvE7ZtDd/vIQ0RHv+3Mh5DR96p7cS7HsBhYIICDBCu8csTNWNO6tBWfqXPWekRuj2FNOGOZg==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "markdown-table": "^3.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-task-list-item": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-task-list-item/-/mdast-util-gfm-task-list-item-2.0.0.tgz", + "integrity": "sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-mdx": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-mdx/-/mdast-util-mdx-3.0.0.tgz", + "integrity": "sha512-JfbYLAW7XnYTTbUsmpu0kdBUVe+yKVJZBItEjwyYJiDJuZ9w4eeaqks4HQO+R7objWgS2ymV60GYpI14Ug554w==", + "license": "MIT", + "dependencies": { + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-mdx-expression": "^2.0.0", + "mdast-util-mdx-jsx": "^3.0.0", + "mdast-util-mdxjs-esm": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-mdx-expression": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-mdx-expression/-/mdast-util-mdx-expression-2.0.1.tgz", + "integrity": "sha512-J6f+9hUp+ldTZqKRSg7Vw5V6MqjATc+3E4gf3CFNcuZNWD8XdyI6zQ8GqH7f8169MM6P7hMBRDVGnn7oHB9kXQ==", + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-mdx-jsx": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/mdast-util-mdx-jsx/-/mdast-util-mdx-jsx-3.2.0.tgz", + "integrity": "sha512-lj/z8v0r6ZtsN/cGNNtemmmfoLAFZnjMbNyLzBafjzikOM+glrjNHPlf6lQDOTccj9n5b0PPihEBbhneMyGs1Q==", + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "ccount": "^2.0.0", + "devlop": "^1.1.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0", + "parse-entities": "^4.0.0", + "stringify-entities": "^4.0.0", + "unist-util-stringify-position": "^4.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-mdxjs-esm": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-mdxjs-esm/-/mdast-util-mdxjs-esm-2.0.1.tgz", + "integrity": "sha512-EcmOpxsZ96CvlP03NghtH1EsLtr0n9Tm4lPUJUBccV9RwUOneqSycg19n5HGzCf+10LozMRSObtVr3ee1WoHtg==", + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-phrasing": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-phrasing/-/mdast-util-phrasing-4.1.0.tgz", + "integrity": "sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "unist-util-is": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-hast": { + "version": "13.2.1", + "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-13.2.1.tgz", + "integrity": "sha512-cctsq2wp5vTsLIcaymblUriiTcZd0CwWtCbLvrOzYCDZoWyMNV8sZ7krj09FSnsiJi3WVsHLM4k6Dq/yaPyCXA==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "@ungap/structured-clone": "^1.0.0", + "devlop": "^1.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "trim-lines": "^3.0.0", + "unist-util-position": "^5.0.0", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-markdown": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-2.1.2.tgz", + "integrity": "sha512-xj68wMTvGXVOKonmog6LwyJKrYXZPvlwabaryTjLh9LuvovB/KAH+kvi8Gjj+7rJjsFi23nkUxRQv1KqSroMqA==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "longest-streak": "^3.0.0", + "mdast-util-phrasing": "^4.0.0", + "mdast-util-to-string": "^4.0.0", + "micromark-util-classify-character": "^2.0.0", + "micromark-util-decode-string": "^2.0.0", + "unist-util-visit": "^5.0.0", + "zwitch": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-4.0.0.tgz", + "integrity": "sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdn-data": { + "version": "2.0.30", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.30.tgz", + "integrity": "sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==", + "license": "CC0-1.0" + }, + "node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/memfs": { + "version": "4.57.6", + "resolved": "https://registry.npmjs.org/memfs/-/memfs-4.57.6.tgz", + "integrity": "sha512-WQK+DGjKCnPdpSyJUXphz+COF2uEhhsxQ3VIWBSbzpbbXuch3h4FePMqXrXGdLjsTgo4JFzBFsP6AWd9pVazGw==", + "license": "Apache-2.0", + "dependencies": { + "@jsonjoy.com/fs-core": "4.57.6", + "@jsonjoy.com/fs-fsa": "4.57.6", + "@jsonjoy.com/fs-node": "4.57.6", + "@jsonjoy.com/fs-node-builtins": "4.57.6", + "@jsonjoy.com/fs-node-to-fsa": "4.57.6", + "@jsonjoy.com/fs-node-utils": "4.57.6", + "@jsonjoy.com/fs-print": "4.57.6", + "@jsonjoy.com/fs-snapshot": "4.57.6", + "@jsonjoy.com/json-pack": "^1.11.0", + "@jsonjoy.com/util": "^1.9.0", + "glob-to-regex.js": "^1.0.1", + "thingies": "^2.5.0", + "tree-dump": "^1.0.3", + "tslib": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/merge-descriptors": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz", + "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "license": "MIT" + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/micromark": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/micromark/-/micromark-4.0.2.tgz", + "integrity": "sha512-zpe98Q6kvavpCr1NPVSCMebCKfD7CA2NqZ+rykeNhONIJBpc1tFKt9hucLGwha3jNTNI8lHpctWJWoimVF4PfA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "@types/debug": "^4.0.0", + "debug": "^4.0.0", + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "micromark-core-commonmark": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-combine-extensions": "^2.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-encode": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "micromark-util-subtokenize": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-core-commonmark": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-2.0.3.tgz", + "integrity": "sha512-RDBrHEMSxVFLg6xvnXmb1Ayr2WzLAWjeSATAoxwKYJV94TeNavgoIdA0a9ytzDSVzBy2YKFK+emCPOEibLeCrg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "micromark-factory-destination": "^2.0.0", + "micromark-factory-label": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-factory-title": "^2.0.0", + "micromark-factory-whitespace": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-classify-character": "^2.0.0", + "micromark-util-html-tag-name": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-subtokenize": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-core-commonmark/node_modules/micromark-factory-space": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", + "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-core-commonmark/node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-core-commonmark/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-extension-directive": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/micromark-extension-directive/-/micromark-extension-directive-3.0.2.tgz", + "integrity": "sha512-wjcXHgk+PPdmvR58Le9d7zQYWy+vKEU9Se44p2CrCDPiLr2FMyiT4Fyb5UFKFC66wGB3kPlgD7q3TnoqPS7SZA==", + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-factory-whitespace": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "parse-entities": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-directive/node_modules/micromark-factory-space": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", + "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-directive/node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-directive/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-extension-frontmatter": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-frontmatter/-/micromark-extension-frontmatter-2.0.0.tgz", + "integrity": "sha512-C4AkuM3dA58cgZha7zVnuVxBhDsbttIMiytjgsM2XbHAB2faRVaHRle40558FBN+DJcrLNCoqG5mlrpdU4cRtg==", + "license": "MIT", + "dependencies": { + "fault": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-frontmatter/node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-frontmatter/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-extension-gfm": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm/-/micromark-extension-gfm-3.0.0.tgz", + "integrity": "sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w==", + "license": "MIT", + "dependencies": { + "micromark-extension-gfm-autolink-literal": "^2.0.0", + "micromark-extension-gfm-footnote": "^2.0.0", + "micromark-extension-gfm-strikethrough": "^2.0.0", + "micromark-extension-gfm-table": "^2.0.0", + "micromark-extension-gfm-tagfilter": "^2.0.0", + "micromark-extension-gfm-task-list-item": "^2.0.0", + "micromark-util-combine-extensions": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-autolink-literal": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-autolink-literal/-/micromark-extension-gfm-autolink-literal-2.1.0.tgz", + "integrity": "sha512-oOg7knzhicgQ3t4QCjCWgTmfNhvQbDDnJeVu9v81r7NltNCVmhPy1fJRX27pISafdjL+SVc4d3l48Gb6pbRypw==", + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-autolink-literal/node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-gfm-autolink-literal/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-extension-gfm-footnote": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-footnote/-/micromark-extension-gfm-footnote-2.1.0.tgz", + "integrity": "sha512-/yPhxI1ntnDNsiHtzLKYnE3vf9JZ6cAisqVDauhp4CEHxlb4uoOTxOCJ+9s51bIB8U1N1FJ1RXOKTIlD5B/gqw==", + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-core-commonmark": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-footnote/node_modules/micromark-factory-space": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", + "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-gfm-footnote/node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-gfm-footnote/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-extension-gfm-strikethrough": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-strikethrough/-/micromark-extension-gfm-strikethrough-2.1.0.tgz", + "integrity": "sha512-ADVjpOOkjz1hhkZLlBiYA9cR2Anf8F4HqZUO6e5eDcPQd0Txw5fxLzzxnEkSkfnD0wziSGiv7sYhk/ktvbf1uw==", + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-classify-character": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-strikethrough/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-extension-gfm-table": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-table/-/micromark-extension-gfm-table-2.1.1.tgz", + "integrity": "sha512-t2OU/dXXioARrC6yWfJ4hqB7rct14e8f7m0cbI5hUmDyyIlwv5vEtooptH8INkbLzOatzKuVbQmAYcbWoyz6Dg==", + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-table/node_modules/micromark-factory-space": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", + "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-gfm-table/node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-gfm-table/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-extension-gfm-tagfilter": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-tagfilter/-/micromark-extension-gfm-tagfilter-2.0.0.tgz", + "integrity": "sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg==", + "license": "MIT", + "dependencies": { + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-task-list-item": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-task-list-item/-/micromark-extension-gfm-task-list-item-2.1.0.tgz", + "integrity": "sha512-qIBZhqxqI6fjLDYFTBIa4eivDMnP+OZqsNwmQ3xNLE4Cxwc+zfQEfbs6tzAo2Hjq+bh6q5F+Z8/cksrLFYWQQw==", + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-task-list-item/node_modules/micromark-factory-space": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", + "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-gfm-task-list-item/node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-gfm-task-list-item/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-extension-mdx-expression": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/micromark-extension-mdx-expression/-/micromark-extension-mdx-expression-3.0.1.tgz", + "integrity": "sha512-dD/ADLJ1AeMvSAKBwO22zG22N4ybhe7kFIZ3LsDI0GlsNr2A3KYxb0LdC1u5rj4Nw+CHKY0RVdnHX8vj8ejm4Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "devlop": "^1.0.0", + "micromark-factory-mdx-expression": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-events-to-acorn": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-mdx-expression/node_modules/micromark-factory-space": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", + "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-mdx-expression/node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-mdx-expression/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-extension-mdx-jsx": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/micromark-extension-mdx-jsx/-/micromark-extension-mdx-jsx-3.0.2.tgz", + "integrity": "sha512-e5+q1DjMh62LZAJOnDraSSbDMvGJ8x3cbjygy2qFEi7HCeUT4BDKCvMozPozcD6WmOt6sVvYDNBKhFSz3kjOVQ==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "devlop": "^1.0.0", + "estree-util-is-identifier-name": "^3.0.0", + "micromark-factory-mdx-expression": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-events-to-acorn": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-mdx-jsx/node_modules/micromark-factory-space": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", + "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-mdx-jsx/node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-mdx-jsx/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-extension-mdx-md": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-mdx-md/-/micromark-extension-mdx-md-2.0.0.tgz", + "integrity": "sha512-EpAiszsB3blw4Rpba7xTOUptcFeBFi+6PY8VnJ2hhimH+vCQDirWgsMpz7w1XcZE7LVrSAUGb9VJpG9ghlYvYQ==", + "license": "MIT", + "dependencies": { + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-mdxjs": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-mdxjs/-/micromark-extension-mdxjs-3.0.0.tgz", + "integrity": "sha512-A873fJfhnJ2siZyUrJ31l34Uqwy4xIFmvPY1oj+Ean5PHcPBYzEsvqvWGaWcfEIr11O5Dlw3p2y0tZWpKHDejQ==", + "license": "MIT", + "dependencies": { + "acorn": "^8.0.0", + "acorn-jsx": "^5.0.0", + "micromark-extension-mdx-expression": "^3.0.0", + "micromark-extension-mdx-jsx": "^3.0.0", + "micromark-extension-mdx-md": "^2.0.0", + "micromark-extension-mdxjs-esm": "^3.0.0", + "micromark-util-combine-extensions": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-mdxjs-esm": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-mdxjs-esm/-/micromark-extension-mdxjs-esm-3.0.0.tgz", + "integrity": "sha512-DJFl4ZqkErRpq/dAPyeWp15tGrcrrJho1hKK5uBS70BCtfrIFg81sqcTVu3Ta+KD1Tk5vAtBNElWxtAa+m8K9A==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "devlop": "^1.0.0", + "micromark-core-commonmark": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-events-to-acorn": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "unist-util-position-from-estree": "^2.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-mdxjs-esm/node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-mdxjs-esm/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-factory-destination": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-2.0.1.tgz", + "integrity": "sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-destination/node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-destination/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-factory-label": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-2.0.1.tgz", + "integrity": "sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-label/node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-label/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-factory-mdx-expression": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/micromark-factory-mdx-expression/-/micromark-factory-mdx-expression-2.0.3.tgz", + "integrity": "sha512-kQnEtA3vzucU2BkrIa8/VaSAsP+EJ3CKOvhMuJgOEGg9KDC6OAY6nSnNDVRiVNRqj7Y4SlSzcStaH/5jge8JdQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "devlop": "^1.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-events-to-acorn": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "unist-util-position-from-estree": "^2.0.0", + "vfile-message": "^4.0.0" + } + }, + "node_modules/micromark-factory-mdx-expression/node_modules/micromark-factory-space": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", + "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-mdx-expression/node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-mdx-expression/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-factory-space": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-1.1.0.tgz", + "integrity": "sha512-cRzEj7c0OL4Mw2v6nwzttyOZe8XY/Z8G0rzmWQZTBi/jjwyw/U4uqKtUORXQrR5bAZZnbTI/feRV/R7hc4jQYQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^1.0.0", + "micromark-util-types": "^1.0.0" + } + }, + "node_modules/micromark-factory-space/node_modules/micromark-util-types": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-1.1.0.tgz", + "integrity": "sha512-ukRBgie8TIAcacscVHSiddHjO4k/q3pnedmzMQ4iwDcK0FtFCohKOlFbaOL/mPgfnPsL3C1ZyxJa4sbWrBl3jg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-factory-title": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-2.0.1.tgz", + "integrity": "sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-title/node_modules/micromark-factory-space": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", + "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-title/node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-title/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-factory-whitespace": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-2.0.1.tgz", + "integrity": "sha512-Ob0nuZ3PKt/n0hORHyvoD9uZhr+Za8sFoP+OnMcnWK5lngSzALgQYKMr9RJVOWLqQYuyn6ulqGWSXdwf6F80lQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-whitespace/node_modules/micromark-factory-space": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", + "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-whitespace/node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-whitespace/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-character": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-1.2.0.tgz", + "integrity": "sha512-lXraTwcX3yH/vMDaFWCQJP1uIszLVebzUa3ZHdrgxr7KEU/9mL4mVgCpGbyhvNLNlauROiNUq7WN5u7ndbY6xg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0" + } + }, + "node_modules/micromark-util-character/node_modules/micromark-util-types": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-1.1.0.tgz", + "integrity": "sha512-ukRBgie8TIAcacscVHSiddHjO4k/q3pnedmzMQ4iwDcK0FtFCohKOlFbaOL/mPgfnPsL3C1ZyxJa4sbWrBl3jg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-chunked": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-2.0.1.tgz", + "integrity": "sha512-QUNFEOPELfmvv+4xiNg2sRYeS/P84pTW0TCgP5zc9FpXetHY0ab7SxKyAQCNCc1eK0459uoLI1y5oO5Vc1dbhA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-chunked/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-classify-character": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-2.0.1.tgz", + "integrity": "sha512-K0kHzM6afW/MbeWYWLjoHQv1sgg2Q9EccHEDzSkxiP/EaagNzCm7T/WMKZ3rjMbvIpvBiZgwR3dKMygtA4mG1Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-classify-character/node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-classify-character/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-combine-extensions": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-2.0.1.tgz", + "integrity": "sha512-OnAnH8Ujmy59JcyZw8JSbK9cGpdVY44NKgSM7E9Eh7DiLS2E9RNQf0dONaGDzEG9yjEl5hcqeIsj4hfRkLH/Bg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-chunked": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-decode-numeric-character-reference": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-2.0.2.tgz", + "integrity": "sha512-ccUbYk6CwVdkmCQMyr64dXz42EfHGkPQlBj5p7YVGzq8I7CtjXZJrubAYezf7Rp+bjPseiROqe7G6foFd+lEuw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-decode-numeric-character-reference/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-decode-string": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-2.0.1.tgz", + "integrity": "sha512-nDV/77Fj6eH1ynwscYTOsbK7rR//Uj0bZXBwJZRfaLEJ1iGBR6kIfNmlNqaqJf649EP0F3NWNdeJi03elllNUQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "decode-named-character-reference": "^1.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-decode-string/node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-decode-string/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-encode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-2.0.1.tgz", + "integrity": "sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-events-to-acorn": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/micromark-util-events-to-acorn/-/micromark-util-events-to-acorn-2.0.3.tgz", + "integrity": "sha512-jmsiEIiZ1n7X1Rr5k8wVExBQCg5jy4UXVADItHmNk1zkwEVhBuIUKRu3fqv+hs4nxLISi2DQGlqIOGiFxgbfHg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "@types/unist": "^3.0.0", + "devlop": "^1.0.0", + "estree-util-visit": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "vfile-message": "^4.0.0" + } + }, + "node_modules/micromark-util-events-to-acorn/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-html-tag-name": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-2.0.1.tgz", + "integrity": "sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-normalize-identifier": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-2.0.1.tgz", + "integrity": "sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-normalize-identifier/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-resolve-all": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-2.0.1.tgz", + "integrity": "sha512-VdQyxFWFT2/FGJgwQnJYbe1jjQoNTS4RjglmSjTUlpUMa95Htx9NHeYW4rGDJzbjvCsl9eLjMQwGeElsqmzcHg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-sanitize-uri": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.1.tgz", + "integrity": "sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-encode": "^2.0.0", + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-sanitize-uri/node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-sanitize-uri/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-subtokenize": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-2.1.0.tgz", + "integrity": "sha512-XQLu552iSctvnEcgXw6+Sx75GflAPNED1qx7eBJ+wydBb2KCbRZe+NwvIEEMM83uml1+2WSXpBAcp9IUCgCYWA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-subtokenize/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-symbol": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-1.1.0.tgz", + "integrity": "sha512-uEjpEYY6KMs1g7QfJ2eX1SQEV+ZT4rUD3UcF6l57acZvLNK7PBZL+ty82Z1qhK1/yXIY4bdx04FKMgR0g4IAag==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-types": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.2.tgz", + "integrity": "sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark/node_modules/micromark-factory-space": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", + "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark/node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "license": "MIT", + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "license": "MIT", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/mime-db": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.33.0.tgz", + "integrity": "sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.18", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.18.tgz", + "integrity": "sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ==", + "license": "MIT", + "dependencies": { + "mime-db": "~1.33.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/mimic-response": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-4.0.0.tgz", + "integrity": "sha512-e5ISH9xMYU0DzrT+jl8q2ze9D6eWBto+I8CNpe+VI+K2J/F/k3PdkdTdz4wvGVH4NTpo+NRYTVIuMQEMMcsLqg==", + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/mini-css-extract-plugin": { + "version": "2.10.2", + "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.10.2.tgz", + "integrity": "sha512-AOSS0IdEB95ayVkxn5oGzNQwqAi2J0Jb/kKm43t7H73s8+f5873g0yuj0PNvK4dO75mu5DHg4nlgp4k6Kga8eg==", + "license": "MIT", + "dependencies": { + "schema-utils": "^4.0.0", + "tapable": "^2.2.1" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" + } + }, + "node_modules/minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", + "license": "ISC" + }, + "node_modules/minimatch": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/mrmime": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-2.0.1.tgz", + "integrity": "sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==", + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" + }, + "node_modules/multicast-dns": { + "version": "7.2.5", + "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-7.2.5.tgz", + "integrity": "sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg==", + "license": "MIT", + "dependencies": { + "dns-packet": "^5.2.2", + "thunky": "^1.0.2" + }, + "bin": { + "multicast-dns": "cli.js" + } + }, + "node_modules/nanoid": { + "version": "3.3.12", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.12.tgz", + "integrity": "sha512-ZB9RH/39qpq5Vu6Y+NmUaFhQR6pp+M2Xt76XBnEwDaGcVAqhlvxrl3B2bKS5D3NH3QR76v3aSrKaF/Kiy7lEtQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/negotiator": { + "version": "0.6.4", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.4.tgz", + "integrity": "sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", + "license": "MIT" + }, + "node_modules/no-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", + "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", + "license": "MIT", + "dependencies": { + "lower-case": "^2.0.2", + "tslib": "^2.0.3" + } + }, + "node_modules/node-emoji": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/node-emoji/-/node-emoji-2.2.0.tgz", + "integrity": "sha512-Z3lTE9pLaJF47NyMhd4ww1yFTAP8YhYI8SleJiHzM46Fgpm5cnNzSl9XfzFNqbaz+VlJrIj3fXQ4DeN1Rjm6cw==", + "license": "MIT", + "dependencies": { + "@sindresorhus/is": "^4.6.0", + "char-regex": "^1.0.2", + "emojilib": "^2.4.0", + "skin-tone": "^2.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/node-releases": { + "version": "2.0.47", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.47.tgz", + "integrity": "sha512-Uzmd6LXpouKo8EUK68IjH4+E01w/hXyV3R3g/geCJo+rXLNfh1xucB+LOzYEOQPSiUK3h/xZf0cQGcSsmyL2Og==", + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/normalize-url": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-8.1.1.tgz", + "integrity": "sha512-JYc0DPlpGWB40kH5g07gGTrYuMqV653k3uBKY6uITPWds3M0ov3GaWGp9lbE3Bzngx8+XkfzgvASb9vk9JDFXQ==", + "license": "MIT", + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "license": "MIT", + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/nprogress": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/nprogress/-/nprogress-0.2.0.tgz", + "integrity": "sha512-I19aIingLgR1fmhftnbWWO3dXc0hSxqHQHQb3H8m+K3TnEn/iSeTZZOyvKXWqQESMwuUVnatlCnZdLBZZt2VSA==", + "license": "MIT" + }, + "node_modules/nth-check": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", + "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0" + }, + "funding": { + "url": "https://github.com/fb55/nth-check?sponsor=1" + } + }, + "node_modules/null-loader": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/null-loader/-/null-loader-4.0.1.tgz", + "integrity": "sha512-pxqVbi4U6N26lq+LmgIbB5XATP0VdZKOG25DhHi8btMmJJefGArFyDg1yc4U3hWCJbMqSrw0qyrz1UQX+qYXqg==", + "license": "MIT", + "dependencies": { + "loader-utils": "^2.0.0", + "schema-utils": "^3.0.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.0.0 || ^5.0.0" + } + }, + "node_modules/null-loader/node_modules/ajv": { + "version": "6.15.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.15.0.tgz", + "integrity": "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==", + "license": "MIT", + "peer": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/null-loader/node_modules/ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "license": "MIT", + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/null-loader/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "license": "MIT" + }, + "node_modules/null-loader/node_modules/schema-utils": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", + "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-inspect": { + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", + "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.assign": { + "version": "4.1.7", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.7.tgz", + "integrity": "sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0", + "has-symbols": "^1.1.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/obuf": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", + "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==", + "license": "MIT" + }, + "node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "license": "MIT", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/on-headers": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.1.0.tgz", + "integrity": "sha512-737ZY3yNnXy37FHkQxPzt4UZ2UWPWiCZWLvFZ4fu5cueciegX0zGPnrlY6bwRg4FdQOe9YU8MkmJwGhoMybl8A==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "license": "MIT", + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/open": { + "version": "8.4.2", + "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz", + "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==", + "license": "MIT", + "dependencies": { + "define-lazy-prop": "^2.0.0", + "is-docker": "^2.1.1", + "is-wsl": "^2.2.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/opener": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/opener/-/opener-1.5.2.tgz", + "integrity": "sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==", + "license": "(WTFPL OR MIT)", + "bin": { + "opener": "bin/opener-bin.js" + } + }, + "node_modules/p-cancelable": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-3.0.0.tgz", + "integrity": "sha512-mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw==", + "license": "MIT", + "engines": { + "node": ">=12.20" + } + }, + "node_modules/p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/p-limit": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz", + "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==", + "license": "MIT", + "dependencies": { + "yocto-queue": "^1.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-6.0.0.tgz", + "integrity": "sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==", + "license": "MIT", + "dependencies": { + "p-limit": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-map": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", + "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", + "license": "MIT", + "dependencies": { + "aggregate-error": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-queue": { + "version": "6.6.2", + "resolved": "https://registry.npmjs.org/p-queue/-/p-queue-6.6.2.tgz", + "integrity": "sha512-RwFpb72c/BhQLEXIZ5K2e+AhgNVmIejGlTgiB9MzZ0e93GRvqZ7uSi0dvRF7/XIXDeNkra2fNHBxTyPDGySpjQ==", + "license": "MIT", + "dependencies": { + "eventemitter3": "^4.0.4", + "p-timeout": "^3.2.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-retry": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-6.2.1.tgz", + "integrity": "sha512-hEt02O4hUct5wtwg4H4KcWgDdm+l1bOaEy/hWzd8xtXB9BqxTWBBhb+2ImAtH4Cv4rPjV76xN3Zumqk3k3AhhQ==", + "license": "MIT", + "dependencies": { + "@types/retry": "0.12.2", + "is-network-error": "^1.0.0", + "retry": "^0.13.1" + }, + "engines": { + "node": ">=16.17" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-timeout": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-3.2.0.tgz", + "integrity": "sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg==", + "license": "MIT", + "dependencies": { + "p-finally": "^1.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/package-json": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/package-json/-/package-json-8.1.1.tgz", + "integrity": "sha512-cbH9IAIJHNj9uXi196JVsRlt7cHKak6u/e6AkL/bkRelZ7rlL3X1YKxsZwa36xipOEKAsdtmaG6aAJoM1fx2zA==", + "license": "MIT", + "dependencies": { + "got": "^12.1.0", + "registry-auth-token": "^5.0.1", + "registry-url": "^6.0.0", + "semver": "^7.3.7" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/param-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz", + "integrity": "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==", + "license": "MIT", + "dependencies": { + "dot-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "license": "MIT", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-entities": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-4.0.2.tgz", + "integrity": "sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw==", + "license": "MIT", + "dependencies": { + "@types/unist": "^2.0.0", + "character-entities-legacy": "^3.0.0", + "character-reference-invalid": "^2.0.0", + "decode-named-character-reference": "^1.0.0", + "is-alphanumerical": "^2.0.0", + "is-decimal": "^2.0.0", + "is-hexadecimal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/parse-entities/node_modules/@types/unist": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.11.tgz", + "integrity": "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==", + "license": "MIT" + }, + "node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parse-numeric-range": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/parse-numeric-range/-/parse-numeric-range-1.3.0.tgz", + "integrity": "sha512-twN+njEipszzlMJd4ONUYgSfZPDxgHhT9Ahed5uTigpQn90FggW4SA/AIPq/6a149fTbE9qBEcSwE3FAEp6wQQ==", + "license": "ISC" + }, + "node_modules/parse5": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.3.0.tgz", + "integrity": "sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==", + "license": "MIT", + "dependencies": { + "entities": "^6.0.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/parse5-htmlparser2-tree-adapter": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-7.1.0.tgz", + "integrity": "sha512-ruw5xyKs6lrpo9x9rCZqZZnIUntICjQAd0Wsmp396Ul9lN/h+ifgVV1x1gZHi8euej6wTfpqX8j+BFQxF0NS/g==", + "license": "MIT", + "dependencies": { + "domhandler": "^5.0.3", + "parse5": "^7.0.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/parse5/node_modules/entities": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.1.tgz", + "integrity": "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/pascal-case": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz", + "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==", + "license": "MIT", + "dependencies": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/path-exists": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-5.0.0.tgz", + "integrity": "sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==", + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + } + }, + "node_modules/path-is-inside": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", + "integrity": "sha512-DUWJr3+ULp4zXmol/SZkFf3JGsS9/SIv+Y3Rt93/UjPpDpklB5f1er4O3POIbUuUJ3FXgqte2Q7SrU6zAqwk8w==", + "license": "(WTFPL OR MIT)" + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "license": "MIT" + }, + "node_modules/path-to-regexp": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.9.0.tgz", + "integrity": "sha512-xIp7/apCFJuUHdDLWe8O1HIkb0kQrOMb/0u6FXQjemHn/ii5LrIzU6bdECnsiTF/GjZkMEKg1xdiZwNqDYlZ6g==", + "license": "MIT", + "dependencies": { + "isarray": "0.0.1" + } + }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", + "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pkg-dir": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-7.0.0.tgz", + "integrity": "sha512-Ie9z/WINcxxLp27BKOCHGde4ITq9UklYKDzVo1nhk5sqGEXU3FpkwP5GM2voTGJkGd9B3Otl+Q4uwSOeSUtOBA==", + "license": "MIT", + "dependencies": { + "find-up": "^6.3.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pkijs": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/pkijs/-/pkijs-3.4.0.tgz", + "integrity": "sha512-emEcLuomt2j03vxD54giVB4SxTjnsqkU692xZOZXHDVoYyypEm+b3jpiTcc+Cf+myooc+/Ly0z01jqeNHVgJGw==", + "license": "BSD-3-Clause", + "dependencies": { + "@noble/hashes": "1.4.0", + "asn1js": "^3.0.6", + "bytestreamjs": "^2.0.1", + "pvtsutils": "^1.3.6", + "pvutils": "^1.1.3", + "tslib": "^2.8.1" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/postcss": { + "version": "8.5.15", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.15.tgz", + "integrity": "sha512-FfR8sjd4em2T6fb3I2MwAJU7HWVMr9zba+enmQeeWFfCbm+UOC/0X4DS8XtpUTMwWMGbjKYP7xjfNekzyGmB3A==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "peer": true, + "dependencies": { + "nanoid": "^3.3.12", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postcss-attribute-case-insensitive": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/postcss-attribute-case-insensitive/-/postcss-attribute-case-insensitive-7.0.1.tgz", + "integrity": "sha512-Uai+SupNSqzlschRyNx3kbCTWgY/2hcwtHEI/ej2LJWc9JJ77qKgGptd8DHwY1mXtZ7Aoh4z4yxfwMBue9eNgw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "dependencies": { + "postcss-selector-parser": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-attribute-case-insensitive/node_modules/postcss-selector-parser": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", + "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-calc": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-9.0.1.tgz", + "integrity": "sha512-TipgjGyzP5QzEhsOZUaIkeO5mKeMFpebWzRogWG/ysonUlnHcq5aJe0jOjpfzUU8PeSaBQnrE8ehR0QA5vs8PQ==", + "license": "MIT", + "dependencies": { + "postcss-selector-parser": "^6.0.11", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.2.2" + } + }, + "node_modules/postcss-clamp": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/postcss-clamp/-/postcss-clamp-4.1.0.tgz", + "integrity": "sha512-ry4b1Llo/9zz+PKC+030KUnPITTJAHeOwjfAyyB60eT0AorGLdzp52s31OsPRHRf8NchkgFoG2y6fCfn1IV1Ow==", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": ">=7.6.0" + }, + "peerDependencies": { + "postcss": "^8.4.6" + } + }, + "node_modules/postcss-color-functional-notation": { + "version": "7.0.12", + "resolved": "https://registry.npmjs.org/postcss-color-functional-notation/-/postcss-color-functional-notation-7.0.12.tgz", + "integrity": "sha512-TLCW9fN5kvO/u38/uesdpbx3e8AkTYhMvDZYa9JpmImWuTE99bDQ7GU7hdOADIZsiI9/zuxfAJxny/khknp1Zw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-color-parser": "^3.1.0", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/postcss-progressive-custom-properties": "^4.2.1", + "@csstools/utilities": "^2.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-color-hex-alpha": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/postcss-color-hex-alpha/-/postcss-color-hex-alpha-10.0.0.tgz", + "integrity": "sha512-1kervM2cnlgPs2a8Vt/Qbe5cQ++N7rkYo/2rz2BkqJZIHQwaVuJgQH38REHrAi4uM0b1fqxMkWYmese94iMp3w==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "dependencies": { + "@csstools/utilities": "^2.0.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-color-rebeccapurple": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/postcss-color-rebeccapurple/-/postcss-color-rebeccapurple-10.0.0.tgz", + "integrity": "sha512-JFta737jSP+hdAIEhk1Vs0q0YF5P8fFcj+09pweS8ktuGuZ8pPlykHsk6mPxZ8awDl4TrcxUqJo9l1IhVr/OjQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/utilities": "^2.0.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-colormin": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-6.1.0.tgz", + "integrity": "sha512-x9yX7DOxeMAR+BgGVnNSAxmAj98NX/YxEMNFP+SDCEeNLb2r3i6Hh1ksMsnW8Ub5SLCpbescQqn9YEbE9554Sw==", + "license": "MIT", + "dependencies": { + "browserslist": "^4.23.0", + "caniuse-api": "^3.0.0", + "colord": "^2.9.3", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-convert-values": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-6.1.0.tgz", + "integrity": "sha512-zx8IwP/ts9WvUM6NkVSkiU902QZL1bwPhaVaLynPtCsOTqp+ZKbNi+s6XJg3rfqpKGA/oc7Oxk5t8pOQJcwl/w==", + "license": "MIT", + "dependencies": { + "browserslist": "^4.23.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-custom-media": { + "version": "11.0.6", + "resolved": "https://registry.npmjs.org/postcss-custom-media/-/postcss-custom-media-11.0.6.tgz", + "integrity": "sha512-C4lD4b7mUIw+RZhtY7qUbf4eADmb7Ey8BFA2px9jUbwg7pjTZDl4KY4bvlUV+/vXQvzQRfiGEVJyAbtOsCMInw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "dependencies": { + "@csstools/cascade-layer-name-parser": "^2.0.5", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/media-query-list-parser": "^4.0.3" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-custom-properties": { + "version": "14.0.6", + "resolved": "https://registry.npmjs.org/postcss-custom-properties/-/postcss-custom-properties-14.0.6.tgz", + "integrity": "sha512-fTYSp3xuk4BUeVhxCSJdIPhDLpJfNakZKoiTDx7yRGCdlZrSJR7mWKVOBS4sBF+5poPQFMj2YdXx1VHItBGihQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "dependencies": { + "@csstools/cascade-layer-name-parser": "^2.0.5", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/utilities": "^2.0.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-custom-selectors": { + "version": "8.0.5", + "resolved": "https://registry.npmjs.org/postcss-custom-selectors/-/postcss-custom-selectors-8.0.5.tgz", + "integrity": "sha512-9PGmckHQswiB2usSO6XMSswO2yFWVoCAuih1yl9FVcwkscLjRKjwsjM3t+NIWpSU2Jx3eOiK2+t4vVTQaoCHHg==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "dependencies": { + "@csstools/cascade-layer-name-parser": "^2.0.5", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "postcss-selector-parser": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-custom-selectors/node_modules/postcss-selector-parser": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", + "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-dir-pseudo-class": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/postcss-dir-pseudo-class/-/postcss-dir-pseudo-class-9.0.1.tgz", + "integrity": "sha512-tRBEK0MHYvcMUrAuYMEOa0zg9APqirBcgzi6P21OhxtJyJADo/SWBwY1CAwEohQ/6HDaa9jCjLRG7K3PVQYHEA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "postcss-selector-parser": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-dir-pseudo-class/node_modules/postcss-selector-parser": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", + "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-discard-comments": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-6.0.2.tgz", + "integrity": "sha512-65w/uIqhSBBfQmYnG92FO1mWZjJ4GL5b8atm5Yw2UgrwD7HiNiSSNwJor1eCFGzUgYnN/iIknhNRVqjrrpuglw==", + "license": "MIT", + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-discard-duplicates": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-6.0.3.tgz", + "integrity": "sha512-+JA0DCvc5XvFAxwx6f/e68gQu/7Z9ud584VLmcgto28eB8FqSFZwtrLwB5Kcp70eIoWP/HXqz4wpo8rD8gpsTw==", + "license": "MIT", + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-discard-empty": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-6.0.3.tgz", + "integrity": "sha512-znyno9cHKQsK6PtxL5D19Fj9uwSzC2mB74cpT66fhgOadEUPyXFkbgwm5tvc3bt3NAy8ltE5MrghxovZRVnOjQ==", + "license": "MIT", + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-discard-overridden": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-6.0.2.tgz", + "integrity": "sha512-j87xzI4LUggC5zND7KdjsI25APtyMuynXZSujByMaav2roV6OZX+8AaCUcZSWqckZpjAjRyFDdpqybgjFO0HJQ==", + "license": "MIT", + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-discard-unused": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/postcss-discard-unused/-/postcss-discard-unused-6.0.5.tgz", + "integrity": "sha512-wHalBlRHkaNnNwfC8z+ppX57VhvS+HWgjW508esjdaEYr3Mx7Gnn2xA4R/CKf5+Z9S5qsqC+Uzh4ueENWwCVUA==", + "license": "MIT", + "dependencies": { + "postcss-selector-parser": "^6.0.16" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-double-position-gradients": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/postcss-double-position-gradients/-/postcss-double-position-gradients-6.0.4.tgz", + "integrity": "sha512-m6IKmxo7FxSP5nF2l63QbCC3r+bWpFUWmZXZf096WxG0m7Vl1Q1+ruFOhpdDRmKrRS+S3Jtk+TVk/7z0+BVK6g==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/postcss-progressive-custom-properties": "^4.2.1", + "@csstools/utilities": "^2.0.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-focus-visible": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/postcss-focus-visible/-/postcss-focus-visible-10.0.1.tgz", + "integrity": "sha512-U58wyjS/I1GZgjRok33aE8juW9qQgQUNwTSdxQGuShHzwuYdcklnvK/+qOWX1Q9kr7ysbraQ6ht6r+udansalA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "postcss-selector-parser": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-focus-visible/node_modules/postcss-selector-parser": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", + "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-focus-within": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/postcss-focus-within/-/postcss-focus-within-9.0.1.tgz", + "integrity": "sha512-fzNUyS1yOYa7mOjpci/bR+u+ESvdar6hk8XNK/TRR0fiGTp2QT5N+ducP0n3rfH/m9I7H/EQU6lsa2BrgxkEjw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "postcss-selector-parser": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-focus-within/node_modules/postcss-selector-parser": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", + "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-font-variant": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/postcss-font-variant/-/postcss-font-variant-5.0.0.tgz", + "integrity": "sha512-1fmkBaCALD72CK2a9i468mA/+tr9/1cBxRRMXOUaZqO43oWPR5imcyPjXwuv7PXbCid4ndlP5zWhidQVVa3hmA==", + "license": "MIT", + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-gap-properties": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/postcss-gap-properties/-/postcss-gap-properties-6.0.0.tgz", + "integrity": "sha512-Om0WPjEwiM9Ru+VhfEDPZJAKWUd0mV1HmNXqp2C29z80aQ2uP9UVhLc7e3aYMIor/S5cVhoPgYQ7RtfeZpYTRw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-image-set-function": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/postcss-image-set-function/-/postcss-image-set-function-7.0.0.tgz", + "integrity": "sha512-QL7W7QNlZuzOwBTeXEmbVckNt1FSmhQtbMRvGGqqU4Nf4xk6KUEQhAoWuMzwbSv5jxiRiSZ5Tv7eiDB9U87znA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/utilities": "^2.0.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-lab-function": { + "version": "7.0.12", + "resolved": "https://registry.npmjs.org/postcss-lab-function/-/postcss-lab-function-7.0.12.tgz", + "integrity": "sha512-tUcyRk1ZTPec3OuKFsqtRzW2Go5lehW29XA21lZ65XmzQkz43VY2tyWEC202F7W3mILOjw0voOiuxRGTsN+J9w==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-color-parser": "^3.1.0", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/postcss-progressive-custom-properties": "^4.2.1", + "@csstools/utilities": "^2.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-loader": { + "version": "7.3.4", + "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-7.3.4.tgz", + "integrity": "sha512-iW5WTTBSC5BfsBJ9daFMPVrLT36MrNiC6fqOZTTaHjBNX6Pfd5p+hSBqe/fEeNd7pc13QiAyGt7VdGMw4eRC4A==", + "license": "MIT", + "dependencies": { + "cosmiconfig": "^8.3.5", + "jiti": "^1.20.0", + "semver": "^7.5.4" + }, + "engines": { + "node": ">= 14.15.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "postcss": "^7.0.0 || ^8.0.1", + "webpack": "^5.0.0" + } + }, + "node_modules/postcss-logical": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/postcss-logical/-/postcss-logical-8.1.0.tgz", + "integrity": "sha512-pL1hXFQ2fEXNKiNiAgtfA005T9FBxky5zkX6s4GZM2D8RkVgRqz3f4g1JUoq925zXv495qk8UNldDwh8uGEDoA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-merge-idents": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/postcss-merge-idents/-/postcss-merge-idents-6.0.3.tgz", + "integrity": "sha512-1oIoAsODUs6IHQZkLQGO15uGEbK3EAl5wi9SS8hs45VgsxQfMnxvt+L+zIr7ifZFIH14cfAeVe2uCTa+SPRa3g==", + "license": "MIT", + "dependencies": { + "cssnano-utils": "^4.0.2", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-merge-longhand": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-6.0.5.tgz", + "integrity": "sha512-5LOiordeTfi64QhICp07nzzuTDjNSO8g5Ksdibt44d+uvIIAE1oZdRn8y/W5ZtYgRH/lnLDlvi9F8btZcVzu3w==", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0", + "stylehacks": "^6.1.1" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-merge-rules": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-6.1.1.tgz", + "integrity": "sha512-KOdWF0gju31AQPZiD+2Ar9Qjowz1LTChSjFFbS+e2sFgc4uHOp3ZvVX4sNeTlk0w2O31ecFGgrFzhO0RSWbWwQ==", + "license": "MIT", + "dependencies": { + "browserslist": "^4.23.0", + "caniuse-api": "^3.0.0", + "cssnano-utils": "^4.0.2", + "postcss-selector-parser": "^6.0.16" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-minify-font-values": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-6.1.0.tgz", + "integrity": "sha512-gklfI/n+9rTh8nYaSJXlCo3nOKqMNkxuGpTn/Qm0gstL3ywTr9/WRKznE+oy6fvfolH6dF+QM4nCo8yPLdvGJg==", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-minify-gradients": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-6.0.3.tgz", + "integrity": "sha512-4KXAHrYlzF0Rr7uc4VrfwDJ2ajrtNEpNEuLxFgwkhFZ56/7gaE4Nr49nLsQDZyUe+ds+kEhf+YAUolJiYXF8+Q==", + "license": "MIT", + "dependencies": { + "colord": "^2.9.3", + "cssnano-utils": "^4.0.2", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-minify-params": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-6.1.0.tgz", + "integrity": "sha512-bmSKnDtyyE8ujHQK0RQJDIKhQ20Jq1LYiez54WiaOoBtcSuflfK3Nm596LvbtlFcpipMjgClQGyGr7GAs+H1uA==", + "license": "MIT", + "dependencies": { + "browserslist": "^4.23.0", + "cssnano-utils": "^4.0.2", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-minify-selectors": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-6.0.4.tgz", + "integrity": "sha512-L8dZSwNLgK7pjTto9PzWRoMbnLq5vsZSTu8+j1P/2GB8qdtGQfn+K1uSvFgYvgh83cbyxT5m43ZZhUMTJDSClQ==", + "license": "MIT", + "dependencies": { + "postcss-selector-parser": "^6.0.16" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-modules-extract-imports": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.1.0.tgz", + "integrity": "sha512-k3kNe0aNFQDAZGbin48pL2VNidTF0w4/eASDsxlyspobzU3wZQLOGj7L9gfRe0Jo9/4uud09DsjFNH7winGv8Q==", + "license": "ISC", + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-modules-local-by-default": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.2.0.tgz", + "integrity": "sha512-5kcJm/zk+GJDSfw+V/42fJ5fhjL5YbFDl8nVdXkJPLLW+Vf9mTD5Xe0wqIaDnLuL2U6cDNpTr+UQ+v2HWIBhzw==", + "license": "MIT", + "dependencies": { + "icss-utils": "^5.0.0", + "postcss-selector-parser": "^7.0.0", + "postcss-value-parser": "^4.1.0" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-modules-local-by-default/node_modules/postcss-selector-parser": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", + "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-modules-scope": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.2.1.tgz", + "integrity": "sha512-m9jZstCVaqGjTAuny8MdgE88scJnCiQSlSrOWcTQgM2t32UBe+MUmFSO5t7VMSfAf/FJKImAxBav8ooCHJXCJA==", + "license": "ISC", + "dependencies": { + "postcss-selector-parser": "^7.0.0" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-modules-scope/node_modules/postcss-selector-parser": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", + "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-modules-values": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz", + "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==", + "license": "ISC", + "dependencies": { + "icss-utils": "^5.0.0" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-nesting": { + "version": "13.0.2", + "resolved": "https://registry.npmjs.org/postcss-nesting/-/postcss-nesting-13.0.2.tgz", + "integrity": "sha512-1YCI290TX+VP0U/K/aFxzHzQWHWURL+CtHMSbex1lCdpXD1SoR2sYuxDu5aNI9lPoXpKTCggFZiDJbwylU0LEQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/selector-resolve-nested": "^3.1.0", + "@csstools/selector-specificity": "^5.0.0", + "postcss-selector-parser": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-nesting/node_modules/@csstools/selector-resolve-nested": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@csstools/selector-resolve-nested/-/selector-resolve-nested-3.1.0.tgz", + "integrity": "sha512-mf1LEW0tJLKfWyvn5KdDrhpxHyuxpbNwTIwOYLIvsTffeyOf85j5oIzfG0yosxDgx/sswlqBnESYUcQH0vgZ0g==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss-selector-parser": "^7.0.0" + } + }, + "node_modules/postcss-nesting/node_modules/@csstools/selector-specificity": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-5.0.0.tgz", + "integrity": "sha512-PCqQV3c4CoVm3kdPhyeZ07VmBRdH2EpMFA/pd9OASpOEC3aXNGoqPDAZ80D0cLpMBxnmk0+yNhGsEx31hq7Gtw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss-selector-parser": "^7.0.0" + } + }, + "node_modules/postcss-nesting/node_modules/postcss-selector-parser": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", + "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", + "license": "MIT", + "peer": true, + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-normalize-charset": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-6.0.2.tgz", + "integrity": "sha512-a8N9czmdnrjPHa3DeFlwqst5eaL5W8jYu3EBbTTkI5FHkfMhFZh1EGbku6jhHhIzTA6tquI2P42NtZ59M/H/kQ==", + "license": "MIT", + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-normalize-display-values": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-6.0.2.tgz", + "integrity": "sha512-8H04Mxsb82ON/aAkPeq8kcBbAtI5Q2a64X/mnRRfPXBq7XeogoQvReqxEfc0B4WPq1KimjezNC8flUtC3Qz6jg==", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-normalize-positions": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-6.0.2.tgz", + "integrity": "sha512-/JFzI441OAB9O7VnLA+RtSNZvQ0NCFZDOtp6QPFo1iIyawyXg0YI3CYM9HBy1WvwCRHnPep/BvI1+dGPKoXx/Q==", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-normalize-repeat-style": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-6.0.2.tgz", + "integrity": "sha512-YdCgsfHkJ2jEXwR4RR3Tm/iOxSfdRt7jplS6XRh9Js9PyCR/aka/FCb6TuHT2U8gQubbm/mPmF6L7FY9d79VwQ==", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-normalize-string": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-6.0.2.tgz", + "integrity": "sha512-vQZIivlxlfqqMp4L9PZsFE4YUkWniziKjQWUtsxUiVsSSPelQydwS8Wwcuw0+83ZjPWNTl02oxlIvXsmmG+CiQ==", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-normalize-timing-functions": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-6.0.2.tgz", + "integrity": "sha512-a+YrtMox4TBtId/AEwbA03VcJgtyW4dGBizPl7e88cTFULYsprgHWTbfyjSLyHeBcK/Q9JhXkt2ZXiwaVHoMzA==", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-normalize-unicode": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-6.1.0.tgz", + "integrity": "sha512-QVC5TQHsVj33otj8/JD869Ndr5Xcc/+fwRh4HAsFsAeygQQXm+0PySrKbr/8tkDKzW+EVT3QkqZMfFrGiossDg==", + "license": "MIT", + "dependencies": { + "browserslist": "^4.23.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-normalize-url": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-6.0.2.tgz", + "integrity": "sha512-kVNcWhCeKAzZ8B4pv/DnrU1wNh458zBNp8dh4y5hhxih5RZQ12QWMuQrDgPRw3LRl8mN9vOVfHl7uhvHYMoXsQ==", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-normalize-whitespace": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-6.0.2.tgz", + "integrity": "sha512-sXZ2Nj1icbJOKmdjXVT9pnyHQKiSAyuNQHSgRCUgThn2388Y9cGVDR+E9J9iAYbSbLHI+UUwLVl1Wzco/zgv0Q==", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-opacity-percentage": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-opacity-percentage/-/postcss-opacity-percentage-3.0.0.tgz", + "integrity": "sha512-K6HGVzyxUxd/VgZdX04DCtdwWJ4NGLG212US4/LA1TLAbHgmAsTWVR86o+gGIbFtnTkfOpb9sCRBx8K7HO66qQ==", + "funding": [ + { + "type": "kofi", + "url": "https://ko-fi.com/mrcgrtz" + }, + { + "type": "liberapay", + "url": "https://liberapay.com/mrcgrtz" + } + ], + "license": "MIT", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-ordered-values": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-6.0.2.tgz", + "integrity": "sha512-VRZSOB+JU32RsEAQrO94QPkClGPKJEL/Z9PCBImXMhIeK5KAYo6slP/hBYlLgrCjFxyqvn5VC81tycFEDBLG1Q==", + "license": "MIT", + "dependencies": { + "cssnano-utils": "^4.0.2", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-overflow-shorthand": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/postcss-overflow-shorthand/-/postcss-overflow-shorthand-6.0.0.tgz", + "integrity": "sha512-BdDl/AbVkDjoTofzDQnwDdm/Ym6oS9KgmO7Gr+LHYjNWJ6ExORe4+3pcLQsLA9gIROMkiGVjjwZNoL/mpXHd5Q==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-page-break": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/postcss-page-break/-/postcss-page-break-3.0.4.tgz", + "integrity": "sha512-1JGu8oCjVXLa9q9rFTo4MbeeA5FMe00/9C7lN4va606Rdb+HkxXtXsmEDrIraQ11fGz/WvKWa8gMuCKkrXpTsQ==", + "license": "MIT", + "peerDependencies": { + "postcss": "^8" + } + }, + "node_modules/postcss-place": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/postcss-place/-/postcss-place-10.0.0.tgz", + "integrity": "sha512-5EBrMzat2pPAxQNWYavwAfoKfYcTADJ8AXGVPcUZ2UkNloUTWzJQExgrzrDkh3EKzmAx1evfTAzF9I8NGcc+qw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-preset-env": { + "version": "10.6.1", + "resolved": "https://registry.npmjs.org/postcss-preset-env/-/postcss-preset-env-10.6.1.tgz", + "integrity": "sha512-yrk74d9EvY+W7+lO9Aj1QmjWY9q5NsKjK2V9drkOPZB/X6KZ0B3igKsHUYakb7oYVhnioWypQX3xGuePf89f3g==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/postcss-alpha-function": "^1.0.1", + "@csstools/postcss-cascade-layers": "^5.0.2", + "@csstools/postcss-color-function": "^4.0.12", + "@csstools/postcss-color-function-display-p3-linear": "^1.0.1", + "@csstools/postcss-color-mix-function": "^3.0.12", + "@csstools/postcss-color-mix-variadic-function-arguments": "^1.0.2", + "@csstools/postcss-content-alt-text": "^2.0.8", + "@csstools/postcss-contrast-color-function": "^2.0.12", + "@csstools/postcss-exponential-functions": "^2.0.9", + "@csstools/postcss-font-format-keywords": "^4.0.0", + "@csstools/postcss-gamut-mapping": "^2.0.11", + "@csstools/postcss-gradients-interpolation-method": "^5.0.12", + "@csstools/postcss-hwb-function": "^4.0.12", + "@csstools/postcss-ic-unit": "^4.0.4", + "@csstools/postcss-initial": "^2.0.1", + "@csstools/postcss-is-pseudo-class": "^5.0.3", + "@csstools/postcss-light-dark-function": "^2.0.11", + "@csstools/postcss-logical-float-and-clear": "^3.0.0", + "@csstools/postcss-logical-overflow": "^2.0.0", + "@csstools/postcss-logical-overscroll-behavior": "^2.0.0", + "@csstools/postcss-logical-resize": "^3.0.0", + "@csstools/postcss-logical-viewport-units": "^3.0.4", + "@csstools/postcss-media-minmax": "^2.0.9", + "@csstools/postcss-media-queries-aspect-ratio-number-values": "^3.0.5", + "@csstools/postcss-nested-calc": "^4.0.0", + "@csstools/postcss-normalize-display-values": "^4.0.1", + "@csstools/postcss-oklab-function": "^4.0.12", + "@csstools/postcss-position-area-property": "^1.0.0", + "@csstools/postcss-progressive-custom-properties": "^4.2.1", + "@csstools/postcss-property-rule-prelude-list": "^1.0.0", + "@csstools/postcss-random-function": "^2.0.1", + "@csstools/postcss-relative-color-syntax": "^3.0.12", + "@csstools/postcss-scope-pseudo-class": "^4.0.1", + "@csstools/postcss-sign-functions": "^1.1.4", + "@csstools/postcss-stepped-value-functions": "^4.0.9", + "@csstools/postcss-syntax-descriptor-syntax-production": "^1.0.1", + "@csstools/postcss-system-ui-font-family": "^1.0.0", + "@csstools/postcss-text-decoration-shorthand": "^4.0.3", + "@csstools/postcss-trigonometric-functions": "^4.0.9", + "@csstools/postcss-unset-value": "^4.0.0", + "autoprefixer": "^10.4.23", + "browserslist": "^4.28.1", + "css-blank-pseudo": "^7.0.1", + "css-has-pseudo": "^7.0.3", + "css-prefers-color-scheme": "^10.0.0", + "cssdb": "^8.6.0", + "postcss-attribute-case-insensitive": "^7.0.1", + "postcss-clamp": "^4.1.0", + "postcss-color-functional-notation": "^7.0.12", + "postcss-color-hex-alpha": "^10.0.0", + "postcss-color-rebeccapurple": "^10.0.0", + "postcss-custom-media": "^11.0.6", + "postcss-custom-properties": "^14.0.6", + "postcss-custom-selectors": "^8.0.5", + "postcss-dir-pseudo-class": "^9.0.1", + "postcss-double-position-gradients": "^6.0.4", + "postcss-focus-visible": "^10.0.1", + "postcss-focus-within": "^9.0.1", + "postcss-font-variant": "^5.0.0", + "postcss-gap-properties": "^6.0.0", + "postcss-image-set-function": "^7.0.0", + "postcss-lab-function": "^7.0.12", + "postcss-logical": "^8.1.0", + "postcss-nesting": "^13.0.2", + "postcss-opacity-percentage": "^3.0.0", + "postcss-overflow-shorthand": "^6.0.0", + "postcss-page-break": "^3.0.4", + "postcss-place": "^10.0.0", + "postcss-pseudo-class-any-link": "^10.0.1", + "postcss-replace-overflow-wrap": "^4.0.0", + "postcss-selector-not": "^8.0.1" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-pseudo-class-any-link": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/postcss-pseudo-class-any-link/-/postcss-pseudo-class-any-link-10.0.1.tgz", + "integrity": "sha512-3el9rXlBOqTFaMFkWDOkHUTQekFIYnaQY55Rsp8As8QQkpiSgIYEcF/6Ond93oHiDsGb4kad8zjt+NPlOC1H0Q==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "postcss-selector-parser": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-pseudo-class-any-link/node_modules/postcss-selector-parser": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", + "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-reduce-idents": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/postcss-reduce-idents/-/postcss-reduce-idents-6.0.3.tgz", + "integrity": "sha512-G3yCqZDpsNPoQgbDUy3T0E6hqOQ5xigUtBQyrmq3tn2GxlyiL0yyl7H+T8ulQR6kOcHJ9t7/9H4/R2tv8tJbMA==", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-reduce-initial": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-6.1.0.tgz", + "integrity": "sha512-RarLgBK/CrL1qZags04oKbVbrrVK2wcxhvta3GCxrZO4zveibqbRPmm2VI8sSgCXwoUHEliRSbOfpR0b/VIoiw==", + "license": "MIT", + "dependencies": { + "browserslist": "^4.23.0", + "caniuse-api": "^3.0.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-reduce-transforms": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-6.0.2.tgz", + "integrity": "sha512-sB+Ya++3Xj1WaT9+5LOOdirAxP7dJZms3GRcYheSPi1PiTMigsxHAdkrbItHxwYHr4kt1zL7mmcHstgMYT+aiA==", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-replace-overflow-wrap": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-replace-overflow-wrap/-/postcss-replace-overflow-wrap-4.0.0.tgz", + "integrity": "sha512-KmF7SBPphT4gPPcKZc7aDkweHiKEEO8cla/GjcBK+ckKxiZslIu3C4GCRW3DNfL0o7yW7kMQu9xlZ1kXRXLXtw==", + "license": "MIT", + "peerDependencies": { + "postcss": "^8.0.3" + } + }, + "node_modules/postcss-selector-not": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/postcss-selector-not/-/postcss-selector-not-8.0.1.tgz", + "integrity": "sha512-kmVy/5PYVb2UOhy0+LqUYAhKj7DUGDpSWa5LZqlkWJaaAV+dxxsOG3+St0yNLu6vsKD7Dmqx+nWQt0iil89+WA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "dependencies": { + "postcss-selector-parser": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-selector-not/node_modules/postcss-selector-parser": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", + "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-selector-parser": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", + "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-sort-media-queries": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/postcss-sort-media-queries/-/postcss-sort-media-queries-5.2.0.tgz", + "integrity": "sha512-AZ5fDMLD8SldlAYlvi8NIqo0+Z8xnXU2ia0jxmuhxAU+Lqt9K+AlmLNJ/zWEnE9x+Zx3qL3+1K20ATgNOr3fAA==", + "license": "MIT", + "dependencies": { + "sort-css-media-queries": "2.2.0" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "postcss": "^8.4.23" + } + }, + "node_modules/postcss-svgo": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-6.0.3.tgz", + "integrity": "sha512-dlrahRmxP22bX6iKEjOM+c8/1p+81asjKT+V5lrgOH944ryx/OHpclnIbGsKVd3uWOXFLYJwCVf0eEkJGvO96g==", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0", + "svgo": "^3.2.0" + }, + "engines": { + "node": "^14 || ^16 || >= 18" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-unique-selectors": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-6.0.4.tgz", + "integrity": "sha512-K38OCaIrO8+PzpArzkLKB42dSARtC2tmG6PvD4b1o1Q2E9Os8jzfWFfSy/rixsHwohtsDdFtAWGjFVFUdwYaMg==", + "license": "MIT", + "dependencies": { + "postcss-selector-parser": "^6.0.16" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", + "license": "MIT" + }, + "node_modules/postcss-zindex": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-zindex/-/postcss-zindex-6.0.2.tgz", + "integrity": "sha512-5BxW9l1evPB/4ZIc+2GobEBoKC+h8gPGCMi+jxsYvd2x0mjq7wazk6DrP71pStqxE9Foxh5TVnonbWpFZzXaYg==", + "license": "MIT", + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/pretty-error": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-4.0.0.tgz", + "integrity": "sha512-AoJ5YMAcXKYxKhuJGdcvse+Voc6v1RgnsR3nWcYU7q4t6z0Q6T86sv5Zq8VIRbOWWFpvdGE83LtdSMNd+6Y0xw==", + "license": "MIT", + "dependencies": { + "lodash": "^4.17.20", + "renderkid": "^3.0.0" + } + }, + "node_modules/pretty-time": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/pretty-time/-/pretty-time-1.1.0.tgz", + "integrity": "sha512-28iF6xPQrP8Oa6uxE6a1biz+lWeTOAPKggvjB8HAs6nVMKZwf5bG++632Dx614hIWgUPkgivRfG+a8uAXGTIbA==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/prism-react-renderer": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/prism-react-renderer/-/prism-react-renderer-2.4.1.tgz", + "integrity": "sha512-ey8Ls/+Di31eqzUxC46h8MksNuGx/n0AAC8uKpwFau4RPDYLuE3EXTp8N8G2vX2N7UC/+IXeNUnlWBGGcAG+Ig==", + "license": "MIT", + "dependencies": { + "@types/prismjs": "^1.26.0", + "clsx": "^2.0.0" + }, + "peerDependencies": { + "react": ">=16.0.0" + } + }, + "node_modules/prismjs": { + "version": "1.30.0", + "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.30.0.tgz", + "integrity": "sha512-DEvV2ZF2r2/63V+tK8hQvrR2ZGn10srHbXviTlcv7Kpzw8jWiNTqbVgjO3IY8RxrrOUF8VPMQQFysYYYv0YZxw==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "license": "MIT" + }, + "node_modules/prompts": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", + "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", + "license": "MIT", + "dependencies": { + "kleur": "^3.0.3", + "sisteransi": "^1.0.5" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/prop-types": { + "version": "15.8.1", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", + "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.13.1" + } + }, + "node_modules/property-information": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/property-information/-/property-information-7.2.0.tgz", + "integrity": "sha512-IAtzIB6sUiWaJYrX9smp3V46pBGbBeLFRGdh25kg1334VcBlD8HzhPeNIWQH9zhGmo2itIe25EHt9dQP7G5hmg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/proto-list": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz", + "integrity": "sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==", + "license": "ISC" + }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "license": "MIT", + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/proxy-addr/node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/pupa": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/pupa/-/pupa-3.3.0.tgz", + "integrity": "sha512-LjgDO2zPtoXP2wJpDjZrGdojii1uqO0cnwKoIoUzkfS98HDmbeiGmYiXo3lXeFlq2xvne1QFQhwYXSUCLKtEuA==", + "license": "MIT", + "dependencies": { + "escape-goat": "^4.0.0" + }, + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pvtsutils": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/pvtsutils/-/pvtsutils-1.3.6.tgz", + "integrity": "sha512-PLgQXQ6H2FWCaeRak8vvk1GW462lMxB5s3Jm673N82zI4vqtVUPuZdffdZbPDFRoU8kAhItWFtPCWiPpp4/EDg==", + "license": "MIT", + "dependencies": { + "tslib": "^2.8.1" + } + }, + "node_modules/pvutils": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/pvutils/-/pvutils-1.1.5.tgz", + "integrity": "sha512-KTqnxsgGiQ6ZAzZCVlJH5eOjSnvlyEgx1m8bkRJfOhmGRqfo5KLvmAlACQkrjEtOQ4B7wF9TdSLIs9O90MX9xA==", + "license": "MIT", + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/qs": { + "version": "6.15.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.15.2.tgz", + "integrity": "sha512-Rzq0KEyX/w/tEybncDgdkZrJgVUsUMk3xjh3t5bv3S1HTAtg+uOYt72+ZfwiQwKdysThkTBdL/rTi6HDmX9Ddw==", + "license": "BSD-3-Clause", + "dependencies": { + "side-channel": "^1.1.0" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/quick-lru": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", + "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "license": "MIT", + "dependencies": { + "safe-buffer": "^5.1.0" + } + }, + "node_modules/range-parser": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz", + "integrity": "sha512-kA5WQoNVo4t9lNx2kQNFCxKeBl5IbbSNBl1M/tLkw9WCn+hxNBAW5Qh8gdhs63CJnhjJ2zQWFoqPJP2sK1AV5A==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "2.5.3", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.3.tgz", + "integrity": "sha512-s4VSOf6yN0rvbRZGxs8Om5CWj6seneMwK3oDb4lWDH0UPhWcxwOWw5+qk24bxq87szX1ydrwylIOp2uG1ojUpA==", + "license": "MIT", + "dependencies": { + "bytes": "~3.1.2", + "http-errors": "~2.0.1", + "iconv-lite": "~0.4.24", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/raw-body/node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "license": "(BSD-2-Clause OR MIT OR Apache-2.0)", + "dependencies": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "bin": { + "rc": "cli.js" + } + }, + "node_modules/rc/node_modules/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "license": "ISC" + }, + "node_modules/rc/node_modules/strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react": { + "version": "19.2.7", + "resolved": "https://registry.npmjs.org/react/-/react-19.2.7.tgz", + "integrity": "sha512-HNe9WslTbXmFK8o8cmwgAeJFSBvt1bPdHCVKtaaV+WlAN36mpT4hcRpwbf3fY56ar2oIXzsBpOAiIRHAdY0OlQ==", + "license": "MIT", + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-dom": { + "version": "19.2.7", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.7.tgz", + "integrity": "sha512-t0BRVXvbiE/o20Hfw669rLbMCDWtYZLvmJigy2f0MxsXF+71pxhR3xOkspmsO8h3ZlNzyibAmtCa3l4lYKk6gQ==", + "license": "MIT", + "peer": true, + "dependencies": { + "scheduler": "^0.27.0" + }, + "peerDependencies": { + "react": "^19.2.7" + } + }, + "node_modules/react-fast-compare": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/react-fast-compare/-/react-fast-compare-3.2.2.tgz", + "integrity": "sha512-nsO+KSNgo1SbJqJEYRE9ERzo7YtYbou/OqjSQKxV7jcKox7+usiUVZOAC+XnDOABXggQTno0Y1CpVnuWEc1boQ==", + "license": "MIT" + }, + "node_modules/react-helmet-async": { + "name": "@slorber/react-helmet-async", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@slorber/react-helmet-async/-/react-helmet-async-1.3.0.tgz", + "integrity": "sha512-e9/OK8VhwUSc67diWI8Rb3I0YgI9/SBQtnhe9aEuK6MhZm7ntZZimXgwXnd8W96YTmSOb9M4d8LwhRZyhWr/1A==", + "license": "Apache-2.0", + "dependencies": { + "@babel/runtime": "^7.12.5", + "invariant": "^2.2.4", + "prop-types": "^15.7.2", + "react-fast-compare": "^3.2.0", + "shallowequal": "^1.1.0" + }, + "peerDependencies": { + "react": "^16.6.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", + "react-dom": "^16.6.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, + "node_modules/react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", + "license": "MIT" + }, + "node_modules/react-json-view-lite": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/react-json-view-lite/-/react-json-view-lite-2.5.0.tgz", + "integrity": "sha512-tk7o7QG9oYyELWHL8xiMQ8x4WzjCzbWNyig3uexmkLb54r8jO0yH3WCWx8UZS0c49eSA4QUmG5caiRJ8fAn58g==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "react": "^18.0.0 || ^19.0.0" + } + }, + "node_modules/react-loadable": { + "name": "@docusaurus/react-loadable", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@docusaurus/react-loadable/-/react-loadable-6.0.0.tgz", + "integrity": "sha512-YMMxTUQV/QFSnbgrP3tjDzLHRg7vsbMn8e9HAa8o/1iXoiomo48b7sk/kkmWEuWNDPJVlKSJRB6Y2fHqdJk+SQ==", + "license": "MIT", + "peer": true, + "dependencies": { + "@types/react": "*" + }, + "peerDependencies": { + "react": "*" + } + }, + "node_modules/react-loadable-ssr-addon-v5-slorber": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/react-loadable-ssr-addon-v5-slorber/-/react-loadable-ssr-addon-v5-slorber-1.0.3.tgz", + "integrity": "sha512-GXfh9VLwB5ERaCsU6RULh7tkemeX15aNh6wuMEBtfdyMa7fFG8TXrhXlx1SoEK2Ty/l6XIkzzYIQmyaWW3JgdQ==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.10.3" + }, + "engines": { + "node": ">=10.13.0" + }, + "peerDependencies": { + "react-loadable": "*", + "webpack": ">=4.41.1 || 5.x" + } + }, + "node_modules/react-router": { + "version": "5.3.4", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-5.3.4.tgz", + "integrity": "sha512-Ys9K+ppnJah3QuaRiLxk+jDWOR1MekYQrlytiXxC1RyfbdsZkS5pvKAzCCr031xHixZwpnsYNT5xysdFHQaYsA==", + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/runtime": "^7.12.13", + "history": "^4.9.0", + "hoist-non-react-statics": "^3.1.0", + "loose-envify": "^1.3.1", + "path-to-regexp": "^1.7.0", + "prop-types": "^15.6.2", + "react-is": "^16.6.0", + "tiny-invariant": "^1.0.2", + "tiny-warning": "^1.0.0" + }, + "peerDependencies": { + "react": ">=15" + } + }, + "node_modules/react-router-config": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/react-router-config/-/react-router-config-5.1.1.tgz", + "integrity": "sha512-DuanZjaD8mQp1ppHjgnnUnyOlqYXZVjnov/JzFhjLEwd3Z4dYjMSnqrEzzGThH47vpCOqPPwJM2FtthLeJ8Pbg==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.1.2" + }, + "peerDependencies": { + "react": ">=15", + "react-router": ">=5" + } + }, + "node_modules/react-router-dom": { + "version": "5.3.4", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-5.3.4.tgz", + "integrity": "sha512-m4EqFMHv/Ih4kpcBCONHbkT68KoAeHN4p3lAGoNryfHi0dMy0kCzEZakiKRsvg5wHZ/JLrLW8o8KomWiz/qbYQ==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.12.13", + "history": "^4.9.0", + "loose-envify": "^1.3.1", + "prop-types": "^15.6.2", + "react-router": "5.3.4", + "tiny-invariant": "^1.0.2", + "tiny-warning": "^1.0.0" + }, + "peerDependencies": { + "react": ">=15" + } + }, + "node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "license": "MIT", + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/recma-build-jsx": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/recma-build-jsx/-/recma-build-jsx-1.0.0.tgz", + "integrity": "sha512-8GtdyqaBcDfva+GUKDr3nev3VpKAhup1+RvkMvUxURHpW7QyIvk9F5wz7Vzo06CEMSilw6uArgRqhpiUcWp8ew==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "estree-util-build-jsx": "^3.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/recma-jsx": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/recma-jsx/-/recma-jsx-1.0.1.tgz", + "integrity": "sha512-huSIy7VU2Z5OLv6oFLosQGGDqPqdO1iq6bWNAdhzMxSJP7RAso4fCZ1cKu8j9YHCZf3TPrq4dw3okhrylgcd7w==", + "license": "MIT", + "dependencies": { + "acorn-jsx": "^5.0.0", + "estree-util-to-js": "^2.0.0", + "recma-parse": "^1.0.0", + "recma-stringify": "^1.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + }, + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/recma-parse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/recma-parse/-/recma-parse-1.0.0.tgz", + "integrity": "sha512-OYLsIGBB5Y5wjnSnQW6t3Xg7q3fQ7FWbw/vcXtORTnyaSFscOtABg+7Pnz6YZ6c27fG1/aN8CjfwoUEUIdwqWQ==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "esast-util-from-js": "^2.0.0", + "unified": "^11.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/recma-stringify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/recma-stringify/-/recma-stringify-1.0.0.tgz", + "integrity": "sha512-cjwII1MdIIVloKvC9ErQ+OgAtwHBmcZ0Bg4ciz78FtbT8In39aAYbaA7zvxQ61xVMSPE8WxhLwLbhif4Js2C+g==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "estree-util-to-js": "^2.0.0", + "unified": "^11.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/reflect-metadata": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.2.2.tgz", + "integrity": "sha512-urBwgfrvVP/eAyXx4hluJivBKzuEbSQs9rKWCrCkbSxNv8mxPcUZKeuoF3Uy4mJl3Lwprp6yy5/39VWigZ4K6Q==", + "license": "Apache-2.0" + }, + "node_modules/regenerate": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", + "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", + "license": "MIT" + }, + "node_modules/regenerate-unicode-properties": { + "version": "10.2.2", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.2.2.tgz", + "integrity": "sha512-m03P+zhBeQd1RGnYxrGyDAPpWX/epKirLrp8e3qevZdVkKtnCrjjWczIbYc8+xd6vcTStVlqfycTx1KR4LOr0g==", + "license": "MIT", + "dependencies": { + "regenerate": "^1.4.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/regexpu-core": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-6.4.0.tgz", + "integrity": "sha512-0ghuzq67LI9bLXpOX/ISfve/Mq33a4aFRzoQYhnnok1JOFpmE/A2TBGkNVenOGEeSBCjIiWcc6MVOG5HEQv0sA==", + "license": "MIT", + "dependencies": { + "regenerate": "^1.4.2", + "regenerate-unicode-properties": "^10.2.2", + "regjsgen": "^0.8.0", + "regjsparser": "^0.13.0", + "unicode-match-property-ecmascript": "^2.0.0", + "unicode-match-property-value-ecmascript": "^2.2.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/registry-auth-token": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-5.1.1.tgz", + "integrity": "sha512-P7B4+jq8DeD2nMsAcdfaqHbssgHtZ7Z5+++a5ask90fvmJ8p5je4mOa+wzu+DB4vQ5tdJV/xywY+UnVFeQLV5Q==", + "license": "MIT", + "dependencies": { + "@pnpm/npm-conf": "^3.0.2" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/registry-url": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-6.0.1.tgz", + "integrity": "sha512-+crtS5QjFRqFCoQmvGduwYWEBng99ZvmFvF+cUJkGYF1L1BfU8C6Zp9T7f5vPAwyLkUExpvK+ANVZmGU49qi4Q==", + "license": "MIT", + "dependencies": { + "rc": "1.2.8" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/regjsgen": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.8.0.tgz", + "integrity": "sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q==", + "license": "MIT" + }, + "node_modules/regjsparser": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.13.1.tgz", + "integrity": "sha512-dLsljMd9sqwRkby8zhO1gSg3PnJIBFid8f4CQj/sXx+7cKx+E7u0PKhZ+U4wmhx7EfmtvnA318oVaIkAB1lRJw==", + "license": "BSD-2-Clause", + "dependencies": { + "jsesc": "~3.1.0" + }, + "bin": { + "regjsparser": "bin/parser" + } + }, + "node_modules/rehype-raw": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/rehype-raw/-/rehype-raw-7.0.0.tgz", + "integrity": "sha512-/aE8hCfKlQeA8LmyeyQvQF3eBiLRGNlfBJEvWH7ivp9sBqs7TNqBL5X3v157rM4IFETqDnIOO+z5M/biZbo9Ww==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "hast-util-raw": "^9.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/rehype-recma": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/rehype-recma/-/rehype-recma-1.0.0.tgz", + "integrity": "sha512-lqA4rGUf1JmacCNWWZx0Wv1dHqMwxzsDWYMTowuplHF3xH0N/MmrZ/G3BDZnzAkRmxDadujCjaKM2hqYdCBOGw==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "@types/hast": "^3.0.0", + "hast-util-to-estree": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/relateurl": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", + "integrity": "sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==", + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/remark-directive": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/remark-directive/-/remark-directive-3.0.1.tgz", + "integrity": "sha512-gwglrEQEZcZYgVyG1tQuA+h58EZfq5CSULw7J90AFuCTyib1thgHPoqQ+h9iFvU6R+vnZ5oNFQR5QKgGpk741A==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-directive": "^3.0.0", + "micromark-extension-directive": "^3.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-emoji": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/remark-emoji/-/remark-emoji-4.0.1.tgz", + "integrity": "sha512-fHdvsTR1dHkWKev9eNyhTo4EFwbUvJ8ka9SgeWkMPYFX4WoI7ViVBms3PjlQYgw5TLvNQso3GUB/b/8t3yo+dg==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.2", + "emoticon": "^4.0.1", + "mdast-util-find-and-replace": "^3.0.1", + "node-emoji": "^2.1.0", + "unified": "^11.0.4" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + } + }, + "node_modules/remark-frontmatter": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/remark-frontmatter/-/remark-frontmatter-5.0.0.tgz", + "integrity": "sha512-XTFYvNASMe5iPN0719nPrdItC9aU0ssC4v14mH1BCi1u0n1gAocqcujWUrByftZTbLhRtiKRyjYTSIOcr69UVQ==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-frontmatter": "^2.0.0", + "micromark-extension-frontmatter": "^2.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-gfm": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/remark-gfm/-/remark-gfm-4.0.1.tgz", + "integrity": "sha512-1quofZ2RQ9EWdeN34S79+KExV1764+wCUGop5CPL1WGdD0ocPpu91lzPGbwWMECpEpd42kJGQwzRfyov9j4yNg==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-gfm": "^3.0.0", + "micromark-extension-gfm": "^3.0.0", + "remark-parse": "^11.0.0", + "remark-stringify": "^11.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-mdx": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/remark-mdx/-/remark-mdx-3.1.1.tgz", + "integrity": "sha512-Pjj2IYlUY3+D8x00UJsIOg5BEvfMyeI+2uLPn9VO9Wg4MEtN/VTIq2NEJQfde9PnX15KgtHyl9S0BcTnWrIuWg==", + "license": "MIT", + "dependencies": { + "mdast-util-mdx": "^3.0.0", + "micromark-extension-mdxjs": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-parse": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-11.0.0.tgz", + "integrity": "sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-from-markdown": "^2.0.0", + "micromark-util-types": "^2.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-rehype": { + "version": "11.1.2", + "resolved": "https://registry.npmjs.org/remark-rehype/-/remark-rehype-11.1.2.tgz", + "integrity": "sha512-Dh7l57ianaEoIpzbp0PC9UKAdCSVklD8E5Rpw7ETfbTl3FqcOOgq5q2LVDhgGCkaBv7p24JXikPdvhhmHvKMsw==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "mdast-util-to-hast": "^13.0.0", + "unified": "^11.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-stringify": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/remark-stringify/-/remark-stringify-11.0.0.tgz", + "integrity": "sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-to-markdown": "^2.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/renderkid": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-3.0.0.tgz", + "integrity": "sha512-q/7VIQA8lmM1hF+jn+sFSPWGlMkSAeNYcPLmDQx2zzuiDfaLrOmumR8iaUKlenFgh0XRPIUeSPlH3A+AW3Z5pg==", + "license": "MIT", + "dependencies": { + "css-select": "^4.1.3", + "dom-converter": "^0.2.0", + "htmlparser2": "^6.1.0", + "lodash": "^4.17.21", + "strip-ansi": "^6.0.1" + } + }, + "node_modules/renderkid/node_modules/css-select": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", + "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^6.0.1", + "domhandler": "^4.3.1", + "domutils": "^2.8.0", + "nth-check": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/renderkid/node_modules/dom-serializer": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", + "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", + "license": "MIT", + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^4.2.0", + "entities": "^2.0.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/renderkid/node_modules/domhandler": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", + "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", + "license": "BSD-2-Clause", + "dependencies": { + "domelementtype": "^2.2.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/renderkid/node_modules/domutils": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", + "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", + "license": "BSD-2-Clause", + "dependencies": { + "dom-serializer": "^1.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.2.0" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "node_modules/renderkid/node_modules/entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "license": "BSD-2-Clause", + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/renderkid/node_modules/htmlparser2": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz", + "integrity": "sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==", + "funding": [ + "https://github.com/fb55/htmlparser2?sponsor=1", + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "license": "MIT", + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^4.0.0", + "domutils": "^2.5.2", + "entities": "^2.0.0" + } + }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-like": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/require-like/-/require-like-0.1.2.tgz", + "integrity": "sha512-oyrU88skkMtDdauHDuKVrgR+zuItqr6/c//FXzvmxRGMexSDc6hNvJInGW3LL46n+8b50RykrvwSUIIQH2LQ5A==", + "engines": { + "node": "*" + } + }, + "node_modules/requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", + "license": "MIT" + }, + "node_modules/resolve": { + "version": "1.22.12", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.12.tgz", + "integrity": "sha512-TyeJ1zif53BPfHootBGwPRYT1RUt6oGWsaQr8UyZW/eAm9bKoijtvruSDEmZHm92CwS9nj7/fWttqPCgzep8CA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "is-core-module": "^2.16.1", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-alpn": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz", + "integrity": "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==", + "license": "MIT" + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/resolve-pathname": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-pathname/-/resolve-pathname-3.0.0.tgz", + "integrity": "sha512-C7rARubxI8bXFNB/hqcp/4iUeIXJhJZvFPFPiSPRnhU5UPxzMFIl+2E6yY6c4k9giDJAhtV+enfA+G89N6Csng==", + "license": "MIT" + }, + "node_modules/responselike": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/responselike/-/responselike-3.0.0.tgz", + "integrity": "sha512-40yHxbNcl2+rzXvZuVkrYohathsSJlMTXKryG5y8uciHv1+xDLHQpgjG64JUO9nrEq2jGLH6IZ8BcZyw3wrweg==", + "license": "MIT", + "dependencies": { + "lowercase-keys": "^3.0.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/retry": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", + "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/reusify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", + "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", + "license": "MIT", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rtlcss": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/rtlcss/-/rtlcss-4.3.0.tgz", + "integrity": "sha512-FI+pHEn7Wc4NqKXMXFM+VAYKEj/mRIcW4h24YVwVtyjI+EqGrLc2Hx/Ny0lrZ21cBWU2goLy36eqMcNj3AQJig==", + "license": "MIT", + "dependencies": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0", + "postcss": "^8.4.21", + "strip-json-comments": "^3.1.1" + }, + "bin": { + "rtlcss": "bin/rtlcss.js" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/run-applescript": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/run-applescript/-/run-applescript-7.1.0.tgz", + "integrity": "sha512-DPe5pVFaAsinSaV6QjQ6gdiedWDcRCbUuiQfQa2wmWV7+xC9bGulGI8+TdRmoFkAPaBXk8CrAbnlY2ISniJ47Q==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "license": "MIT" + }, + "node_modules/sax": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.6.0.tgz", + "integrity": "sha512-6R3J5M4AcbtLUdZmRv2SygeVaM7IhrLXu9BmnOGmmACak8fiUtOsYNWUS4uK7upbmHIBbLBeFeI//477BKLBzA==", + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=11.0.0" + } + }, + "node_modules/scheduler": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.27.0.tgz", + "integrity": "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==", + "license": "MIT" + }, + "node_modules/schema-dts": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/schema-dts/-/schema-dts-1.1.5.tgz", + "integrity": "sha512-RJr9EaCmsLzBX2NDiO5Z3ux2BVosNZN5jo0gWgsyKvxKIUL5R3swNvoorulAeL9kLB0iTSX7V6aokhla2m7xbg==", + "license": "Apache-2.0" + }, + "node_modules/schema-utils": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.3.tgz", + "integrity": "sha512-eflK8wEtyOE6+hsaRVPxvUKYCpRgzLqDTb8krvAsRIwOGlHoSgYLgBXoubGgLd2fT41/OUYdb48v4k4WWHQurA==", + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.9.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.1.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/search-insights": { + "version": "2.17.3", + "resolved": "https://registry.npmjs.org/search-insights/-/search-insights-2.17.3.tgz", + "integrity": "sha512-RQPdCYTa8A68uM2jwxoY842xDhvx3E5LFL1LxvxCNMev4o5mLuokczhzjAgGwUZBAmOKZknArSxLKmXtIi2AxQ==", + "license": "MIT", + "peer": true + }, + "node_modules/section-matter": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/section-matter/-/section-matter-1.0.0.tgz", + "integrity": "sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA==", + "license": "MIT", + "dependencies": { + "extend-shallow": "^2.0.1", + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/select-hose": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", + "integrity": "sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==", + "license": "MIT" + }, + "node_modules/selfsigned": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-5.5.0.tgz", + "integrity": "sha512-ftnu3TW4+3eBfLRFnDEkzGxSF/10BJBkaLJuBHZX0kiPS7bRdlpZGu6YGt4KngMkdTwJE6MbjavFpqHvqVt+Ew==", + "license": "MIT", + "dependencies": { + "@peculiar/x509": "^1.14.2", + "pkijs": "^3.3.3" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/semver": { + "version": "7.8.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.1.tgz", + "integrity": "sha512-rkVq3IXh+4FDGch+KwzX3aV9W3kO54GyEgpvBzSyctDA6Xtd7RJQV1xmXbeQp5v7+VzLOfVqiutSE6GICgPFvg==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-4.0.0.tgz", + "integrity": "sha512-0Ju4+6A8iOnpL/Thra7dZsSlOHYAHIeMxfhWQRI1/VLcT3WDBZKKtQt/QkBOsiIN9ZpuvHE6cGZ0x4glCMmfiA==", + "license": "MIT", + "dependencies": { + "semver": "^7.3.5" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/send": { + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/send/-/send-0.19.2.tgz", + "integrity": "sha512-VMbMxbDeehAxpOtWJXlcUS5E8iXh6QmN+BkRX1GARS3wRaXEEgzCcB10gTQazO42tpNIya8xIyNx8fll1OFPrg==", + "license": "MIT", + "dependencies": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "~0.5.2", + "http-errors": "~2.0.1", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "~2.4.1", + "range-parser": "~1.2.1", + "statuses": "~2.0.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/send/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/send/node_modules/debug/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" + }, + "node_modules/send/node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serialize-javascript": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", + "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", + "license": "BSD-3-Clause", + "dependencies": { + "randombytes": "^2.1.0" + } + }, + "node_modules/serve-handler": { + "version": "6.1.7", + "resolved": "https://registry.npmjs.org/serve-handler/-/serve-handler-6.1.7.tgz", + "integrity": "sha512-CinAq1xWb0vR3twAv9evEU8cNWkXCb9kd5ePAHUKJBkOsUpR1wt/CvGdeca7vqumL1U5cSaeVQ6zZMxiJ3yWsg==", + "license": "MIT", + "dependencies": { + "bytes": "3.0.0", + "content-disposition": "0.5.2", + "mime-types": "2.1.18", + "minimatch": "3.1.5", + "path-is-inside": "1.0.2", + "path-to-regexp": "3.3.0", + "range-parser": "1.2.0" + } + }, + "node_modules/serve-handler/node_modules/path-to-regexp": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-3.3.0.tgz", + "integrity": "sha512-qyCH421YQPS2WFDxDjftfc1ZR5WKQzVzqsp4n9M2kQhVOo/ByahFoUNJfl58kOcEGfQ//7weFTDhm+ss8Ecxgw==", + "license": "MIT" + }, + "node_modules/serve-index": { + "version": "1.9.2", + "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.2.tgz", + "integrity": "sha512-KDj11HScOaLmrPxl70KYNW1PksP4Nb/CLL2yvC+Qd2kHMPEEpfc4Re2e4FOay+bC/+XQl/7zAcWON3JVo5v3KQ==", + "license": "MIT", + "dependencies": { + "accepts": "~1.3.8", + "batch": "0.6.1", + "debug": "2.6.9", + "escape-html": "~1.0.3", + "http-errors": "~1.8.0", + "mime-types": "~2.1.35", + "parseurl": "~1.3.3" + }, + "engines": { + "node": ">= 0.8.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/serve-index/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/serve-index/node_modules/depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-index/node_modules/http-errors": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.1.tgz", + "integrity": "sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==", + "license": "MIT", + "dependencies": { + "depd": "~1.1.2", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-index/node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-index/node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-index/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" + }, + "node_modules/serve-index/node_modules/statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-static": { + "version": "1.16.3", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.3.tgz", + "integrity": "sha512-x0RTqQel6g5SY7Lg6ZreMmsOzncHFU7nhnRWkKgWuMTu5NN0DR5oruckMqRvacAN9d5w6ARnRBXl9xhDCgfMeA==", + "license": "MIT", + "dependencies": { + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "~0.19.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/set-function-length": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", + "license": "ISC" + }, + "node_modules/shallow-clone": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", + "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", + "license": "MIT", + "dependencies": { + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shallowequal": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/shallowequal/-/shallowequal-1.1.0.tgz", + "integrity": "sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==", + "license": "MIT" + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/shell-quote": { + "version": "1.8.4", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.4.tgz", + "integrity": "sha512-VsC6n6vz1ihYYyZZwX7YZSF5l5x36ca17OC+a69h94YqB7X6XLwf+5MOgynYir2SLFUbl8gIYvBo8K8RoNQ6bQ==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", + "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3", + "side-channel-list": "^1.0.0", + "side-channel-map": "^1.0.1", + "side-channel-weakmap": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-list": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.1.tgz", + "integrity": "sha512-mjn/0bi/oUURjc5Xl7IaWi/OJJJumuoJFQJfDDyO46+hBWsfaVM65TBHq2eoZBhzl9EchxOijpkbRC8SVBQU0w==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", + "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-weakmap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", + "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3", + "side-channel-map": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "license": "ISC" + }, + "node_modules/sirv": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/sirv/-/sirv-2.0.4.tgz", + "integrity": "sha512-94Bdh3cC2PKrbgSOUqTiGPWVZeSiXfKOVZNJniWoqrWrRkB1CJzBU3NEbiTsPcYy1lDsANA/THzS+9WBiy5nfQ==", + "license": "MIT", + "dependencies": { + "@polka/url": "^1.0.0-next.24", + "mrmime": "^2.0.0", + "totalist": "^3.0.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/sisteransi": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", + "license": "MIT" + }, + "node_modules/sitemap": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/sitemap/-/sitemap-7.1.3.tgz", + "integrity": "sha512-tAjEd+wt/YwnEbfNB2ht51ybBJxbEWwe5ki/Z//Wh0rpBFTCUSj46GnxUKEWzhfuJTsee8x3lybHxFgUMig2hw==", + "license": "MIT", + "dependencies": { + "@types/node": "^17.0.5", + "@types/sax": "^1.2.1", + "arg": "^5.0.0", + "sax": "^1.2.4" + }, + "bin": { + "sitemap": "dist/cli.js" + }, + "engines": { + "node": ">=12.0.0", + "npm": ">=5.6.0" + } + }, + "node_modules/sitemap/node_modules/@types/node": { + "version": "17.0.45", + "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.45.tgz", + "integrity": "sha512-w+tIMs3rq2afQdsPJlODhoUEKzFP1ayaoyl1CcnwtIlsVe7K7bA1NGm4s3PraqTLlXnbIN84zuBlxBWo1u9BLw==", + "license": "MIT" + }, + "node_modules/skin-tone": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/skin-tone/-/skin-tone-2.0.0.tgz", + "integrity": "sha512-kUMbT1oBJCpgrnKoSr0o6wPtvRWT9W9UKvGLwfJYO2WuahZRHOpEyL1ckyMGgMWh0UdpmaoFqKKD29WTomNEGA==", + "license": "MIT", + "dependencies": { + "unicode-emoji-modifier-base": "^1.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/snake-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/snake-case/-/snake-case-3.0.4.tgz", + "integrity": "sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg==", + "license": "MIT", + "dependencies": { + "dot-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/sockjs": { + "version": "0.3.24", + "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.24.tgz", + "integrity": "sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==", + "license": "MIT", + "dependencies": { + "faye-websocket": "^0.11.3", + "uuid": "^8.3.2", + "websocket-driver": "^0.7.4" + } + }, + "node_modules/sort-css-media-queries": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/sort-css-media-queries/-/sort-css-media-queries-2.2.0.tgz", + "integrity": "sha512-0xtkGhWCC9MGt/EzgnvbbbKhqWjl1+/rncmhTh5qCpbYguXh6S/qwePfv/JQ8jePXXmqingylxoC49pCkSPIbA==", + "license": "MIT", + "engines": { + "node": ">= 6.3.0" + } + }, + "node_modules/source-map": { + "version": "0.7.6", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.6.tgz", + "integrity": "sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==", + "license": "BSD-3-Clause", + "engines": { + "node": ">= 12" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "license": "MIT", + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/source-map-support/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/space-separated-tokens": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz", + "integrity": "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/spdy": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz", + "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==", + "license": "MIT", + "dependencies": { + "debug": "^4.1.0", + "handle-thing": "^2.0.0", + "http-deceiver": "^1.2.7", + "select-hose": "^2.0.0", + "spdy-transport": "^3.0.0" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/spdy-transport": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz", + "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", + "license": "MIT", + "dependencies": { + "debug": "^4.1.0", + "detect-node": "^2.0.4", + "hpack.js": "^2.1.6", + "obuf": "^1.1.2", + "readable-stream": "^3.0.6", + "wbuf": "^1.7.3" + } + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "license": "BSD-3-Clause" + }, + "node_modules/srcset": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/srcset/-/srcset-4.0.0.tgz", + "integrity": "sha512-wvLeHgcVHKO8Sc/H/5lkGreJQVeYMm9rlmt8PuR1xE31rIuXhuzznUUqAt8MqLhB3MqJdFzlNAfpcWnxiFUcPw==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/statuses": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz", + "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/std-env": { + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.10.0.tgz", + "integrity": "sha512-5GS12FdOZNliM5mAOxFRg7Ir0pWz8MdpYm6AY6VPkGpbA7ZzmbzNcBJQ0GPvvyWgcY7QAhCgf9Uy89I03faLkg==", + "license": "MIT" + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "license": "MIT", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/string-width/node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/string-width/node_modules/strip-ansi": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", + "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.2.2" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/stringify-entities": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-4.0.4.tgz", + "integrity": "sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==", + "license": "MIT", + "dependencies": { + "character-entities-html4": "^2.0.0", + "character-entities-legacy": "^3.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/stringify-object": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/stringify-object/-/stringify-object-3.3.0.tgz", + "integrity": "sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==", + "license": "BSD-2-Clause", + "dependencies": { + "get-own-enumerable-property-symbols": "^3.0.0", + "is-obj": "^1.0.1", + "is-regexp": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-bom-string": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-bom-string/-/strip-bom-string-1.0.0.tgz", + "integrity": "sha512-uCC2VHvQRYu+lMh4My/sFNmF2klFymLX1wHJeXnbEJERpV/ZsVuonzerjfrGpIGF7LBVa1O7i9kjiWvJiFck8g==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/style-to-js": { + "version": "1.1.21", + "resolved": "https://registry.npmjs.org/style-to-js/-/style-to-js-1.1.21.tgz", + "integrity": "sha512-RjQetxJrrUJLQPHbLku6U/ocGtzyjbJMP9lCNK7Ag0CNh690nSH8woqWH9u16nMjYBAok+i7JO1NP2pOy8IsPQ==", + "license": "MIT", + "dependencies": { + "style-to-object": "1.0.14" + } + }, + "node_modules/style-to-object": { + "version": "1.0.14", + "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-1.0.14.tgz", + "integrity": "sha512-LIN7rULI0jBscWQYaSswptyderlarFkjQ+t79nzty8tcIAceVomEVlLzH5VP4Cmsv6MtKhs7qaAiwlcp+Mgaxw==", + "license": "MIT", + "dependencies": { + "inline-style-parser": "0.2.7" + } + }, + "node_modules/stylehacks": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-6.1.1.tgz", + "integrity": "sha512-gSTTEQ670cJNoaeIp9KX6lZmm8LJ3jPB5yJmX8Zq/wQxOsAFXV3qjWzHas3YYk1qesuVIyYWWUpZ0vSE/dTSGg==", + "license": "MIT", + "dependencies": { + "browserslist": "^4.23.0", + "postcss-selector-parser": "^6.0.16" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/svg-parser": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/svg-parser/-/svg-parser-2.0.4.tgz", + "integrity": "sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ==", + "license": "MIT" + }, + "node_modules/svgo": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-3.3.3.tgz", + "integrity": "sha512-+wn7I4p7YgJhHs38k2TNjy1vCfPIfLIJWR5MnCStsN8WuuTcBnRKcMHQLMM2ijxGZmDoZwNv8ipl5aTTen62ng==", + "license": "MIT", + "dependencies": { + "commander": "^7.2.0", + "css-select": "^5.1.0", + "css-tree": "^2.3.1", + "css-what": "^6.1.0", + "csso": "^5.0.5", + "picocolors": "^1.0.0", + "sax": "^1.5.0" + }, + "bin": { + "svgo": "bin/svgo" + }, + "engines": { + "node": ">=14.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/svgo" + } + }, + "node_modules/svgo/node_modules/commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "license": "MIT", + "engines": { + "node": ">= 10" + } + }, + "node_modules/tapable": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.3.tgz", + "integrity": "sha512-uxc/zpqFg6x7C8vOE7lh6Lbda8eEL9zmVm/PLeTPBRhh1xCgdWaQ+J1CUieGpIfm2HdtsUpRv+HshiasBMcc6A==", + "license": "MIT", + "engines": { + "node": ">=6" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/terser": { + "version": "5.48.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.48.0.tgz", + "integrity": "sha512-J/9An6vs9Us6wKRriSFXBWdRZapREHqFzdNUKk0pmu804EMR6dr6winwo7e5JDxN4xahxQsuysyYFwlwj4XN/Q==", + "license": "BSD-2-Clause", + "dependencies": { + "@jridgewell/source-map": "^0.3.3", + "acorn": "^8.15.0", + "commander": "^2.20.0", + "source-map-support": "~0.5.20" + }, + "bin": { + "terser": "bin/terser" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/terser-webpack-plugin": { + "version": "5.6.1", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.6.1.tgz", + "integrity": "sha512-201R5j+sJpK8nFWwKVyNfZot8FaJbLZDq5evriVzbV1wDtSXDjRUDRfJzHpAaxFDMEhsZL1QkeqM61wgsS3KaQ==", + "license": "MIT", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.25", + "jest-worker": "^27.4.5", + "schema-utils": "^4.3.0", + "terser": "^5.31.1" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.1.0" + }, + "peerDependenciesMeta": { + "@minify-html/node": { + "optional": true + }, + "@swc/core": { + "optional": true + }, + "@swc/css": { + "optional": true + }, + "@swc/html": { + "optional": true + }, + "clean-css": { + "optional": true + }, + "cssnano": { + "optional": true + }, + "csso": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "html-minifier-terser": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "postcss": { + "optional": true + }, + "uglify-js": { + "optional": true + } + } + }, + "node_modules/terser-webpack-plugin/node_modules/jest-worker": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", + "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", + "license": "MIT", + "dependencies": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/terser-webpack-plugin/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/terser/node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "license": "MIT" + }, + "node_modules/thingies": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/thingies/-/thingies-2.6.0.tgz", + "integrity": "sha512-rMHRjmlFLM1R96UYPvpmnc3LYtdFrT33JIB7L9hetGue1qAPfn1N2LJeEjxUSidu1Iku+haLZXDuEXUHNGO/lg==", + "license": "MIT", + "engines": { + "node": ">=10.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "^2" + } + }, + "node_modules/thunky": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", + "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==", + "license": "MIT" + }, + "node_modules/tiny-invariant": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.3.tgz", + "integrity": "sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==", + "license": "MIT" + }, + "node_modules/tiny-warning": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/tiny-warning/-/tiny-warning-1.0.3.tgz", + "integrity": "sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==", + "license": "MIT" + }, + "node_modules/tinypool": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-1.1.1.tgz", + "integrity": "sha512-Zba82s87IFq9A9XmjiX5uZA/ARWDrB03OHlq+Vw1fSdt0I+4/Kutwy8BP4Y/y/aORMo61FQ0vIb5j44vSo5Pkg==", + "license": "MIT", + "engines": { + "node": "^18.0.0 || >=20.0.0" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "license": "MIT", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/totalist": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/totalist/-/totalist-3.0.1.tgz", + "integrity": "sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/tree-dump": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/tree-dump/-/tree-dump-1.1.0.tgz", + "integrity": "sha512-rMuvhU4MCDbcbnleZTFezWsaZXRFemSqAM+7jPnzUl1fo9w3YEKOxAeui0fz3OI4EU4hf23iyA7uQRVko+UaBA==", + "license": "Apache-2.0", + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/trim-lines": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/trim-lines/-/trim-lines-3.0.1.tgz", + "integrity": "sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/trough": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/trough/-/trough-2.2.0.tgz", + "integrity": "sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "license": "0BSD", + "peer": true + }, + "node_modules/tsyringe": { + "version": "4.10.0", + "resolved": "https://registry.npmjs.org/tsyringe/-/tsyringe-4.10.0.tgz", + "integrity": "sha512-axr3IdNuVIxnaK5XGEUFTu3YmAQ6lllgrvqfEoR16g/HGnYY/6We4oWENtAnzK6/LpJ2ur9PAb80RBt7/U4ugw==", + "license": "MIT", + "dependencies": { + "tslib": "^1.9.3" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/tsyringe/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "license": "0BSD" + }, + "node_modules/type-fest": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", + "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==", + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "license": "MIT", + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/type-is/node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/type-is/node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/typedarray-to-buffer": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", + "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", + "license": "MIT", + "dependencies": { + "is-typedarray": "^1.0.0" + } + }, + "node_modules/undici-types": { + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.24.6.tgz", + "integrity": "sha512-WRNW+sJgj5OBN4/0JpHFqtqzhpbnV0GuB+OozA9gCL7a993SmU+1JBZCzLNxYsbMfIeDL+lTsphD5jN5N+n0zg==", + "license": "MIT" + }, + "node_modules/unicode-canonical-property-names-ecmascript": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.1.tgz", + "integrity": "sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-emoji-modifier-base": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unicode-emoji-modifier-base/-/unicode-emoji-modifier-base-1.0.0.tgz", + "integrity": "sha512-yLSH4py7oFH3oG/9K+XWrz1pSi3dfUrWEnInbxMfArOfc1+33BlGPQtLsOYwvdMy11AwUBetYuaRxSPqgkq+8g==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-match-property-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", + "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", + "license": "MIT", + "dependencies": { + "unicode-canonical-property-names-ecmascript": "^2.0.0", + "unicode-property-aliases-ecmascript": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-match-property-value-ecmascript": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.2.1.tgz", + "integrity": "sha512-JQ84qTuMg4nVkx8ga4A16a1epI9H6uTXAknqxkGF/aFfRLw1xC/Bp24HNLaZhHSkWd3+84t8iXnp1J0kYcZHhg==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-property-aliases-ecmascript": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.2.0.tgz", + "integrity": "sha512-hpbDzxUY9BFwX+UeBnxv3Sh1q7HFxj48DTmXchNgRa46lO8uj3/1iEn3MiNUYTg1g9ctIqXCCERn8gYZhHC5lQ==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/unified": { + "version": "11.0.5", + "resolved": "https://registry.npmjs.org/unified/-/unified-11.0.5.tgz", + "integrity": "sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "bail": "^2.0.0", + "devlop": "^1.0.0", + "extend": "^3.0.0", + "is-plain-obj": "^4.0.0", + "trough": "^2.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unique-string": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-3.0.0.tgz", + "integrity": "sha512-VGXBUVwxKMBUznyffQweQABPRRW1vHZAbadFZud4pLFAqRGvv/96vafgjWFqzourzr8YonlQiPgH0YCJfawoGQ==", + "license": "MIT", + "dependencies": { + "crypto-random-string": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/unist-util-is": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.1.tgz", + "integrity": "sha512-LsiILbtBETkDz8I9p1dQ0uyRUWuaQzd/cuEeS1hoRSyW5E5XGmTzlwY1OrNzzakGowI9Dr/I8HVaw4hTtnxy8g==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-position": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-5.0.0.tgz", + "integrity": "sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-position-from-estree": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unist-util-position-from-estree/-/unist-util-position-from-estree-2.0.0.tgz", + "integrity": "sha512-KaFVRjoqLyF6YXCbVLNad/eS4+OfPQQn2yOd7zF/h5T/CSL2v8NpN6a5TPvtbXthAGw5nG+PuTtq+DdIZr+cRQ==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-stringify-position": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz", + "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-5.1.0.tgz", + "integrity": "sha512-m+vIdyeCOpdr/QeQCu2EzxX/ohgS8KbnPDgFni4dQsfSCtpz8UqDyY5GjRru8PDKuYn7Fq19j1CQ+nJSsGKOzg==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0", + "unist-util-visit-parents": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit-parents": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-6.0.2.tgz", + "integrity": "sha512-goh1s1TBrqSqukSc8wrjwWhL0hiJxgA8m4kFxGlQ+8FYQ3C/m11FcTs4YYem7V664AhHVvgoQLk890Ssdsr2IQ==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz", + "integrity": "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "escalade": "^3.2.0", + "picocolors": "^1.1.1" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/update-notifier": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-6.0.2.tgz", + "integrity": "sha512-EDxhTEVPZZRLWYcJ4ZXjGFN0oP7qYvbXWzEgRm/Yql4dHX5wDbvh89YHP6PK1lzZJYrMtXUuZZz8XGK+U6U1og==", + "license": "BSD-2-Clause", + "dependencies": { + "boxen": "^7.0.0", + "chalk": "^5.0.1", + "configstore": "^6.0.0", + "has-yarn": "^3.0.0", + "import-lazy": "^4.0.0", + "is-ci": "^3.0.1", + "is-installed-globally": "^0.4.0", + "is-npm": "^6.0.0", + "is-yarn-global": "^0.4.0", + "latest-version": "^7.0.0", + "pupa": "^3.1.0", + "semver": "^7.3.7", + "semver-diff": "^4.0.0", + "xdg-basedir": "^5.1.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/yeoman/update-notifier?sponsor=1" + } + }, + "node_modules/update-notifier/node_modules/boxen": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/boxen/-/boxen-7.1.1.tgz", + "integrity": "sha512-2hCgjEmP8YLWQ130n2FerGv7rYpfBmnmp9Uy2Le1vge6X3gZIfSmEzP5QTDElFxcvVcXlEn8Aq6MU/PZygIOog==", + "license": "MIT", + "dependencies": { + "ansi-align": "^3.0.1", + "camelcase": "^7.0.1", + "chalk": "^5.2.0", + "cli-boxes": "^3.0.0", + "string-width": "^5.1.2", + "type-fest": "^2.13.0", + "widest-line": "^4.0.1", + "wrap-ansi": "^8.1.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/update-notifier/node_modules/camelcase": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-7.0.1.tgz", + "integrity": "sha512-xlx1yCK2Oc1APsPXDL2LdlNP6+uu8OCDdhOBSVT279M/S+y75O30C2VuD8T2ogdePBBl7PfPF4504tnLgX3zfw==", + "license": "MIT", + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/update-notifier/node_modules/chalk": { + "version": "5.6.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz", + "integrity": "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==", + "license": "MIT", + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "license": "BSD-2-Clause", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/url-loader": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/url-loader/-/url-loader-4.1.1.tgz", + "integrity": "sha512-3BTV812+AVHHOJQO8O5MkWgZ5aosP7GnROJwvzLS9hWDj00lZ6Z0wNak423Lp9PBZN05N+Jk/N5Si8jRAlGyWA==", + "license": "MIT", + "dependencies": { + "loader-utils": "^2.0.0", + "mime-types": "^2.1.27", + "schema-utils": "^3.0.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "file-loader": "*", + "webpack": "^4.0.0 || ^5.0.0" + }, + "peerDependenciesMeta": { + "file-loader": { + "optional": true + } + } + }, + "node_modules/url-loader/node_modules/ajv": { + "version": "6.15.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.15.0.tgz", + "integrity": "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==", + "license": "MIT", + "peer": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/url-loader/node_modules/ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "license": "MIT", + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/url-loader/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "license": "MIT" + }, + "node_modules/url-loader/node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/url-loader/node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/url-loader/node_modules/schema-utils": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", + "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "license": "MIT" + }, + "node_modules/utila": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz", + "integrity": "sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA==", + "license": "MIT" + }, + "node_modules/utility-types": { + "version": "3.11.0", + "resolved": "https://registry.npmjs.org/utility-types/-/utility-types-3.11.0.tgz", + "integrity": "sha512-6Z7Ma2aVEWisaL6TvBCy7P8rm2LQoPv6dJ7ecIaIixHcwfbJ0x7mWdbcwlIM5IGQxPZSFYeqRCqlOOeKoJYMkw==", + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", + "license": "MIT", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "deprecated": "uuid@10 and below is no longer supported. For ESM codebases, update to uuid@latest. For CommonJS codebases, use uuid@11 (but be aware this version will likely be deprecated in 2028).", + "license": "MIT", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/value-equal": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/value-equal/-/value-equal-1.0.1.tgz", + "integrity": "sha512-NOJ6JZCAWr0zlxZt+xqCHNTEKOsrks2HQd4MqhP1qy4z1SkbEP467eNx6TgDKXMvUOb+OENfJCZwM+16n7fRfw==", + "license": "MIT" + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/vfile": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.3.tgz", + "integrity": "sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vfile-location": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/vfile-location/-/vfile-location-5.0.3.tgz", + "integrity": "sha512-5yXvWDEgqeiYiBe1lbxYF7UMAIm/IcopxMHrMQDq3nvKcjPKIhZklUKL+AE7J7uApI4kwe2snsK+eI6UTj9EHg==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vfile-message": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-4.0.3.tgz", + "integrity": "sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-stringify-position": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/watchpack": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.5.1.tgz", + "integrity": "sha512-Zn5uXdcFNIA1+1Ei5McRd+iRzfhENPCe7LeABkJtNulSxjma+l7ltNx55BWZkRlwRnpOgHqxnjyaDgJnNXnqzg==", + "license": "MIT", + "dependencies": { + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.1.2" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/wbuf": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", + "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", + "license": "MIT", + "dependencies": { + "minimalistic-assert": "^1.0.0" + } + }, + "node_modules/web-namespaces": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/web-namespaces/-/web-namespaces-2.0.1.tgz", + "integrity": "sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/webpack": { + "version": "5.107.2", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.107.2.tgz", + "integrity": "sha512-v7RhXaJbpMlV0D7hC7lb2EbnxkoeUqf9qhKr6lozx3Q48pmFrqqNRmZFUEGmi7pSwm6fCQ2H1IjvCkHqdpVdjQ==", + "license": "MIT", + "peer": true, + "dependencies": { + "@types/estree": "^1.0.8", + "@types/json-schema": "^7.0.15", + "@webassemblyjs/ast": "^1.14.1", + "@webassemblyjs/wasm-edit": "^1.14.1", + "@webassemblyjs/wasm-parser": "^1.14.1", + "acorn": "^8.16.0", + "acorn-import-phases": "^1.0.3", + "browserslist": "^4.28.1", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^5.22.0", + "es-module-lexer": "^2.1.0", + "eslint-scope": "5.1.1", + "events": "^3.2.0", + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.2.11", + "loader-runner": "^4.3.2", + "mime-db": "^1.54.0", + "neo-async": "^2.6.2", + "schema-utils": "^4.3.3", + "tapable": "^2.3.0", + "terser-webpack-plugin": "^5.5.0", + "watchpack": "^2.5.1", + "webpack-sources": "^3.5.0" + }, + "bin": { + "webpack": "bin/webpack.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependenciesMeta": { + "webpack-cli": { + "optional": true + } + } + }, + "node_modules/webpack-bundle-analyzer": { + "version": "4.10.2", + "resolved": "https://registry.npmjs.org/webpack-bundle-analyzer/-/webpack-bundle-analyzer-4.10.2.tgz", + "integrity": "sha512-vJptkMm9pk5si4Bv922ZbKLV8UTT4zib4FPgXMhgzUny0bfDDkLXAVQs3ly3fS4/TN9ROFtb0NFrm04UXFE/Vw==", + "license": "MIT", + "dependencies": { + "@discoveryjs/json-ext": "0.5.7", + "acorn": "^8.0.4", + "acorn-walk": "^8.0.0", + "commander": "^7.2.0", + "debounce": "^1.2.1", + "escape-string-regexp": "^4.0.0", + "gzip-size": "^6.0.0", + "html-escaper": "^2.0.2", + "opener": "^1.5.2", + "picocolors": "^1.0.0", + "sirv": "^2.0.3", + "ws": "^7.3.1" + }, + "bin": { + "webpack-bundle-analyzer": "lib/bin/analyzer.js" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/webpack-bundle-analyzer/node_modules/commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "license": "MIT", + "engines": { + "node": ">= 10" + } + }, + "node_modules/webpack-dev-middleware": { + "version": "7.4.5", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-7.4.5.tgz", + "integrity": "sha512-uxQ6YqGdE4hgDKNf7hUiPXOdtkXvBJXrfEGYSx7P7LC8hnUYGK70X6xQXUvXeNyBDDcsiQXpG2m3G9vxowaEuA==", + "license": "MIT", + "dependencies": { + "colorette": "^2.0.10", + "memfs": "^4.43.1", + "mime-types": "^3.0.1", + "on-finished": "^2.4.1", + "range-parser": "^1.2.1", + "schema-utils": "^4.0.0" + }, + "engines": { + "node": ">= 18.12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" + }, + "peerDependenciesMeta": { + "webpack": { + "optional": true + } + } + }, + "node_modules/webpack-dev-middleware/node_modules/mime-db": { + "version": "1.54.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", + "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/webpack-dev-middleware/node_modules/mime-types": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.2.tgz", + "integrity": "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==", + "license": "MIT", + "dependencies": { + "mime-db": "^1.54.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/webpack-dev-middleware/node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/webpack-dev-server": { + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-5.2.4.tgz", + "integrity": "sha512-GqDPGZN9bRqKBTkp4aWkobDDHMsrXKoGSdOH56smIri8qR0JG8gfL8/v/f/OZR3/OKXjG8uwJbFVhKm/FNU/UA==", + "license": "MIT", + "dependencies": { + "@types/bonjour": "^3.5.13", + "@types/connect-history-api-fallback": "^1.5.4", + "@types/express": "^4.17.25", + "@types/express-serve-static-core": "^4.17.21", + "@types/serve-index": "^1.9.4", + "@types/serve-static": "^1.15.5", + "@types/sockjs": "^0.3.36", + "@types/ws": "^8.5.10", + "ansi-html-community": "^0.0.8", + "bonjour-service": "^1.2.1", + "chokidar": "^3.6.0", + "colorette": "^2.0.10", + "compression": "^1.8.1", + "connect-history-api-fallback": "^2.0.0", + "express": "^4.22.1", + "graceful-fs": "^4.2.6", + "http-proxy-middleware": "^2.0.9", + "ipaddr.js": "^2.1.0", + "launch-editor": "^2.6.1", + "open": "^10.0.3", + "p-retry": "^6.2.0", + "schema-utils": "^4.2.0", + "selfsigned": "^5.5.0", + "serve-index": "^1.9.1", + "sockjs": "^0.3.24", + "spdy": "^4.0.2", + "webpack-dev-middleware": "^7.4.2", + "ws": "^8.18.0" + }, + "bin": { + "webpack-dev-server": "bin/webpack-dev-server.js" + }, + "engines": { + "node": ">= 18.12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" + }, + "peerDependenciesMeta": { + "webpack": { + "optional": true + }, + "webpack-cli": { + "optional": true + } + } + }, + "node_modules/webpack-dev-server/node_modules/define-lazy-prop": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz", + "integrity": "sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/webpack-dev-server/node_modules/open": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/open/-/open-10.2.0.tgz", + "integrity": "sha512-YgBpdJHPyQ2UE5x+hlSXcnejzAvD0b22U2OuAP+8OnlJT+PjWPxtgmGqKKc+RgTM63U9gN0YzrYc71R2WT/hTA==", + "license": "MIT", + "dependencies": { + "default-browser": "^5.2.1", + "define-lazy-prop": "^3.0.0", + "is-inside-container": "^1.0.0", + "wsl-utils": "^0.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/webpack-dev-server/node_modules/ws": { + "version": "8.21.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.21.0.tgz", + "integrity": "sha512-Vsp28b7DRcimFQvrqu2Wek3z1iYxDCWqHYB8Qsnk/S4RfaCQzPGPyBNuVjJV3cd6UiKtUtp6sNM77gWvzcCH+g==", + "license": "MIT", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/webpack-merge": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-6.0.1.tgz", + "integrity": "sha512-hXXvrjtx2PLYx4qruKl+kyRSLc52V+cCvMxRjmKwoA+CBbbF5GfIBtR6kCvl0fYGqTUPKB+1ktVmTHqMOzgCBg==", + "license": "MIT", + "dependencies": { + "clone-deep": "^4.0.1", + "flat": "^5.0.2", + "wildcard": "^2.0.1" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/webpack-sources": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.5.0.tgz", + "integrity": "sha512-HPuy+uuoTCaaoEoI1LQ3JN9+vrPBvEesnnX1jADHy728cHSMlq4wUc4afYqahq2B1mhQVZxCXOkNTnXltr+2vQ==", + "license": "MIT", + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/webpack/node_modules/mime-db": { + "version": "1.54.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", + "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/webpackbar": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/webpackbar/-/webpackbar-7.0.0.tgz", + "integrity": "sha512-aS9soqSO2iCHgqHoCrj4LbfGQUboDCYJPSFOAchEK+9psIjNrfSWW4Y0YEz67MKURNvMmfo0ycOg9d/+OOf9/Q==", + "license": "MIT", + "dependencies": { + "ansis": "^3.2.0", + "consola": "^3.2.3", + "pretty-time": "^1.1.0", + "std-env": "^3.7.0" + }, + "engines": { + "node": ">=14.21.3" + }, + "peerDependencies": { + "@rspack/core": "*", + "webpack": "3 || 4 || 5" + }, + "peerDependenciesMeta": { + "@rspack/core": { + "optional": true + }, + "webpack": { + "optional": true + } + } + }, + "node_modules/websocket-driver": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", + "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", + "license": "Apache-2.0", + "dependencies": { + "http-parser-js": ">=0.5.1", + "safe-buffer": ">=5.1.0", + "websocket-extensions": ">=0.1.1" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/websocket-extensions": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", + "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", + "license": "Apache-2.0", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/widest-line": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-4.0.1.tgz", + "integrity": "sha512-o0cyEG0e8GPzT4iGHphIOh0cJOV8fivsXxddQasHPHfoZf1ZexrfeA21w2NaEN1RHE+fXlfISmOE8R9N3u3Qig==", + "license": "MIT", + "dependencies": { + "string-width": "^5.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/wildcard": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.1.tgz", + "integrity": "sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==", + "license": "MIT" + }, + "node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-styles": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/strip-ansi": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", + "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.2.2" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/write-file-atomic": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", + "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", + "license": "ISC", + "dependencies": { + "imurmurhash": "^0.1.4", + "is-typedarray": "^1.0.0", + "signal-exit": "^3.0.2", + "typedarray-to-buffer": "^3.1.5" + } + }, + "node_modules/ws": { + "version": "7.5.11", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.11.tgz", + "integrity": "sha512-zS54Oen9bITtp7kp2XM3AydrCIq1D+HwJOuH+c+e4LfpL/lotP5osijd+UoMnxwAam1GN8R4KtLAyIrIcBNpiA==", + "license": "MIT", + "engines": { + "node": ">=8.3.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/wsl-utils": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/wsl-utils/-/wsl-utils-0.1.0.tgz", + "integrity": "sha512-h3Fbisa2nKGPxCpm89Hk33lBLsnaGBvctQopaBSOW/uIs6FTe1ATyAnKFJrzVs9vpGdsTe73WF3V4lIsk4Gacw==", + "license": "MIT", + "dependencies": { + "is-wsl": "^3.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/wsl-utils/node_modules/is-wsl": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-3.1.1.tgz", + "integrity": "sha512-e6rvdUCiQCAuumZslxRJWR/Doq4VpPR82kqclvcS0efgt430SlGIk05vdCN58+VrzgtIcfNODjozVielycD4Sw==", + "license": "MIT", + "dependencies": { + "is-inside-container": "^1.0.0" + }, + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/xdg-basedir": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-5.1.0.tgz", + "integrity": "sha512-GCPAHLvrIH13+c0SuacwvRYj2SxJXQ4kaVTT5xgL3kPrz56XxkF21IGhjSE1+W0aw7gpBWRGXLCPnPby6lSpmQ==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/xml-js": { + "version": "1.6.11", + "resolved": "https://registry.npmjs.org/xml-js/-/xml-js-1.6.11.tgz", + "integrity": "sha512-7rVi2KMfwfWFl+GpPg6m80IVMWXLRjO+PxTq7V2CDhoGak0wzYzFgUY2m4XJ47OGdXd8eLE8EmwfAmdjw7lC1g==", + "license": "MIT", + "dependencies": { + "sax": "^1.2.4" + }, + "bin": { + "xml-js": "bin/cli.js" + } + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "license": "ISC" + }, + "node_modules/yocto-queue": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.2.2.tgz", + "integrity": "sha512-4LCcse/U2MHZ63HAJVE+v71o7yOdIe4cZ70Wpf8D/IyjDKYQLV5GD46B+hSTjJsvV5PztjvHoU580EftxjDZFQ==", + "license": "MIT", + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/zwitch": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-2.0.4.tgz", + "integrity": "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + } + } +} diff --git a/website/package.json b/website/package.json new file mode 100644 index 00000000..ec86977e --- /dev/null +++ b/website/package.json @@ -0,0 +1,20 @@ +{ + "name": "timemanagement-website", + "version": "0.1.0", + "private": true, + "scripts": { + "start": "docusaurus start", + "build": "docusaurus build", + "serve": "docusaurus serve", + "clear": "docusaurus clear" + }, + "dependencies": { + "@docusaurus/core": "^3.9.2", + "@docusaurus/preset-classic": "^3.9.2", + "@mdx-js/react": "^3.1.0", + "clsx": "^2.1.1", + "prism-react-renderer": "^2.4.1", + "react": "^19.1.0", + "react-dom": "^19.1.0" + } +} diff --git a/website/sidebars.js b/website/sidebars.js new file mode 100644 index 00000000..5472612f --- /dev/null +++ b/website/sidebars.js @@ -0,0 +1,36 @@ +const sidebars = { + docs: [ + { + type: "category", + label: "Functional", + items: [ + "user/overview", + "user/install-and-run", + "user/setup-and-sync", + "user/features", + "user/troubleshooting" + ] + }, + { + type: "category", + label: "Technical", + items: [ + "technical/architecture", + "technical/repository-organization", + "technical/build-and-packaging", + "technical/release-process" + ] + }, + { + type: "category", + label: "Contributor", + items: [ + "contributing/getting-started", + "contributing/pull-request-guidelines", + "contributing/documentation-governance" + ] + } + ] +}; + +module.exports = sidebars; diff --git a/website/src/css/custom.css b/website/src/css/custom.css new file mode 100644 index 00000000..833cd981 --- /dev/null +++ b/website/src/css/custom.css @@ -0,0 +1,32 @@ +:root { + --ifm-color-primary: #b35a16; + --ifm-color-primary-dark: #a45214; + --ifm-color-primary-darker: #9b4d13; + --ifm-color-primary-darkest: #80400f; + --ifm-color-primary-light: #c7661c; + --ifm-color-primary-lighter: #d56f1f; + --ifm-color-primary-lightest: #de8742; + --ifm-background-color: #fffef9; + --ifm-navbar-background-color: rgba(255, 254, 249, 0.92); + --ifm-footer-background-color: #243125; + --ifm-code-font-size: 95%; + --ifm-heading-color: #1f2a1f; + --ifm-font-family-base: "Fira Sans", "Segoe UI", sans-serif; + --ifm-font-family-monospace: "Fira Code", "SFMono-Regular", monospace; +} + +html[data-theme="dark"] { + --ifm-background-color: #152019; + --ifm-navbar-background-color: rgba(21, 32, 25, 0.92); + --ifm-heading-color: #f6f2e8; + --ifm-color-content: #e8e1d2; + --ifm-color-primary: #de8742; +} + +.navbar { + backdrop-filter: blur(14px); +} + +.footer { + border-top: 1px solid rgba(255, 255, 255, 0.08); +} diff --git a/website/src/pages/index.js b/website/src/pages/index.js new file mode 100644 index 00000000..f4d54c2b --- /dev/null +++ b/website/src/pages/index.js @@ -0,0 +1,158 @@ +import clsx from "clsx"; +import Layout from "@theme/Layout"; +import Link from "@docusaurus/Link"; +import styles from "./index.module.css"; + +const productHighlights = [ + { + title: "Track work clearly", + description: + "Log timesheets, manage tasks, and keep day-to-day work visible from one app experience." + }, + { + title: "Bridge UI and backend", + description: + "The project combines QML, JavaScript models, and Python services to support desktop and Ubuntu Touch workflows." + }, + { + title: "Ship with confidence", + description: + "Keep functional docs, technical docs, and contributor guidance together so releases stay understandable." + } +]; + +const audienceCards = [ + { + title: "For users", + description: + "Start with installation, setup, sync, and troubleshooting guides.", + link: "/docs/user/overview", + cta: "Explore user docs" + }, + { + title: "For maintainers", + description: + "Understand architecture, repository layout, packaging, and release responsibilities.", + link: "/docs/technical/architecture", + cta: "Open technical docs" + }, + { + title: "For contributors", + description: + "Follow the PR workflow, local setup guidance, and documentation governance rules.", + link: "/docs/contributing/getting-started", + cta: "Read contributing docs" + } +]; + +const featureList = [ + "Timesheet recording and work logging", + "Task and project-oriented workflows", + "Odoo sync support and backend services", + "Desktop and Ubuntu Touch packaging workflow" +]; + +export default function Home() { + return ( + +
+
+
+
+

Product website + documentation hub

+

+ TimeManagement brings product guidance and project knowledge into one place. +

+

+ Use this site to understand what the app does, how to install it, how syncing works, + and how to contribute without digging through the repository first. +

+
+ + Read the docs + + + View architecture + +
+
+
+ TimeManagement logo +

Supported audiences

+
    +
  • End users and product stakeholders
  • +
  • Developers and maintainers
  • +
  • Contributors and reviewers
  • +
+
+
+
+
+ +
+
+
+
+

Why this site exists

+

One place for product story, usage guidance, and engineering context.

+
+
+ {productHighlights.map((item) => ( +
+

{item.title}

+

{item.description}

+
+ ))} +
+
+
+ +
+
+
+

Documentation paths

+

Start from the track that matches your role.

+
+
+ {audienceCards.map((card) => ( +
+

{card.title}

+

{card.description}

+ + {card.cta} + +
+ ))} +
+
+
+ +
+
+
+
+

Core capabilities

+

Built for active work management and sync-heavy workflows.

+
    + {featureList.map((feature) => ( +
  • {feature}
  • + ))} +
+
+
+ TimeManagement brand mark +

+ The first release of this site focuses on clarity: installation, setup, structure, + release process, and contributor guidance. +

+
+
+
+
+
+
+ ); +} diff --git a/website/src/pages/index.module.css b/website/src/pages/index.module.css new file mode 100644 index 00000000..7cc40840 --- /dev/null +++ b/website/src/pages/index.module.css @@ -0,0 +1,161 @@ +.hero { + background: + radial-gradient(circle at top left, rgba(239, 124, 38, 0.28), transparent 35%), + linear-gradient(135deg, #f8f4e7 0%, #fffef9 55%, #f2ece0 100%); + padding: 5rem 0 4rem; +} + +.heroGrid { + display: grid; + gap: 2rem; +} + +.kicker, +.eyebrow { + color: #8f4d1a; + font-size: 0.86rem; + font-weight: 700; + letter-spacing: 0.08em; + margin-bottom: 0.75rem; + text-transform: uppercase; +} + +.heroTitle { + color: #1f2a1f; + font-size: clamp(2.4rem, 5vw, 4.6rem); + line-height: 1.04; + margin-bottom: 1rem; + max-width: 11ch; +} + +.heroText { + color: #394639; + font-size: 1.1rem; + line-height: 1.75; + margin-bottom: 1.75rem; + max-width: 58ch; +} + +.heroActions { + display: flex; + flex-wrap: wrap; + gap: 0.9rem; +} + +.heroPanel { + align-self: center; + background: rgba(255, 255, 255, 0.8); + border: 1px solid rgba(107, 90, 57, 0.12); + border-radius: 24px; + box-shadow: 0 18px 60px rgba(84, 68, 42, 0.12); + padding: 2rem; +} + +.heroPanel h2 { + color: #273227; + font-size: 1.3rem; + margin-bottom: 0.8rem; +} + +.heroLogo { + display: block; + margin-bottom: 1.25rem; + max-width: 96px; +} + +.panelList { + color: #394639; + margin: 0; + padding-left: 1.2rem; +} + +.section { + padding: 4rem 0; +} + +.sectionAlt { + background: linear-gradient(180deg, #f5efe3 0%, #fbfaf6 100%); +} + +.sectionHeading { + margin-bottom: 1.75rem; + max-width: 44rem; +} + +.sectionHeading h2 { + color: #1f2a1f; + font-size: clamp(1.8rem, 3vw, 2.5rem); + line-height: 1.15; + margin: 0; +} + +.cardGrid { + display: grid; + gap: 1rem; +} + +.card { + background: #fffdf8; + border: 1px solid rgba(75, 62, 36, 0.1); + border-radius: 18px; + box-shadow: 0 10px 30px rgba(66, 55, 35, 0.07); + padding: 1.35rem; +} + +.card h3 { + color: #273227; + margin-bottom: 0.6rem; +} + +.card p { + color: #4b564b; + margin-bottom: 0; +} + +.inlineLink { + color: #8f4d1a; + display: inline-block; + font-weight: 700; + margin-top: 1rem; +} + +.splitSection { + display: grid; + gap: 1.25rem; +} + +.featureList { + color: #394639; + line-height: 1.9; + padding-left: 1.2rem; +} + +.visualCard { + align-items: center; + background: linear-gradient(145deg, #203021 0%, #2e4730 100%); + border-radius: 24px; + color: #f9f6ec; + display: grid; + gap: 1rem; + padding: 2rem; +} + +.visualCard img { + max-width: 120px; +} + +@media (min-width: 768px) { + .heroGrid { + align-items: center; + grid-template-columns: minmax(0, 1.4fr) minmax(280px, 0.9fr); + } + + .cardGrid { + grid-template-columns: repeat(3, minmax(0, 1fr)); + } + + .splitSection { + align-items: center; + grid-template-columns: minmax(0, 1.3fr) minmax(280px, 0.9fr); + } +} diff --git a/website/static/img/logo-mark.png b/website/static/img/logo-mark.png new file mode 100644 index 00000000..89a5124a --- /dev/null +++ b/website/static/img/logo-mark.png @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/website/static/img/logo.png b/website/static/img/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..a86366006d8ad0952d6b18bdaeab6052f73275df GIT binary patch literal 57616 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 literal 0 HcmV?d00001 diff --git a/website/static/img/social-card.png b/website/static/img/social-card.png new file mode 100644 index 0000000000000000000000000000000000000000..a86366006d8ad0952d6b18bdaeab6052f73275df GIT binary patch literal 57616 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 literal 0 HcmV?d00001 From 6422743bf62d1651e3acf8fdcf9c2ba1d93d5f59 Mon Sep 17 00:00:00 2001 From: Suraj Yadav Date: Fri, 5 Jun 2026 16:49:39 +0530 Subject: [PATCH 16/67] feat: Enhance homepage layout and styling with new features and documentation sections --- website/docusaurus.config.js | 6 + website/src/pages/index.js | 354 +++++++++++++----- website/src/pages/index.module.css | 582 ++++++++++++++++++++++++----- 3 files changed, 755 insertions(+), 187 deletions(-) diff --git a/website/docusaurus.config.js b/website/docusaurus.config.js index 923b7af4..42a7b07d 100644 --- a/website/docusaurus.config.js +++ b/website/docusaurus.config.js @@ -8,6 +8,12 @@ const config = { projectName: "timemanagement", trailingSlash: false, onBrokenLinks: "throw", + stylesheets: [ + { + href: "https://fonts.googleapis.com/css2?family=Space+Grotesk:wght@400;500;600;700&display=swap", + type: "text/css" + } + ], markdown: { hooks: { onBrokenMarkdownLinks: "warn" diff --git a/website/src/pages/index.js b/website/src/pages/index.js index f4d54c2b..dd8841b5 100644 --- a/website/src/pages/index.js +++ b/website/src/pages/index.js @@ -1,128 +1,292 @@ import clsx from "clsx"; import Layout from "@theme/Layout"; import Link from "@docusaurus/Link"; +import { useEffect, useRef } from "react"; import styles from "./index.module.css"; -const productHighlights = [ +const features = [ { - title: "Track work clearly", + icon: "⏱", + title: "Timesheet Recording", description: - "Log timesheets, manage tasks, and keep day-to-day work visible from one app experience." + "Log hours, track work entries, and maintain clear records across projects and activities.", + tag: "Core" }, { - title: "Bridge UI and backend", + icon: "☑", + title: "Task Management", description: - "The project combines QML, JavaScript models, and Python services to support desktop and Ubuntu Touch workflows." + "Organize tasks by project, track progress through stages, and manage work from a single view.", + tag: "Core" }, { - title: "Ship with confidence", + icon: "📊", + title: "Dashboard & Charts", description: - "Keep functional docs, technical docs, and contributor guidance together so releases stay understandable." + "Visual summaries, project timelines, and charts that show where time is actually going.", + tag: "Analytics" + }, + { + icon: "🔄", + title: "Odoo Sync", + description: + "Background daemon syncs with Odoo instances — local data and remote systems stay aligned.", + tag: "Integration" + }, + { + icon: "📱", + title: "Ubuntu Touch & Desktop", + description: + "Convergent design for phones and desktops. One codebase, two form factors.", + tag: "Platform" + }, + { + icon: "🔔", + title: "Live Notifications", + description: + "System-level alerts for project updates, task changes, and sync events.", + tag: "UX" } ]; -const audienceCards = [ +const techStack = [ { - title: "For users", + layer: "Interface", + tech: "QML", description: - "Start with installation, setup, sync, and troubleshooting guides.", - link: "/docs/user/overview", - cta: "Explore user docs" + "Application UI, pages, shared components, and user interaction layer.", + path: "qml/" }, { - title: "For maintainers", + layer: "Logic", + tech: "JavaScript", description: - "Understand architecture, repository layout, packaging, and release responsibilities.", - link: "/docs/technical/architecture", - cta: "Open technical docs" + "Shared state, data models, and cross-feature helper modules.", + path: "models/" }, { - title: "For contributors", + layer: "Services", + tech: "Python", description: - "Follow the PR workflow, local setup guidance, and documentation governance rules.", - link: "/docs/contributing/getting-started", - cta: "Read contributing docs" + "Backend bridging, daemon process, sync routines, and system integration.", + path: "src/" } ]; -const featureList = [ - "Timesheet recording and work logging", - "Task and project-oriented workflows", - "Odoo sync support and backend services", - "Desktop and Ubuntu Touch packaging workflow" +const docPaths = [ + { + audience: "Users", + description: + "Installation, setup, sync configuration, and troubleshooting guides.", + link: "/docs/user/overview", + cta: "User Docs", + pages: ["Overview", "Install & Run", "Setup & Sync", "Features", "Troubleshooting"] + }, + { + audience: "Contributors", + description: + "PR workflow, local development setup, and documentation governance.", + link: "/docs/contributing/getting-started", + cta: "Contributing Guide", + pages: ["Getting Started", "PR Guidelines", "Doc Governance"] + }, + { + audience: "Maintainers", + description: + "Architecture decisions, repository layout, build system, and release process.", + link: "/docs/technical/architecture", + cta: "Technical Docs", + pages: ["Architecture", "Repo Organization", "Build & Packaging", "Release Process"] + } ]; +function useScrollReveal() { + const ref = useRef(null); + + useEffect(() => { + const prefersReduced = window.matchMedia( + "(prefers-reduced-motion: reduce)" + ).matches; + if (prefersReduced) { + ref.current + ?.querySelectorAll("[data-reveal]") + .forEach((el) => el.setAttribute("data-visible", "true")); + return; + } + + const observer = new IntersectionObserver( + (entries) => { + entries.forEach((entry) => { + if (entry.isIntersecting) { + entry.target.setAttribute("data-visible", "true"); + observer.unobserve(entry.target); + } + }); + }, + { threshold: 0.08, rootMargin: "0px 0px -40px 0px" } + ); + + ref.current + ?.querySelectorAll("[data-reveal]") + .forEach((el) => observer.observe(el)); + + return () => observer.disconnect(); + }, []); + + return ref; +} + +function TerminalPreview() { + return ( +
+
+ + + +
+
+        $ 
+        git clone https://github.com/CITOpenRep/timemanagement.git
+        {"\n"}
+        $ 
+        cd timemanagement
+        {"\n"}
+        $ 
+        clickable build && clickable install
+      
+
+ ); +} + export default function Home() { + const mainRef = useScrollReveal(); + return ( + {/* ── HERO ── */}
+
-
-
-

Product website + documentation hub

-

- TimeManagement brings product guidance and project knowledge into one place. -

-

- Use this site to understand what the app does, how to install it, how syncing works, - and how to contribute without digging through the repository first. -

-
- - Read the docs - - - View architecture - -
-
-
- TimeManagement logo -

Supported audiences

-
    -
  • End users and product stakeholders
  • -
  • Developers and maintainers
  • -
  • Contributors and reviewers
  • -
-
+
+ Open Source · QML + JS + Python
+ +

+ Time + Management +

+ +

+ A practical workspace for tracking time, managing tasks, and + syncing with Odoo — built for Ubuntu Touch and desktop. +

+ +
+ + Get Started + + + View on GitHub → + +
+ +
-
-
+ {/* ── MAIN CONTENT ── */} +
+ {/* ── FEATURES ── */} +
-
-

Why this site exists

-

One place for product story, usage guidance, and engineering context.

+
+

Capabilities

+

+ Everything you need to track work and stay organized +

-
- {productHighlights.map((item) => ( -
-

{item.title}

-

{item.description}

+
+ {features.map((f) => ( +
+
+ {f.icon} + {f.tag} +
+

{f.title}

+

{f.description}

))}
-
+ {/* ── ARCHITECTURE ── */} +
+
+
+

Architecture

+

+ Three layers, one coherent system +

+
+
+ {techStack.map((layer, i) => ( +
+
+ {layer.layer} + {layer.tech} +
+

{layer.description}

+ {layer.path} +
+ ))} +
+
+
+ + {/* ── DOCUMENTATION ── */} +
-
-

Documentation paths

-

Start from the track that matches your role.

+
+

Documentation

+

+ Start from the track that matches your role +

-
- {audienceCards.map((card) => ( -
-

{card.title}

-

{card.description}

- - {card.cta} +
+ {docPaths.map((doc, i) => ( +
+

{doc.audience}

+

{doc.description}

+
    + {doc.pages.map((page) => ( +
  • {page}
  • + ))} +
+ + {doc.cta}
))} @@ -130,24 +294,28 @@ export default function Home() {
-
+ {/* ── OPEN SOURCE CTA ── */} +
-
-
-

Core capabilities

-

Built for active work management and sync-heavy workflows.

-
    - {featureList.map((feature) => ( -
  • {feature}
  • - ))} -
-
-
- TimeManagement brand mark -

- The first release of this site focuses on clarity: installation, setup, structure, - release process, and contributor guidance. -

+
+

Built in the open

+

+ TimeManagement is open source. Browse the code, report issues, + or contribute directly on GitHub. +

+
+ + View Repository + + + Report an Issue → +
diff --git a/website/src/pages/index.module.css b/website/src/pages/index.module.css index 7cc40840..c53f0876 100644 --- a/website/src/pages/index.module.css +++ b/website/src/pages/index.module.css @@ -1,161 +1,555 @@ +/* ── Reset & Reveal System ── */ +[data-reveal] { + opacity: 0; + transform: translateY(28px); + transition: opacity 0.7s cubic-bezier(0.16, 1, 0.3, 1), + transform 0.7s cubic-bezier(0.16, 1, 0.3, 1); + transition-delay: calc(var(--reveal-delay, 0) * 100ms); +} + +[data-reveal][data-visible="true"] { + opacity: 1; + transform: translateY(0); +} + +@media (prefers-reduced-motion: reduce) { + [data-reveal] { + opacity: 1; + transform: none; + transition: none; + } +} + +/* ── Hero ── */ .hero { - background: - radial-gradient(circle at top left, rgba(239, 124, 38, 0.28), transparent 35%), - linear-gradient(135deg, #f8f4e7 0%, #fffef9 55%, #f2ece0 100%); - padding: 5rem 0 4rem; + background: #0f1a14; + padding: 7rem 0 5rem; + position: relative; + overflow: hidden; + text-align: center; } -.heroGrid { - display: grid; - gap: 2rem; +.hero::after { + content: ""; + position: absolute; + inset: 0; + background-image: url("data:image/svg+xml,%3Csvg viewBox='0 0 200 200' xmlns='http://www.w3.org/2000/svg'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.9' numOctaves='4' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23n)' opacity='0.04'/%3E%3C/svg%3E"); + pointer-events: none; + z-index: 0; } -.kicker, -.eyebrow { - color: #8f4d1a; - font-size: 0.86rem; - font-weight: 700; - letter-spacing: 0.08em; - margin-bottom: 0.75rem; +.hero > * { + position: relative; + z-index: 1; +} + +.heroGlow { + position: absolute; + top: -160px; + left: 50%; + transform: translateX(-50%); + width: 700px; + height: 500px; + background: radial-gradient( + ellipse, + rgba(224, 122, 36, 0.12) 0%, + rgba(224, 122, 36, 0.04) 40%, + transparent 70% + ); + pointer-events: none; + z-index: 0; +} + +.heroBadge { + display: inline-flex; + align-items: center; + gap: 0.5rem; + font-size: 0.72rem; + font-weight: 600; + letter-spacing: 0.14em; text-transform: uppercase; + color: #e07a24; + border: 1px solid rgba(224, 122, 36, 0.25); + padding: 0.45rem 1.1rem; + border-radius: 2px; + margin-bottom: 2.5rem; + animation: fadeInDown 0.8s cubic-bezier(0.16, 1, 0.3, 1) both; } .heroTitle { - color: #1f2a1f; - font-size: clamp(2.4rem, 5vw, 4.6rem); - line-height: 1.04; - margin-bottom: 1rem; - max-width: 11ch; + font-family: "Space Grotesk", sans-serif; + font-size: clamp(3rem, 9vw, 6.5rem); + font-weight: 700; + line-height: 0.95; + color: #f0ebe0; + margin: 0 auto 1.5rem; + letter-spacing: -0.035em; + max-width: 14ch; + animation: fadeInUp 0.9s 0.15s cubic-bezier(0.16, 1, 0.3, 1) both; } -.heroText { - color: #394639; - font-size: 1.1rem; - line-height: 1.75; - margin-bottom: 1.75rem; - max-width: 58ch; +.heroTitleAccent { + color: #e07a24; } -.heroActions { +.heroTagline { + color: #9aa89c; + font-size: clamp(1.05rem, 2vw, 1.25rem); + line-height: 1.7; + max-width: 52ch; + margin: 0 auto 2.5rem; + animation: fadeInUp 0.9s 0.3s cubic-bezier(0.16, 1, 0.3, 1) both; +} + +.heroCtas { display: flex; flex-wrap: wrap; - gap: 0.9rem; + gap: 0.85rem; + justify-content: center; + margin-bottom: 3.5rem; + animation: fadeInUp 0.9s 0.45s cubic-bezier(0.16, 1, 0.3, 1) both; +} + +.ctaPrimary { + display: inline-flex; + align-items: center; + gap: 0.5rem; + background: #e07a24; + color: #0f1a14 !important; + font-weight: 700; + font-size: 0.95rem; + padding: 0.75rem 1.6rem; + border-radius: 2px; + text-decoration: none !important; + transition: background 0.2s ease, transform 0.2s ease, box-shadow 0.2s ease; + will-change: transform; +} + +.ctaPrimary:hover { + background: #f08a34; + transform: translateY(-2px); + box-shadow: 0 6px 24px rgba(224, 122, 36, 0.3); +} + +.ctaSecondary { + display: inline-flex; + align-items: center; + gap: 0.5rem; + background: transparent; + color: #c8bfa8 !important; + font-weight: 600; + font-size: 0.95rem; + padding: 0.75rem 1.6rem; + border: 1px solid rgba(200, 191, 168, 0.2); + border-radius: 2px; + text-decoration: none !important; + transition: border-color 0.2s ease, color 0.2s ease, transform 0.2s ease; + will-change: transform; } -.heroPanel { - align-self: center; - background: rgba(255, 255, 255, 0.8); - border: 1px solid rgba(107, 90, 57, 0.12); - border-radius: 24px; - box-shadow: 0 18px 60px rgba(84, 68, 42, 0.12); - padding: 2rem; +.ctaSecondary:hover { + border-color: rgba(200, 191, 168, 0.5); + color: #f0ebe0 !important; + transform: translateY(-2px); } -.heroPanel h2 { - color: #273227; - font-size: 1.3rem; - margin-bottom: 0.8rem; +/* Terminal Preview */ +.terminal { + max-width: 480px; + margin: 0 auto; + background: #1a2820; + border: 1px solid #2d3e32; + border-radius: 2px; + overflow: hidden; + text-align: left; + animation: fadeInUp 0.9s 0.6s cubic-bezier(0.16, 1, 0.3, 1) both; +} + +.terminalBar { + display: flex; + gap: 6px; + padding: 10px 14px; + background: #152019; + border-bottom: 1px solid #2d3e32; } -.heroLogo { - display: block; - margin-bottom: 1.25rem; - max-width: 96px; +.terminalDot { + width: 10px; + height: 10px; + border-radius: 50%; + background: #2d3e32; } -.panelList { - color: #394639; +.terminalDot:nth-child(1) { background: #e05544; } +.terminalDot:nth-child(2) { background: #e0a324; } +.terminalDot:nth-child(3) { background: #3d8a56; } + +.terminalCode { + padding: 1rem 1.25rem; margin: 0; - padding-left: 1.2rem; + font-family: "Fira Code", "SFMono-Regular", monospace; + font-size: 0.82rem; + line-height: 1.8; + color: #9aa89c; +} + +.terminalCode .terminalPrompt { + color: #3d8a56; + user-select: none; +} + +.terminalCode .terminalCmd { + color: #e6dfd0; } +/* ── Section System ── */ .section { - padding: 4rem 0; + padding: 5rem 0; +} + +.sectionDark { + background: #111d16; + position: relative; +} + +.sectionDark::after { + content: ""; + position: absolute; + inset: 0; + background-image: url("data:image/svg+xml,%3Csvg viewBox='0 0 200 200' xmlns='http://www.w3.org/2000/svg'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.9' numOctaves='4' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23n)' opacity='0.03'/%3E%3C/svg%3E"); + pointer-events: none; +} + +.sectionDark > * { + position: relative; + z-index: 1; +} + +.sectionLight { + background: #faf8f2; } -.sectionAlt { - background: linear-gradient(180deg, #f5efe3 0%, #fbfaf6 100%); +.sectionLabel { + font-size: 0.72rem; + font-weight: 700; + letter-spacing: 0.14em; + text-transform: uppercase; + color: #e07a24; + margin-bottom: 0.75rem; } -.sectionHeading { - margin-bottom: 1.75rem; - max-width: 44rem; +.sectionTitle { + font-family: "Space Grotesk", sans-serif; + font-size: clamp(1.8rem, 4vw, 2.8rem); + font-weight: 700; + line-height: 1.1; + letter-spacing: -0.02em; + margin: 0 0 3rem; + max-width: 22ch; } -.sectionHeading h2 { +.sectionTitleLight { color: #1f2a1f; - font-size: clamp(1.8rem, 3vw, 2.5rem); - line-height: 1.15; - margin: 0; } -.cardGrid { +.sectionTitleDark { + color: #f0ebe0; +} + +/* ── Features Grid ── */ +.featureGrid { display: grid; - gap: 1rem; + gap: 1px; + background: rgba(75, 62, 36, 0.1); + border: 1px solid rgba(75, 62, 36, 0.1); + border-radius: 2px; + overflow: hidden; } -.card { +.featureCard { background: #fffdf8; - border: 1px solid rgba(75, 62, 36, 0.1); - border-radius: 18px; - box-shadow: 0 10px 30px rgba(66, 55, 35, 0.07); - padding: 1.35rem; + padding: 1.75rem; + position: relative; + transition: background 0.25s ease; +} + +.featureCard:hover { + background: #faf5ea; +} + +.featureCardHeader { + display: flex; + align-items: center; + justify-content: space-between; + margin-bottom: 0.75rem; +} + +.featureIcon { + font-size: 1.5rem; + line-height: 1; +} + +.featureTag { + font-size: 0.65rem; + font-weight: 700; + letter-spacing: 0.1em; + text-transform: uppercase; + color: #8f6d3a; + background: rgba(224, 122, 36, 0.08); + padding: 0.25rem 0.55rem; + border-radius: 2px; +} + +.featureCard h3 { + font-family: "Space Grotesk", sans-serif; + font-size: 1.1rem; + font-weight: 600; + color: #1f2a1f; + margin: 0 0 0.5rem; + letter-spacing: -0.01em; +} + +.featureCard p { + color: #5a6b5a; + font-size: 0.92rem; + line-height: 1.6; + margin: 0; +} + +/* ── Architecture Stack ── */ +.stackDiagram { + display: flex; + flex-direction: column; + gap: 2px; + max-width: 640px; +} + +.stackLayer { + background: #1a2820; + border-left: 3px solid #e07a24; + padding: 1.5rem 1.75rem; + position: relative; + transition: background 0.25s ease, border-color 0.25s ease; +} + +.stackLayer:hover { + background: #1f3028; } -.card h3 { - color: #273227; - margin-bottom: 0.6rem; +.stackLayer:nth-child(2) { + border-left-color: #d4a34a; } -.card p { - color: #4b564b; - margin-bottom: 0; +.stackLayer:nth-child(3) { + border-left-color: #3d8a56; } -.inlineLink { - color: #8f4d1a; - display: inline-block; +.layerHeader { + display: flex; + align-items: center; + gap: 0.75rem; + margin-bottom: 0.5rem; +} + +.layerLabel { + font-size: 0.68rem; font-weight: 700; - margin-top: 1rem; + letter-spacing: 0.12em; + text-transform: uppercase; + color: #6b8870; +} + +.layerTech { + font-family: "Space Grotesk", sans-serif; + font-size: 1.2rem; + font-weight: 700; + color: #f0ebe0; +} + +.stackLayer p { + color: #8a9b8c; + font-size: 0.9rem; + line-height: 1.55; + margin: 0 0 0.6rem; +} + +.layerPath { + font-family: "Fira Code", monospace; + font-size: 0.78rem; + color: #e07a24; + background: rgba(224, 122, 36, 0.08); + padding: 0.2rem 0.5rem; + border-radius: 2px; } -.splitSection { +/* ── Documentation Cards ── */ +.docGrid { display: grid; gap: 1.25rem; } -.featureList { - color: #394639; - line-height: 1.9; - padding-left: 1.2rem; +.docCard { + background: #fffdf8; + border: 1px solid rgba(75, 62, 36, 0.1); + border-radius: 2px; + padding: 1.75rem; + display: flex; + flex-direction: column; + transition: border-color 0.25s ease, box-shadow 0.25s ease, transform 0.25s ease; + will-change: transform; +} + +.docCard:hover { + border-color: rgba(224, 122, 36, 0.25); + box-shadow: 0 8px 32px rgba(66, 55, 35, 0.08); + transform: translateY(-3px); +} + +.docCard h3 { + font-family: "Space Grotesk", sans-serif; + font-size: 1.2rem; + font-weight: 700; + color: #1f2a1f; + margin: 0 0 0.5rem; +} + +.docCard > p { + color: #5a6b5a; + font-size: 0.92rem; + line-height: 1.6; + margin: 0 0 1rem; +} + +.docPageList { + list-style: none; + padding: 0; + margin: 0 0 1.25rem; + display: flex; + flex-wrap: wrap; + gap: 0.4rem; +} + +.docPageList li { + font-size: 0.72rem; + font-weight: 600; + letter-spacing: 0.04em; + color: #6b7d6b; + background: rgba(75, 62, 36, 0.06); + padding: 0.3rem 0.6rem; + border-radius: 2px; } -.visualCard { +.docLink { + display: inline-flex; align-items: center; - background: linear-gradient(145deg, #203021 0%, #2e4730 100%); - border-radius: 24px; - color: #f9f6ec; - display: grid; - gap: 1rem; - padding: 2rem; + gap: 0.4rem; + color: #e07a24 !important; + font-weight: 700; + font-size: 0.88rem; + text-decoration: none !important; + margin-top: auto; + transition: gap 0.2s ease; } -.visualCard img { - max-width: 120px; +.docLink:hover { + gap: 0.7rem; } -@media (min-width: 768px) { - .heroGrid { - align-items: center; - grid-template-columns: minmax(0, 1.4fr) minmax(280px, 0.9fr); +/* ── Open Source CTA ── */ +.ossCta { + text-align: center; + max-width: 560px; + margin: 0 auto; +} + +.ossCta h2 { + font-family: "Space Grotesk", sans-serif; + font-size: clamp(1.8rem, 4vw, 2.5rem); + font-weight: 700; + color: #f0ebe0; + margin: 0 0 1rem; + letter-spacing: -0.02em; +} + +.ossCta p { + color: #8a9b8c; + font-size: 1.05rem; + line-height: 1.7; + margin: 0 0 2rem; +} + +.ossLinks { + display: flex; + flex-wrap: wrap; + gap: 0.85rem; + justify-content: center; +} + +/* ── Keyframes ── */ +@keyframes fadeInDown { + from { + opacity: 0; + transform: translateY(-16px); + } + to { + opacity: 1; + transform: translateY(0); + } +} + +@keyframes fadeInUp { + from { + opacity: 0; + transform: translateY(24px); + } + to { + opacity: 1; + transform: translateY(0); + } +} + +/* ── Responsive ── */ +@media (min-width: 640px) { + .featureGrid { + grid-template-columns: repeat(2, 1fr); + } +} + +@media (min-width: 960px) { + .featureGrid { + grid-template-columns: repeat(3, 1fr); } - .cardGrid { - grid-template-columns: repeat(3, minmax(0, 1fr)); + .docGrid { + grid-template-columns: repeat(3, 1fr); + } +} + +@media (max-width: 639px) { + .hero { + padding: 5rem 0 3.5rem; + } + + .section { + padding: 3.5rem 0; } - .splitSection { + .heroCtas { + flex-direction: column; align-items: center; - grid-template-columns: minmax(0, 1.3fr) minmax(280px, 0.9fr); + } + + .ctaPrimary, + .ctaSecondary { + width: 100%; + justify-content: center; + max-width: 280px; + } + + .terminal { + margin: 0 -1rem; + border-radius: 0; + border-left: none; + border-right: none; } } From 394d446a8fe398fa3ecb9b18a0c58dd689196bbd Mon Sep 17 00:00:00 2001 From: Parvathy Nair Date: Mon, 8 Jun 2026 15:48:39 +0530 Subject: [PATCH 17/67] [ADD] User Manual --- website/docs/functional/user-manual.md | 3812 ++++++++++++++++++++++++ 1 file changed, 3812 insertions(+) create mode 100644 website/docs/functional/user-manual.md diff --git a/website/docs/functional/user-manual.md b/website/docs/functional/user-manual.md new file mode 100644 index 00000000..0c102d14 --- /dev/null +++ b/website/docs/functional/user-manual.md @@ -0,0 +1,3812 @@ +# UT Time Management App Documentation + +# Time Management App – Functional Documentation (v1.2.7) + +# 1. Dashboard + +## 1.1 Introduction + +The **Dashboard** is the main screen of the Time Management App. It provides a quick overview of tasks, projects, and time distribution based on priority. + +This screen enables users to: + +- Identify tasks requiring immediate attention +- Organize work efficiently +- Monitor time spent across activities and projects + +--- + +## 1.2 Dashboard Overview + +The Dashboard consists of the following sections: + +1. Header (Top Bar) +2. Priority Matrix +3. Charts +4. Projects Section +5. Quick Action Button + +--- + +## 1.2.1 Header Section + +Located at the top of the screen. + +### Features: + +- **Account Name**: Displays the active user account +- **Menu Icon (☰)**: Opens the side navigation menu +- **Notification Icon (🔔)**: Displays alerts and updates +- **Add Icon (➕)**: Used to create a new timesheet entry +- **Kebab Menu Icon (⋮)**: Opens the overflow menu with additional navigation options + +--- + +## 1.2.2 Priority Matrix + +The Priority Matrix categorizes tasks based on **urgency** and **importance**. + +### Categories: + +**Do First (Urgent & Important)** + +- Tasks that require immediate attention + +**Do Next (Not Urgent & Important)** + +- Important tasks that can be scheduled + +**Do Later (Urgent & Not Important)** + +- Tasks that can be postponed or delegated + +**Don’t Do (Not Urgent & Not Important)** + +- Tasks that are unnecessary + +### Time Display: + +Each category displays total time spent (e.g., `0H`), helping users evaluate productivity and time allocation. + +--- + +## 1.2.3 Charts + +**Most Time-Consuming Projects (Donut Chart)** + +- Visual representation of time distribution across projects +- Larger segments indicate higher time usage + +**Project-wise Time Spent (Bar Chart)** + +- Displays time spent per project +- X-axis: Project names +- Y-axis: Time (in hours) +- Bars allow visual comparison of effort across projects + +--- + +## 1.2.4 Projects Section + +Displays detailed information about user projects. + +### Features: + +- **Total Time Spent** (e.g., `0.0 h`) +- **Progress Indicator**: Visual bar showing time utilization +- **Search Bar ("Search projects…")**: Enables quick project lookup + +### Sorting and Filtering Options: + +- **Most Time**: Sort by highest time spent +- **Tasks**: Sort by number of tasks +- **A–Z**: Alphabetical sorting + +--- + +## 1.2.5 Quick Action Button + +A floating action button located at the bottom-right corner. + +### Functions: + +- Add a new task +- Create a timesheet entry +- Log activity + +--- + +## 2. Kebab Menu (Overflow Menu) + +The Kebab Menu (⋮) is located in the **top-right corner of the Header Section** and provides quick access to key navigation items. + +### Purpose: + +- Offers an alternative navigation method to the sidebar +- Improves usability on smaller screens and compact layouts +- Enables quick access without opening the full menu + +### Menu Items: + +The following options are available in the Kebab Menu: + +- Dashboard +- Timesheet +- Activities +- My Tasks +- All Tasks +- Projects +- Project Updates +- About Us +- Settings + +--- + +## 3. About Us + +The **About Us** section provides essential information about the Time Management application, including its purpose, version details, and key capabilities. It can be accessible from the **Main Navigation Menu** + +This section helps users understand: + +- What the application does +- Who it is intended for +- The main features and benefits +- System and integration information + +## + +## 4. Settings + +The **Settings** section allows users to configure the application according to their preferences and manage system-level features such as connected accounts, notifications, synchronization, and appearance. + +This section is especially useful for first-time users to personalize their experience and ensure the app works seamlessly with external systems. + +--- + +## 4.1 Accessing Settings + +To open **Settings**: + +1. Click on the **Menu (☰)** icon in the top-left corner +2. Select **Settings** from the sidebar navigation + +The Settings screen is divided into multiple configurable sections. + +--- + +## 4.2 Settings Overview + +The Settings module includes the following options: + +1. Connected Accounts +2. Notifications +3. Background Sync +4. Theme Settings + +Each option is explained in detail below. + +--- + +## 4.3 Connected Accounts + +The **Connected Accounts** section allows users to link and manage multiple environments or instances (such as local, test, or production systems). + +### Purpose: + +- Enable integration with different servers or environments +- Allow switching between multiple accounts +- Manage synchronization across systems + +### Key Elements: + +- **Account List**: Displays all configured accounts +- **Account Type Indicator**: Shows whether it is Local or Server Instance +- **Instance URL**: Displays the connected server link +- **Status Indicator**: + - *In Progress*: Sync or connection is ongoing + - *Successful*: Connection is active and working +- **Sync Icon (🔄)**: Manually refresh or sync the account +- **Checkbox Selector**: Activate or select a specific account +- **Add Button (➕)**: Add a new account + +--- + +### + +## 4.3.1 Adding a New Account + +**Click on the (➕) icon to a**dd a new account + +### Sections in “Create Account” Screen: + +1. Account Details +2. Server Connection +3. Credentials +4. Sync Preferences + +Each section must be completed carefully to ensure a successful connection. + +--- + +### 4.3.1.1 Account Details + +This section defines how the account will appear inside the application. + +### Fields: + +- **Account Name** + - Enter a recognizable name (e.g., *Work Account*, *Test Server*) + - This name helps identify the account when switching between multiple accounts + +--- + +### 4.3.1.2 Server Connection + +This section is used to connect the app to your server. + +### Fields: + +- **URL** + - Enter the server URL. Example: [https://tma.onestein.eu/](https://tma.onestein.eu/) + + **Fetch Databases Button** + +After entering the URL, click **Fetch Databases**. + +--- + +### 4.3.1.3 Fetch Databases + +Clicking **Fetch Databases** initiates a process to retrieve available databases from the provided server. + +### System Behavior: + +- The app connects to the server +- A new screen or dialog opens +- A list of available databases is displayed + +### User Actions Required: + +On the database selection screen: + +- Review the list of available databases +- Select the appropriate database +- If required, manually enter the **Database Name** + +### Notes: + +- If no databases appear: + - Verify the server URL + - Check internet connectivity + - Ensure the server is accessible +- If multiple databases are listed: + - Choose the correct one based on your environment + +Once selected, confirm and return to the account setup screen. + +--- + +### 4.3.1.4 Database Name + +After fetching databases: + +- The selected database name will be auto-filled or manually entered +- Ensure the correct database is selected before proceeding + +--- + +### 4.3.1.5 Credentials + +This section is used to authenticate your account. + +### Fields: + +- **Username** + - Enter your login username +- **Connect With** + - **Connect With Password or API Key** +- **Password** + - Enter your account password + - Use the visibility toggle (👁) to view or hide the password + +--- + +### 4.3.1.6 Sync Preferences + +This section allows you to control how data synchronization works. + +### Options: + +- **Custom Sync Settings (Toggle Switch)** + + When enabled: + + - You can define custom sync behavior + + When disabled: + + - The system uses default settings: + - Sync Interval: ~15 minutes + - Direction: Two-way sync (data is both sent and received) + +--- + +### 4.3.1.7 Completing Account Setup + +After filling all required fields: + +1. Click the **✔ (Save/Confirm)** button at the top-right corner +2. The system will: + - Validate credentials + - Establish connection + - Add the account to the Connected Accounts list + +--- + +### 4.3.1.8 Post-Setup Behavior + +Once the account is successfully created: + +- It appears under **Connected Accounts** +- You can: + - Activate it using the checkbox + - Sync it manually using the 🔄 icon +- Initial synchronization may begin automatically + +--- + +### 4.3.2 Switching Between Accounts + +- Use the **checkbox** next to an account to activate it +- Only one account should be active at a time +- The active account determines where your data is synced and stored + +--- + +### 4.3.3 Syncing an Account + +- Click the **Sync (🔄)** icon next to an account +- The system will: + - Fetch latest data + - Update tasks, projects, timesheets etc.. +- Status will update automatically (e.g., *In Progress → Successful*) + +### 4.3.4 Managing Accounts (Swipe Actions) + +The **Connected Accounts** list supports quick actions using swipe gestures, allowing users to efficiently manage accounts without opening additional screens. + +### Purpose: + +- Provide faster access to common actions +- Improve usability, especially on touch devices +- Reduce navigation steps + +### Available Actions: + +**Swipe Right (→): Edit Account** + +- Swipe an account item to the **right** +- This reveals the **Edit** option +- Use this to: + - Update instance URL + - Modify login credentials + - Change account configuration + +--- + +**Swipe Left (←): View & Delete Options** + +- Swipe an account item to the **left** +- This reveals two action icons: +1. **View** + - Opens account details + - Displays configuration and connection information +2. **Delete** + - Removes the account from the app + + +## 4.4 Notifications + +The **Notifications** section controls how and when the application alerts you. + +### 4.4.1 Push Notifications + +The **Push Notifications** section allows you to control whether the application can send alerts directly to your device. + +### Key Option: + +- **Enable Notifications (Toggle Switch)** + - **ON**: The app will send real-time notifications for updates such as task changes, project updates, and activity logs + - **OFF**: All push notifications will be disabled + +### When to Enable: + +- If you want to stay informed about updates instantly +- If you rely on reminders for task or project updates, activity etc + +### When to Disable: + +- If you prefer fewer interruptions +- If you only check updates manually within the app + +--- + +### 4.4.2 Notification Schedule + +The **Notification Schedule** feature allows you to control *when* notifications are delivered, ensuring they only arrive during your preferred working hours. + +This is especially useful for maintaining work-life balance and avoiding notifications outside office hours. + +--- + +### 4.4.2.1 Enable Schedule + +- **Enable Schedule (Toggle Switch)** + - **ON**: Notifications will only be sent during configured days and hours + - **OFF**: Notifications can be sent at any time + +--- + +### 4.4.2.2 Timezone + +- Select your **Timezone** to ensure notifications are aligned with your local time +- Default value is usually set to **System Default** + +--- + +### 4.4.2.3 Working Days + +- Monday (Mon) +- Tuesday (Tue) +- Wednesday (Wed) +- Thursday (Thu) +- Friday (Fri) +- Saturday (Sat) +- Sunday (Sun) + +### How it works: + +- Only selected days will allow notifications +- Unselected days will block all notifications + +--- + +### 4.4.2.4 Working Hours + +### Fields: + +- **From**: Start time (e.g., 09:00) +- **To**: End time (e.g., 18:00) + +### Behavior: + +- Notifications will only be sent within the selected time range +- Notifications outside this range will be suppressed + +--- + +### 4.4.2.5 Example Configuration + +**Scenario: Standard Work Schedule** + +- Enable Notifications: ON +- Enable Schedule: ON +- Working Days: Monday to Friday +- Working Hours: 09:00 to 18:00 + +**Result:** + +You will only receive notifications during office hours on weekdays. + +--- + +## + +## 4.5 Background Sync + +The **Background Sync** feature ensures your data stays updated automatically. + +### Features: + +- Enable automatic synchronization +- Set sync frequency +- Sync tasks, timesheets, projects, projects updates etc.. in the background + +### Benefits: + +- Reduces manual effort +- Keeps data consistent across devices and accounts +- Ensures real-time updates + +--- + +## 4.5.1 Background Sync Settings Overview + +The **Background Sync Settings** screen allows you to configure how and when your data is synchronized with the server. + +This feature works in the background without requiring manual intervention, ensuring that your application always reflects the most up-to-date information. + +--- + +## 4.5.2 Key Configuration Options + +### 1. Enable AutoSync (Toggle Switch) + +- **ON**: + - Automatic synchronization is enabled + - The app will sync data at defined intervals +- **OFF**: + - Background sync is disabled + - Data must be synced manually (if applicable) + +--- + +### 2. Sync Interval + +Defines how often the application performs automatic synchronization. + +### Example Options: + +- 5 minutes *(Recommended)* +- 15 minutes *(Recommended)* +- 30 minutes or more + +### Recommendation: + +- Use **5–15 minutes** for active users +- Use longer intervals to conserve battery and data usage + +--- + +### 3. Sync Direction + +### Available Options: + +- **Both (Up & Down)** *(Default)* + - Uploads local changes to the server + - Downloads updates from the server +- **Upload Only (Up)** + - Sends local data to the server + - Does not fetch updates +- **Download Only (Down)** + - Retrieves updates from the server + - Does not upload local changes + +--- + +### 4. Restart Background Daemon + +This option allows you to restart the background synchronization service. + +### When to Use: + +- If sync appears stuck or not updating +- After changing sync settings +- After reconnecting an account + +## 4.5.3 How Background Sync Works + +When AutoSync is enabled: + +1. The app runs a background service +2. At each interval: + - Connects to the configured account/server + - Uploads new or modified data (tasks, timesheets, etc.) + - Downloads updates from the server +3. Updates are applied automatically without user action + +--- + +--- + +## 4.5.4 Best Practices + +- Keep **AutoSync enabled** for a seamless experience +- Use a **15-minute interval** for balanced performance and battery usage +- Keep **Sync Direction = Both** unless you have a specific need +- Restart the daemon if syncing issues occur + +--- + +## 4.6 Theme Settings + +The **Theme Settings** section allows users to customize the visual appearance of the application. + +### Benefits: + +- Improves readability +- Enhances user comfort during extended usage +- Supports accessibility preferences + +--- + +## 4.6.1 Theme Settings Overview + +The **Theme Settings** screen provides a simple and user-friendly interface to select your preferred application theme. + +Users can instantly switch between available themes, and the changes are applied across the entire application without requiring a restart. + +--- + +## 4.6.2 Available Theme Options + +### 1. Light Theme + +- Bright and clean interface +- Uses light backgrounds with dark text +- Suitable for well-lit environments and daytime use + +--- + +### 2. Dark Theme + +- Dark background with lighter text +- Reduces screen brightness and glare + +--- + +## 4.6.3 How to Change the Theme + +Follow these steps to update your theme: + +1. Select **Theme Settings** +2. Choose one of the available options: + - Light Theme + - Dark Theme +3. The selected theme will be applied immediately + +--- + +## 4.6.4 Selection Indicator + +- The currently selected theme is marked with a **check indicator (✔)** +- Only one theme can be active at a time + +--- + +## 4.6.5 System Behavior + +- Theme changes are applied **instantly** across all screens +- No restart or refresh is required +- The selected theme is **saved automatically** and persists across sessions + +--- + +## + +# 5. Projects + +The **Projects** module is used to create, organize, monitor, and manage all project-related activities within the Time Management App. + +Projects help users: + +- Group related tasks and activities +- Track project timelines and allocated effort +- Monitor progress and status +- Manage assignments and ownership +- Organize work efficiently across teams or departments + +The Projects section acts as a centralized workspace for all ongoing and completed projects. + +--- + +# 5.1 Accessing the Projects Module + +To open the **Projects** section: + +1. Click the **Menu (☰)** icon from the top-left corner +2. Select **Projects** from the sidebar navigation + +--- + +# 5.2 Projects Screen Overview + +The Projects screen contains the following components: + +1. Header Section +2. Projects List +3. Project Information Panel +4. Search and Filter Options +5. Quick Action Buttons + +--- + +# 5.2.1 Header Section + +Located at the top of the Projects screen. + +### Features: + +- **Search Icon** +Used to search projects quickly +- **Grid/List View Icon** +Switch between available project display layouts +- **Add Icon** +Create a new project +- **Save Icon** +Save newly created or edited project details + +--- + +# 5.2.2 Projects List Panel + +The left-side panel displays all available projects. + +Each project item provides a quick summary including: + +- Project Name +- Instance Name +- Current Status +- Planned Hours +- Start Date +- End Date +- Overdue Indicator (if applicable) + +### Example Statuses: + +- To Do +- In Progress +- Completed +- On Hold + +### Additional Indicators: + +- **Star Icon** +Marks favorite or important projects +- **Overdue Label** +Highlights projects that exceeded their planned completion date + +--- + +# 5.2.3 Project Information Panel + +On clicking on any pf the project from the project overview list, will displays detailed information about the selected project. + +--- + +# 5.3 Creating a New Project + +To create a project: + +1. Open the **Projects** module +2. Click the **➕ Add Icon** +3. Fill in the required project information +4. Click the **✔ Save Button** + +The project will then appear in the Projects List. + +--- + +# 5.3.1 Project Creation Fields + +The following fields are available while creating or editing a project. + +--- + +## 1. Account + +Defines which connected account or environment the project belongs to. + +### Purpose: + +- Ensures project data is stored in the correct server/account +- Useful when multiple accounts are configured + +### Behavior: + +- Displays the currently active account +- Can be changed using the dropdown selector + +--- + +## 2. Parent Project + +Used to create sub-projects under a larger project. + +### Purpose: + +- Organize complex projects into smaller sections +- Improve project hierarchy and structure + +### Example: + +Main Project: + +- Website Migration + +Sub Projects: + +- UI Design +- Backend Setup +- Testing + +### Behavior: + +- Tap or click **“Tap to select”** +- Choose an existing parent project + +--- + +## 3. Assignee + +Defines the user responsible for the project. + +### Purpose: + +- Clarifies ownership +- Helps track accountability + +### Behavior: + +- Select a user from the available list + +--- + +## 4. Project Name + +The primary title of the project. + +### Guidelines: + +- Use clear and descriptive names +- Keep names unique when possible + +### Example: + +- Mobile App Development +- CURQ Documentation +- Website Redesign + +--- + +## 5. Description + +Used to provide detailed information about the project. + +### Recommended Information: + +- Project objectives +- Scope of work +- Important notes +- Expected outcomes + +### + +--- + +## 6. Allocated Hours + +Defines the estimated time planned for the project. + +### Purpose: + +- Helps with workload planning +- Enables comparison between planned vs actual effort + +### Example: + +`01:00` = 1 Hour + +### Behavior: + +- Accepts hour and minute values +- Used in project tracking and reporting + +--- + +## 7. Color Indicator + +Allows assigning a color to the project. + +### Purpose: + +- Improve visual organization +- Make projects easier to identify + +### Behavior: + +- Click the color selector +- Choose a preferred project color + +The selected color may appear in project lists, charts, and calendars. + +--- + +# 5.3.2 Planned Dates Section + +The Planned Dates section defines the expected project timeline. + +--- + +## Date Range + +Provides quick date selection presets. + +### Example Options: + +- Today +- This Week +- This Month +- Custom Range + +### Purpose: + +- Simplifies date selection +- Speeds up project planning + +--- + +## Start Date + +Defines when the project is expected to begin. + +### Behavior: + +- Selected using the date picker +- Used for scheduling and reporting + +--- + +## End Date + +Defines the planned completion date. + +### Behavior: + +- Used to monitor deadlines +- Helps identify overdue projects + +### Important Note: + +If the current date exceeds the End Date and the project is incomplete, the system may display an **Overdue** indicator. + +--- + +# 5.3.3 Attachments Section + +The Attachments section allows users to upload and manage project-related files. + +### + +### How to Upload: + +1. Click the **Upload Icon** +2. Select a file from your device +3. Wait for upload completion + +### Benefits: + +- Keeps all project-related files centralized +- Improves collaboration and accessibility +- The attached file will get synced to server automatically and vic versa + +--- + +# 5.4 Viewing Project Details + +Selecting a project from the Projects List displays its details in the right-side panel. + +Users can review: + +- Project status +- Timeline +- Allocated hours +- Description +- Assigned user +- Attachments + +--- + +# 5.5 Editing a Project + +To edit an existing project: + +1. Select the project from the list +2. Click on the edit icon from the top right +3. Update the required fields +4. Click the **✔ Save Button** + +### + +--- + +# 5.6 Project Status Management + +Projects move through different statuses during their lifecycle. + +### Common Statuses: + +| Status | Description | +| --- | --- | +| To Do | Project has not started | +| In Progress | Work is currently ongoing | +| Completed | Project work is finished | +| On Hold | Temporarily paused | + +### Benefits: + +- Helps monitor project progress +- Improves reporting and planning +- Enables workload tracking + +--- + +# 5.7 Searching Projects + +The Projects module includes a search feature for quickly locating projects. + +### Search Capabilities: + +Users can search using Project Name + +### How to Search: + +1. Click the **Search Icon** +2. Enter search text +3. Matching projects are displayed instantly + +--- + +# 5.8 Project Favorites + +Projects can be marked as favorites using the **Star Icon** + +### Benefits: + +- Faster access to important projects +- Improved productivity +- Easier navigation + +### Behavior: + +- Tap the star icon to mark/unmark a project as favorite + +--- + +# + +# 5.9 Project Overview Swipe Actions + +From the Projects List overview, swipe any project item to the **left** to reveal three action icons: + +- **View** +- **Start** +- **Pause** + +### Available Actions: + +### 1. View + +Clicking the **View** icon opens the detailed page of the selected project, where users can review and manage complete project information. + +### 2. Start + +Clicking the **Start** icon starts the project timer. + +Once started, the application begins recording time automatically and creates a timesheet entry for the corresponding project. + +### 3. Pause + +Clicking the **Pause** icon stops the active timer and pauses time tracking for the project. + +### Benefits: + +- Quick access to project actions +- Faster time tracking +- Improved productivity and workflow management +- Reduced navigation effort + +# 5.10 Filter Projects by Stage + +The **Filter by Stage** feature allows users to quickly view projects based on their current status or progress stage. + +This feature is accessible through the **Floating Action Button (FAB)** located at the bottom-right corner of the Projects screen. + +--- + +# 5.10.1 Accessing the Filter Menu + +To open the project stage filter: + +1. Navigate to the **Projects** module +2. Click the **Floating Action Button (FAB)** at the bottom-right corner +3. A filter panel titled **“Filter by Stage”** will appear + +The filter panel displays available project stages and filtering options. + +--- + +# 5.10.2 Available Filter Options + +For example, users can filter projects using the following stages: + +| Filter Option | Description | +| --- | --- | +| Open Projects | Displays all active and ongoing projects | +| All Stages | Displays projects from every status | +| To Do | Displays projects that have not started | +| In Progress | Displays projects currently being worked on | +| Done | Displays completed projects | +| Cancelled | Displays cancelled or closed projects | + +--- + +# 5.10.3 How Filtering Works + +When a stage is selected: + +- The Projects List refreshes automatically +- Only projects matching the selected stage are displayed +- Filtering helps users focus on specific project categories +- By default, all stages will be displayed when opening a project list overview + +### Example: + +Selecting **In Progress** will display only projects currently under active development or execution. + +--- + +--- + +# 5.10.4 Clearing or Changing Filters + +Users can change the applied filter at any time by: + +1. Opening the **Filter by Stage** panel again +2. Selecting a different stage + +To display all projects again: + +- Select **All Stages** + +--- + +# + +# 6. Tasks + +The **Tasks** module helps users create, organize, assign, and track individual or all work items within the Time Management App. + +Tasks are the core working units of the application and can be linked to projects, assignees, stages, priorities, and planned schedules. + +This module enables users to: + +- Create and manage daily work items +- Assign responsibilities to team members +- Track deadlines and overdue tasks +- Organize tasks by stage and priority +- Monitor workload efficiently +- Improve productivity and planning + +--- + +# 6.1 Accessing the Tasks Module + +To open the **Tasks** section: + +1. Click the **Menu (☰)** icon from the top-left corner +2. Select **All Tasks** from the sidebar navigation + +The Tasks screen will open and display all available tasks. + +--- + +# 6.2 Tasks Screen Overview + +The Tasks screen is divided into two main sections: + +1. Tasks Overview Panel +2. Task Details Panel or create new task page + +--- + +--- + +# 6.2.1 Tasks Overview Panel + +Each task card provides a quick summary including: + +- Task Name +- Related Project Name +- Task Stage +- Priority Indicator +- Planned Hours +- Start Date +- End Date +- Overdue Status + +### Example Task Stages: + +- Analysis +- Design +- Development +- Testing +- Completed + +### Overdue Indicator: + +If a task exceeds its planned end date and is not completed, the system displays an **Overdue** label in red. + +### Date Tabs: + +Tasks can be filtered using quick date categories: + +- Today +- This Week +- This Month +- Later +- Done +- All + +### Benefits: + +- Helps users focus on current work +- Simplifies workload management +- Improves task visibility + +--- + +# 6.2.3 Task Details Panel or creating a new task + +To create a new task, click on the + icon, the new task entry form will open. + +Inorder to view the task details of already created task, just click on the corresponding task, it will displays detailed information about the selected task. + +Users can: + +- Create new tasks +- Edit existing tasks +- Assign users +- Set priorities +- Define stages +- Add descriptions +- Configure dates and planned hours +- Upload attachments + +--- + +# 6.3 Creating a New Task + +To create a task: + +1. Open the **All Tasks** module +2. Click the **➕ Add Icon** from the top-right corner +3. Fill in the required task details +4. Click the **✔ Save Button** + +The task will then appear in the Tasks Overview list. + +--- + +# 6.3.1 Task Creation Fields + +The following fields are available while creating or editing a task. + +--- + +## 1. Account + +Defines which connected account or environment the task belongs to. + +### Purpose: + +- Ensures task data is stored in the correct server/account +- Useful when multiple accounts are configured + +### Behavior: + +- Displays the active account +- Can be changed using the dropdown selector + +--- + +## 2. Project + +Used to associate the task with a specific project. + +### Purpose: + +- Organizes tasks under projects +- Enables project-based tracking and reporting + +### Behavior: + +- Tap or click **“Tap to select”** +- Select an available project from the list + +--- + +## 3. Subproject + +Allows linking the task to a subproject if applicable. + +### Purpose: + +- Improves task organization +- Supports hierarchical project management + +### Behavior: + +- Optional field +- Available only when subprojects exist + +--- + +## 4. Parent Task + +Used to create child tasks under a larger task. + +### Purpose: + +- Break large tasks into smaller manageable items +- Improve task structure and workflow + +### Behavior: + +- Select an existing parent task if required + +--- + +## 5. Assignees + +Defines the users responsible for the task. + +### Purpose: + +- Clarifies ownership +- Enables collaboration +- Helps monitor accountability + +### Behavior: + +- Click **Select Assignees** +- Choose one or multiple users from the list +- To unselect the assignees, click on the cross icon + +--- + +## 6. Task Name + +The primary title of the task. + +### Guidelines: + +- Use short and descriptive names +- Clearly define the work item + +### + +--- + +## 7. Priority + +Defines the importance level of the task. + +### Purpose: + +- Helps identify urgent work +- Improves planning and scheduling + +### Behavior: + +- Priority is selected using the star rating system +- More highlighted stars indicate higher priority + +### Example: + +- ★☆☆ = Low Priority +- ★★☆ = Medium Priority +- ★★★ = High Priority + +--- + +## 8. Initial Stage + +Defines the current workflow stage of the task. + +### Example Stages: + +- Analysis +- Design +- Development +- Testing +- Completed + +### Purpose: + +- Tracks progress of work +- Improves workflow management + +### Behavior: + +- Select a stage from the dropdown menu + +--- + +## 9. Description + +Used to provide detailed information about the task. + +### Recommended Information: + +- Objectives +- Scope of work +- Technical notes +- Important instructions + +### Benefits: + +- Improves communication +- Reduces misunderstandings +- Provides implementation clarity + +--- + +## 10. Planned Hours + +Defines the estimated time required for the task. + +### Purpose: + +- Helps with effort estimation +- Enables planned vs actual time comparison + +### Example: + +`01:00` = 1 Hour + +### Behavior: + +- Supports hour and minute input +- Plus (+) and minus (-) buttons help adjust time quickly + +--- + +# 6.3.2 Planned Dates Section + +The Planned Dates section defines the expected task schedule. + +--- + +## Date Range + +Provides quick scheduling presets. + +### Example Options: + +- Today +- This Week +- This Month +- Custom Range + +### Purpose: + +- Speeds up date selection +- Simplifies task planning + +--- + +## Start Date + +Defines when the task is expected to begin. + +### Behavior: + +- Selected using the date picker +- Used for scheduling and reporting + +--- + +## End Date + +Defines the planned completion date. + +### Behavior: + +- Used for deadline tracking +- Helps identify overdue tasks + +### Note: + +If the current date exceeds the End Date and the task is incomplete, the system displays an **Overdue** indicator. + +--- + +# 6.3.3 Deadline Section + +The Deadline section allows users to define a final expected completion date for the task. + +### Purpose: + +- Improves schedule tracking +- Helps prioritize urgent work +- Enables deadline monitoring + +### Behavior: + +- Click the **Select** button +- Choose a deadline date from the date picker + +--- + +# 6.3.4 Attachments Section + +The Attachments section allows users to upload files related to the task. + +### + +### How to Upload: + +1. Click the **Upload Icon** +2. Select a file from your device +3. Wait for upload completion + +### Benefits: + +- Centralizes task-related files +- Improves collaboration +- Ensures files are available across synced devices + +--- + +# 6.4 Viewing Task Details + +Selecting a task from the Tasks Overview Panel displays its complete information in the Task Details Panel. + +Users can review: + +- Task status +- Assigned users +- Planned hours +- Timeline +- Priority +- Description +- Attachments + +--- + +# 6.5 Editing a Task + +To edit an existing task: + +1. Select the task from the task list and clck on edit icon or from the task overview, swipe the corresponding task to the left, amd click on edit icon +2. Update the required fields +3. Click the **✔ Save Button** + +### + +--- + +# 6.6 Task Stage Management + +Tasks move through different stages during their lifecycle. + +### Common Stages: + +| Stage | Description | +| --- | --- | +| Analysis | Requirement analysis and planning | +| Design | UI/UX or technical design phase | +| Development | Active implementation work | +| Testing | Quality assurance and validation | +| Completed | Task is fully finished | + +### Benefits: + +- Improves workflow tracking +- Helps monitor progress +- Enables better reporting + +--- + +# 6.7 Searching Tasks + +The Tasks module includes a search feature for quickly locating tasks. + +### Search Capabilities: + +Users can search using: Task Name + +### How to Search: + +1. Click the **Search Icon** +2. Enter search text +3. Matching tasks are displayed instantly + +--- + +# 6.8 Filtering Tasks by Assignee + +The application supports filtering tasks based on assigned users. + +### Purpose: + +- Helps managers review team workload +- Enables users to focus on assigned work +- Simplifies task tracking + +--- + +# 6.8.1 Accessing the Assignee Filter + +To filter tasks by assignee: + +1. Open the **All Tasks** module +2. Click the **Assignee Filter Icon** from the top bar +3. The **Filter by Assignees** popup window appears +4. By deafult, the logged in user name will be selected + +--- + +# + +--- + +## + +--- + +## Selected Users + +Displays users currently selected for filtering. + +### Purpose: + +- Shows active filter criteria +- Helps users review selected assignees + +--- + +## Available Users + +Displays all available team members. + +### Behavior: + +- Select users using the checkbox +- Multiple users can be selected simultaneously + +--- + +## Apply Filter + +Applies the selected assignee filter. + +### Result: + +- Only tasks assigned to selected users are displayed + +--- + +## Clear Filter + +Removes all applied assignee filters. + +### + +--- + +# 6.9 Task Status Indicators + +The Tasks module includes visual indicators to help users quickly understand task conditions. + +### Indicators Include: + +| Indicator | Meaning | +| --- | --- | +| Red Overdue Text | Task deadline exceeded | +| Star Rating | Task priority level | +| Stage Label | Current workflow stage | +| Planned Hours | Estimated effort | + +### Benefits: + +- Faster decision-making +- Better workload visibility +- Improved task prioritization + +--- + +# + +# 6.10 Floating Action Button (FAB) + +The **Floating Action Button (FAB)** is located at the bottom-right corner of the Tasks Overview screen. + +The FAB provides quick access to frequently used actions, allowing users to create and manage tasks more efficiently. + +--- + +## 6.10.1 Accessing the FAB Menu + +To open the FAB menu: + +1. Navigate to the **All Tasks** module +2. Locate the **Floating Action Button (FAB)** at the bottom-right corner of the screen +3. Click or tap the FAB icon + +A quick action menu will appear with available options. + +--- + +## 6.10.2 Creating a New Task Using the FAB + +The FAB allows users to quickly create a new task without navigating through additional menus. + +### Steps: + +1. Open the **All Tasks** screen +2. Click the **Floating Action Button (FAB)** +3. Select **Task** from the menu options +4. A new task entry form will open +5. Fill in the required task information +6. Click the **✔ Save Button** to create the task + +--- + +## 6.10.3 Benefits of Using the FAB + +### Quick Access + +- Reduces navigation steps +- Allows faster task creation + +# 6.11 Task Swipe Actions + +The Tasks module supports swipe gestures for quick task management directly from the task overview list. + +These gestures help users perform common actions without opening the full task details screen, improving productivity and reducing navigation effort. + +--- + +# 6.11.1 Swipe Right Actions (Reschedule & Delete) + +When a user swipes a task item to the **right**, additional quick action icons become visible. + +### Available Actions: + +| Action | Description | +| --- | --- | +| Reschedule Icon | Used to quickly change the planned task dates | +| Delete Icon | Removes the selected task | + +--- + +## Reschedule Task + +Clicking the **Reschedule** icon opens the **Reschedule Task** dialog window. + +This feature allows users to quickly update the task schedule using predefined options or custom date ranges. + +### Quick Reschedule Options + +The following shortcut options are available: + +- **Tomorrow** + - Moves the task schedule to the next day +- **Next Week** + - Reschedules the task to the following week +- **Next Month** + - Moves the task schedule to the next month + +These options are useful for quickly postponing work without manually selecting dates. + +--- + +## Custom Date Range + +Users can also manually configure a custom task schedule. + +### Fields: + +| Field | Description | +| --- | --- | +| Start Date | Defines the new task start date | +| End Date | Defines the new task completion date | +| Duration | Automatically displays total duration between selected dates | + +### Buttons: + +| Button | Purpose | +| --- | --- | +| Cancel | Closes the dialog without saving changes | +| Apply | Saves and applies the new schedule | + +### Benefits: + +- Quickly adjust project timelines +- Improve workload planning +- Simplify schedule management + +--- + +## Delete Task + +Clicking the **Delete** icon removes the task from the system. + +### + +--- + +# 6.11.2 Swipe Left Actions (View, Edit, Start & Pause) + +When a user swipes a task item to the **left**, four quick action icons are displayed. + +### Available Actions: + +| Action | Description | +| --- | --- | +| View | Opens detailed task information | +| Edit | Opens the task edit screen | +| Start | Starts the task timer | +| Pause | Stops or pauses the running task timer | + +--- + +## View Task + +The **View** action opens the complete task details page. + +Users can review: + +- Task description +- Assignees +- Priority +- Planned hours +- Attachments +- Dates and deadlines +- Current stage and progress + +--- + +## Edit Task + +The **Edit** action opens the task editing screen. + +Users can modify: + +- Task name +- Project assignment +- Priority +- Planned hours +- Stages +- Dates +- Assignees +- Attachments + +After making changes: + +1. Click the **✔ Save Button** +2. Updated information is saved automatically + +--- + +## Start Task Timer + +The **Start** action begins time tracking for the selected task. + +### System Behavior: + +- A timer starts automatically +- A timesheet entry may be created +- The task becomes active + +### Benefits: + +- Accurate time tracking +- Improved productivity monitoring +- Easier reporting + +--- + +## Pause Task Timer + +The **Pause** action stops or pauses the active timer. + +### System Behavior: + +- Time tracking is temporarily stopped +- Users can restart tracking anytime + +### Benefits: + +- Prevents incorrect time logging +- Supports interruption handling +- Improves timesheet accuracy + +--- + +# + +# 7. My Tasks + +The **My Tasks** module is a personalized workspace that displays tasks assigned specifically to the logged-in user. + +This section helps users: + +- Focus on their assigned work +- Monitor upcoming and overdue tasks +- Track daily and weekly workload +- Start and pause task timers quickly +- Manage priorities efficiently +- Improve personal productivity and task organization + +Unlike the **All Tasks** module, which displays tasks for all users, the **My Tasks** module only shows tasks relevant to the current user. + +--- + +# 7.1 Accessing the My Tasks Module + +To open the **My Tasks** section: + +1. Click the **Menu (☰)** icon from the top-left corner +2. Select **My Tasks** from the sidebar navigation + +The My Tasks screen will display all tasks assigned to the logged-in user. + +--- + +# 7.2 My Tasks Screen Overview + +The My Tasks screen contains the following sections: + +1. Header Section +2. Task Category Tabs +3. My Tasks Overview Panel +4. Task Information Area +5. Quick Action Button (FAB) + +--- + +# 7.2.1 Header Section + +Located at the top of the My Tasks screen. + +### Features: + +- **Filter Icon** +Used to filter tasks based on criteria such as closed or completed tasks +- **Help Icon** +Provides quick guidance or support information +- **Search Icon** +Allows users to search tasks instantly +- **Grid/List View Icon** +Switch between different task display layouts +- **Add Icon (➕)** +Used to create a new task + +--- + +# 7.2.2 Task Category Tabs + +The My Tasks module provides quick-access tabs to organize tasks based on timeline and completion status. + +### Available Tabs: + +| Tab | Description | +| --- | --- | +| Inbox | Newly assigned or pending tasks | +| Today | Tasks planned for the current day | +| This Week | Tasks scheduled within the current week | +| This Month | Tasks planned for the current month | +| Later | Tasks planned for future dates | +| Done | Completed tasks | +| Cancelled | Cancelled or closed tasks | +| All | Displays all assigned tasks | + +### Benefits: + +- Helps users focus on immediate priorities +- Simplifies workload planning +- Improves task visibility and navigation + +--- + +# 7.2.3 My Tasks Overview Panel + +The task overview panel displays all assigned task cards in a structured list format. + +Each task card includes: + +- Task Name +- Related Project Name +- Task Stage +- Priority Rating +- Planned Hours +- Start Date +- End Date +- Overdue Status + +### + +### Priority Indicator: + +Task priority is represented using star ratings. + +| Priority | Example | +| --- | --- | +| Low | ★☆☆ | +| Medium | ★★☆ | +| High | ★★★ | + +### Overdue Indicator: + +If a task exceeds its planned end date and is still incomplete, the system displays the overdue duration in red. + +### + +--- + +# 7.2.4 Task Information Display + +Each task item provides detailed scheduling and planning information. + +### Information Displayed: + +- **Planned Hours** + - Displays estimated work duration +- **Start Date** + - Indicates when the task is scheduled to begin +- **End Date** + - Indicates planned completion date +- **Stage Name** + - Displays the current workflow stage + +### Purpose: + +- Helps users track deadlines +- Improves schedule awareness +- Enables better task planning + +--- + +# 7.2.5 Floating Action Button (FAB) + +The Floating Action Button is located at the bottom-right corner of the My Tasks screen. + +### Functions: + +- Create a new task +- Access quick task actions +- Improve navigation efficiency + +### Benefits: + +- Faster task creation +- Reduced navigation effort +- Improved user productivity + +--- + +# 7.3 Viewing Task Details + +To view detailed information about a task: + +1. Open the **My Tasks** module +2. Click on the required task card +3. The detailed task view screen will open + +--- + +# 7.4 Creating a New Task from My Tasks + +Users can create tasks directly from the My Tasks module. + +### Steps: + +1. Open the **My Tasks** screen +2. Click the **➕ Add Icon** or Floating Action Button +3. Enter required task information +4. Click the **✔ Save Button** + +The task will automatically appear in the appropriate category tab. + +--- + +# 7.5 Editing an Existing Task + +To edit a task: + +1. Open the task details screen +2. Click the **Edit Icon** +3. Update the required fields +4. Click the **✔ Save Button** + +### + +--- + +# 7.6 Task Timer Management + +The My Tasks module supports built-in time tracking. + +Users can start and pause timers directly from the task overview screen. + +--- + +# 7.6.1 Starting a Task Timer + +To start tracking time: + +1. Swipe the task item to the left +2. Click the **Start Icon** + +### System Behavior: + +- Task timer starts automatically +- Active work duration begins recording +- A timesheet entry may be created automatically + +### Benefits: + +- Accurate time tracking +- Improved productivity reporting +- Simplified timesheet management + +--- + +# 7.6.2 Pausing a Task Timer + +To pause active tracking: + +1. Swipe the task item to the left +2. Click the **Pause Icon** + +### System Behavior: + +- Active timer stops temporarily +- Time tracking pauses until resumed + +### Benefits: + +- Prevents incorrect time logging +- Supports interruptions during work +- Improves reporting accuracy + +--- + +# 7.7 Swipe Actions in My Tasks + +The My Tasks module supports quick swipe gestures for faster task management. + +These actions reduce navigation steps and improve usability. + +--- + +# 7.7.1 Swipe Left Actions + +When a task item is swiped to the **left**, quick action icons become visible. + +### Available Actions: + +| Action | Description | +| --- | --- | +| View | Opens complete task details | +| Edit | Opens task editing screen | +| Start | Starts task timer | +| Pause | Pauses active task timer | + +--- + +# 7.7.2 Swipe Right Actions + +When a task item is swiped to the **right**, additional management actions become available. + +### Available Actions: + +| Action | Description | +| --- | --- | +| Reschedule | Change planned task dates quickly | +| Delete | Remove the task from the system | + +--- + +# 7.8 Rescheduling Tasks + +The Reschedule feature allows users to quickly postpone or update task schedules. + +### Quick Options: + +- Tomorrow +- Next Week +- Next Month + +### Custom Scheduling: + +Users can manually select: + +- Start Date +- End Date +- Duration + +### Benefits: + +- Improves schedule management +- Simplifies workload adjustment +- Helps manage delays efficiently + +--- + +# 7.9 Searching Tasks in My Tasks + +The My Tasks module includes a built-in search feature. + +### How to Search: + +1. Click the **Search Icon** +2. Enter the task name or keyword +3. Matching tasks appear instantly + +### Benefits: + +- Quickly locate assigned work +- Reduce navigation time +- Improve task accessibility + +--- + +# 7.10 Task Status Indicators + +Visual indicators help users quickly identify task conditions and priorities. + +### Indicators Include: + +| Indicator | Meaning | +| --- | --- | +| Red Overdue Text | Task deadline exceeded | +| Star Rating | Task priority level | +| Stage Label | Current workflow stage | +| Planned Hours | Estimated effort | + +### Benefits: + +- Faster decision-making +- Improved workload visibility +- Better task prioritization + +--- + +# + +## 8. Project Updates + +The Project Updates module is used to create, track, monitor, and communicate the latest progress of projects within the Time Management App. + +This module helps teams and stakeholders: + +- Share current project progress +- Monitor project health and status +- Communicate blockers or risks +- Maintain historical update records +- Improve project visibility across teams + +Project Updates act as progress checkpoints and provide a centralized place to document project activities, achievements, delays, and important notes. + +--- + +## 8.1 Accessing the Project Updates Module + +To open the Project Updates section: + +1. Click the **Menu (☰)** icon from the top-left corner +2. Select **Project Updates** from the sidebar navigation + +The Project Updates screen will open and display all available project updates. + +--- + +## 8.2 Project Updates Screen Overview + +The Project Updates screen is divided into the following sections: + +- Header Section +- Status Filter Tabs +- Project Updates List Panel +- Project Update Details Panel +- Quick Action Icons + +--- + +## 8.2.1 Header Section + +Located at the top of the Project Updates screen. + +### Features: + +| Feature | Description | +| --- | --- | +| Add Icon (➕) | Create a new project update | +| Search Icon | Search project updates quickly | +| Back Navigation | Return to previous screens if applicable | + +--- + +## 8.2.2 Status Filter Tabs + +The Project Updates module provides quick filters to organize updates based on project status. + +### Available Filters: + +| Filter | Description | +| --- | --- | +| All | Displays all project updates | +| On Track | Displays updates for healthy progressing projects | +| At Risk | Displays projects with identified risks or possible delays | +| Off Track | Displays projects facing major issues or delays | +| On Hold | Displays temporarily paused projects | + +### Benefits: + +- Quickly identify project health +- Improve project monitoring +- Simplify stakeholder reporting +- Focus on critical updates + +--- + +## 8.2.3 Project Updates List Panel + +It displays all available project updates in list format. + +Each update card provides a quick summary including: + +- Update Title +- Created By User +- Update Date +- Related Project Name +- Project Status +- Progress Indicator +- Details Button + +### Example Status Labels: + +| Status | Meaning | +| --- | --- | +| on_track | Project progressing as planned | +| at_risk | Potential issues identified | +| off_track | Major delays or blockers | +| on_hold | Work temporarily paused | + +### Progress Indicator + +Each project update displays a visual progress bar representing overall completion percentage. + +Purpose: + +- Quickly understand project completion level +- Monitor ongoing progress visually +- Improve reporting clarity + +--- + +## + +--- + +# 8.3 Creating a New Project Update + +To create a new project update: + +1. Open the **Project Updates** module +2. Click the **➕ Add Icon** +3. Fill in the required update information +4. Click the **✔ Save Button** + +The update will then appear in the Project Updates list. + +--- + +# 8.3.1 Project Update Fields + +The following fields are available while creating or editing a project update. + +--- + +## 1. Account + +Defines which connected account or environment the update belongs to. + +### Purpose: + +- Ensures updates are stored in the correct account/server +- Useful when multiple accounts are configured + +### Behavior: + +- Displays the currently active account +- Can be changed using the dropdown selector + +--- + +## 2. Project + +Used to associate the update with a specific project. + +### Purpose: + +- Organizes updates under projects +- Enables project-based progress tracking +- Maintains project history + +### Behavior: + +- Click or tap **“Tap to select”** +- Choose a project from the available list + +--- + +## 3. Update Title + +Defines the main subject or heading of the project update. + +### Guidelines: + +- Keep titles short and meaningful +- Clearly summarize the update + +### Example: + +- Sprint Progress Update +- UI Development Completed +- Testing Delayed Due to API Issue + +--- + +## 4. Project Status + +Defines the current health or condition of the project. + +### Available Statuses: + +| Status | Description | +| --- | --- | +| On Track | Project progressing normally | +| At Risk | Potential delay or issue identified | +| Off Track | Major blockers or delays impacting progress | +| On Hold | Project temporarily paused | + +### Purpose: + +- Helps management assess project condition +- Improves reporting visibility +- Enables faster decision-making + +--- + +## 5. Progress + +Defines the current completion percentage of the project. + +### Behavior: + +- Configured using the progress slider +- Percentage value is displayed dynamically + +### Example: + +- 10% → Initial phase started +- 50% → Midway completed +- 100% → Fully completed + +### Benefits: + +- Quick visual understanding of progress +- Better project monitoring +- Easier stakeholder communication + +--- + +## 6. Description + +Used to provide detailed project update information. + +### Recommended Information: + +- Completed activities +- Current progress +- Upcoming work +- Risks or blockers +- Dependencies +- Important notes + +### Benefits: + +- Improves communication +- Maintains project history +- Provides transparency across teams + +--- + +# 8.4 Saving a Project Update + +After entering all required details: + +1. Review the entered information +2. Click the **✔ Save Button** located at the top-right corner + +### System Behavior: + +- The update is validated +- Information is saved automatically +- The new update appears in the Project Updates list +- Progress and status become visible to users + +--- + +# 8.5 Viewing Project Update Details + +Users can review complete update information directly from the Project Updates overview list. + +### Steps: + +1. Open the **Project Updates** module +2. Locate the required update +3. Click the **Details** button + +### Result: + +The selected project update opens in the detailed view screen. + +Users can review: + +- Update title +- Related project +- Project status +- Progress percentage +- Full description +- Created by information +- Update date + +--- + +# 8.6 Rich Text Editor in Project Update Details + +When the **Details** button is clicked, the project update description opens in a **Rich Text Editor**. + +The Rich Text Editor allows users to view and manage formatted update content professionally. + +--- + +## 8.6.1 Purpose of the Rich Text Editor + +The editor is designed to: + +- Improve readability of project updates +- Support structured documentation +- Enable formatted communication +- Maintain professional update records + +--- + +## 8.6.2 Rich Text Formatting Features + +The editor may support the following formatting options: + +| Feature | Purpose | +| --- | --- | +| Bold Text | Highlight important information | +| Italic Text | Add emphasis | +| Underline | Mark key details | +| Bullet Lists | Organize information clearly | +| Numbered Lists | Display step-by-step updates | +| Headings | Structure long content | +| Text Alignment | Improve readability | +| Hyperlinks | Add reference links if required | + +--- + +--- + +# 8.7 Editing a Project Update + +To modify an existing project update: + +1. Open the Project Updates module +2. Select the required update and click on edit icon +3. Update the required fields +4. Click the ✔ Save Button + +### + +--- + +# 8.8 Searching Project Updates + +The Project Updates module includes a search feature for quickly locating updates. + +### + +### How to Search: + +1. Click the Search Icon +2. Enter search text +3. Matching updates are displayed instantly + +### + +--- + +# 8.9 Project Update Status Indicators + +Visual status labels help users quickly identify project conditions. + +| Indicator | Meaning | +| --- | --- | +| Green (On Track) | Healthy project progress | +| Orange (At Risk) | Warning or possible delay | +| Red (Off Track) | Critical issue or delay | +| Gray (On Hold) | Temporarily paused project | + +### + +# 8.10 Project Update Swipe Actions + +The Project Updates module supports swipe gestures for quick update management directly from the project updates overview list. + +These swipe actions help users perform common operations quickly without opening the full update details screen, improving productivity and reducing navigation effort. + +--- + +## 8.10.1 Swipe Right Action (Delete) + +When a user swipes a project update item to the right, a **Delete Icon** becomes visible. + +### Available Action: + +| Action | Description | +| --- | --- | +| Delete | Removes the selected project update | + +### Delete Project Update + +Clicking the **Delete Icon** removes the selected project update from the system. + +### System Behavior: + +- The selected update is removed from the Project Updates list +- Associated update information will no longer be visible +- The list refreshes automatically after deletion + +### + +--- + +## 8.10.2 Swipe Left Action (Edit) + +When a user swipes a project update item to the left, an **Edit Icon** becomes visible. + +### Available Action: + +| Action | Description | +| --- | --- | +| Edit | Opens the project update editing screen | + +### Edit Project Update + +Clicking the **Edit Icon** opens the selected project update in edit mode. + +Users can modify: + +- Update Title +- Project Status +- Progress Percentage +- Description +- Related Project Information + +### Steps: + +1. Swipe the update item to the left +2. Click the **Edit Icon** +3. Update the required information +4. Click the **✔ Save Button** + +### System Behavior: + +- Changes are validated automatically +- Updated information is saved instantly +- The Project Updates list refreshes automatically + +### + +# 9. Activities + +The **Activities** module is used to create, manage, track, and monitor daily activities within the Time Management App. + +Activities help users: + +- Organize day-to-day work efficiently +- Track meetings, follow-ups, and personal work items +- Maintain activity history +- Monitor overdue activities +- Improve productivity and work planning +- Link activities with projects, tasks, and subprojects + +The Activities module acts as a centralized workspace for managing all ongoing and planned activities. + +--- + +# 9.1 Accessing the Activities Module + +To open the **Activities** section: + +1. Click the **Menu (☰)** icon from the top-left corner +2. Select **Activities** from the sidebar navigation + +The Activities screen will display all available activities. + +--- + +# 9.2 Activities Screen Overview + +The Activities screen is divided into the following sections: + +1. Header Section +2. Activity Filter Tabs +3. Activities Overview Panel +4. Activity Details Panel +5. Quick Action Icons + +--- + +# 9.2.1 Header Section + +Located at the top of the Activities screen. + +### Features: + +| Feature | Description | +| --- | --- | +| Assignee Filter Icon | Filter activities based on assigned users | +| Add Icon (➕) | Create a new activity | +| Search Icon | Search activities quickly | +| Back Navigation | Return to the previous screen | + +--- + +# 9.2.2 Activity Filter Tabs + +The Activities module provides quick-access filters to organize activities based on date and completion status. + +### Available Tabs: + +| Tab | Description | +| --- | --- | +| Today | Displays activities planned for the current day | +| This Week | Displays activities planned within the current week | +| This Month | Displays activities scheduled within the current month | +| Later | Displays future activities | +| OverDue | Displays overdue activities | +| All | Displays all activities | +| Done | Displays completed activities | + +### + +--- + +# 9.2.3 Activities Overview Panel + +The Activities Overview Panel displays all activities in a structured list format. + +Each activity card provides a quick summary including: + +- Activity Name +- Activity Notes or Description +- Assigned User +- Activity Type +- Planned Date +- Overdue Status + +### Activity Types: + +Example activity types include: + +- Meeting +- To-Do +- Follow-Up +- Reminder +- Call + +### Overdue Indicator: + +If an activity exceeds its planned date and is not completed, the system displays an **Overdue** label in red. + +### + +--- + +# 9.2.4 Activity Details Panel + +Selecting an activity from the Activities Overview Panel opens the Activity Details Page. + +Users can: + +- View activity details +- Create new activities +- Edit existing activities +- Assign users +- Link projects and tasks +- Add notes and summaries +- Configure dates +- Define activity types + +--- + +# 9.3 Creating a New Activity + +To create a new activity: + +1. Open the **Activities** module +2. Click the **➕ Add Icon** from the top-right corner +3. Fill in the required activity information +4. Click the **✔ Save Button** + +The activity will then appear in the Activities Overview list. + +--- + +# 9.3.1 Activity Creation Fields + +The following fields are available while creating or editing an activity. + +--- + +## 1. Account + +Defines which connected account or environment the activity belongs to. + +### Purpose: + +- Ensures activity data is stored in the correct account/server +- Useful when multiple accounts are configured + +### Behavior: + +- Displays the active account +- Can be changed using the dropdown selector + +--- + +## 2. Project + +Used to associate the activity with a specific project. + +### Purpose: + +- Organizes activities under projects +- Enables project-based activity tracking + +### Behavior: + +- Click or tap **“Tap to select”** +- Select a project from the available list + +--- + +## 3. Subproject + +Allows linking the activity to a subproject if applicable. + +### Purpose: + +- Improves activity organization +- Supports structured project management + +### Behavior: + +- Optional field +- Available only when subprojects exist + +--- + +## 4. Task + +Used to associate the activity with a specific task. + +### Purpose: + +- Helps track work performed for a task +- Enables activity-to-task mapping + +### Behavior: + +- Select a task from the available list + +--- + +## 5. Subtask + +Allows linking the activity to a subtask. + +### Purpose: + +- Supports detailed work tracking +- Improves task hierarchy management + +### Behavior: + +- Optional field +- Displayed when subtasks are available + +--- + +## 6. Assignee + +Defines the user responsible for the activity. + +### Purpose: + +- Clarifies ownership +- Helps track accountability + +### Behavior: + +- Select a user from the available list + +--- + +## 7. Connected To + +Defines whether the activity is connected to a project or a task. + +### Available Options: + +| Option | Description | +| --- | --- | +| Project | Activity is linked to a project | +| Task | Activity is linked to a task | + +### Purpose: + +- Improves activity categorization +- Helps maintain proper work relationships + +--- + +## 8. Summary + +Defines the primary title or summary of the activity. + +### + +### Example: + +- Client Meeting +- Testing Discussion +- Follow-up Call +- Documentation Review + +--- + +## 9. Notes + +Used to provide additional information related to the activity. + +### Recommended Information: + +- Discussion points +- Meeting outcomes +- Important reminders +- Follow-up actions +- Additional comments + +### + +--- + +## 10. Activity Type + +Defines the category or type of activity. + +### Example Types: + +- Meeting +- To-Do +- Reminder +- Call +- Discussion + +### Purpose: + +- Improves activity organization +- Enables easier filtering and reporting + +### Behavior: + +- Select the required type from the available list + +--- + +## 11. Date + +Defines the planned activity date. + +### Purpose: + +- Helps schedule activities properly +- Enables overdue tracking + +### Behavior: + +- Select a predefined date range or custom date +- Selected date appears in the activity overview list + +--- + +# 9.4 Viewing Activity Details + +To view activity details: + +1. Open the **Activities** module +2. Select the required activity from the overview list +3. The Activity Details Panel will display complete information + +Users can review: + +- Summary +- Notes +- Project information +- Task details +- Assigned user +- Activity type +- Scheduled date +- Status information + +--- + +# 9.5 Editing an Activity + +To edit an existing activity: + +1. Select the activity from the Activities list +2. Click the **Edit Icon** or use swipe actions towards left +3. Update the required fields +4. Click the **✔ Save Button** + +### System Behavior: + +- Updated information is validated automatically +- Changes are saved instantly +- The activity list refreshes automatically + +--- + +# 9.6 Searching Activities + +The Activities module includes a search feature for quickly locating activities. + +### + +### How to Search: + +1. Click the **Search Icon** +2. Enter search text +3. Matching activities are displayed instantly + +### + +--- + +# + +--- + +# 9.7 Activity Swipe Actions + +The Activities module supports swipe gestures for quick activity management directly from the Activities Overview list. + +These gestures help users perform common actions quickly without opening the complete activity details screen. + +--- + +# + +# 9.7.1 Swipe Right Action (Delete) + +When a user swipes an activity item to the **right**, a **Delete Icon** becomes visible. + +### Available Action: + +| Action | Description | +| --- | --- | +| Delete | Removes the selected activity | + +### Delete Activity + +Clicking the **Delete Icon** removes the selected activity from the system. + +### System Behavior: + +- The selected activity is removed from the Activities list +- Associated information will no longer be visible +- The overview list refreshes automatically after deletion + +--- + +# 9.7.2 Swipe Left Actions (Edit, Mark as Done, Follow-Up) + +When a user swipes an activity item to the **left**, three action icons become visible. + +### Available Actions: + +| Action | Description | +| --- | --- | +| Edit | Opens the activity editing screen | +| Mark as Done | Marks the selected activity as completed | +| Follow-Up | Creates a new follow-up activity using the same activity content | + +--- + +## Edit Activity + +Clicking the **Edit Icon** opens the selected activity in edit mode. + +Users can modify: + +- Summary +- Notes +- Project Information +- Task Information +- Assignee +- Activity Type +- Date + +### Steps: + +1. Swipe the activity item to the left +2. Click the **Edit Icon** +3. Update the required information +4. Click the **✔ Save Button** + +### + +--- + +## Mark Activity as Done + +Clicking the **Done Icon (✔)** marks the selected activity as completed. + +### Steps: + +1. Swipe the activity item to the left +2. Click the **Done Icon** + +### System Behavior: + +- The activity status changes to **Completed** +- The activity is updated instantly +- The Activities list refreshes automatically + +### + +--- + +## Create Follow-Up Activity + +Clicking the **Follow-Up Icon** creates a new activity using the same content as the selected activity. + +### System Behavior: + +- A new activity form opens automatically +- Existing activity details are prefilled +- Users can modify details before saving +- The original activity remains unchanged + +### Prefilled Information Includes: + +- Summary +- Notes +- Project Information +- Task Information +- Assignee +- Activity Type + +### Steps: + +1. Swipe the activity item to the left +2. Click the **Follow-Up Icon** +3. Update any required information +4. Select the new activity date if needed +5. Click the **✔ Save Button** + +### + +# + +# 10. Timesheet + +The **Timesheet** module is used to record, manage, and monitor the time spent on projects, tasks, and daily work activities within the Time Management App. + +This module helps users: + +- Track daily working hours +- Record effort spent on tasks and projects +- Maintain accurate work logs +- Improve productivity tracking +- Support reporting and billing processes +- Monitor time utilization across teams and projects + +The Timesheet module serves as the central area for managing all work-hour entries. + +--- + +# 10.1 Accessing the Timesheet Module + +To open the **Timesheet** section: + +1. Click the **Menu (☰)** icon from the top-left corner +2. Select **Timesheet** from the sidebar navigation + +The Timesheet screen will display all available timesheet entries. + +--- + +# 10.2 Timesheet Screen Overview + +The Timesheet screen is divided into the following sections: + +1. Header Section +2. Timesheet Filter Tabs +3. Timesheet Overview Panel +4. Timesheet Details Panel +5. Swipe Actions +6. Floating Action Button (FAB) + +--- + +# 10.2.1 Header Section + +Located at the top of the Timesheet screen. + +### Features: + +| Feature | Description | +| --- | --- | +| Add Icon (➕) | Create a new timesheet entry | +| Back Navigation | Return to the previous screen | +| Search Icon | Search existing timesheet entries | + +--- + +# 10.2.2 Timesheet Filter Tabs + +The Timesheet module provides filters to organize timesheet entries based on their current status. + +### Available Tabs: + +| Tab | Description | +| --- | --- | +| All | Displays all timesheet entries | +| Active | Displays currently active or ongoing timesheets | +| Draft | Displays saved draft timesheets awaiting completion | + +### Purpose: + +- Helps users quickly identify required entries +- Simplifies time tracking management +- Improves navigation through large numbers of records + +--- + +# 10.2.3 Timesheet Overview Panel + +The Timesheet Overview Panel displays all timesheet records in a list format. + +Each timesheet item provides a quick summary including: + +- Timesheet Title +- Project Name +- Task or Subtask Information +- Logged Hours +- Entry Date +- Assigned User +- Priority Information + +### + +--- + +# 10.2.4 Timesheet Details Panel + +Selecting a timesheet entry from the overview list opens the Timesheet Details Panel. + +Users can: + +- Create new timesheet entries +- Edit existing entries +- Log working hours +- Select projects and tasks +- Configure priorities +- Add descriptions and notes +- Manage manual or automated time tracking + +--- + +# 10.2.5 Swipe Actions + +The Timesheet module supports swipe gestures for faster task management directly from the overview list. + +Users can perform actions by swiping a timesheet entry either to the left or right. + +--- + +## Right Swipe Action – Delete + +Swiping a timesheet entry from **left to right** reveals the **Delete** option. + +### Purpose: + +- Quickly remove unwanted or incorrect entries +- Simplify timesheet cleanup + +### How to Use: + +1. Locate the required timesheet entry +2. Swipe the entry toward the right +3. Tap the **Delete** button + +### + +--- + +## Left Swipe Actions – Quick Controls + +Swiping a timesheet entry from **right to left** displays three quick action icons: + +| Icon | Description | +| --- | --- | +| Edit | Opens the selected timesheet in edit mode | +| Start Timer | Starts or resumes automated time tracking | +| Mark as Done | Marks the draft timesheet as completed and ready for synchronization | + +--- + +## Edit Action + +The **Edit** action allows users to quickly modify an existing timesheet entry without opening additional menus. + +### + +--- + +## Start Timer Action + +The **Start Timer** action begins automated time tracking directly from the timesheet list. + +### System Behavior: + +- The timer starts immediately +- Active tracking is updated in real time +- Recorded duration is automatically attached to the selected timesheet +- The entry may appear under the **Active** tab while running + +--- + +## Mark as Done Action + +The **Mark as Done** action is used to finalize a draft timesheet entry. + +### How to Use: + +1. Open the **Draft** tab +2. Swipe the required entry toward the left +3. Tap the **✔ Mark as Done** icon + +### System Behavior: + +- A confirmation popup message appears: + +**Success:** *Timesheet is now ready to be synced to Odoo.* + +- The entry is removed from the **Draft** tab +- The entry remains visible under the **All** tab +- The timesheet status changes from **Draft** to **Completed** +- The entry becomes available for synchronization with Odoo + +--- + +# 10.2.6 Floating Action Button (FAB) + +A **Floating Action Button (FAB)** is available at the bottom-right corner of the Timesheet screen. + +The FAB provides quick access to timesheet creation features. + +--- + +## FAB Behavior + +### Default State + +- A circular action icon is displayed at the bottom-right corner of the screen + +### On Click + +When the FAB icon is tapped: + +- A **Create** button expands above the FAB + +### Create Button Action + +Clicking the **Create** button opens the **New Timesheet Entry Form**. + +--- + +# 10.3 Creating a New Timesheet Entry + +To create a new timesheet entry: + +1. Open the **Timesheet** module +2. Click the **➕ Add Icon** or **Create Button** +3. Fill in the required information +4. Click the **✔ Save Button** + +The timesheet entry will then appear in the Timesheet Overview list. + +--- + +# 10.3.1 Timesheet Creation Fields + +The following fields are available while creating or editing a timesheet entry. + +--- + +## 1. Account + +Defines which account or workspace the timesheet belongs to. + +### Purpose: + +- Ensures data is stored under the correct environment +- Supports multiple account configurations + +### Behavior: + +- Displays the currently selected account +- Can be changed using the dropdown selector + +--- + +## 2. Project + +Used to associate the timesheet entry with a project. + +### Purpose: + +- Tracks time against specific projects +- Supports project-based reporting + +### Behavior: + +1. Click or tap **Tap to Select** +2. Select the required project from the list + +--- + +## 3. Subproject + +Allows linking the timesheet entry to a subproject. + +### Purpose: + +- Improves project organization +- Supports detailed work tracking + +### Behavior: + +- Optional field +- Available only when subprojects exist + +--- + +## 4. Task + +Used to associate the entry with a specific task. + +### Purpose: + +- Tracks effort spent on tasks +- Improves task-level reporting + +### Behavior: + +- Select a task from the available list + +--- + +## 5. Subtask + +Allows linking the entry to a subtask. + +### Purpose: + +- Supports detailed time allocation +- Enhances work breakdown tracking + +### Behavior: + +- Optional field +- Displayed only when subtasks are available + +--- + +## 6. Priority + +Defines the importance and urgency level of the work item. + +### Available Priority Levels: + +| Priority | Description | +| --- | --- | +| Important, Urgent (1) | High-priority work requiring immediate attention | +| Important, Not Urgent (2) | Important work that can be planned | +| Urgent, Not Important (3) | Time-sensitive work with lower business impact | +| Not Urent, Not Important (4) | Low-priority work | + +### Purpose: + +- Helps users categorize work effectively +- Supports better task management and planning + +--- + +## 7. Time Tracking Mode + +Defines how time will be recorded. + +### Available Options: + +| Option | Description | +| --- | --- | +| Manual | Users manually enter working hours | +| Automated | The system timer automatically tracks time | + +### Purpose: + +- Provides flexibility in time recording +- Supports both quick entry and live tracking workflows + +--- + +## 8. Timer + +The timer is used when **Automated** tracking is enabled. + +### Features: + +- Start tracking work time +- Pause ongoing tracking +- Stop and save tracked duration + +### System Behavior: + +- The timer updates automatically while running +- Recorded duration is added to the timesheet entry + +--- + +## 9. Date + +Defines the working date for the timesheet entry. + +### Purpose: + +- Helps organize timesheet records chronologically +- Supports reporting and attendance tracking + +### Behavior: + +- Users can select predefined date options or a custom date +- Selected date appears in the timesheet overview list + +--- + +## 10. Description + +Used to provide detailed information about the work completed. + +### Recommended Information: + +- Work performed +- Development updates +- Testing activities +- Meetings attended +- Task completion details +- Issues resolved + +### Purpose: + +- Improves reporting clarity +- Helps managers and team members understand completed work +- Supports audit and billing requirements + +--- + +# 10.4 Viewing Timesheet Details + +To view timesheet details: + +1. Open the **Timesheet** module +2. Select the required timesheet entry from the overview list +3. The Timesheet Details Panel will display complete information + +--- + +# 10.5 Editing a Timesheet Entry + +To edit an existing timesheet entry: + +1. Select the required timesheet entry +2. Open the entry in edit mode +3. Update the required fields +4. Click the **✔ Save Button** + +### System Behavior: + +- Updated information is validated automatically +- Changes are saved instantly +- The overview list refreshes automatically + +--- + +# 10.6 Searching Timesheet Entries + +The Timesheet module includes a search feature for quickly locating entries. + +### How to Search: + +1. Open the Timesheet module +2. Click the **Search Icon** +3. Enter search text +4. Matching timesheet entries are displayed instantly + +### + +--- + +# 10.7 Timesheet Status Management + +Timesheet entries can exist in different states depending on their progress. + +### Available Statuses: + +| Status | Description | +| --- | --- | +| Active | Currently ongoing or recently updated entries | +| Draft | Entries saved temporarily before final submission | +| Completed | Finished and finalized entries ready for synchronization | + +### Purpose: + +- Helps users monitor work progress +- Supports structured approval workflows +- Improves reporting accuracy + +--- + +# 10.8 Automated Timer Save as Draft Process + +When using the **Automated** time tracking option, the system provides a simplified workflow for saving tracked work entries. + +After starting the timer and allowing it to run for a few seconds or longer, stopping the timer will automatically open the **Add Description to Timesheet** dialog box. + +This dialog allows users to: + +- Review the recorded time +- Enter work descriptions or notes +- Save the entry as a draft +- Cancel the operation if needed + +This feature helps users quickly capture ongoing work without immediately finalizing the timesheet entry. + +--- + +# 10.8.1 Opening the Automated Timer Dialog + +The dialog box appears automatically when: + +1. The user selects **Automated** time tracking +2. Starts the timer +3. Allows the timer to run +4. Clicks the **Stop Button** + +Once stopped, the system opens the **Add Description to Timesheet** popup window. + +--- + +# 10.8.2 Add Description to Timesheet Dialog + +The dialog box contains the following sections: + +| Section | Description | +| --- | --- | +| Time Recorded | Displays the total tracked duration | +| Description/Notes | Allows users to enter work details | +| Save as Draft Button | Saves the entry in Draft status | +| Cancel Button | Closes the dialog without saving | + +--- + +# 10.8.3 Save as Draft + +Clicking the **Save as Draft** button stores the timesheet entry in **Draft** status. + +### System Behavior: + +- The tracked duration is saved +- Entered descriptions are stored +- The timesheet is not finalized +- Users can edit the entry later +- The entry becomes visible under the **Draft** tab + +--- + +# 10.8.4 Draft Timesheet Visibility + +All draft timesheet entries are displayed under the **Draft** filter tab. + +### To View Draft Timesheets: + +1. Open the **Timesheet** module +2. Select the **Draft** tab +3. View all saved draft entries + +### Users Can: + +- Continue editing draft entries +- Add missing project or task information +- Update descriptions +- Finalize and save entries later + +--- + +# 10.8.5 Completing a Draft Timesheet + +Draft entries can be finalized directly from the overview screen using the **Mark as Done** action. + +### Steps: + +1. Open the **Draft** tab +2. Swipe the required timesheet entry toward the left +3. Tap the **✔ Mark as Done** icon + +### System Response: + +A success popup message appears: + +**Success:** *Timesheet is now ready to be synced to Odoo.* + +### After Completion: + +- The entry is removed from the **Draft** tab +- The entry remains visible under the **All** tab +- The timesheet status changes to **Completed** +- The entry becomes available for synchronization with Odoo + +--- + +# 10.8.6 Cancel Option + +Clicking the **Cancel** button closes the dialog box without saving the timesheet entry. + +### System Behavior: + +- The popup window closes +- Unsaved description data is discarded +- No draft entry is created +- The timer data is not stored unless saved manually + +--- + +# 10.9 Odoo Synchronization Readiness + +Completed timesheets marked using the **Mark as Done** action become eligible for synchronization with Odoo. + +### Synchronization Workflow: + +1. User completes or finalizes a draft timesheet +2. System marks the entry as ready for sync +3. The timesheet remains visible in the **All** tab +4. Backend synchronization processes can transfer the entry to Odoo + +### + +### \ No newline at end of file From 0b03fd28f07d85bbcc276f1837c5b949beb4e29c Mon Sep 17 00:00:00 2001 From: Parvathy Nair Date: Mon, 8 Jun 2026 16:28:40 +0530 Subject: [PATCH 18/67] Added in website sidebar --- website/docs/functional/user-manual.md | 5 +++++ website/package-lock.json | 28 +------------------------- website/sidebars.js | 1 + 3 files changed, 7 insertions(+), 27 deletions(-) diff --git a/website/docs/functional/user-manual.md b/website/docs/functional/user-manual.md index 0c102d14..6d3c0131 100644 --- a/website/docs/functional/user-manual.md +++ b/website/docs/functional/user-manual.md @@ -1,3 +1,8 @@ +--- +title: Functional Documentation +sidebar_label: User Manual +--- + # UT Time Management App Documentation # Time Management App – Functional Documentation (v1.2.7) diff --git a/website/package-lock.json b/website/package-lock.json index c6f9f569..699b7e20 100644 --- a/website/package-lock.json +++ b/website/package-lock.json @@ -153,7 +153,6 @@ "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-5.53.0.tgz", "integrity": "sha512-Ds16IyPm/dNJPCU8OzApo2gwGrgWT5BYHhE3NFwZbpCveqyvPDB9sZDDkJ5DsdOGT2aC+R3i0/M1OVXF2qdgPg==", "license": "MIT", - "peer": true, "dependencies": { "@algolia/client-common": "5.53.0", "@algolia/requester-browser-xhr": "5.53.0", @@ -279,7 +278,6 @@ "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.29.7.tgz", "integrity": "sha512-RgHBCvtjbOK2gXSNBNIkNoEc9qoVEtau3hj8gEqKQuL3HZAibKarWFEI3Lfm6EYKkLalOh8eSrj9b+ch9H/VBA==", "license": "MIT", - "peer": true, "dependencies": { "@babel/code-frame": "^7.29.7", "@babel/generator": "^7.29.7", @@ -2087,7 +2085,6 @@ } ], "license": "MIT", - "peer": true, "engines": { "node": ">=18" }, @@ -2110,7 +2107,6 @@ } ], "license": "MIT", - "peer": true, "engines": { "node": ">=18" } @@ -2220,7 +2216,6 @@ "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", "license": "MIT", - "peer": true, "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" @@ -2642,7 +2637,6 @@ "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", "license": "MIT", - "peer": true, "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" @@ -3661,7 +3655,6 @@ "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-docs/-/plugin-content-docs-3.10.1.tgz", "integrity": "sha512-2jRVrtzjf8LClGTHQlwlwuD3wQXRx3WEoF7XUarJ8Ou+0onV+SLtejsyfY9JLpfUh9hPhXM4pbBGkyAY4Bi3HQ==", "license": "MIT", - "peer": true, "dependencies": { "@docusaurus/core": "3.10.1", "@docusaurus/logger": "3.10.1", @@ -4655,7 +4648,6 @@ "resolved": "https://registry.npmjs.org/@mdx-js/react/-/react-3.1.1.tgz", "integrity": "sha512-f++rKLQgUVYDAtECQ6fn/is15GkEH9+nZPM3MS0RcxVqoTfawHvDlSCH7JbMhAM6uJ32v3eXLvLmLvjGu7PTQw==", "license": "MIT", - "peer": true, "dependencies": { "@types/mdx": "^2.0.0" }, @@ -5128,7 +5120,6 @@ "resolved": "https://registry.npmjs.org/@svgr/core/-/core-8.1.0.tgz", "integrity": "sha512-8QqtOQT5ACVlmsvKOJNEaWmRPmcojMOzCz4Hs2BGG/toAp/K38LcsMRyLp349glq5AzJbCEeimEoxaX6v/fLrA==", "license": "MIT", - "peer": true, "dependencies": { "@babel/core": "^7.21.3", "@svgr/babel-preset": "8.1.0", @@ -5462,7 +5453,6 @@ "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.16.tgz", "integrity": "sha512-esJiCAnl0kfpNdE69f3So4WJUXy95dLZydX0KwK46riIHDzHM7O9Vtf9xCHW0PXIqvgqNrswl522kA/5yx+F4w==", "license": "MIT", - "peer": true, "dependencies": { "csstype": "^3.2.2" } @@ -5804,7 +5794,6 @@ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.16.0.tgz", "integrity": "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==", "license": "MIT", - "peer": true, "bin": { "acorn": "bin/acorn" }, @@ -5872,7 +5861,6 @@ "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.20.0.tgz", "integrity": "sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA==", "license": "MIT", - "peer": true, "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", @@ -5918,7 +5906,6 @@ "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-5.53.0.tgz", "integrity": "sha512-OGW1q6b91CRSSeiOnM8LxuR5NYJ2esvw66jUZ4IIvdv+ItNkx3pwLuyR+jaCdbGee4ov5WgUnyPryyh11xvByQ==", "license": "MIT", - "peer": true, "dependencies": { "@algolia/abtesting": "1.19.0", "@algolia/client-abtesting": "5.53.0", @@ -6380,7 +6367,6 @@ } ], "license": "MIT", - "peer": true, "dependencies": { "baseline-browser-mapping": "^2.10.12", "caniuse-lite": "^1.0.30001782", @@ -7347,7 +7333,6 @@ "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", "license": "MIT", - "peer": true, "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" @@ -8688,7 +8673,6 @@ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.15.0.tgz", "integrity": "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==", "license": "MIT", - "peer": true, "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -13132,7 +13116,6 @@ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.15.0.tgz", "integrity": "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==", "license": "MIT", - "peer": true, "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -13665,7 +13648,6 @@ } ], "license": "MIT", - "peer": true, "dependencies": { "nanoid": "^3.3.12", "picocolors": "^1.1.1", @@ -14569,7 +14551,6 @@ "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", "license": "MIT", - "peer": true, "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" @@ -15386,7 +15367,6 @@ "resolved": "https://registry.npmjs.org/react/-/react-19.2.7.tgz", "integrity": "sha512-HNe9WslTbXmFK8o8cmwgAeJFSBvt1bPdHCVKtaaV+WlAN36mpT4hcRpwbf3fY56ar2oIXzsBpOAiIRHAdY0OlQ==", "license": "MIT", - "peer": true, "engines": { "node": ">=0.10.0" } @@ -15396,7 +15376,6 @@ "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.7.tgz", "integrity": "sha512-t0BRVXvbiE/o20Hfw669rLbMCDWtYZLvmJigy2f0MxsXF+71pxhR3xOkspmsO8h3ZlNzyibAmtCa3l4lYKk6gQ==", "license": "MIT", - "peer": true, "dependencies": { "scheduler": "^0.27.0" }, @@ -15452,7 +15431,6 @@ "resolved": "https://registry.npmjs.org/@docusaurus/react-loadable/-/react-loadable-6.0.0.tgz", "integrity": "sha512-YMMxTUQV/QFSnbgrP3tjDzLHRg7vsbMn8e9HAa8o/1iXoiomo48b7sk/kkmWEuWNDPJVlKSJRB6Y2fHqdJk+SQ==", "license": "MIT", - "peer": true, "dependencies": { "@types/react": "*" }, @@ -15481,7 +15459,6 @@ "resolved": "https://registry.npmjs.org/react-router/-/react-router-5.3.4.tgz", "integrity": "sha512-Ys9K+ppnJah3QuaRiLxk+jDWOR1MekYQrlytiXxC1RyfbdsZkS5pvKAzCCr031xHixZwpnsYNT5xysdFHQaYsA==", "license": "MIT", - "peer": true, "dependencies": { "@babel/runtime": "^7.12.13", "history": "^4.9.0", @@ -17261,8 +17238,7 @@ "version": "2.8.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", - "license": "0BSD", - "peer": true + "license": "0BSD" }, "node_modules/tsyringe": { "version": "4.10.0", @@ -17670,7 +17646,6 @@ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.15.0.tgz", "integrity": "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==", "license": "MIT", - "peer": true, "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -17870,7 +17845,6 @@ "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.107.2.tgz", "integrity": "sha512-v7RhXaJbpMlV0D7hC7lb2EbnxkoeUqf9qhKr6lozx3Q48pmFrqqNRmZFUEGmi7pSwm6fCQ2H1IjvCkHqdpVdjQ==", "license": "MIT", - "peer": true, "dependencies": { "@types/estree": "^1.0.8", "@types/json-schema": "^7.0.15", diff --git a/website/sidebars.js b/website/sidebars.js index 5472612f..cadaa245 100644 --- a/website/sidebars.js +++ b/website/sidebars.js @@ -4,6 +4,7 @@ const sidebars = { type: "category", label: "Functional", items: [ + "functional/user-manual", "user/overview", "user/install-and-run", "user/setup-and-sync", From 8c5fd5399dff53b8d2cfbda4f91436bb4a4f0ed2 Mon Sep 17 00:00:00 2001 From: Suraj Yadav Date: Tue, 9 Jun 2026 10:28:09 +0530 Subject: [PATCH 19/67] fix: Update terminal code styles for improved appearance --- website/src/pages/index.module.css | 2 ++ 1 file changed, 2 insertions(+) diff --git a/website/src/pages/index.module.css b/website/src/pages/index.module.css index c53f0876..57d24856 100644 --- a/website/src/pages/index.module.css +++ b/website/src/pages/index.module.css @@ -191,6 +191,8 @@ font-size: 0.82rem; line-height: 1.8; color: #9aa89c; + background: transparent; + border: none; } .terminalCode .terminalPrompt { From df288640df0855fccd1aeb7d6779d1bf1f9090b5 Mon Sep 17 00:00:00 2001 From: Suraj Yadav Date: Tue, 9 Jun 2026 10:43:51 +0530 Subject: [PATCH 20/67] feat: Add copy functionality to TerminalPreview and enhance styling --- website/src/pages/index.js | 27 +++++++++++++++++++++++---- website/src/pages/index.module.css | 28 ++++++++++++++++++++++++++-- 2 files changed, 49 insertions(+), 6 deletions(-) diff --git a/website/src/pages/index.js b/website/src/pages/index.js index dd8841b5..56e97128 100644 --- a/website/src/pages/index.js +++ b/website/src/pages/index.js @@ -1,7 +1,7 @@ import clsx from "clsx"; import Layout from "@theme/Layout"; import Link from "@docusaurus/Link"; -import { useEffect, useRef } from "react"; +import { useEffect, useRef, useState } from "react"; import styles from "./index.module.css"; const features = [ @@ -137,12 +137,31 @@ function useScrollReveal() { } function TerminalPreview() { + const [copied, setCopied] = useState(false); + + const handleCopy = () => { + const textToCopy = "git clone https://github.com/CITOpenRep/timemanagement.git\ncd timemanagement\nclickable build && clickable install"; + navigator.clipboard.writeText(textToCopy).then(() => { + setCopied(true); + setTimeout(() => setCopied(false), 2000); + }); + }; + return (
- - - +
+ + + +
+
         $ 
diff --git a/website/src/pages/index.module.css b/website/src/pages/index.module.css
index 57d24856..ea93c567 100644
--- a/website/src/pages/index.module.css
+++ b/website/src/pages/index.module.css
@@ -167,12 +167,36 @@
 
 .terminalBar {
   display: flex;
-  gap: 6px;
-  padding: 10px 14px;
+  justify-content: space-between;
+  align-items: center;
+  padding: 8px 14px;
   background: #152019;
   border-bottom: 1px solid #2d3e32;
 }
 
+.terminalDots {
+  display: flex;
+  gap: 6px;
+}
+
+.copyButton {
+  background: rgba(255, 255, 255, 0.05);
+  border: 1px solid rgba(255, 255, 255, 0.1);
+  color: #9aa89c;
+  border-radius: 4px;
+  padding: 4px 10px;
+  font-size: 0.75rem;
+  cursor: pointer;
+  font-family: var(--ifm-font-family-base);
+  transition: all 0.2s ease;
+}
+
+.copyButton:hover {
+  background: rgba(255, 255, 255, 0.1);
+  color: #f0ebe0;
+  border-color: rgba(255, 255, 255, 0.2);
+}
+
 .terminalDot {
   width: 10px;
   height: 10px;

From d0da8ed2207feec4e8616ce54793582a3e7fe01c Mon Sep 17 00:00:00 2001
From: Suraj Yadav 
Date: Tue, 9 Jun 2026 11:19:28 +0530
Subject: [PATCH 21/67] feat: Integrate search functionality using
 @easyops-cn/docusaurus-search-local and update configuration

---
 website-search.md            |  88 ++++++
 website/docusaurus.config.js |  19 +-
 website/package-lock.json    | 546 +++++++++++++++++++++++++++++++++++
 website/package.json         |   1 +
 4 files changed, 653 insertions(+), 1 deletion(-)
 create mode 100644 website-search.md

diff --git a/website-search.md b/website-search.md
new file mode 100644
index 00000000..9d5f32ac
--- /dev/null
+++ b/website-search.md
@@ -0,0 +1,88 @@
+# PLAN-website-search
+
+## Overview
+This plan outlines the integration of a fast, offline, and lightweight client-side search engine into the TimeManagement documentation website using `@easyops-cn/docusaurus-search-local`. This allows users to easily search through all static Markdown documentation pages directly from the website header.
+
+- **Project Type**: WEB
+- **Target Component**: Docusaurus Documentation Website (`website/`)
+
+## Success Criteria
+1. The search bar is visible in the global navigation header.
+2. Users can search and find relevant documentation from static Markdown files (User, Technical, and Contributing docs).
+3. Search index is generated during the build process (`npm run build`).
+4. Search runs entirely client-side without external API calls.
+5. The production build of the website runs and compiles successfully.
+6. The search UI matches the website's existing modern/dark design language (no purple accents, clean typography).
+
+## Tech Stack
+- **Search Library**: `@easyops-cn/docusaurus-search-local` (v0.46.1+ for Docusaurus v3 & React 19 compatibility)
+- **Framework**: Docusaurus v3
+- **Styling**: Custom CSS overrides if needed to fit the design system
+
+## File Structure Changes
+```plaintext
+website/
+├── docusaurus.config.js       # Configure search-local plugin
+└── package.json               # Add @easyops-cn/docusaurus-search-local dependency
+```
+
+---
+
+## Task Breakdown
+
+### Task 1: Install Search Dependency
+- **Agent**: `frontend-specialist`
+- **Skills**: `clean-code`
+- **Priority**: P0
+- **Dependencies**: None
+- **INPUT**: `website/package.json`
+- **OUTPUT**: Dev dependency added, `node_modules` updated
+- **VERIFY**: Run `npm install` in the `website/` directory to ensure package installs cleanly.
+- **Rollback Strategy**: Discard `package.json` change and delete `node_modules` lockfile edits.
+
+### Task 2: Configure Docusaurus Search Local Plugin
+- **Agent**: `frontend-specialist`
+- **Skills**: `clean-code`
+- **Priority**: P1
+- **Dependencies**: Task 1
+- **INPUT**: `website/docusaurus.config.js`
+- **OUTPUT**: Plugin added to the configuration
+- **VERIFY**: Ensure syntax is valid and it is loaded via `themes` (as required by `@easyops-cn/docusaurus-search-local` which is a theme plugin).
+- **Rollback Strategy**: Revert `docusaurus.config.js` changes to git HEAD.
+
+### Task 3: Build Documentation Website & Generate Search Index
+- **Agent**: `frontend-specialist`
+- **Skills**: `performance-profiling`
+- **Priority**: P2
+- **Dependencies**: Task 2
+- **INPUT**: `website/src`, `website/docs`
+- **OUTPUT**: Production build in `website/build`
+- **VERIFY**: Run `npm run build` inside `website/`. Ensure the search index is built and serialized correctly into JSON files in the build output.
+- **Rollback Strategy**: Rebuild with clean cache (`npm run clear` followed by `npm run build`).
+
+### Task 4: Verify Search Functionality in Browser
+- **Agent**: `frontend-specialist`
+- **Skills**: `webapp-testing`
+- **Priority**: P3
+- **Dependencies**: Task 3
+- **INPUT**: Local preview server running via `npm run serve`
+- **OUTPUT**: Interactive verification report
+- **VERIFY**: Run local server and use browser subagent to interactively type a query (e.g. "odoo" or "architecture") and confirm matching documents appear and are clickable.
+- **Rollback Strategy**: Check search configuration options (like language, indexing strategy) if matches don't appear.
+
+---
+
+## Phase X: Final Verification & Checklist
+
+- [ ] **Purple Ban**: Verify no purple/violet accents are added to the search UI.
+- [ ] **Template Ban**: Verify search input coordinates clean and modern with the custom hero/style.
+- [ ] **Lint/Typecheck**: Run `npm run lint` if configured in the website.
+- [ ] **Production Build**: Verify `npm run build` completes successfully.
+- [ ] **UX Audit**: Verify touch target size and accessibility for search input.
+- [ ] **Playwright/E2E check**: Run the server and test basic search interaction.
+
+### ✅ PHASE X COMPLETE
+- Lint: [ ]
+- Security: [ ]
+- Build: [ ]
+- Date: [Pending completion]
diff --git a/website/docusaurus.config.js b/website/docusaurus.config.js
index 42a7b07d..eb36bb6b 100644
--- a/website/docusaurus.config.js
+++ b/website/docusaurus.config.js
@@ -112,7 +112,24 @@ const config = {
       darkTheme: require("prism-react-renderer").themes.vsDark
     }
   },
-  themes: []
+  themes: [
+    [
+      require.resolve("@easyops-cn/docusaurus-search-local"),
+      /** @type {import("@easyops-cn/docusaurus-search-local").Options} */
+      ({
+        hashed: true,
+        language: ["en"],
+        docsRouteBasePath: "docs",
+        docsDir: "docs",
+        indexBlog: false,
+        indexDocs: true,
+        indexPages: true,
+        highlightSearchTermsOnTargetPage: true,
+        searchResultLimits: 8,
+        searchResultContextMaxLength: 50
+      })
+    ]
+  ]
 };
 
 module.exports = config;
diff --git a/website/package-lock.json b/website/package-lock.json
index c6f9f569..fe7680c1 100644
--- a/website/package-lock.json
+++ b/website/package-lock.json
@@ -10,6 +10,7 @@
       "dependencies": {
         "@docusaurus/core": "^3.9.2",
         "@docusaurus/preset-classic": "^3.9.2",
+        "@easyops-cn/docusaurus-search-local": "^0.55.2",
         "@mdx-js/react": "^3.1.0",
         "clsx": "^2.1.1",
         "prism-react-renderer": "^2.4.1",
@@ -3931,6 +3932,7 @@
       "resolved": "https://registry.npmjs.org/@docusaurus/theme-common/-/theme-common-3.10.1.tgz",
       "integrity": "sha512-0YtmIeoNo1fIw65LO8+/1dPgmDV86UmhMkow37gzjytuiCSQm9xob6PJy0L4kuQEMTLfUOGvkXvZr7GPrHquMA==",
       "license": "MIT",
+      "peer": true,
       "dependencies": {
         "@docusaurus/mdx-loader": "3.10.1",
         "@docusaurus/module-type-aliases": "3.10.1",
@@ -4099,6 +4101,156 @@
         "node": ">=20.0"
       }
     },
+    "node_modules/@easyops-cn/autocomplete.js": {
+      "version": "0.38.1",
+      "resolved": "https://registry.npmjs.org/@easyops-cn/autocomplete.js/-/autocomplete.js-0.38.1.tgz",
+      "integrity": "sha512-drg76jS6syilOUmVNkyo1c7ZEBPcPuK+aJA7AksM5ZIIbV57DMHCywiCr+uHyv8BE5jUTU98j/H7gVrkHrWW3Q==",
+      "license": "MIT",
+      "dependencies": {
+        "cssesc": "^3.0.0",
+        "immediate": "^3.2.3"
+      }
+    },
+    "node_modules/@easyops-cn/docusaurus-search-local": {
+      "version": "0.55.2",
+      "resolved": "https://registry.npmjs.org/@easyops-cn/docusaurus-search-local/-/docusaurus-search-local-0.55.2.tgz",
+      "integrity": "sha512-dI/riu+MbDxkAjAHAdc0uahjXRaWKvbIPe9IAmA6AGcUfnVb9xd8s2I/6wEPTOXsAd6eFqn4Yis3WBWh3KUd3g==",
+      "license": "MIT",
+      "dependencies": {
+        "@docusaurus/plugin-content-docs": "^2 || ^3",
+        "@docusaurus/theme-translations": "^2 || ^3",
+        "@docusaurus/utils": "^2 || ^3",
+        "@docusaurus/utils-common": "^2 || ^3",
+        "@docusaurus/utils-validation": "^2 || ^3",
+        "@easyops-cn/autocomplete.js": "^0.38.1",
+        "@node-rs/jieba": "^1.6.0",
+        "cheerio": "^1.0.0",
+        "clsx": "^2.1.1",
+        "comlink": "^4.4.2",
+        "debug": "^4.2.0",
+        "fs-extra": "^10.0.0",
+        "klaw-sync": "^6.0.0",
+        "lunr": "^2.3.9",
+        "lunr-languages": "^1.4.0",
+        "mark.js": "^8.11.1",
+        "tslib": "^2.4.0"
+      },
+      "engines": {
+        "node": ">=12"
+      },
+      "peerDependencies": {
+        "@docusaurus/theme-common": "^2 || ^3",
+        "open-ask-ai": "^0.7.3",
+        "react": "^16.14.0 || ^17 || ^18 || ^19",
+        "react-dom": "^16.14.0 || 17 || ^18 || ^19"
+      },
+      "peerDependenciesMeta": {
+        "open-ask-ai": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/@easyops-cn/docusaurus-search-local/node_modules/cheerio": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.2.0.tgz",
+      "integrity": "sha512-WDrybc/gKFpTYQutKIK6UvfcuxijIZfMfXaYm8NMsPQxSYvf+13fXUJ4rztGGbJcBQ/GF55gvrZ0Bc0bj/mqvg==",
+      "license": "MIT",
+      "dependencies": {
+        "cheerio-select": "^2.1.0",
+        "dom-serializer": "^2.0.0",
+        "domhandler": "^5.0.3",
+        "domutils": "^3.2.2",
+        "encoding-sniffer": "^0.2.1",
+        "htmlparser2": "^10.1.0",
+        "parse5": "^7.3.0",
+        "parse5-htmlparser2-tree-adapter": "^7.1.0",
+        "parse5-parser-stream": "^7.1.2",
+        "undici": "^7.19.0",
+        "whatwg-mimetype": "^4.0.0"
+      },
+      "engines": {
+        "node": ">=20.18.1"
+      },
+      "funding": {
+        "url": "https://github.com/cheeriojs/cheerio?sponsor=1"
+      }
+    },
+    "node_modules/@easyops-cn/docusaurus-search-local/node_modules/entities": {
+      "version": "7.0.1",
+      "resolved": "https://registry.npmjs.org/entities/-/entities-7.0.1.tgz",
+      "integrity": "sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA==",
+      "license": "BSD-2-Clause",
+      "engines": {
+        "node": ">=0.12"
+      },
+      "funding": {
+        "url": "https://github.com/fb55/entities?sponsor=1"
+      }
+    },
+    "node_modules/@easyops-cn/docusaurus-search-local/node_modules/fs-extra": {
+      "version": "10.1.0",
+      "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz",
+      "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==",
+      "license": "MIT",
+      "dependencies": {
+        "graceful-fs": "^4.2.0",
+        "jsonfile": "^6.0.1",
+        "universalify": "^2.0.0"
+      },
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/@easyops-cn/docusaurus-search-local/node_modules/htmlparser2": {
+      "version": "10.1.0",
+      "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-10.1.0.tgz",
+      "integrity": "sha512-VTZkM9GWRAtEpveh7MSF6SjjrpNVNNVJfFup7xTY3UpFtm67foy9HDVXneLtFVt4pMz5kZtgNcvCniNFb1hlEQ==",
+      "funding": [
+        "https://github.com/fb55/htmlparser2?sponsor=1",
+        {
+          "type": "github",
+          "url": "https://github.com/sponsors/fb55"
+        }
+      ],
+      "license": "MIT",
+      "dependencies": {
+        "domelementtype": "^2.3.0",
+        "domhandler": "^5.0.3",
+        "domutils": "^3.2.2",
+        "entities": "^7.0.1"
+      }
+    },
+    "node_modules/@emnapi/core": {
+      "version": "1.11.0",
+      "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.11.0.tgz",
+      "integrity": "sha512-l9Oo58x0HOP5znGzVhYW9U3e5wVuA4LAZU2AGezTmkhO1CgQRFDhDg4nneHsu/t3WniXg9QrG2nIXL/ZS8ln8Q==",
+      "license": "MIT",
+      "optional": true,
+      "dependencies": {
+        "@emnapi/wasi-threads": "1.2.2",
+        "tslib": "^2.4.0"
+      }
+    },
+    "node_modules/@emnapi/runtime": {
+      "version": "1.11.0",
+      "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.11.0.tgz",
+      "integrity": "sha512-55coeOFKHv1ywEcUXJtWU5f+Jr/W5tZDvZig8DLKSwUN1JpROQ4rk/SNOQiFWmaR/VKF4zuFyW1B8JduOSv6Pg==",
+      "license": "MIT",
+      "optional": true,
+      "dependencies": {
+        "tslib": "^2.4.0"
+      }
+    },
+    "node_modules/@emnapi/wasi-threads": {
+      "version": "1.2.2",
+      "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.2.2.tgz",
+      "integrity": "sha512-c95qOXkHdydNKhscBTebqEC1CVAZpyqOfVfBzQ1qgzyl3gfeldUjIggDbIZgDKsHLgnsM+igH7TJ/eAasaVuMA==",
+      "license": "MIT",
+      "optional": true,
+      "dependencies": {
+        "tslib": "^2.4.0"
+      }
+    },
     "node_modules/@hapi/hoek": {
       "version": "9.3.0",
       "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.3.0.tgz",
@@ -4668,6 +4820,18 @@
         "react": ">=16"
       }
     },
+    "node_modules/@napi-rs/wasm-runtime": {
+      "version": "0.2.12",
+      "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-0.2.12.tgz",
+      "integrity": "sha512-ZVWUcfwY4E/yPitQJl481FjFo3K22D6qF0DuFH6Y/nbnE11GY5uguDxZMGXPQ8WQ0128MXQD7TnfHyK4oWoIJQ==",
+      "license": "MIT",
+      "optional": true,
+      "dependencies": {
+        "@emnapi/core": "^1.4.3",
+        "@emnapi/runtime": "^1.4.3",
+        "@tybys/wasm-util": "^0.10.0"
+      }
+    },
     "node_modules/@noble/hashes": {
       "version": "1.4.0",
       "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.4.0.tgz",
@@ -4680,6 +4844,259 @@
         "url": "https://paulmillr.com/funding/"
       }
     },
+    "node_modules/@node-rs/jieba": {
+      "version": "1.10.4",
+      "resolved": "https://registry.npmjs.org/@node-rs/jieba/-/jieba-1.10.4.tgz",
+      "integrity": "sha512-GvDgi8MnBiyWd6tksojej8anIx18244NmIOc1ovEw8WKNUejcccLfyu8vj66LWSuoZuKILVtNsOy4jvg3aoxIw==",
+      "license": "MIT",
+      "engines": {
+        "node": ">= 10"
+      },
+      "funding": {
+        "type": "github",
+        "url": "https://github.com/sponsors/Brooooooklyn"
+      },
+      "optionalDependencies": {
+        "@node-rs/jieba-android-arm-eabi": "1.10.4",
+        "@node-rs/jieba-android-arm64": "1.10.4",
+        "@node-rs/jieba-darwin-arm64": "1.10.4",
+        "@node-rs/jieba-darwin-x64": "1.10.4",
+        "@node-rs/jieba-freebsd-x64": "1.10.4",
+        "@node-rs/jieba-linux-arm-gnueabihf": "1.10.4",
+        "@node-rs/jieba-linux-arm64-gnu": "1.10.4",
+        "@node-rs/jieba-linux-arm64-musl": "1.10.4",
+        "@node-rs/jieba-linux-x64-gnu": "1.10.4",
+        "@node-rs/jieba-linux-x64-musl": "1.10.4",
+        "@node-rs/jieba-wasm32-wasi": "1.10.4",
+        "@node-rs/jieba-win32-arm64-msvc": "1.10.4",
+        "@node-rs/jieba-win32-ia32-msvc": "1.10.4",
+        "@node-rs/jieba-win32-x64-msvc": "1.10.4"
+      }
+    },
+    "node_modules/@node-rs/jieba-android-arm-eabi": {
+      "version": "1.10.4",
+      "resolved": "https://registry.npmjs.org/@node-rs/jieba-android-arm-eabi/-/jieba-android-arm-eabi-1.10.4.tgz",
+      "integrity": "sha512-MhyvW5N3Fwcp385d0rxbCWH42kqDBatQTyP8XbnYbju2+0BO/eTeCCLYj7Agws4pwxn2LtdldXRSKavT7WdzNA==",
+      "cpu": [
+        "arm"
+      ],
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "android"
+      ],
+      "engines": {
+        "node": ">= 10"
+      }
+    },
+    "node_modules/@node-rs/jieba-android-arm64": {
+      "version": "1.10.4",
+      "resolved": "https://registry.npmjs.org/@node-rs/jieba-android-arm64/-/jieba-android-arm64-1.10.4.tgz",
+      "integrity": "sha512-XyDwq5+rQ+Tk55A+FGi6PtJbzf974oqnpyCcCPzwU3QVXJCa2Rr4Lci+fx8oOpU4plT3GuD+chXMYLsXipMgJA==",
+      "cpu": [
+        "arm64"
+      ],
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "android"
+      ],
+      "engines": {
+        "node": ">= 10"
+      }
+    },
+    "node_modules/@node-rs/jieba-darwin-arm64": {
+      "version": "1.10.4",
+      "resolved": "https://registry.npmjs.org/@node-rs/jieba-darwin-arm64/-/jieba-darwin-arm64-1.10.4.tgz",
+      "integrity": "sha512-G++RYEJ2jo0rxF9626KUy90wp06TRUjAsvY/BrIzEOX/ingQYV/HjwQzNPRR1P1o32a6/U8RGo7zEBhfdybL6w==",
+      "cpu": [
+        "arm64"
+      ],
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "darwin"
+      ],
+      "engines": {
+        "node": ">= 10"
+      }
+    },
+    "node_modules/@node-rs/jieba-darwin-x64": {
+      "version": "1.10.4",
+      "resolved": "https://registry.npmjs.org/@node-rs/jieba-darwin-x64/-/jieba-darwin-x64-1.10.4.tgz",
+      "integrity": "sha512-MmDNeOb2TXIZCPyWCi2upQnZpPjAxw5ZGEj6R8kNsPXVFALHIKMa6ZZ15LCOkSTsKXVC17j2t4h+hSuyYb6qfQ==",
+      "cpu": [
+        "x64"
+      ],
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "darwin"
+      ],
+      "engines": {
+        "node": ">= 10"
+      }
+    },
+    "node_modules/@node-rs/jieba-freebsd-x64": {
+      "version": "1.10.4",
+      "resolved": "https://registry.npmjs.org/@node-rs/jieba-freebsd-x64/-/jieba-freebsd-x64-1.10.4.tgz",
+      "integrity": "sha512-/x7aVQ8nqUWhpXU92RZqd333cq639i/olNpd9Z5hdlyyV5/B65LLy+Je2B2bfs62PVVm5QXRpeBcZqaHelp/bg==",
+      "cpu": [
+        "x64"
+      ],
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "freebsd"
+      ],
+      "engines": {
+        "node": ">= 10"
+      }
+    },
+    "node_modules/@node-rs/jieba-linux-arm-gnueabihf": {
+      "version": "1.10.4",
+      "resolved": "https://registry.npmjs.org/@node-rs/jieba-linux-arm-gnueabihf/-/jieba-linux-arm-gnueabihf-1.10.4.tgz",
+      "integrity": "sha512-crd2M35oJBRLkoESs0O6QO3BBbhpv+tqXuKsqhIG94B1d02RVxtRIvSDwO33QurxqSdvN9IeSnVpHbDGkuXm3g==",
+      "cpu": [
+        "arm"
+      ],
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">= 10"
+      }
+    },
+    "node_modules/@node-rs/jieba-linux-arm64-gnu": {
+      "version": "1.10.4",
+      "resolved": "https://registry.npmjs.org/@node-rs/jieba-linux-arm64-gnu/-/jieba-linux-arm64-gnu-1.10.4.tgz",
+      "integrity": "sha512-omIzNX1psUzPcsdnUhGU6oHeOaTCuCjUgOA/v/DGkvWC1jLcnfXe4vdYbtXMh4XOCuIgS1UCcvZEc8vQLXFbXQ==",
+      "cpu": [
+        "arm64"
+      ],
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">= 10"
+      }
+    },
+    "node_modules/@node-rs/jieba-linux-arm64-musl": {
+      "version": "1.10.4",
+      "resolved": "https://registry.npmjs.org/@node-rs/jieba-linux-arm64-musl/-/jieba-linux-arm64-musl-1.10.4.tgz",
+      "integrity": "sha512-Y/tiJ1+HeS5nnmLbZOE+66LbsPOHZ/PUckAYVeLlQfpygLEpLYdlh0aPpS5uiaWMjAXYZYdFkpZHhxDmSLpwpw==",
+      "cpu": [
+        "arm64"
+      ],
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">= 10"
+      }
+    },
+    "node_modules/@node-rs/jieba-linux-x64-gnu": {
+      "version": "1.10.4",
+      "resolved": "https://registry.npmjs.org/@node-rs/jieba-linux-x64-gnu/-/jieba-linux-x64-gnu-1.10.4.tgz",
+      "integrity": "sha512-WZO8ykRJpWGE9MHuZpy1lu3nJluPoeB+fIJJn5CWZ9YTVhNDWoCF4i/7nxz1ntulINYGQ8VVuCU9LD86Mek97g==",
+      "cpu": [
+        "x64"
+      ],
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">= 10"
+      }
+    },
+    "node_modules/@node-rs/jieba-linux-x64-musl": {
+      "version": "1.10.4",
+      "resolved": "https://registry.npmjs.org/@node-rs/jieba-linux-x64-musl/-/jieba-linux-x64-musl-1.10.4.tgz",
+      "integrity": "sha512-uBBD4S1rGKcgCyAk6VCKatEVQb6EDD5I40v/DxODi5CuZVCANi9m5oee/MQbAoaX7RydA2f0OSCE9/tcwXEwUg==",
+      "cpu": [
+        "x64"
+      ],
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">= 10"
+      }
+    },
+    "node_modules/@node-rs/jieba-wasm32-wasi": {
+      "version": "1.10.4",
+      "resolved": "https://registry.npmjs.org/@node-rs/jieba-wasm32-wasi/-/jieba-wasm32-wasi-1.10.4.tgz",
+      "integrity": "sha512-Y2umiKHjuIJy0uulNDz9SDYHdfq5Hmy7jY5nORO99B4pySKkcrMjpeVrmWXJLIsEKLJwcCXHxz8tjwU5/uhz0A==",
+      "cpu": [
+        "wasm32"
+      ],
+      "license": "MIT",
+      "optional": true,
+      "dependencies": {
+        "@napi-rs/wasm-runtime": "^0.2.3"
+      },
+      "engines": {
+        "node": ">=14.0.0"
+      }
+    },
+    "node_modules/@node-rs/jieba-win32-arm64-msvc": {
+      "version": "1.10.4",
+      "resolved": "https://registry.npmjs.org/@node-rs/jieba-win32-arm64-msvc/-/jieba-win32-arm64-msvc-1.10.4.tgz",
+      "integrity": "sha512-nwMtViFm4hjqhz1it/juQnxpXgqlGltCuWJ02bw70YUDMDlbyTy3grCJPpQQpueeETcALUnTxda8pZuVrLRcBA==",
+      "cpu": [
+        "arm64"
+      ],
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "win32"
+      ],
+      "engines": {
+        "node": ">= 10"
+      }
+    },
+    "node_modules/@node-rs/jieba-win32-ia32-msvc": {
+      "version": "1.10.4",
+      "resolved": "https://registry.npmjs.org/@node-rs/jieba-win32-ia32-msvc/-/jieba-win32-ia32-msvc-1.10.4.tgz",
+      "integrity": "sha512-DCAvLx7Z+W4z5oKS+7vUowAJr0uw9JBw8x1Y23Xs/xMA4Em+OOSiaF5/tCJqZUCJ8uC4QeImmgDFiBqGNwxlyA==",
+      "cpu": [
+        "ia32"
+      ],
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "win32"
+      ],
+      "engines": {
+        "node": ">= 10"
+      }
+    },
+    "node_modules/@node-rs/jieba-win32-x64-msvc": {
+      "version": "1.10.4",
+      "resolved": "https://registry.npmjs.org/@node-rs/jieba-win32-x64-msvc/-/jieba-win32-x64-msvc-1.10.4.tgz",
+      "integrity": "sha512-+sqemSfS1jjb+Tt7InNbNzrRh1Ua3vProVvC4BZRPg010/leCbGFFiQHpzcPRfpxAXZrzG5Y0YBTsPzN/I4yHQ==",
+      "cpu": [
+        "x64"
+      ],
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "win32"
+      ],
+      "engines": {
+        "node": ">= 10"
+      }
+    },
     "node_modules/@nodelib/fs.scandir": {
       "version": "2.1.5",
       "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz",
@@ -5239,6 +5656,16 @@
         "node": ">=14.16"
       }
     },
+    "node_modules/@tybys/wasm-util": {
+      "version": "0.10.2",
+      "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.2.tgz",
+      "integrity": "sha512-RoBvJ2X0wuKlWFIjrwffGw1IqZHKQqzIchKaadZZfnNpsAYp2mM0h36JtPCjNDAHGgYez/15uMBpfGwchhiMgg==",
+      "license": "MIT",
+      "optional": true,
+      "dependencies": {
+        "tslib": "^2.4.0"
+      }
+    },
     "node_modules/@types/body-parser": {
       "version": "1.19.6",
       "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.6.tgz",
@@ -6881,6 +7308,12 @@
         "node": ">=10"
       }
     },
+    "node_modules/comlink": {
+      "version": "4.4.2",
+      "resolved": "https://registry.npmjs.org/comlink/-/comlink-4.4.2.tgz",
+      "integrity": "sha512-OxGdvBmJuNKSCMO4NTl1L47VRp6xn2wG4F/2hYzB6tiCb709otOxtEYCSvK80PtjODfXXZu8ds+Nw5kVCjqd2g==",
+      "license": "Apache-2.0"
+    },
     "node_modules/comma-separated-tokens": {
       "version": "2.0.3",
       "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz",
@@ -8087,6 +8520,31 @@
         "node": ">= 0.8"
       }
     },
+    "node_modules/encoding-sniffer": {
+      "version": "0.2.1",
+      "resolved": "https://registry.npmjs.org/encoding-sniffer/-/encoding-sniffer-0.2.1.tgz",
+      "integrity": "sha512-5gvq20T6vfpekVtqrYQsSCFZ1wEg5+wW0/QaZMWkFr6BqD3NfKs0rLCx4rrVlSWJeZb5NBJgVLswK/w2MWU+Gw==",
+      "license": "MIT",
+      "dependencies": {
+        "iconv-lite": "^0.6.3",
+        "whatwg-encoding": "^3.1.1"
+      },
+      "funding": {
+        "url": "https://github.com/fb55/encoding-sniffer?sponsor=1"
+      }
+    },
+    "node_modules/encoding-sniffer/node_modules/iconv-lite": {
+      "version": "0.6.3",
+      "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz",
+      "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==",
+      "license": "MIT",
+      "dependencies": {
+        "safer-buffer": ">= 2.1.2 < 3.0.0"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
     "node_modules/enhanced-resolve": {
       "version": "5.22.2",
       "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.22.2.tgz",
@@ -9778,6 +10236,12 @@
         "node": ">=16.x"
       }
     },
+    "node_modules/immediate": {
+      "version": "3.3.0",
+      "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.3.0.tgz",
+      "integrity": "sha512-HR7EVodfFUdQCTIeySw+WDRFJlPcLOJbXfwwZ7Oom6tjsvZ3bOkCDJHehQC3nxJrv7+f9XecwazynjU8e4Vw3Q==",
+      "license": "MIT"
+    },
     "node_modules/import-fresh": {
       "version": "3.3.1",
       "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz",
@@ -10374,6 +10838,15 @@
         "node": ">=0.10.0"
       }
     },
+    "node_modules/klaw-sync": {
+      "version": "6.0.0",
+      "resolved": "https://registry.npmjs.org/klaw-sync/-/klaw-sync-6.0.0.tgz",
+      "integrity": "sha512-nIeuVSzdCCs6TDPTqI8w1Yre34sSq7AkZ4B3sfOBbI2CgVSB4Du4aLQijFU2+lhAFCwt9+42Hel6lQNIv6AntQ==",
+      "license": "MIT",
+      "dependencies": {
+        "graceful-fs": "^4.1.11"
+      }
+    },
     "node_modules/kleur": {
       "version": "3.0.3",
       "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz",
@@ -10553,6 +11026,24 @@
         "yallist": "^3.0.2"
       }
     },
+    "node_modules/lunr": {
+      "version": "2.3.9",
+      "resolved": "https://registry.npmjs.org/lunr/-/lunr-2.3.9.tgz",
+      "integrity": "sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow==",
+      "license": "MIT"
+    },
+    "node_modules/lunr-languages": {
+      "version": "1.20.0",
+      "resolved": "https://registry.npmjs.org/lunr-languages/-/lunr-languages-1.20.0.tgz",
+      "integrity": "sha512-3LVgE7ekWXt04NBci/hjm+NXJxXZeRXuyClL0kA0HONyBOjxhP3ZQkuWIM4Ok3pbeptUW/rj3XcJcJuJVPwPYA==",
+      "license": "MPL-1.1"
+    },
+    "node_modules/mark.js": {
+      "version": "8.11.1",
+      "resolved": "https://registry.npmjs.org/mark.js/-/mark.js-8.11.1.tgz",
+      "integrity": "sha512-1I+1qpDt4idfgLQG+BNWmrqku+7/2bi5nLf4YwF8y8zXvmfiTBY3PV3ZibfrjBueCByROpuBjLLFCajqkgYoLQ==",
+      "license": "MIT"
+    },
     "node_modules/markdown-extensions": {
       "version": "2.0.0",
       "resolved": "https://registry.npmjs.org/markdown-extensions/-/markdown-extensions-2.0.0.tgz",
@@ -13517,6 +14008,18 @@
         "url": "https://github.com/inikulin/parse5?sponsor=1"
       }
     },
+    "node_modules/parse5-parser-stream": {
+      "version": "7.1.2",
+      "resolved": "https://registry.npmjs.org/parse5-parser-stream/-/parse5-parser-stream-7.1.2.tgz",
+      "integrity": "sha512-JyeQc9iwFLn5TbvvqACIF/VXG6abODeB3Fwmv/TGdLk2LfbWkaySGY72at4+Ty7EkPZj854u4CrICqNk2qIbow==",
+      "license": "MIT",
+      "dependencies": {
+        "parse5": "^7.0.0"
+      },
+      "funding": {
+        "url": "https://github.com/inikulin/parse5?sponsor=1"
+      }
+    },
     "node_modules/parse5/node_modules/entities": {
       "version": "6.0.1",
       "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.1.tgz",
@@ -17337,6 +17840,15 @@
         "is-typedarray": "^1.0.0"
       }
     },
+    "node_modules/undici": {
+      "version": "7.27.2",
+      "resolved": "https://registry.npmjs.org/undici/-/undici-7.27.2.tgz",
+      "integrity": "sha512-uZsKNuzQxDMUY6M3pIMvy5tvlGmtq8XJ2oLAkfRKGNu+1VQAIvLy2xIVG5ATZl5wDXl/tddByAWCizRbOme+TA==",
+      "license": "MIT",
+      "engines": {
+        "node": ">=20.18.1"
+      }
+    },
     "node_modules/undici-types": {
       "version": "7.24.6",
       "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.24.6.tgz",
@@ -18200,6 +18712,40 @@
         "node": ">=0.8.0"
       }
     },
+    "node_modules/whatwg-encoding": {
+      "version": "3.1.1",
+      "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-3.1.1.tgz",
+      "integrity": "sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==",
+      "deprecated": "Use @exodus/bytes instead for a more spec-conformant and faster implementation",
+      "license": "MIT",
+      "dependencies": {
+        "iconv-lite": "0.6.3"
+      },
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/whatwg-encoding/node_modules/iconv-lite": {
+      "version": "0.6.3",
+      "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz",
+      "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==",
+      "license": "MIT",
+      "dependencies": {
+        "safer-buffer": ">= 2.1.2 < 3.0.0"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/whatwg-mimetype": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-4.0.0.tgz",
+      "integrity": "sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==",
+      "license": "MIT",
+      "engines": {
+        "node": ">=18"
+      }
+    },
     "node_modules/which": {
       "version": "2.0.2",
       "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
diff --git a/website/package.json b/website/package.json
index ec86977e..6959b1f8 100644
--- a/website/package.json
+++ b/website/package.json
@@ -11,6 +11,7 @@
   "dependencies": {
     "@docusaurus/core": "^3.9.2",
     "@docusaurus/preset-classic": "^3.9.2",
+    "@easyops-cn/docusaurus-search-local": "^0.55.2",
     "@mdx-js/react": "^3.1.0",
     "clsx": "^2.1.1",
     "prism-react-renderer": "^2.4.1",

From e39f1a06b7166da4dfb23fc095d0491ddf52a6b6 Mon Sep 17 00:00:00 2001
From: Suraj Yadav 
Date: Tue, 9 Jun 2026 13:44:38 +0530
Subject: [PATCH 22/67] Refactor code structure for improved readability and
 maintainability

---
 website-search.md                             |   20 +-
 .../contributing/documentation-governance.md  |    1 +
 website/docs/contributing/getting-started.md  |    1 +
 .../contributing/pull-request-guidelines.md   |    1 +
 website/docs/technical/architecture.md        |   28 +
 website/docs/technical/build-and-packaging.md |    1 +
 website/docs/technical/release-process.md     |    1 +
 .../docs/technical/repository-organization.md |    1 +
 website/docs/user/features.md                 |   24 +-
 website/docs/user/install-and-run.md          |    1 +
 website/docs/user/overview.md                 |    1 +
 website/docs/user/setup-and-sync.md           |    1 +
 website/docs/user/troubleshooting.md          |    1 +
 website/docusaurus.config.js                  |    2 +
 website/package-lock.json                     | 1363 +++++++++++++++--
 website/package.json                          |    2 +
 website/src/pages/index.module.css            |    1 +
 website/static/img/snapshots/architecture.png |  Bin 0 -> 612546 bytes
 website/static/img/snapshots/dashboard.png    |  Bin 0 -> 502371 bytes
 website/static/img/snapshots/settings.png     |  Bin 0 -> 419057 bytes
 website/static/img/snapshots/tasks.png        |  Bin 0 -> 533079 bytes
 website/static/img/snapshots/timesheets.png   |  Bin 0 -> 445784 bytes
 22 files changed, 1322 insertions(+), 128 deletions(-)
 create mode 100644 website/static/img/snapshots/architecture.png
 create mode 100644 website/static/img/snapshots/dashboard.png
 create mode 100644 website/static/img/snapshots/settings.png
 create mode 100644 website/static/img/snapshots/tasks.png
 create mode 100644 website/static/img/snapshots/timesheets.png

diff --git a/website-search.md b/website-search.md
index 9d5f32ac..337a856f 100644
--- a/website-search.md
+++ b/website-search.md
@@ -74,15 +74,15 @@ website/
 
 ## Phase X: Final Verification & Checklist
 
-- [ ] **Purple Ban**: Verify no purple/violet accents are added to the search UI.
-- [ ] **Template Ban**: Verify search input coordinates clean and modern with the custom hero/style.
-- [ ] **Lint/Typecheck**: Run `npm run lint` if configured in the website.
-- [ ] **Production Build**: Verify `npm run build` completes successfully.
-- [ ] **UX Audit**: Verify touch target size and accessibility for search input.
-- [ ] **Playwright/E2E check**: Run the server and test basic search interaction.
+- [x] **Purple Ban**: Verify no purple/violet accents are added to the search UI.
+- [x] **Template Ban**: Verify search input coordinates clean and modern with the custom hero/style.
+- [x] **Lint/Typecheck**: Run `npm run lint` if configured in the website.
+- [x] **Production Build**: Verify `npm run build` completes successfully.
+- [x] **UX Audit**: Verify touch target size and accessibility for search input.
+- [x] **Playwright/E2E check**: Verify search interaction in browser.
 
 ### ✅ PHASE X COMPLETE
-- Lint: [ ]
-- Security: [ ]
-- Build: [ ]
-- Date: [Pending completion]
+- Lint: [x]
+- Security: [x]
+- Build: [x]
+- Date: 2026-06-09
diff --git a/website/docs/contributing/documentation-governance.md b/website/docs/contributing/documentation-governance.md
index 260aebf7..f00a0942 100644
--- a/website/docs/contributing/documentation-governance.md
+++ b/website/docs/contributing/documentation-governance.md
@@ -1,3 +1,4 @@
+---
 title: Documentation Governance
 sidebar_label: Documentation Governance
 ---
diff --git a/website/docs/contributing/getting-started.md b/website/docs/contributing/getting-started.md
index add0c634..0a72c0dc 100644
--- a/website/docs/contributing/getting-started.md
+++ b/website/docs/contributing/getting-started.md
@@ -1,3 +1,4 @@
+---
 title: Contributor Getting Started
 sidebar_label: Getting Started
 ---
diff --git a/website/docs/contributing/pull-request-guidelines.md b/website/docs/contributing/pull-request-guidelines.md
index 2d810406..a085e35c 100644
--- a/website/docs/contributing/pull-request-guidelines.md
+++ b/website/docs/contributing/pull-request-guidelines.md
@@ -1,3 +1,4 @@
+---
 title: Pull Request Guidelines
 sidebar_label: Pull Request Guidelines
 ---
diff --git a/website/docs/technical/architecture.md b/website/docs/technical/architecture.md
index 15fd3685..9d104d68 100644
--- a/website/docs/technical/architecture.md
+++ b/website/docs/technical/architecture.md
@@ -1,3 +1,4 @@
+---
 title: Architecture Overview
 sidebar_label: Architecture
 ---
@@ -27,6 +28,33 @@ At a high level:
 - `docs/`: source documentation kept in the main repository
 - `website/`: Docusaurus-based website and documentation portal
 
+## System Architecture Model
+
+Here is the high-level representation of the TimeManagement three-layer architecture and component integration.
+
+### Architectural Diagram
+```mermaid
+graph TD
+    subgraph UI ["QML Client Layer"]
+        A[QML Pages] --> B[Shared QML Components]
+    end
+    
+    subgraph State ["JavaScript Logic Layer"]
+        C[Shared State Models] --> D[API Helpers]
+    end
+
+    subgraph Service ["Python Service Layer"]
+        E[Sync Daemon] --> F[Odoo API Client]
+        E --> G[Local SQLite DB]
+    end
+
+    UI -->|Import / Call| State
+    State -->|D-Bus / Sync Commands| Service
+```
+
+![Architecture Flow Diagram](/img/snapshots/architecture.png)
+*Figure 1: Component layout and communication lines between UI, JavaScript models, and Python backend services.*
+
 ## Documentation intent
 
 This technical section should answer:
diff --git a/website/docs/technical/build-and-packaging.md b/website/docs/technical/build-and-packaging.md
index 3c98a0d2..3a70abbf 100644
--- a/website/docs/technical/build-and-packaging.md
+++ b/website/docs/technical/build-and-packaging.md
@@ -1,3 +1,4 @@
+---
 title: Build and Packaging
 sidebar_label: Build and Packaging
 ---
diff --git a/website/docs/technical/release-process.md b/website/docs/technical/release-process.md
index 5a63e04b..b06f14b3 100644
--- a/website/docs/technical/release-process.md
+++ b/website/docs/technical/release-process.md
@@ -1,3 +1,4 @@
+---
 title: Release Process
 sidebar_label: Release Process
 ---
diff --git a/website/docs/technical/repository-organization.md b/website/docs/technical/repository-organization.md
index 55c1f075..14df17ac 100644
--- a/website/docs/technical/repository-organization.md
+++ b/website/docs/technical/repository-organization.md
@@ -1,3 +1,4 @@
+---
 title: Repository Organization
 sidebar_label: Repository Organization
 ---
diff --git a/website/docs/user/features.md b/website/docs/user/features.md
index 94cbac89..86fc7df7 100644
--- a/website/docs/user/features.md
+++ b/website/docs/user/features.md
@@ -1,3 +1,4 @@
+---
 title: Features and Workflows
 sidebar_label: Features
 ---
@@ -25,11 +26,22 @@ This feature organization helps with:
 - issue reporting with more precise page references
 - future release notes grouped by product area
 
-## Suggested future additions
+## App Visual Gallery (Snapshots)
+
+Here are placeholders for visual guides across the main application views:
+
+### Timesheets & Logging
+![Timesheet Recording Snapshot](/img/snapshots/timesheets.png)
+*Figure 1: Interface for logging work hours, tracking entries, and editing timesheets.*
+
+### Task Management
+![Task Management Snapshot](/img/snapshots/tasks.png)
+*Figure 2: Kanban/list layouts showing active tasks, stages, and project assignments.*
 
-This page is a good place to add:
+### Dashboard & Analytics
+![Dashboard Snapshot](/img/snapshots/dashboard.png)
+*Figure 3: Dynamic charts showing project time breakdown and weekly summaries.*
 
-- workflow screenshots
-- short videos or GIFs
-- page-by-page capability summaries
-- platform-specific notes when desktop and device behavior differs
+### Settings & Configurations
+![Settings Snapshot](/img/snapshots/settings.png)
+*Figure 4: Settings page including sync options, server connection settings, and device properties.*
diff --git a/website/docs/user/install-and-run.md b/website/docs/user/install-and-run.md
index 454381d2..cbc5cede 100644
--- a/website/docs/user/install-and-run.md
+++ b/website/docs/user/install-and-run.md
@@ -1,3 +1,4 @@
+---
 title: Install and Run
 sidebar_label: Install and Run
 ---
diff --git a/website/docs/user/overview.md b/website/docs/user/overview.md
index 12908738..143e7efd 100644
--- a/website/docs/user/overview.md
+++ b/website/docs/user/overview.md
@@ -1,3 +1,4 @@
+---
 title: User Documentation Overview
 sidebar_label: Overview
 ---
diff --git a/website/docs/user/setup-and-sync.md b/website/docs/user/setup-and-sync.md
index e00413b7..294ba6bf 100644
--- a/website/docs/user/setup-and-sync.md
+++ b/website/docs/user/setup-and-sync.md
@@ -1,3 +1,4 @@
+---
 title: Setup and Sync
 sidebar_label: Setup and Sync
 ---
diff --git a/website/docs/user/troubleshooting.md b/website/docs/user/troubleshooting.md
index e4fd3730..c25e29e6 100644
--- a/website/docs/user/troubleshooting.md
+++ b/website/docs/user/troubleshooting.md
@@ -1,3 +1,4 @@
+---
 title: Troubleshooting
 sidebar_label: Troubleshooting
 ---
diff --git a/website/docusaurus.config.js b/website/docusaurus.config.js
index eb36bb6b..5c6c8844 100644
--- a/website/docusaurus.config.js
+++ b/website/docusaurus.config.js
@@ -15,6 +15,7 @@ const config = {
     }
   ],
   markdown: {
+    mermaid: true,
     hooks: {
       onBrokenMarkdownLinks: "warn"
     }
@@ -113,6 +114,7 @@ const config = {
     }
   },
   themes: [
+    "@docusaurus/theme-mermaid",
     [
       require.resolve("@easyops-cn/docusaurus-search-local"),
       /** @type {import("@easyops-cn/docusaurus-search-local").Options} */
diff --git a/website/package-lock.json b/website/package-lock.json
index fe7680c1..8368a3bc 100644
--- a/website/package-lock.json
+++ b/website/package-lock.json
@@ -10,8 +10,10 @@
       "dependencies": {
         "@docusaurus/core": "^3.9.2",
         "@docusaurus/preset-classic": "^3.9.2",
+        "@docusaurus/theme-mermaid": "^3.10.1",
         "@easyops-cn/docusaurus-search-local": "^0.55.2",
         "@mdx-js/react": "^3.1.0",
+        "@mermaid-js/layout-elk": "^0.1.9",
         "clsx": "^2.1.1",
         "prism-react-renderer": "^2.4.1",
         "react": "^19.1.0",
@@ -252,6 +254,19 @@
         "node": ">= 14.0.0"
       }
     },
+    "node_modules/@antfu/install-pkg": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/@antfu/install-pkg/-/install-pkg-1.1.0.tgz",
+      "integrity": "sha512-MGQsmw10ZyI+EJo45CdSER4zEb+p31LpDAFp2Z3gkSd1yqVZGi0Ebx++YTEMonJy4oChEMLsxZ64j8FH6sSqtQ==",
+      "license": "MIT",
+      "dependencies": {
+        "package-manager-detector": "^1.3.0",
+        "tinyexec": "^1.0.1"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/antfu"
+      }
+    },
     "node_modules/@babel/code-frame": {
       "version": "7.29.7",
       "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.7.tgz",
@@ -1971,6 +1986,18 @@
         "node": ">=6.9.0"
       }
     },
+    "node_modules/@braintree/sanitize-url": {
+      "version": "7.1.2",
+      "resolved": "https://registry.npmjs.org/@braintree/sanitize-url/-/sanitize-url-7.1.2.tgz",
+      "integrity": "sha512-jigsZK+sMF/cuiB7sERuo9V7N9jx+dhmHHnQyDSVdpZwVutaBu7WvNYqMDLSgFgfB30n452TP3vjDAvFC973mA==",
+      "license": "MIT"
+    },
+    "node_modules/@chevrotain/types": {
+      "version": "11.1.2",
+      "resolved": "https://registry.npmjs.org/@chevrotain/types/-/types-11.1.2.tgz",
+      "integrity": "sha512-U+HFai5+zmJCkK86QsaJtoITlboZHBqrVketcO2ROv865xfCMSFpELQoz1GkX5GzME8pTa+3kbKrZHQtI0gdbw==",
+      "license": "Apache-2.0"
+    },
     "node_modules/@colors/colors": {
       "version": "1.5.0",
       "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz",
@@ -3956,6 +3983,34 @@
         "react-dom": "^18.0.0 || ^19.0.0"
       }
     },
+    "node_modules/@docusaurus/theme-mermaid": {
+      "version": "3.10.1",
+      "resolved": "https://registry.npmjs.org/@docusaurus/theme-mermaid/-/theme-mermaid-3.10.1.tgz",
+      "integrity": "sha512-2gxpmln8Pc4EN1oWzshQEx2HTs67jk14v7MmgqGs8ZU7Nm8oihg+fTouof2u4vN8DtB3Fln4cDJu4UprSX1S3Q==",
+      "license": "MIT",
+      "dependencies": {
+        "@docusaurus/core": "3.10.1",
+        "@docusaurus/module-type-aliases": "3.10.1",
+        "@docusaurus/theme-common": "3.10.1",
+        "@docusaurus/types": "3.10.1",
+        "@docusaurus/utils-validation": "3.10.1",
+        "mermaid": ">=11.6.0",
+        "tslib": "^2.6.0"
+      },
+      "engines": {
+        "node": ">=20.0"
+      },
+      "peerDependencies": {
+        "@mermaid-js/layout-elk": "^0.1.9",
+        "react": "^18.0.0 || ^19.0.0",
+        "react-dom": "^18.0.0 || ^19.0.0"
+      },
+      "peerDependenciesMeta": {
+        "@mermaid-js/layout-elk": {
+          "optional": true
+        }
+      }
+    },
     "node_modules/@docusaurus/theme-search-algolia": {
       "version": "3.10.1",
       "resolved": "https://registry.npmjs.org/@docusaurus/theme-search-algolia/-/theme-search-algolia-3.10.1.tgz",
@@ -4266,6 +4321,23 @@
         "@hapi/hoek": "^9.0.0"
       }
     },
+    "node_modules/@iconify/types": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/@iconify/types/-/types-2.0.0.tgz",
+      "integrity": "sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==",
+      "license": "MIT"
+    },
+    "node_modules/@iconify/utils": {
+      "version": "3.1.3",
+      "resolved": "https://registry.npmjs.org/@iconify/utils/-/utils-3.1.3.tgz",
+      "integrity": "sha512-LPKOXPn/zV+zis1oOfGWogaXVpqUybF3ZS6SCZIsz8vg0ivVp9+fVqyYB7xq0aiST/VhUQYGO1qo6uoYSiEJqw==",
+      "license": "MIT",
+      "dependencies": {
+        "@antfu/install-pkg": "^1.1.0",
+        "@iconify/types": "^2.0.0",
+        "import-meta-resolve": "^4.2.0"
+      }
+    },
     "node_modules/@jest/schemas": {
       "version": "29.6.3",
       "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz",
@@ -4820,6 +4892,29 @@
         "react": ">=16"
       }
     },
+    "node_modules/@mermaid-js/layout-elk": {
+      "version": "0.1.9",
+      "resolved": "https://registry.npmjs.org/@mermaid-js/layout-elk/-/layout-elk-0.1.9.tgz",
+      "integrity": "sha512-HuvaqFZBr6yT9PpWYockvKAZPJVd89yn/UjOYPxhzbZxlybL2v+2BjVCg7MVH6vRs1irUohb/s42HEdec1CCZw==",
+      "license": "MIT",
+      "peer": true,
+      "dependencies": {
+        "d3": "^7.9.0",
+        "elkjs": "^0.9.3"
+      },
+      "peerDependencies": {
+        "mermaid": "^11.0.2"
+      }
+    },
+    "node_modules/@mermaid-js/parser": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/@mermaid-js/parser/-/parser-1.1.1.tgz",
+      "integrity": "sha512-VuHdsYMK1bT6X2JbcAaWAhugTRvRBRyuZgd+c22swUeI9g/ntaxF7CY7dYarhZovofCbUNO0G7JesfmNtjYOCw==",
+      "license": "MIT",
+      "dependencies": {
+        "@chevrotain/types": "~11.1.1"
+      }
+    },
     "node_modules/@napi-rs/wasm-runtime": {
       "version": "0.2.12",
       "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-0.2.12.tgz",
@@ -5704,6 +5799,259 @@
         "@types/node": "*"
       }
     },
+    "node_modules/@types/d3": {
+      "version": "7.4.3",
+      "resolved": "https://registry.npmjs.org/@types/d3/-/d3-7.4.3.tgz",
+      "integrity": "sha512-lZXZ9ckh5R8uiFVt8ogUNf+pIrK4EsWrx2Np75WvF/eTpJ0FMHNhjXk8CKEx/+gpHbNQyJWehbFaTvqmHWB3ww==",
+      "license": "MIT",
+      "dependencies": {
+        "@types/d3-array": "*",
+        "@types/d3-axis": "*",
+        "@types/d3-brush": "*",
+        "@types/d3-chord": "*",
+        "@types/d3-color": "*",
+        "@types/d3-contour": "*",
+        "@types/d3-delaunay": "*",
+        "@types/d3-dispatch": "*",
+        "@types/d3-drag": "*",
+        "@types/d3-dsv": "*",
+        "@types/d3-ease": "*",
+        "@types/d3-fetch": "*",
+        "@types/d3-force": "*",
+        "@types/d3-format": "*",
+        "@types/d3-geo": "*",
+        "@types/d3-hierarchy": "*",
+        "@types/d3-interpolate": "*",
+        "@types/d3-path": "*",
+        "@types/d3-polygon": "*",
+        "@types/d3-quadtree": "*",
+        "@types/d3-random": "*",
+        "@types/d3-scale": "*",
+        "@types/d3-scale-chromatic": "*",
+        "@types/d3-selection": "*",
+        "@types/d3-shape": "*",
+        "@types/d3-time": "*",
+        "@types/d3-time-format": "*",
+        "@types/d3-timer": "*",
+        "@types/d3-transition": "*",
+        "@types/d3-zoom": "*"
+      }
+    },
+    "node_modules/@types/d3-array": {
+      "version": "3.2.2",
+      "resolved": "https://registry.npmjs.org/@types/d3-array/-/d3-array-3.2.2.tgz",
+      "integrity": "sha512-hOLWVbm7uRza0BYXpIIW5pxfrKe0W+D5lrFiAEYR+pb6w3N2SwSMaJbXdUfSEv+dT4MfHBLtn5js0LAWaO6otw==",
+      "license": "MIT"
+    },
+    "node_modules/@types/d3-axis": {
+      "version": "3.0.6",
+      "resolved": "https://registry.npmjs.org/@types/d3-axis/-/d3-axis-3.0.6.tgz",
+      "integrity": "sha512-pYeijfZuBd87T0hGn0FO1vQ/cgLk6E1ALJjfkC0oJ8cbwkZl3TpgS8bVBLZN+2jjGgg38epgxb2zmoGtSfvgMw==",
+      "license": "MIT",
+      "dependencies": {
+        "@types/d3-selection": "*"
+      }
+    },
+    "node_modules/@types/d3-brush": {
+      "version": "3.0.6",
+      "resolved": "https://registry.npmjs.org/@types/d3-brush/-/d3-brush-3.0.6.tgz",
+      "integrity": "sha512-nH60IZNNxEcrh6L1ZSMNA28rj27ut/2ZmI3r96Zd+1jrZD++zD3LsMIjWlvg4AYrHn/Pqz4CF3veCxGjtbqt7A==",
+      "license": "MIT",
+      "dependencies": {
+        "@types/d3-selection": "*"
+      }
+    },
+    "node_modules/@types/d3-chord": {
+      "version": "3.0.6",
+      "resolved": "https://registry.npmjs.org/@types/d3-chord/-/d3-chord-3.0.6.tgz",
+      "integrity": "sha512-LFYWWd8nwfwEmTZG9PfQxd17HbNPksHBiJHaKuY1XeqscXacsS2tyoo6OdRsjf+NQYeB6XrNL3a25E3gH69lcg==",
+      "license": "MIT"
+    },
+    "node_modules/@types/d3-color": {
+      "version": "3.1.3",
+      "resolved": "https://registry.npmjs.org/@types/d3-color/-/d3-color-3.1.3.tgz",
+      "integrity": "sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A==",
+      "license": "MIT"
+    },
+    "node_modules/@types/d3-contour": {
+      "version": "3.0.6",
+      "resolved": "https://registry.npmjs.org/@types/d3-contour/-/d3-contour-3.0.6.tgz",
+      "integrity": "sha512-BjzLgXGnCWjUSYGfH1cpdo41/hgdWETu4YxpezoztawmqsvCeep+8QGfiY6YbDvfgHz/DkjeIkkZVJavB4a3rg==",
+      "license": "MIT",
+      "dependencies": {
+        "@types/d3-array": "*",
+        "@types/geojson": "*"
+      }
+    },
+    "node_modules/@types/d3-delaunay": {
+      "version": "6.0.4",
+      "resolved": "https://registry.npmjs.org/@types/d3-delaunay/-/d3-delaunay-6.0.4.tgz",
+      "integrity": "sha512-ZMaSKu4THYCU6sV64Lhg6qjf1orxBthaC161plr5KuPHo3CNm8DTHiLw/5Eq2b6TsNP0W0iJrUOFscY6Q450Hw==",
+      "license": "MIT"
+    },
+    "node_modules/@types/d3-dispatch": {
+      "version": "3.0.7",
+      "resolved": "https://registry.npmjs.org/@types/d3-dispatch/-/d3-dispatch-3.0.7.tgz",
+      "integrity": "sha512-5o9OIAdKkhN1QItV2oqaE5KMIiXAvDWBDPrD85e58Qlz1c1kI/J0NcqbEG88CoTwJrYe7ntUCVfeUl2UJKbWgA==",
+      "license": "MIT"
+    },
+    "node_modules/@types/d3-drag": {
+      "version": "3.0.7",
+      "resolved": "https://registry.npmjs.org/@types/d3-drag/-/d3-drag-3.0.7.tgz",
+      "integrity": "sha512-HE3jVKlzU9AaMazNufooRJ5ZpWmLIoc90A37WU2JMmeq28w1FQqCZswHZ3xR+SuxYftzHq6WU6KJHvqxKzTxxQ==",
+      "license": "MIT",
+      "dependencies": {
+        "@types/d3-selection": "*"
+      }
+    },
+    "node_modules/@types/d3-dsv": {
+      "version": "3.0.7",
+      "resolved": "https://registry.npmjs.org/@types/d3-dsv/-/d3-dsv-3.0.7.tgz",
+      "integrity": "sha512-n6QBF9/+XASqcKK6waudgL0pf/S5XHPPI8APyMLLUHd8NqouBGLsU8MgtO7NINGtPBtk9Kko/W4ea0oAspwh9g==",
+      "license": "MIT"
+    },
+    "node_modules/@types/d3-ease": {
+      "version": "3.0.2",
+      "resolved": "https://registry.npmjs.org/@types/d3-ease/-/d3-ease-3.0.2.tgz",
+      "integrity": "sha512-NcV1JjO5oDzoK26oMzbILE6HW7uVXOHLQvHshBUW4UMdZGfiY6v5BeQwh9a9tCzv+CeefZQHJt5SRgK154RtiA==",
+      "license": "MIT"
+    },
+    "node_modules/@types/d3-fetch": {
+      "version": "3.0.7",
+      "resolved": "https://registry.npmjs.org/@types/d3-fetch/-/d3-fetch-3.0.7.tgz",
+      "integrity": "sha512-fTAfNmxSb9SOWNB9IoG5c8Hg6R+AzUHDRlsXsDZsNp6sxAEOP0tkP3gKkNSO/qmHPoBFTxNrjDprVHDQDvo5aA==",
+      "license": "MIT",
+      "dependencies": {
+        "@types/d3-dsv": "*"
+      }
+    },
+    "node_modules/@types/d3-force": {
+      "version": "3.0.10",
+      "resolved": "https://registry.npmjs.org/@types/d3-force/-/d3-force-3.0.10.tgz",
+      "integrity": "sha512-ZYeSaCF3p73RdOKcjj+swRlZfnYpK1EbaDiYICEEp5Q6sUiqFaFQ9qgoshp5CzIyyb/yD09kD9o2zEltCexlgw==",
+      "license": "MIT"
+    },
+    "node_modules/@types/d3-format": {
+      "version": "3.0.4",
+      "resolved": "https://registry.npmjs.org/@types/d3-format/-/d3-format-3.0.4.tgz",
+      "integrity": "sha512-fALi2aI6shfg7vM5KiR1wNJnZ7r6UuggVqtDA+xiEdPZQwy/trcQaHnwShLuLdta2rTymCNpxYTiMZX/e09F4g==",
+      "license": "MIT"
+    },
+    "node_modules/@types/d3-geo": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/@types/d3-geo/-/d3-geo-3.1.0.tgz",
+      "integrity": "sha512-856sckF0oP/diXtS4jNsiQw/UuK5fQG8l/a9VVLeSouf1/PPbBE1i1W852zVwKwYCBkFJJB7nCFTbk6UMEXBOQ==",
+      "license": "MIT",
+      "dependencies": {
+        "@types/geojson": "*"
+      }
+    },
+    "node_modules/@types/d3-hierarchy": {
+      "version": "3.1.7",
+      "resolved": "https://registry.npmjs.org/@types/d3-hierarchy/-/d3-hierarchy-3.1.7.tgz",
+      "integrity": "sha512-tJFtNoYBtRtkNysX1Xq4sxtjK8YgoWUNpIiUee0/jHGRwqvzYxkq0hGVbbOGSz+JgFxxRu4K8nb3YpG3CMARtg==",
+      "license": "MIT"
+    },
+    "node_modules/@types/d3-interpolate": {
+      "version": "3.0.4",
+      "resolved": "https://registry.npmjs.org/@types/d3-interpolate/-/d3-interpolate-3.0.4.tgz",
+      "integrity": "sha512-mgLPETlrpVV1YRJIglr4Ez47g7Yxjl1lj7YKsiMCb27VJH9W8NVM6Bb9d8kkpG/uAQS5AmbA48q2IAolKKo1MA==",
+      "license": "MIT",
+      "dependencies": {
+        "@types/d3-color": "*"
+      }
+    },
+    "node_modules/@types/d3-path": {
+      "version": "3.1.1",
+      "resolved": "https://registry.npmjs.org/@types/d3-path/-/d3-path-3.1.1.tgz",
+      "integrity": "sha512-VMZBYyQvbGmWyWVea0EHs/BwLgxc+MKi1zLDCONksozI4YJMcTt8ZEuIR4Sb1MMTE8MMW49v0IwI5+b7RmfWlg==",
+      "license": "MIT"
+    },
+    "node_modules/@types/d3-polygon": {
+      "version": "3.0.2",
+      "resolved": "https://registry.npmjs.org/@types/d3-polygon/-/d3-polygon-3.0.2.tgz",
+      "integrity": "sha512-ZuWOtMaHCkN9xoeEMr1ubW2nGWsp4nIql+OPQRstu4ypeZ+zk3YKqQT0CXVe/PYqrKpZAi+J9mTs05TKwjXSRA==",
+      "license": "MIT"
+    },
+    "node_modules/@types/d3-quadtree": {
+      "version": "3.0.6",
+      "resolved": "https://registry.npmjs.org/@types/d3-quadtree/-/d3-quadtree-3.0.6.tgz",
+      "integrity": "sha512-oUzyO1/Zm6rsxKRHA1vH0NEDG58HrT5icx/azi9MF1TWdtttWl0UIUsjEQBBh+SIkrpd21ZjEv7ptxWys1ncsg==",
+      "license": "MIT"
+    },
+    "node_modules/@types/d3-random": {
+      "version": "3.0.3",
+      "resolved": "https://registry.npmjs.org/@types/d3-random/-/d3-random-3.0.3.tgz",
+      "integrity": "sha512-Imagg1vJ3y76Y2ea0871wpabqp613+8/r0mCLEBfdtqC7xMSfj9idOnmBYyMoULfHePJyxMAw3nWhJxzc+LFwQ==",
+      "license": "MIT"
+    },
+    "node_modules/@types/d3-scale": {
+      "version": "4.0.9",
+      "resolved": "https://registry.npmjs.org/@types/d3-scale/-/d3-scale-4.0.9.tgz",
+      "integrity": "sha512-dLmtwB8zkAeO/juAMfnV+sItKjlsw2lKdZVVy6LRr0cBmegxSABiLEpGVmSJJ8O08i4+sGR6qQtb6WtuwJdvVw==",
+      "license": "MIT",
+      "dependencies": {
+        "@types/d3-time": "*"
+      }
+    },
+    "node_modules/@types/d3-scale-chromatic": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/@types/d3-scale-chromatic/-/d3-scale-chromatic-3.1.0.tgz",
+      "integrity": "sha512-iWMJgwkK7yTRmWqRB5plb1kadXyQ5Sj8V/zYlFGMUBbIPKQScw+Dku9cAAMgJG+z5GYDoMjWGLVOvjghDEFnKQ==",
+      "license": "MIT"
+    },
+    "node_modules/@types/d3-selection": {
+      "version": "3.0.11",
+      "resolved": "https://registry.npmjs.org/@types/d3-selection/-/d3-selection-3.0.11.tgz",
+      "integrity": "sha512-bhAXu23DJWsrI45xafYpkQ4NtcKMwWnAC/vKrd2l+nxMFuvOT3XMYTIj2opv8vq8AO5Yh7Qac/nSeP/3zjTK0w==",
+      "license": "MIT"
+    },
+    "node_modules/@types/d3-shape": {
+      "version": "3.1.8",
+      "resolved": "https://registry.npmjs.org/@types/d3-shape/-/d3-shape-3.1.8.tgz",
+      "integrity": "sha512-lae0iWfcDeR7qt7rA88BNiqdvPS5pFVPpo5OfjElwNaT2yyekbM0C9vK+yqBqEmHr6lDkRnYNoTBYlAgJa7a4w==",
+      "license": "MIT",
+      "dependencies": {
+        "@types/d3-path": "*"
+      }
+    },
+    "node_modules/@types/d3-time": {
+      "version": "3.0.4",
+      "resolved": "https://registry.npmjs.org/@types/d3-time/-/d3-time-3.0.4.tgz",
+      "integrity": "sha512-yuzZug1nkAAaBlBBikKZTgzCeA+k1uy4ZFwWANOfKw5z5LRhV0gNA7gNkKm7HoK+HRN0wX3EkxGk0fpbWhmB7g==",
+      "license": "MIT"
+    },
+    "node_modules/@types/d3-time-format": {
+      "version": "4.0.3",
+      "resolved": "https://registry.npmjs.org/@types/d3-time-format/-/d3-time-format-4.0.3.tgz",
+      "integrity": "sha512-5xg9rC+wWL8kdDj153qZcsJ0FWiFt0J5RB6LYUNZjwSnesfblqrI/bJ1wBdJ8OQfncgbJG5+2F+qfqnqyzYxyg==",
+      "license": "MIT"
+    },
+    "node_modules/@types/d3-timer": {
+      "version": "3.0.2",
+      "resolved": "https://registry.npmjs.org/@types/d3-timer/-/d3-timer-3.0.2.tgz",
+      "integrity": "sha512-Ps3T8E8dZDam6fUyNiMkekK3XUsaUEik+idO9/YjPtfj2qruF8tFBXS7XhtE4iIXBLxhmLjP3SXpLhVf21I9Lw==",
+      "license": "MIT"
+    },
+    "node_modules/@types/d3-transition": {
+      "version": "3.0.9",
+      "resolved": "https://registry.npmjs.org/@types/d3-transition/-/d3-transition-3.0.9.tgz",
+      "integrity": "sha512-uZS5shfxzO3rGlu0cC3bjmMFKsXv+SmZZcgp0KD22ts4uGXp5EVYGzu/0YdwZeKmddhcAccYtREJKkPfXkZuCg==",
+      "license": "MIT",
+      "dependencies": {
+        "@types/d3-selection": "*"
+      }
+    },
+    "node_modules/@types/d3-zoom": {
+      "version": "3.0.8",
+      "resolved": "https://registry.npmjs.org/@types/d3-zoom/-/d3-zoom-3.0.8.tgz",
+      "integrity": "sha512-iqMC4/YlFCSlO8+2Ii1GGGliCAY4XdeG748w5vQUbevlbDu0zSjH/+jojorQVBK/se0j6DUFNPBGSqD3YWYnDw==",
+      "license": "MIT",
+      "dependencies": {
+        "@types/d3-interpolate": "*",
+        "@types/d3-selection": "*"
+      }
+    },
     "node_modules/@types/debug": {
       "version": "4.1.13",
       "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.13.tgz",
@@ -5752,6 +6100,12 @@
         "@types/send": "*"
       }
     },
+    "node_modules/@types/geojson": {
+      "version": "7946.0.16",
+      "resolved": "https://registry.npmjs.org/@types/geojson/-/geojson-7946.0.16.tgz",
+      "integrity": "sha512-6C8nqWur3j98U6+lXDfTUWIfgvZU+EumvpHKcYjujKH7woYyLj2sUmff0tRhrqM7BohUw7Pz3ZB1jj2gW9Fvmg==",
+      "license": "MIT"
+    },
     "node_modules/@types/gtag.js": {
       "version": "0.0.20",
       "resolved": "https://registry.npmjs.org/@types/gtag.js/-/gtag.js-0.0.20.tgz",
@@ -5989,6 +6343,13 @@
         "@types/node": "*"
       }
     },
+    "node_modules/@types/trusted-types": {
+      "version": "2.0.7",
+      "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.7.tgz",
+      "integrity": "sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==",
+      "license": "MIT",
+      "optional": true
+    },
     "node_modules/@types/unist": {
       "version": "3.0.3",
       "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz",
@@ -6025,6 +6386,16 @@
       "integrity": "sha512-mUFwbeTqrVgDQxFveS+df2yfap6iuP20NAKAsBt5jDEoOTDew+zwLAOilHCeQJOVSvmgCX4ogqIrA0mnyr08yQ==",
       "license": "ISC"
     },
+    "node_modules/@upsetjs/venn.js": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/@upsetjs/venn.js/-/venn.js-2.0.0.tgz",
+      "integrity": "sha512-WbBhLrooyePuQ1VZxrJjtLvTc4NVfpOyKx0sKqioq9bX1C1m7Jgykkn8gLrtwumBioXIqam8DLxp88Adbue6Hw==",
+      "license": "MIT",
+      "optionalDependencies": {
+        "d3-selection": "^3.0.0",
+        "d3-transition": "^3.0.1"
+      }
+    },
     "node_modules/@webassemblyjs/ast": {
       "version": "1.14.1",
       "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.14.1.tgz",
@@ -7609,6 +7980,15 @@
       "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==",
       "license": "MIT"
     },
+    "node_modules/cose-base": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/cose-base/-/cose-base-1.0.3.tgz",
+      "integrity": "sha512-s9whTXInMSgAp/NVXVNuVxVKzGH2qck3aQlVHxDCdAEPgtMKwc4Wq6/QKhgdEdgbLSi9rBTAcPoRa6JpiG4ksg==",
+      "license": "MIT",
+      "dependencies": {
+        "layout-base": "^1.0.0"
+      }
+    },
     "node_modules/cosmiconfig": {
       "version": "8.3.6",
       "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.3.6.tgz",
@@ -7947,152 +8327,680 @@
       ],
       "license": "MIT-0"
     },
-    "node_modules/cssesc": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz",
-      "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==",
-      "license": "MIT",
-      "bin": {
-        "cssesc": "bin/cssesc"
+    "node_modules/cssesc": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz",
+      "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==",
+      "license": "MIT",
+      "bin": {
+        "cssesc": "bin/cssesc"
+      },
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/cssnano": {
+      "version": "6.1.2",
+      "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-6.1.2.tgz",
+      "integrity": "sha512-rYk5UeX7VAM/u0lNqewCdasdtPK81CgX8wJFLEIXHbV2oldWRgJAsZrdhRXkV1NJzA2g850KiFm9mMU2HxNxMA==",
+      "license": "MIT",
+      "dependencies": {
+        "cssnano-preset-default": "^6.1.2",
+        "lilconfig": "^3.1.1"
+      },
+      "engines": {
+        "node": "^14 || ^16 || >=18.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/cssnano"
+      },
+      "peerDependencies": {
+        "postcss": "^8.4.31"
+      }
+    },
+    "node_modules/cssnano-preset-advanced": {
+      "version": "6.1.2",
+      "resolved": "https://registry.npmjs.org/cssnano-preset-advanced/-/cssnano-preset-advanced-6.1.2.tgz",
+      "integrity": "sha512-Nhao7eD8ph2DoHolEzQs5CfRpiEP0xa1HBdnFZ82kvqdmbwVBUr2r1QuQ4t1pi+D1ZpqpcO4T+wy/7RxzJ/WPQ==",
+      "license": "MIT",
+      "dependencies": {
+        "autoprefixer": "^10.4.19",
+        "browserslist": "^4.23.0",
+        "cssnano-preset-default": "^6.1.2",
+        "postcss-discard-unused": "^6.0.5",
+        "postcss-merge-idents": "^6.0.3",
+        "postcss-reduce-idents": "^6.0.3",
+        "postcss-zindex": "^6.0.2"
+      },
+      "engines": {
+        "node": "^14 || ^16 || >=18.0"
+      },
+      "peerDependencies": {
+        "postcss": "^8.4.31"
+      }
+    },
+    "node_modules/cssnano-preset-default": {
+      "version": "6.1.2",
+      "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-6.1.2.tgz",
+      "integrity": "sha512-1C0C+eNaeN8OcHQa193aRgYexyJtU8XwbdieEjClw+J9d94E41LwT6ivKH0WT+fYwYWB0Zp3I3IZ7tI/BbUbrg==",
+      "license": "MIT",
+      "dependencies": {
+        "browserslist": "^4.23.0",
+        "css-declaration-sorter": "^7.2.0",
+        "cssnano-utils": "^4.0.2",
+        "postcss-calc": "^9.0.1",
+        "postcss-colormin": "^6.1.0",
+        "postcss-convert-values": "^6.1.0",
+        "postcss-discard-comments": "^6.0.2",
+        "postcss-discard-duplicates": "^6.0.3",
+        "postcss-discard-empty": "^6.0.3",
+        "postcss-discard-overridden": "^6.0.2",
+        "postcss-merge-longhand": "^6.0.5",
+        "postcss-merge-rules": "^6.1.1",
+        "postcss-minify-font-values": "^6.1.0",
+        "postcss-minify-gradients": "^6.0.3",
+        "postcss-minify-params": "^6.1.0",
+        "postcss-minify-selectors": "^6.0.4",
+        "postcss-normalize-charset": "^6.0.2",
+        "postcss-normalize-display-values": "^6.0.2",
+        "postcss-normalize-positions": "^6.0.2",
+        "postcss-normalize-repeat-style": "^6.0.2",
+        "postcss-normalize-string": "^6.0.2",
+        "postcss-normalize-timing-functions": "^6.0.2",
+        "postcss-normalize-unicode": "^6.1.0",
+        "postcss-normalize-url": "^6.0.2",
+        "postcss-normalize-whitespace": "^6.0.2",
+        "postcss-ordered-values": "^6.0.2",
+        "postcss-reduce-initial": "^6.1.0",
+        "postcss-reduce-transforms": "^6.0.2",
+        "postcss-svgo": "^6.0.3",
+        "postcss-unique-selectors": "^6.0.4"
+      },
+      "engines": {
+        "node": "^14 || ^16 || >=18.0"
+      },
+      "peerDependencies": {
+        "postcss": "^8.4.31"
+      }
+    },
+    "node_modules/cssnano-utils": {
+      "version": "4.0.2",
+      "resolved": "https://registry.npmjs.org/cssnano-utils/-/cssnano-utils-4.0.2.tgz",
+      "integrity": "sha512-ZR1jHg+wZ8o4c3zqf1SIUSTIvm/9mU343FMR6Obe/unskbvpGhZOo1J6d/r8D1pzkRQYuwbcH3hToOuoA2G7oQ==",
+      "license": "MIT",
+      "engines": {
+        "node": "^14 || ^16 || >=18.0"
+      },
+      "peerDependencies": {
+        "postcss": "^8.4.31"
+      }
+    },
+    "node_modules/csso": {
+      "version": "5.0.5",
+      "resolved": "https://registry.npmjs.org/csso/-/csso-5.0.5.tgz",
+      "integrity": "sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ==",
+      "license": "MIT",
+      "dependencies": {
+        "css-tree": "~2.2.0"
+      },
+      "engines": {
+        "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0",
+        "npm": ">=7.0.0"
+      }
+    },
+    "node_modules/csso/node_modules/css-tree": {
+      "version": "2.2.1",
+      "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.2.1.tgz",
+      "integrity": "sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA==",
+      "license": "MIT",
+      "dependencies": {
+        "mdn-data": "2.0.28",
+        "source-map-js": "^1.0.1"
+      },
+      "engines": {
+        "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0",
+        "npm": ">=7.0.0"
+      }
+    },
+    "node_modules/csso/node_modules/mdn-data": {
+      "version": "2.0.28",
+      "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.28.tgz",
+      "integrity": "sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g==",
+      "license": "CC0-1.0"
+    },
+    "node_modules/csstype": {
+      "version": "3.2.3",
+      "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz",
+      "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==",
+      "license": "MIT"
+    },
+    "node_modules/cytoscape": {
+      "version": "3.34.0",
+      "resolved": "https://registry.npmjs.org/cytoscape/-/cytoscape-3.34.0.tgz",
+      "integrity": "sha512-62rNSrioXw93uliKFBwjukeQyeWwH2PqDrTac31r2P6464u3AUvTk0xS4LVvT251g7IgkFunrI48ZEZGjywSOg==",
+      "license": "MIT",
+      "peer": true,
+      "engines": {
+        "node": ">=0.10"
+      }
+    },
+    "node_modules/cytoscape-cose-bilkent": {
+      "version": "4.1.0",
+      "resolved": "https://registry.npmjs.org/cytoscape-cose-bilkent/-/cytoscape-cose-bilkent-4.1.0.tgz",
+      "integrity": "sha512-wgQlVIUJF13Quxiv5e1gstZ08rnZj2XaLHGoFMYXz7SkNfCDOOteKBE6SYRfA9WxxI/iBc3ajfDoc6hb/MRAHQ==",
+      "license": "MIT",
+      "dependencies": {
+        "cose-base": "^1.0.0"
+      },
+      "peerDependencies": {
+        "cytoscape": "^3.2.0"
+      }
+    },
+    "node_modules/cytoscape-fcose": {
+      "version": "2.2.0",
+      "resolved": "https://registry.npmjs.org/cytoscape-fcose/-/cytoscape-fcose-2.2.0.tgz",
+      "integrity": "sha512-ki1/VuRIHFCzxWNrsshHYPs6L7TvLu3DL+TyIGEsRcvVERmxokbf5Gdk7mFxZnTdiGtnA4cfSmjZJMviqSuZrQ==",
+      "license": "MIT",
+      "dependencies": {
+        "cose-base": "^2.2.0"
+      },
+      "peerDependencies": {
+        "cytoscape": "^3.2.0"
+      }
+    },
+    "node_modules/cytoscape-fcose/node_modules/cose-base": {
+      "version": "2.2.0",
+      "resolved": "https://registry.npmjs.org/cose-base/-/cose-base-2.2.0.tgz",
+      "integrity": "sha512-AzlgcsCbUMymkADOJtQm3wO9S3ltPfYOFD5033keQn9NJzIbtnZj+UdBJe7DYml/8TdbtHJW3j58SOnKhWY/5g==",
+      "license": "MIT",
+      "dependencies": {
+        "layout-base": "^2.0.0"
+      }
+    },
+    "node_modules/cytoscape-fcose/node_modules/layout-base": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/layout-base/-/layout-base-2.0.1.tgz",
+      "integrity": "sha512-dp3s92+uNI1hWIpPGH3jK2kxE2lMjdXdr+DH8ynZHpd6PUlH6x6cbuXnoMmiNumznqaNO31xu9e79F0uuZ0JFg==",
+      "license": "MIT"
+    },
+    "node_modules/d3": {
+      "version": "7.9.0",
+      "resolved": "https://registry.npmjs.org/d3/-/d3-7.9.0.tgz",
+      "integrity": "sha512-e1U46jVP+w7Iut8Jt8ri1YsPOvFpg46k+K8TpCb0P+zjCkjkPnV7WzfDJzMHy1LnA+wj5pLT1wjO901gLXeEhA==",
+      "license": "ISC",
+      "dependencies": {
+        "d3-array": "3",
+        "d3-axis": "3",
+        "d3-brush": "3",
+        "d3-chord": "3",
+        "d3-color": "3",
+        "d3-contour": "4",
+        "d3-delaunay": "6",
+        "d3-dispatch": "3",
+        "d3-drag": "3",
+        "d3-dsv": "3",
+        "d3-ease": "3",
+        "d3-fetch": "3",
+        "d3-force": "3",
+        "d3-format": "3",
+        "d3-geo": "3",
+        "d3-hierarchy": "3",
+        "d3-interpolate": "3",
+        "d3-path": "3",
+        "d3-polygon": "3",
+        "d3-quadtree": "3",
+        "d3-random": "3",
+        "d3-scale": "4",
+        "d3-scale-chromatic": "3",
+        "d3-selection": "3",
+        "d3-shape": "3",
+        "d3-time": "3",
+        "d3-time-format": "4",
+        "d3-timer": "3",
+        "d3-transition": "3",
+        "d3-zoom": "3"
+      },
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/d3-array": {
+      "version": "3.2.4",
+      "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-3.2.4.tgz",
+      "integrity": "sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==",
+      "license": "ISC",
+      "dependencies": {
+        "internmap": "1 - 2"
+      },
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/d3-axis": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/d3-axis/-/d3-axis-3.0.0.tgz",
+      "integrity": "sha512-IH5tgjV4jE/GhHkRV0HiVYPDtvfjHQlQfJHs0usq7M30XcSBvOotpmH1IgkcXsO/5gEQZD43B//fc7SRT5S+xw==",
+      "license": "ISC",
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/d3-brush": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/d3-brush/-/d3-brush-3.0.0.tgz",
+      "integrity": "sha512-ALnjWlVYkXsVIGlOsuWH1+3udkYFI48Ljihfnh8FZPF2QS9o+PzGLBslO0PjzVoHLZ2KCVgAM8NVkXPJB2aNnQ==",
+      "license": "ISC",
+      "dependencies": {
+        "d3-dispatch": "1 - 3",
+        "d3-drag": "2 - 3",
+        "d3-interpolate": "1 - 3",
+        "d3-selection": "3",
+        "d3-transition": "3"
+      },
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/d3-chord": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/d3-chord/-/d3-chord-3.0.1.tgz",
+      "integrity": "sha512-VE5S6TNa+j8msksl7HwjxMHDM2yNK3XCkusIlpX5kwauBfXuyLAtNg9jCp/iHH61tgI4sb6R/EIMWCqEIdjT/g==",
+      "license": "ISC",
+      "dependencies": {
+        "d3-path": "1 - 3"
+      },
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/d3-color": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-3.1.0.tgz",
+      "integrity": "sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==",
+      "license": "ISC",
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/d3-contour": {
+      "version": "4.0.2",
+      "resolved": "https://registry.npmjs.org/d3-contour/-/d3-contour-4.0.2.tgz",
+      "integrity": "sha512-4EzFTRIikzs47RGmdxbeUvLWtGedDUNkTcmzoeyg4sP/dvCexO47AaQL7VKy/gul85TOxw+IBgA8US2xwbToNA==",
+      "license": "ISC",
+      "dependencies": {
+        "d3-array": "^3.2.0"
+      },
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/d3-delaunay": {
+      "version": "6.0.4",
+      "resolved": "https://registry.npmjs.org/d3-delaunay/-/d3-delaunay-6.0.4.tgz",
+      "integrity": "sha512-mdjtIZ1XLAM8bm/hx3WwjfHt6Sggek7qH043O8KEjDXN40xi3vx/6pYSVTwLjEgiXQTbvaouWKynLBiUZ6SK6A==",
+      "license": "ISC",
+      "dependencies": {
+        "delaunator": "5"
+      },
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/d3-dispatch": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-3.0.1.tgz",
+      "integrity": "sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg==",
+      "license": "ISC",
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/d3-drag": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/d3-drag/-/d3-drag-3.0.0.tgz",
+      "integrity": "sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg==",
+      "license": "ISC",
+      "dependencies": {
+        "d3-dispatch": "1 - 3",
+        "d3-selection": "3"
+      },
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/d3-dsv": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/d3-dsv/-/d3-dsv-3.0.1.tgz",
+      "integrity": "sha512-UG6OvdI5afDIFP9w4G0mNq50dSOsXHJaRE8arAS5o9ApWnIElp8GZw1Dun8vP8OyHOZ/QJUKUJwxiiCCnUwm+Q==",
+      "license": "ISC",
+      "dependencies": {
+        "commander": "7",
+        "iconv-lite": "0.6",
+        "rw": "1"
+      },
+      "bin": {
+        "csv2json": "bin/dsv2json.js",
+        "csv2tsv": "bin/dsv2dsv.js",
+        "dsv2dsv": "bin/dsv2dsv.js",
+        "dsv2json": "bin/dsv2json.js",
+        "json2csv": "bin/json2dsv.js",
+        "json2dsv": "bin/json2dsv.js",
+        "json2tsv": "bin/json2dsv.js",
+        "tsv2csv": "bin/dsv2dsv.js",
+        "tsv2json": "bin/dsv2json.js"
+      },
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/d3-dsv/node_modules/commander": {
+      "version": "7.2.0",
+      "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz",
+      "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==",
+      "license": "MIT",
+      "engines": {
+        "node": ">= 10"
+      }
+    },
+    "node_modules/d3-dsv/node_modules/iconv-lite": {
+      "version": "0.6.3",
+      "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz",
+      "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==",
+      "license": "MIT",
+      "dependencies": {
+        "safer-buffer": ">= 2.1.2 < 3.0.0"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/d3-ease": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-3.0.1.tgz",
+      "integrity": "sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==",
+      "license": "BSD-3-Clause",
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/d3-fetch": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/d3-fetch/-/d3-fetch-3.0.1.tgz",
+      "integrity": "sha512-kpkQIM20n3oLVBKGg6oHrUchHM3xODkTzjMoj7aWQFq5QEM+R6E4WkzT5+tojDY7yjez8KgCBRoj4aEr99Fdqw==",
+      "license": "ISC",
+      "dependencies": {
+        "d3-dsv": "1 - 3"
+      },
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/d3-force": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/d3-force/-/d3-force-3.0.0.tgz",
+      "integrity": "sha512-zxV/SsA+U4yte8051P4ECydjD/S+qeYtnaIyAs9tgHCqfguma/aAQDjo85A9Z6EKhBirHRJHXIgJUlffT4wdLg==",
+      "license": "ISC",
+      "dependencies": {
+        "d3-dispatch": "1 - 3",
+        "d3-quadtree": "1 - 3",
+        "d3-timer": "1 - 3"
+      },
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/d3-format": {
+      "version": "3.1.2",
+      "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-3.1.2.tgz",
+      "integrity": "sha512-AJDdYOdnyRDV5b6ArilzCPPwc1ejkHcoyFarqlPqT7zRYjhavcT3uSrqcMvsgh2CgoPbK3RCwyHaVyxYcP2Arg==",
+      "license": "ISC",
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/d3-geo": {
+      "version": "3.1.1",
+      "resolved": "https://registry.npmjs.org/d3-geo/-/d3-geo-3.1.1.tgz",
+      "integrity": "sha512-637ln3gXKXOwhalDzinUgY83KzNWZRKbYubaG+fGVuc/dxO64RRljtCTnf5ecMyE1RIdtqpkVcq0IbtU2S8j2Q==",
+      "license": "ISC",
+      "dependencies": {
+        "d3-array": "2.5.0 - 3"
+      },
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/d3-hierarchy": {
+      "version": "3.1.2",
+      "resolved": "https://registry.npmjs.org/d3-hierarchy/-/d3-hierarchy-3.1.2.tgz",
+      "integrity": "sha512-FX/9frcub54beBdugHjDCdikxThEqjnR93Qt7PvQTOHxyiNCAlvMrHhclk3cD5VeAaq9fxmfRp+CnWw9rEMBuA==",
+      "license": "ISC",
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/d3-interpolate": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-3.0.1.tgz",
+      "integrity": "sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==",
+      "license": "ISC",
+      "dependencies": {
+        "d3-color": "1 - 3"
+      },
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/d3-path": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-3.1.0.tgz",
+      "integrity": "sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==",
+      "license": "ISC",
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/d3-polygon": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/d3-polygon/-/d3-polygon-3.0.1.tgz",
+      "integrity": "sha512-3vbA7vXYwfe1SYhED++fPUQlWSYTTGmFmQiany/gdbiWgU/iEyQzyymwL9SkJjFFuCS4902BSzewVGsHHmHtXg==",
+      "license": "ISC",
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/d3-quadtree": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/d3-quadtree/-/d3-quadtree-3.0.1.tgz",
+      "integrity": "sha512-04xDrxQTDTCFwP5H6hRhsRcb9xxv2RzkcsygFzmkSIOJy3PeRJP7sNk3VRIbKXcog561P9oU0/rVH6vDROAgUw==",
+      "license": "ISC",
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/d3-random": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/d3-random/-/d3-random-3.0.1.tgz",
+      "integrity": "sha512-FXMe9GfxTxqd5D6jFsQ+DJ8BJS4E/fT5mqqdjovykEB2oFbTMDVdg1MGFxfQW+FBOGoB++k8swBrgwSHT1cUXQ==",
+      "license": "ISC",
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/d3-sankey": {
+      "version": "0.12.3",
+      "resolved": "https://registry.npmjs.org/d3-sankey/-/d3-sankey-0.12.3.tgz",
+      "integrity": "sha512-nQhsBRmM19Ax5xEIPLMY9ZmJ/cDvd1BG3UVvt5h3WRxKg5zGRbvnteTyWAbzeSvlh3tW7ZEmq4VwR5mB3tutmQ==",
+      "license": "BSD-3-Clause",
+      "dependencies": {
+        "d3-array": "1 - 2",
+        "d3-shape": "^1.2.0"
+      }
+    },
+    "node_modules/d3-sankey/node_modules/d3-array": {
+      "version": "2.12.1",
+      "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-2.12.1.tgz",
+      "integrity": "sha512-B0ErZK/66mHtEsR1TkPEEkwdy+WDesimkM5gpZr5Dsg54BiTA5RXtYW5qTLIAcekaS9xfZrzBLF/OAkB3Qn1YQ==",
+      "license": "BSD-3-Clause",
+      "dependencies": {
+        "internmap": "^1.0.0"
+      }
+    },
+    "node_modules/d3-sankey/node_modules/d3-path": {
+      "version": "1.0.9",
+      "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-1.0.9.tgz",
+      "integrity": "sha512-VLaYcn81dtHVTjEHd8B+pbe9yHWpXKZUC87PzoFmsFrJqgFwDe/qxfp5MlfsfM1V5E/iVt0MmEbWQ7FVIXh/bg==",
+      "license": "BSD-3-Clause"
+    },
+    "node_modules/d3-sankey/node_modules/d3-shape": {
+      "version": "1.3.7",
+      "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-1.3.7.tgz",
+      "integrity": "sha512-EUkvKjqPFUAZyOlhY5gzCxCeI0Aep04LwIRpsZ/mLFelJiUfnK56jo5JMDSE7yyP2kLSb6LtF+S5chMk7uqPqw==",
+      "license": "BSD-3-Clause",
+      "dependencies": {
+        "d3-path": "1"
+      }
+    },
+    "node_modules/d3-sankey/node_modules/internmap": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/internmap/-/internmap-1.0.1.tgz",
+      "integrity": "sha512-lDB5YccMydFBtasVtxnZ3MRBHuaoE8GKsppq+EchKL2U4nK/DmEpPHNH8MZe5HkMtpSiTSOZwfN0tzYjO/lJEw==",
+      "license": "ISC"
+    },
+    "node_modules/d3-scale": {
+      "version": "4.0.2",
+      "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-4.0.2.tgz",
+      "integrity": "sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==",
+      "license": "ISC",
+      "dependencies": {
+        "d3-array": "2.10.0 - 3",
+        "d3-format": "1 - 3",
+        "d3-interpolate": "1.2.0 - 3",
+        "d3-time": "2.1.1 - 3",
+        "d3-time-format": "2 - 4"
       },
       "engines": {
-        "node": ">=4"
+        "node": ">=12"
       }
     },
-    "node_modules/cssnano": {
-      "version": "6.1.2",
-      "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-6.1.2.tgz",
-      "integrity": "sha512-rYk5UeX7VAM/u0lNqewCdasdtPK81CgX8wJFLEIXHbV2oldWRgJAsZrdhRXkV1NJzA2g850KiFm9mMU2HxNxMA==",
-      "license": "MIT",
+    "node_modules/d3-scale-chromatic": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/d3-scale-chromatic/-/d3-scale-chromatic-3.1.0.tgz",
+      "integrity": "sha512-A3s5PWiZ9YCXFye1o246KoscMWqf8BsD9eRiJ3He7C9OBaxKhAd5TFCdEx/7VbKtxxTsu//1mMJFrEt572cEyQ==",
+      "license": "ISC",
       "dependencies": {
-        "cssnano-preset-default": "^6.1.2",
-        "lilconfig": "^3.1.1"
+        "d3-color": "1 - 3",
+        "d3-interpolate": "1 - 3"
       },
       "engines": {
-        "node": "^14 || ^16 || >=18.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/cssnano"
-      },
-      "peerDependencies": {
-        "postcss": "^8.4.31"
+        "node": ">=12"
       }
     },
-    "node_modules/cssnano-preset-advanced": {
-      "version": "6.1.2",
-      "resolved": "https://registry.npmjs.org/cssnano-preset-advanced/-/cssnano-preset-advanced-6.1.2.tgz",
-      "integrity": "sha512-Nhao7eD8ph2DoHolEzQs5CfRpiEP0xa1HBdnFZ82kvqdmbwVBUr2r1QuQ4t1pi+D1ZpqpcO4T+wy/7RxzJ/WPQ==",
-      "license": "MIT",
+    "node_modules/d3-selection": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-3.0.0.tgz",
+      "integrity": "sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==",
+      "license": "ISC",
+      "peer": true,
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/d3-shape": {
+      "version": "3.2.0",
+      "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-3.2.0.tgz",
+      "integrity": "sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==",
+      "license": "ISC",
       "dependencies": {
-        "autoprefixer": "^10.4.19",
-        "browserslist": "^4.23.0",
-        "cssnano-preset-default": "^6.1.2",
-        "postcss-discard-unused": "^6.0.5",
-        "postcss-merge-idents": "^6.0.3",
-        "postcss-reduce-idents": "^6.0.3",
-        "postcss-zindex": "^6.0.2"
+        "d3-path": "^3.1.0"
       },
       "engines": {
-        "node": "^14 || ^16 || >=18.0"
-      },
-      "peerDependencies": {
-        "postcss": "^8.4.31"
+        "node": ">=12"
       }
     },
-    "node_modules/cssnano-preset-default": {
-      "version": "6.1.2",
-      "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-6.1.2.tgz",
-      "integrity": "sha512-1C0C+eNaeN8OcHQa193aRgYexyJtU8XwbdieEjClw+J9d94E41LwT6ivKH0WT+fYwYWB0Zp3I3IZ7tI/BbUbrg==",
-      "license": "MIT",
+    "node_modules/d3-time": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-3.1.0.tgz",
+      "integrity": "sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==",
+      "license": "ISC",
       "dependencies": {
-        "browserslist": "^4.23.0",
-        "css-declaration-sorter": "^7.2.0",
-        "cssnano-utils": "^4.0.2",
-        "postcss-calc": "^9.0.1",
-        "postcss-colormin": "^6.1.0",
-        "postcss-convert-values": "^6.1.0",
-        "postcss-discard-comments": "^6.0.2",
-        "postcss-discard-duplicates": "^6.0.3",
-        "postcss-discard-empty": "^6.0.3",
-        "postcss-discard-overridden": "^6.0.2",
-        "postcss-merge-longhand": "^6.0.5",
-        "postcss-merge-rules": "^6.1.1",
-        "postcss-minify-font-values": "^6.1.0",
-        "postcss-minify-gradients": "^6.0.3",
-        "postcss-minify-params": "^6.1.0",
-        "postcss-minify-selectors": "^6.0.4",
-        "postcss-normalize-charset": "^6.0.2",
-        "postcss-normalize-display-values": "^6.0.2",
-        "postcss-normalize-positions": "^6.0.2",
-        "postcss-normalize-repeat-style": "^6.0.2",
-        "postcss-normalize-string": "^6.0.2",
-        "postcss-normalize-timing-functions": "^6.0.2",
-        "postcss-normalize-unicode": "^6.1.0",
-        "postcss-normalize-url": "^6.0.2",
-        "postcss-normalize-whitespace": "^6.0.2",
-        "postcss-ordered-values": "^6.0.2",
-        "postcss-reduce-initial": "^6.1.0",
-        "postcss-reduce-transforms": "^6.0.2",
-        "postcss-svgo": "^6.0.3",
-        "postcss-unique-selectors": "^6.0.4"
+        "d3-array": "2 - 3"
       },
       "engines": {
-        "node": "^14 || ^16 || >=18.0"
+        "node": ">=12"
+      }
+    },
+    "node_modules/d3-time-format": {
+      "version": "4.1.0",
+      "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-4.1.0.tgz",
+      "integrity": "sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==",
+      "license": "ISC",
+      "dependencies": {
+        "d3-time": "1 - 3"
       },
-      "peerDependencies": {
-        "postcss": "^8.4.31"
+      "engines": {
+        "node": ">=12"
       }
     },
-    "node_modules/cssnano-utils": {
-      "version": "4.0.2",
-      "resolved": "https://registry.npmjs.org/cssnano-utils/-/cssnano-utils-4.0.2.tgz",
-      "integrity": "sha512-ZR1jHg+wZ8o4c3zqf1SIUSTIvm/9mU343FMR6Obe/unskbvpGhZOo1J6d/r8D1pzkRQYuwbcH3hToOuoA2G7oQ==",
-      "license": "MIT",
+    "node_modules/d3-timer": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-3.0.1.tgz",
+      "integrity": "sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==",
+      "license": "ISC",
       "engines": {
-        "node": "^14 || ^16 || >=18.0"
-      },
-      "peerDependencies": {
-        "postcss": "^8.4.31"
+        "node": ">=12"
       }
     },
-    "node_modules/csso": {
-      "version": "5.0.5",
-      "resolved": "https://registry.npmjs.org/csso/-/csso-5.0.5.tgz",
-      "integrity": "sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ==",
-      "license": "MIT",
+    "node_modules/d3-transition": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/d3-transition/-/d3-transition-3.0.1.tgz",
+      "integrity": "sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w==",
+      "license": "ISC",
       "dependencies": {
-        "css-tree": "~2.2.0"
+        "d3-color": "1 - 3",
+        "d3-dispatch": "1 - 3",
+        "d3-ease": "1 - 3",
+        "d3-interpolate": "1 - 3",
+        "d3-timer": "1 - 3"
       },
       "engines": {
-        "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0",
-        "npm": ">=7.0.0"
+        "node": ">=12"
+      },
+      "peerDependencies": {
+        "d3-selection": "2 - 3"
       }
     },
-    "node_modules/csso/node_modules/css-tree": {
-      "version": "2.2.1",
-      "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.2.1.tgz",
-      "integrity": "sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA==",
-      "license": "MIT",
+    "node_modules/d3-zoom": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/d3-zoom/-/d3-zoom-3.0.0.tgz",
+      "integrity": "sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw==",
+      "license": "ISC",
       "dependencies": {
-        "mdn-data": "2.0.28",
-        "source-map-js": "^1.0.1"
+        "d3-dispatch": "1 - 3",
+        "d3-drag": "2 - 3",
+        "d3-interpolate": "1 - 3",
+        "d3-selection": "2 - 3",
+        "d3-transition": "2 - 3"
       },
       "engines": {
-        "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0",
-        "npm": ">=7.0.0"
+        "node": ">=12"
       }
     },
-    "node_modules/csso/node_modules/mdn-data": {
-      "version": "2.0.28",
-      "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.28.tgz",
-      "integrity": "sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g==",
-      "license": "CC0-1.0"
+    "node_modules/dagre-d3-es": {
+      "version": "7.0.14",
+      "resolved": "https://registry.npmjs.org/dagre-d3-es/-/dagre-d3-es-7.0.14.tgz",
+      "integrity": "sha512-P4rFMVq9ESWqmOgK+dlXvOtLwYg0i7u0HBGJER0LZDJT2VHIPAMZ/riPxqJceWMStH5+E61QxFra9kIS3AqdMg==",
+      "license": "MIT",
+      "dependencies": {
+        "d3": "^7.9.0",
+        "lodash-es": "^4.17.21"
+      }
     },
-    "node_modules/csstype": {
-      "version": "3.2.3",
-      "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz",
-      "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==",
+    "node_modules/dayjs": {
+      "version": "1.11.21",
+      "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.21.tgz",
+      "integrity": "sha512-98IT+HOahAisibz/yjKbzuOBwYcjJ7BCLPzARyHiyEBmRz4fatF+KPJszEHXsGYjUG234aH/cOjW1wwTbKUZlA==",
       "license": "MIT"
     },
     "node_modules/debounce": {
@@ -8256,6 +9164,15 @@
         "url": "https://github.com/sponsors/ljharb"
       }
     },
+    "node_modules/delaunator": {
+      "version": "5.1.0",
+      "resolved": "https://registry.npmjs.org/delaunator/-/delaunator-5.1.0.tgz",
+      "integrity": "sha512-AGrQ4QSgssa1NGmWmLPqN5NY2KajF5MqxetNEO+o0n3ZwZZeTmt7bBnvzHWrmkZFxGgr4HdyFgelzgi06otLuQ==",
+      "license": "ISC",
+      "dependencies": {
+        "robust-predicates": "^3.0.2"
+      }
+    },
     "node_modules/depd": {
       "version": "2.0.0",
       "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz",
@@ -8394,6 +9311,15 @@
         "url": "https://github.com/fb55/domhandler?sponsor=1"
       }
     },
+    "node_modules/dompurify": {
+      "version": "3.4.8",
+      "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.4.8.tgz",
+      "integrity": "sha512-yb1cEmaOum7wFvOCSQxyfgVlv5D47Rc30iZWoMpbDIWTnJ6grDDQyu2KFJzB2k7u0pMuJcQ1zphH//fFnw2tjQ==",
+      "license": "(MPL-2.0 OR Apache-2.0)",
+      "optionalDependencies": {
+        "@types/trusted-types": "^2.0.7"
+      }
+    },
     "node_modules/domutils": {
       "version": "3.2.2",
       "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.2.2.tgz",
@@ -8480,6 +9406,12 @@
       "integrity": "sha512-4Mk/mrynCNQ+atY40D3UpmhLWB6AHMbYMlIrPhHcMF6x0L7O0b052FCAsxw1LlaR++UFuNg3D/A6XCuGDa0guQ==",
       "license": "ISC"
     },
+    "node_modules/elkjs": {
+      "version": "0.9.3",
+      "resolved": "https://registry.npmjs.org/elkjs/-/elkjs-0.9.3.tgz",
+      "integrity": "sha512-f/ZeWvW/BCXbhGEf1Ujp29EASo/lk1FDnETgNKwJrsVvGZhUWCZyg3xLJjAsxfOmt8KjswHmI5EwCQcPMpOYhQ==",
+      "license": "EPL-2.0"
+    },
     "node_modules/emoji-regex": {
       "version": "9.2.2",
       "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz",
@@ -8615,6 +9547,16 @@
         "node": ">= 0.4"
       }
     },
+    "node_modules/es-toolkit": {
+      "version": "1.47.0",
+      "resolved": "https://registry.npmjs.org/es-toolkit/-/es-toolkit-1.47.0.tgz",
+      "integrity": "sha512-n1GuoD0WEQZMBk5tttoZSqwgyLx01oqa5XsBmCHwPyNe1S9jPBEmtR2pSgp2kJuWE3ciFZ6yRHmY4pM4C3OOkw==",
+      "license": "MIT",
+      "workspaces": [
+        "docs",
+        "benchmarks"
+      ]
+    },
     "node_modules/esast-util-from-estree": {
       "version": "2.0.0",
       "resolved": "https://registry.npmjs.org/esast-util-from-estree/-/esast-util-from-estree-2.0.0.tgz",
@@ -9628,6 +10570,12 @@
         "url": "https://github.com/sponsors/sindresorhus"
       }
     },
+    "node_modules/hachure-fill": {
+      "version": "0.5.2",
+      "resolved": "https://registry.npmjs.org/hachure-fill/-/hachure-fill-0.5.2.tgz",
+      "integrity": "sha512-3GKBOn+m2LX9iq+JC1064cSFprJY4jL1jCXTcpnfER5HYE2l/4EfWSGzkPa/ZDBmYI0ZOEj5VHV/eKnPGkHuOg==",
+      "license": "MIT"
+    },
     "node_modules/handle-thing": {
       "version": "2.0.1",
       "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz",
@@ -10267,6 +11215,16 @@
         "node": ">=8"
       }
     },
+    "node_modules/import-meta-resolve": {
+      "version": "4.2.0",
+      "resolved": "https://registry.npmjs.org/import-meta-resolve/-/import-meta-resolve-4.2.0.tgz",
+      "integrity": "sha512-Iqv2fzaTQN28s/FwZAoFq0ZSs/7hMAHJVX+w8PZl3cY19Pxk6jFFalxQoIfW2826i/fDLXv8IiEZRIT0lDuWcg==",
+      "license": "MIT",
+      "funding": {
+        "type": "github",
+        "url": "https://github.com/sponsors/wooorm"
+      }
+    },
     "node_modules/imurmurhash": {
       "version": "0.1.4",
       "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
@@ -10315,6 +11273,15 @@
       "integrity": "sha512-Nb2ctOyNR8DqQoR0OwRG95uNWIC0C1lCgf5Naz5H6Ji72KZ8OcFZLz2P5sNgwlyoJ8Yif11oMuYs5pBQa86csA==",
       "license": "MIT"
     },
+    "node_modules/internmap": {
+      "version": "2.0.3",
+      "resolved": "https://registry.npmjs.org/internmap/-/internmap-2.0.3.tgz",
+      "integrity": "sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==",
+      "license": "ISC",
+      "engines": {
+        "node": ">=12"
+      }
+    },
     "node_modules/invariant": {
       "version": "2.2.4",
       "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz",
@@ -10820,6 +11787,31 @@
         "graceful-fs": "^4.1.6"
       }
     },
+    "node_modules/katex": {
+      "version": "0.16.47",
+      "resolved": "https://registry.npmjs.org/katex/-/katex-0.16.47.tgz",
+      "integrity": "sha512-Eeo8Ys1doU1z+x8AZsPpQu+p/QcZBI5PeOo7QGQdy2x2m0MU/hYagBbGOmXwr5KVbEfVuWv9LpnQWeehogurjg==",
+      "funding": [
+        "https://opencollective.com/katex",
+        "https://github.com/sponsors/katex"
+      ],
+      "license": "MIT",
+      "dependencies": {
+        "commander": "^8.3.0"
+      },
+      "bin": {
+        "katex": "cli.js"
+      }
+    },
+    "node_modules/katex/node_modules/commander": {
+      "version": "8.3.0",
+      "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz",
+      "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==",
+      "license": "MIT",
+      "engines": {
+        "node": ">= 12"
+      }
+    },
     "node_modules/keyv": {
       "version": "4.5.4",
       "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz",
@@ -10829,6 +11821,11 @@
         "json-buffer": "3.0.1"
       }
     },
+    "node_modules/khroma": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/khroma/-/khroma-2.1.0.tgz",
+      "integrity": "sha512-Ls993zuzfayK269Svk9hzpeGUKob/sIgZzyHYdjQoAdQetRKpOLj+k/QQQ/6Qi0Yz65mlROrfd+Ev+1+7dz9Kw=="
+    },
     "node_modules/kind-of": {
       "version": "6.0.3",
       "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz",
@@ -10881,6 +11878,12 @@
         "shell-quote": "^1.8.4"
       }
     },
+    "node_modules/layout-base": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/layout-base/-/layout-base-1.0.2.tgz",
+      "integrity": "sha512-8h2oVEZNktL4BH2JCOI90iD1yXwL6iNW7KcCKT2QZgQJR2vbqDsldCTPRU9NifTCqHZci57XvQQ15YTu+sTYPg==",
+      "license": "MIT"
+    },
     "node_modules/leven": {
       "version": "3.1.0",
       "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz",
@@ -10956,6 +11959,12 @@
       "integrity": "sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q==",
       "license": "MIT"
     },
+    "node_modules/lodash-es": {
+      "version": "4.18.1",
+      "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.18.1.tgz",
+      "integrity": "sha512-J8xewKD/Gk22OZbhpOVSwcs60zhd95ESDwezOFuA3/099925PdHJ7OFHNTGtajL3AlZkykD32HykiMo+BIBI8A==",
+      "license": "MIT"
+    },
     "node_modules/lodash.debounce": {
       "version": "4.0.8",
       "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz",
@@ -11066,6 +12075,18 @@
         "url": "https://github.com/sponsors/wooorm"
       }
     },
+    "node_modules/marked": {
+      "version": "16.4.2",
+      "resolved": "https://registry.npmjs.org/marked/-/marked-16.4.2.tgz",
+      "integrity": "sha512-TI3V8YYWvkVf3KJe1dRkpnjs68JUPyEa5vjKrp1XEEJUAOaQc+Qj+L1qWbPd0SJuAdQkFU0h73sXXqwDYxsiDA==",
+      "license": "MIT",
+      "bin": {
+        "marked": "bin/marked.js"
+      },
+      "engines": {
+        "node": ">= 20"
+      }
+    },
     "node_modules/math-intrinsics": {
       "version": "1.1.0",
       "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz",
@@ -11545,6 +12566,48 @@
         "node": ">= 8"
       }
     },
+    "node_modules/mermaid": {
+      "version": "11.15.0",
+      "resolved": "https://registry.npmjs.org/mermaid/-/mermaid-11.15.0.tgz",
+      "integrity": "sha512-pTMbcf3rWdtLiYGpmoTjHEpeY8seiy6sR+9nD7LOs8KfUbHE4lOUAprTRqRAcWSQ6MQpdX+YEsxShtGsINtPtw==",
+      "license": "MIT",
+      "dependencies": {
+        "@braintree/sanitize-url": "^7.1.1",
+        "@iconify/utils": "^3.0.2",
+        "@mermaid-js/parser": "^1.1.1",
+        "@types/d3": "^7.4.3",
+        "@upsetjs/venn.js": "^2.0.0",
+        "cytoscape": "^3.33.1",
+        "cytoscape-cose-bilkent": "^4.1.0",
+        "cytoscape-fcose": "^2.2.0",
+        "d3": "^7.9.0",
+        "d3-sankey": "^0.12.3",
+        "dagre-d3-es": "7.0.14",
+        "dayjs": "^1.11.19",
+        "dompurify": "^3.3.1",
+        "es-toolkit": "^1.45.1",
+        "katex": "^0.16.25",
+        "khroma": "^2.1.0",
+        "marked": "^16.3.0",
+        "roughjs": "^4.6.6",
+        "stylis": "^4.3.6",
+        "ts-dedent": "^2.2.0",
+        "uuid": "^11.1.0 || ^12 || ^13 || ^14.0.0"
+      }
+    },
+    "node_modules/mermaid/node_modules/uuid": {
+      "version": "14.0.0",
+      "resolved": "https://registry.npmjs.org/uuid/-/uuid-14.0.0.tgz",
+      "integrity": "sha512-Qo+uWgilfSmAhXCMav1uYFynlQO7fMFiMVZsQqZRMIXp0O7rR7qjkj+cPvBHLgBqi960QCoo/PH2/6ZtVqKvrg==",
+      "funding": [
+        "https://github.com/sponsors/broofa",
+        "https://github.com/sponsors/ctavan"
+      ],
+      "license": "MIT",
+      "bin": {
+        "uuid": "dist-node/bin/uuid"
+      }
+    },
     "node_modules/methods": {
       "version": "1.1.2",
       "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz",
@@ -13912,6 +14975,12 @@
         "url": "https://github.com/sponsors/sindresorhus"
       }
     },
+    "node_modules/package-manager-detector": {
+      "version": "1.6.0",
+      "resolved": "https://registry.npmjs.org/package-manager-detector/-/package-manager-detector-1.6.0.tgz",
+      "integrity": "sha512-61A5ThoTiDG/C8s8UMZwSorAGwMJ0ERVGj2OjoW5pAalsNOg15+iQiPzrLJ4jhZ1HJzmC2PIHT2oEiH3R5fzNA==",
+      "license": "MIT"
+    },
     "node_modules/param-case": {
       "version": "3.0.4",
       "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz",
@@ -14051,6 +15120,12 @@
         "tslib": "^2.0.3"
       }
     },
+    "node_modules/path-data-parser": {
+      "version": "0.1.0",
+      "resolved": "https://registry.npmjs.org/path-data-parser/-/path-data-parser-0.1.0.tgz",
+      "integrity": "sha512-NOnmBpt5Y2RWbuv0LMzsayp3lVylAHLPUTut412ZA3l+C4uw4ZVkQbjShYCQ8TCpUMdPapr4YjUqLYD6v68j+w==",
+      "license": "MIT"
+    },
     "node_modules/path-exists": {
       "version": "5.0.0",
       "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-5.0.0.tgz",
@@ -14149,6 +15224,22 @@
         "node": ">=16.0.0"
       }
     },
+    "node_modules/points-on-curve": {
+      "version": "0.2.0",
+      "resolved": "https://registry.npmjs.org/points-on-curve/-/points-on-curve-0.2.0.tgz",
+      "integrity": "sha512-0mYKnYYe9ZcqMCWhUjItv/oHjvgEsfKvnUTg8sAtnHr3GVy7rGkXCb6d5cSyqrWqL4k81b9CPg3urd+T7aop3A==",
+      "license": "MIT"
+    },
+    "node_modules/points-on-path": {
+      "version": "0.2.1",
+      "resolved": "https://registry.npmjs.org/points-on-path/-/points-on-path-0.2.1.tgz",
+      "integrity": "sha512-25ClnWWuw7JbWZcgqY/gJ4FQWadKxGWk+3kR/7kD0tCaDtPPMj7oHu2ToLaVhfpnHrZzYby2w6tUA0eOIuUg8g==",
+      "license": "MIT",
+      "dependencies": {
+        "path-data-parser": "0.1.0",
+        "points-on-curve": "0.2.0"
+      }
+    },
     "node_modules/postcss": {
       "version": "8.5.15",
       "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.15.tgz",
@@ -16576,6 +17667,24 @@
         "node": ">=0.10.0"
       }
     },
+    "node_modules/robust-predicates": {
+      "version": "3.0.3",
+      "resolved": "https://registry.npmjs.org/robust-predicates/-/robust-predicates-3.0.3.tgz",
+      "integrity": "sha512-NS3levdsRIUOmiJ8FZWCP7LG3QpJyrs/TE0Zpf1yvZu8cAJJ6QMW92H1c7kWpdIHo8RvmLxN/o2JXTKHp74lUA==",
+      "license": "Unlicense"
+    },
+    "node_modules/roughjs": {
+      "version": "4.6.6",
+      "resolved": "https://registry.npmjs.org/roughjs/-/roughjs-4.6.6.tgz",
+      "integrity": "sha512-ZUz/69+SYpFN/g/lUlo2FXcIjRkSu3nDarreVdGGndHEBJ6cXPdKguS8JGxwj5HA5xIbVKSmLgr5b3AWxtRfvQ==",
+      "license": "MIT",
+      "dependencies": {
+        "hachure-fill": "^0.5.2",
+        "path-data-parser": "^0.1.0",
+        "points-on-curve": "^0.2.0",
+        "points-on-path": "^0.2.1"
+      }
+    },
     "node_modules/rtlcss": {
       "version": "4.3.0",
       "resolved": "https://registry.npmjs.org/rtlcss/-/rtlcss-4.3.0.tgz",
@@ -16629,6 +17738,12 @@
         "queue-microtask": "^1.2.2"
       }
     },
+    "node_modules/rw": {
+      "version": "1.3.3",
+      "resolved": "https://registry.npmjs.org/rw/-/rw-1.3.3.tgz",
+      "integrity": "sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ==",
+      "license": "BSD-3-Clause"
+    },
     "node_modules/safe-buffer": {
       "version": "5.2.1",
       "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
@@ -17461,6 +18576,12 @@
         "postcss": "^8.4.31"
       }
     },
+    "node_modules/stylis": {
+      "version": "4.4.0",
+      "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.4.0.tgz",
+      "integrity": "sha512-5Z9ZpRzfuH6l/UAvCPAPUo3665Nk2wLaZU3x+TLHKVzIz33+sbJqbtrYoC3KD4/uVOr2Zp+L0LySezP9OHV9yA==",
+      "license": "MIT"
+    },
     "node_modules/supports-color": {
       "version": "7.2.0",
       "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
@@ -17685,6 +18806,15 @@
       "integrity": "sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==",
       "license": "MIT"
     },
+    "node_modules/tinyexec": {
+      "version": "1.2.4",
+      "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.2.4.tgz",
+      "integrity": "sha512-SHf/r48b7vOrjve9PxJo3MN5v5yuyjHvdUcrQffT3WXMUfnGmHDVbC4k3sHJaJTgZCwpUplIaAo5ANtMyp3YHg==",
+      "license": "MIT",
+      "engines": {
+        "node": ">=18"
+      }
+    },
     "node_modules/tinypool": {
       "version": "1.1.1",
       "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-1.1.1.tgz",
@@ -17760,6 +18890,15 @@
         "url": "https://github.com/sponsors/wooorm"
       }
     },
+    "node_modules/ts-dedent": {
+      "version": "2.2.0",
+      "resolved": "https://registry.npmjs.org/ts-dedent/-/ts-dedent-2.2.0.tgz",
+      "integrity": "sha512-q5W7tVM71e2xjHZTlgfTDoPF/SmqKG5hddq9SzR49CH2hayqRKJtQ4mtRlSxKaJlR/+9rEM+mnBHf7I2/BQcpQ==",
+      "license": "MIT",
+      "engines": {
+        "node": ">=6.10"
+      }
+    },
     "node_modules/tslib": {
       "version": "2.8.1",
       "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz",
diff --git a/website/package.json b/website/package.json
index 6959b1f8..721d345b 100644
--- a/website/package.json
+++ b/website/package.json
@@ -11,8 +11,10 @@
   "dependencies": {
     "@docusaurus/core": "^3.9.2",
     "@docusaurus/preset-classic": "^3.9.2",
+    "@docusaurus/theme-mermaid": "^3.10.1",
     "@easyops-cn/docusaurus-search-local": "^0.55.2",
     "@mdx-js/react": "^3.1.0",
+    "@mermaid-js/layout-elk": "^0.1.9",
     "clsx": "^2.1.1",
     "prism-react-renderer": "^2.4.1",
     "react": "^19.1.0",
diff --git a/website/src/pages/index.module.css b/website/src/pages/index.module.css
index ea93c567..08b5710c 100644
--- a/website/src/pages/index.module.css
+++ b/website/src/pages/index.module.css
@@ -1,3 +1,4 @@
+/* 
+ {/* ── INTERACTIVE MOBILE MODEL ── */} + + {/* ── ARCHITECTURE ── */}
diff --git a/website/src/pages/index.module.css b/website/src/pages/index.module.css index 08b5710c..0d669274 100644 --- a/website/src/pages/index.module.css +++ b/website/src/pages/index.module.css @@ -580,3 +580,908 @@ border-right: none; } } + +/* ── Interactive Device Workbench ── */ +.workbenchSection { + background: #0b110e; + border-top: 1px solid rgba(224, 122, 36, 0.15); + border-bottom: 1px solid rgba(224, 122, 36, 0.15); + padding: 6rem 0; + position: relative; + overflow: hidden; +} + +.workbenchSection::before { + content: ""; + position: absolute; + inset: 0; + background-image: + linear-gradient(rgba(224, 122, 36, 0.02) 1px, transparent 1px), + linear-gradient(90deg, rgba(224, 122, 36, 0.02) 1px, transparent 1px); + background-size: 24px 24px; + pointer-events: none; +} + +.workbenchGrid { + display: grid; + grid-template-columns: 1fr; + gap: 3rem; + align-items: center; +} + +@media (min-width: 1200px) { + .workbenchGrid { + grid-template-columns: 360px 1fr; + } +} + +.workbenchPanel { + z-index: 2; +} + +.panelTitle { + font-family: "Space Grotesk", sans-serif; + font-size: 2.2rem; + font-weight: 700; + line-height: 1.1; + color: #f0ebe0; + margin-bottom: 1rem; + letter-spacing: -0.02em; +} + +.panelDesc { + color: #9aa89c; + font-size: 0.95rem; + line-height: 1.6; + margin-bottom: 2rem; +} + +.controlGroup { + display: flex; + flex-direction: column; + gap: 1.25rem; + background: #111a14; + border: 1px solid rgba(224, 122, 36, 0.15); + padding: 1.5rem; + border-radius: 2px; +} + +.controlLabel { + font-size: 0.65rem; + font-weight: 700; + letter-spacing: 0.12em; + text-transform: uppercase; + color: #8f9e91; + margin-bottom: 0.5rem; + display: block; +} + +.toggleRow { + display: flex; + gap: 0.5rem; + margin-bottom: 1rem; +} + +.toggleRow:last-child { + margin-bottom: 0; +} + +.toggleBtn { + flex: 1; + background: rgba(224, 122, 36, 0.05); + border: 1px solid rgba(224, 122, 36, 0.2); + color: #c8bfa8; + padding: 0.6rem 0.75rem; + font-size: 0.8rem; + font-weight: 600; + cursor: pointer; + border-radius: 2px; + transition: all 0.2s cubic-bezier(0.16, 1, 0.3, 1); + font-family: inherit; + display: inline-flex; + align-items: center; + justify-content: center; + gap: 0.4rem; +} + +.toggleBtn:hover { + background: rgba(224, 122, 36, 0.1); + color: #f0ebe0; + border-color: rgba(224, 122, 36, 0.4); +} + +.toggleBtnActive { + background: #e07a24; + color: #0f1a14 !important; + border-color: #e07a24; + box-shadow: 0 4px 12px rgba(224, 122, 36, 0.2); +} + +.gestureHint { + margin-top: 1.5rem; + font-size: 0.8rem; + color: #8a9b8c; + display: flex; + align-items: flex-start; + gap: 0.5rem; + background: rgba(224, 122, 36, 0.05); + border-left: 2px solid #e07a24; + padding: 0.75rem; +} + +/* ── Device Simulator Canvas ── */ +.deviceCanvas { + display: flex; + justify-content: center; + align-items: center; + position: relative; + min-height: 680px; + z-index: 1; + width: 100%; +} + +.deviceTurntable { + position: relative; + transition: all 0.6s cubic-bezier(0.16, 1, 0.3, 1); + display: flex; + justify-content: center; + align-items: center; + max-width: 100%; +} + +/* Phone Bezel Frame */ +.deviceFrame { + background: #1e1e1e; + border: 14px solid #282828; + border-radius: 36px; + box-shadow: + 0 30px 60px -15px rgba(0, 0, 0, 0.7), + 0 0 0 1px rgba(255, 255, 255, 0.08), + inset 0 0 8px rgba(0, 0, 0, 0.8); + position: relative; + overflow: hidden; + transition: width 0.4s cubic-bezier(0.16, 1, 0.3, 1), height 0.4s cubic-bezier(0.16, 1, 0.3, 1); + will-change: width, height; + display: flex; + flex-direction: column; +} + +.portrait { + width: 360px; + height: 720px; +} + +.landscape { + width: 900px; + height: 520px; +} + +/* Earpiece notch area for portrait */ +.deviceFrame::before { + content: ""; + position: absolute; + top: 0; + left: 50%; + transform: translateX(-50%); + width: 130px; + height: 20px; + background: #282828; + border-bottom-left-radius: 12px; + border-bottom-right-radius: 12px; + z-index: 120; + transition: opacity 0.3s ease; +} + +.landscape .deviceFrame::before { + opacity: 0; + pointer-events: none; +} + +/* Screen container */ +.deviceScreen { + width: 100%; + height: 100%; + position: relative; + overflow: hidden; + display: flex; + flex-direction: column; + user-select: none; + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif; + background: #ffffff; +} + +/* Status Bar */ +.statusBarActual { + height: 24px; + padding: 0 12px; + display: flex; + justify-content: space-between; + align-items: center; + font-size: 0.65rem; + font-weight: 600; + z-index: 80; + border-bottom: 1px solid rgba(0, 0, 0, 0.05); + background: #f4f2ea; + color: #5d6d60; + flex-shrink: 0; +} + +/* App Header Actual */ +.appHeaderActual { + height: 48px; + background: #e05a2b; + color: #ffffff; + display: flex; + align-items: center; + justify-content: space-between; + padding: 0 12px; + z-index: 10; + flex-shrink: 0; + box-shadow: 0 2px 4px rgba(0,0,0,0.1); +} + +.headerTitle { + font-size: 0.95rem; + font-weight: 600; + margin: 0; + color: #ffffff; +} + +.headerIcons { + display: flex; + align-items: center; + gap: 12px; +} + +.headerIconBtn { + background: transparent; + border: none; + color: #ffffff; + cursor: pointer; + padding: 4px; + font-size: 1rem; + display: flex; + align-items: center; + justify-content: center; + transition: opacity 0.2s; +} + +.headerIconBtn:hover { + opacity: 0.8; +} + +/* Page content wrapper */ +.pageScrollContent { + flex: 1; + overflow-y: auto; + position: relative; + background: #ffffff; + color: #333333; +} + +/* Matrix Layout CSS */ +.matrixSection { + padding: 12px; +} + +.matrixTitle { + text-align: center; + font-size: 0.85rem; + color: #666666; + margin: 6px 0 12px; + font-weight: 400; +} + +.matrixWrapper { + display: flex; + flex-direction: column; + gap: 8px; +} + +.matrixHeaderRow { + display: flex; + align-items: center; +} + +.matrixColHeader { + flex: 1; + text-align: center; + font-size: 0.75rem; + font-weight: 800; + color: #1a1a1a; + letter-spacing: 0.05em; + padding: 2px 0; +} + +.matrixBodyRow { + display: flex; + align-items: stretch; + gap: 8px; +} + +.matrixRowHeader { + width: 24px; + display: flex; + align-items: center; + justify-content: center; + flex-shrink: 0; +} + +.matrixRowHeader span { + writing-mode: vertical-rl; + transform: rotate(180deg); + font-size: 0.72rem; + font-weight: 800; + color: #1a1a1a; + letter-spacing: 0.05em; + white-space: nowrap; +} + +.matrixCard { + flex: 1; + border-radius: 8px; + padding: 16px 8px; + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + color: #ffffff; + min-height: 124px; + position: relative; + box-shadow: inset 0 -4px 0 rgba(0,0,0,0.15); +} + +.matrixCardUrgentImportant { + background: #e53935; /* Red */ +} + +.matrixCardNoturgentImportant { + background: #1e88e5; /* Blue */ +} + +.matrixCardUrgentNotimportant { + background: #43a047; /* Green */ +} + +.matrixCardNoturgentNotimportant { + background: #757575; /* Grey */ +} + +.matrixCardIcon { + width: 28px; + height: 28px; + border-radius: 50%; + border: 1.5px solid #ffffff; + display: flex; + align-items: center; + justify-content: center; + font-size: 0.95rem; + margin-bottom: 6px; +} + +.matrixCardLabel { + font-size: 0.68rem; + font-weight: 600; + margin-bottom: 4px; + opacity: 0.9; +} + +.matrixCardValue { + font-size: 1.7rem; + font-weight: 800; + line-height: 1.1; + letter-spacing: -0.02em; +} + +/* Secondary Tab Bar */ +.tabBarActual { + display: flex; + background: #2d2d2d; + padding: 0; + border-top: 1px solid rgba(0,0,0,0.1); + border-bottom: 1px solid rgba(0,0,0,0.1); + flex-shrink: 0; +} + +.tabBtnActual { + flex: 1; + background: #2d2d2d; + color: #c8bfa8; + border: none; + padding: 10px 0; + font-size: 0.8rem; + font-weight: 600; + cursor: pointer; + text-align: center; + transition: background 0.15s, color 0.15s; +} + +.tabBtnActiveActual { + background: #ffffff !important; + color: #2b3a30 !important; +} + +/* Donut Chart section */ +.chartHeading { + font-size: 0.82rem; + color: #666666; + text-align: center; + margin: 16px 0 10px; + font-weight: 600; +} + +.pieChartContainer { + display: flex; + justify-content: center; + align-items: center; + padding-bottom: 24px; +} + +.pieChartSvg { + width: 140px; + height: 140px; + transform: rotate(-90deg); +} + +/* Circular Pie Slice classes */ +.pieSlice { + fill: none; + stroke-width: 28; +} + +.pieSlice1 { stroke: #e53935; } +.pieSlice2 { stroke: #1e88e5; } +.pieSlice3 { stroke: #43a047; } +.pieSlice4 { stroke: #ffb300; } +.pieSlice5 { stroke: #00acc1; } +.pieSlice6 { stroke: #8e24aa; } +.pieSlice7 { stroke: #d81b60; } +.pieSlice8 { stroke: #3949ab; } + +/* Floating Action Button (FAB) */ +.fabButtonActual { + position: absolute; + bottom: 16px; + right: 16px; + width: 48px; + height: 48px; + border-radius: 50%; + background: #00bcd4; + color: #ffffff; + border: none; + cursor: pointer; + display: flex; + align-items: center; + justify-content: center; + box-shadow: 0 4px 10px rgba(0, 188, 212, 0.45); + font-size: 1.2rem; + z-index: 90; + transition: transform 0.2s cubic-bezier(0.16, 1, 0.3, 1), background 0.2s; +} + +.fabButtonActual:hover { + transform: scale(1.05); + background: #00acc1; +} + +.fabButtonActual:active { + transform: scale(0.95); +} + +/* Slide-out Menu drawer */ +.menuPanelActual { + position: absolute; + top: 0; + left: 0; + height: 100%; + width: 240px; + background: #ffffff; + z-index: 110; + transform: translateX(-100%); + transition: transform 0.3s cubic-bezier(0.16, 1, 0.3, 1); + box-shadow: 4px 0 15px rgba(0,0,0,0.15); + display: flex; + flex-direction: column; +} + +.menuPanelOpen { + transform: translateX(0); +} + +.menuHeaderActual { + height: 48px; + background: #e05a2b; + color: #ffffff; + display: flex; + align-items: center; + justify-content: space-between; + padding: 0 16px; + flex-shrink: 0; +} + +.menuHeaderTitle { + font-size: 1rem; + font-weight: 700; + margin: 0; +} + +.menuHeaderControls { + display: flex; + align-items: center; + gap: 12px; +} + +.menuListActual { + flex: 1; + overflow-y: auto; + padding: 6px 0; + list-style: none; + margin: 0; +} + +.menuItemActual { + display: flex; + align-items: center; + gap: 12px; + padding: 12px 18px; + color: #555555; + font-size: 0.85rem; + font-weight: 500; + cursor: pointer; + border-left: 4px solid transparent; + transition: background 0.15s, border-color 0.15s; +} + +.menuItemActual:hover { + background: #fdfaf2; + color: #e05a2b; +} + +.menuItemActiveActual { + background: #faf2eb; + color: #e05a2b !important; + border-left-color: #e05a2b; + font-weight: 700; +} + +.menuItemIcon { + font-size: 1.05rem; + width: 20px; + text-align: center; + opacity: 0.85; +} + +.menuBackdrop { + position: absolute; + inset: 0; + background: rgba(0, 0, 0, 0.4); + z-index: 100; + opacity: 0; + pointer-events: none; + transition: opacity 0.3s ease; +} + +.menuBackdropVisible { + opacity: 1; + pointer-events: auto; +} + +/* Swipe boundary tip hotspot */ +.leftEdgeSwipeBoundary { + position: absolute; + top: 0; + left: 0; + width: 14px; + height: 100%; + z-index: 95; + cursor: ew-resize; + background: linear-gradient(90deg, rgba(224, 90, 43, 0.1) 0%, transparent 100%); +} + +.leftEdgeSwipeBoundary:hover { + background: linear-gradient(90deg, rgba(224, 90, 43, 0.2) 0%, transparent 100%); +} + +/* ── Converged Landscape 3-Column Grid ── */ +.convergedGrid { + display: grid; + grid-template-columns: 200px 330px 1fr; + height: 100%; + width: 100%; + overflow: hidden; + background: #f5f5f5; +} + +/* Sidebar Column */ +.convergedSidebar { + background: #ffffff; + border-right: 1px solid rgba(0, 0, 0, 0.08); + display: flex; + flex-direction: column; + height: 100%; +} + +.convergedSidebar .menuListActual { + padding-top: 10px; +} + +/* Center Dashboard Column */ +.convergedCenter { + background: #ffffff; + border-right: 1px solid rgba(0, 0, 0, 0.08); + display: flex; + flex-direction: column; + height: 100%; + overflow-y: auto; + position: relative; +} + +/* Right Charts Column */ +.convergedRight { + display: flex; + flex-direction: column; + height: 100%; + background: #ffffff; +} + +.rightHeader { + height: 48px; + background: #e05a2b; + color: #ffffff; + display: flex; + align-items: center; + padding: 0 16px; + font-size: 0.95rem; + font-weight: 600; + flex-shrink: 0; +} + +.rightContent { + flex: 1; + overflow-y: auto; + padding: 16px; +} + +/* Project wise horizontal bar chart */ +.barChartTitle { + font-size: 0.85rem; + font-weight: 600; + color: #333333; + text-align: center; + margin-bottom: 16px; +} + +.barChartContainer { + display: flex; + flex-direction: column; + gap: 8px; + margin-bottom: 24px; +} + +.barChartRow { + display: flex; + align-items: center; + gap: 8px; + font-size: 0.65rem; +} + +.barChartLabel { + width: 110px; + text-align: right; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + color: #555555; + font-weight: 500; +} + +.barChartValueWrapper { + flex: 1; + display: flex; + align-items: center; + gap: 6px; +} + +.barChartBarBg { + flex: 1; + height: 8px; + background: #eeeeee; + border-radius: 4px; + overflow: hidden; +} + +.barChartBarFill { + height: 100%; + border-radius: 4px; + transition: width 0.8s ease; +} + +.barChartValText { + width: 45px; + font-weight: 700; + color: #333333; + text-align: left; +} + +/* Show Next 10 button */ +.showNextBtn { + width: 100%; + background: #f5f5f5; + color: #666666; + border: 1px solid #e0e0e0; + padding: 6px; + font-size: 0.7rem; + font-weight: 600; + cursor: pointer; + text-align: center; + border-radius: 4px; + margin-bottom: 20px; + transition: background 0.15s; +} + +.showNextBtn:hover { + background: #eeeeee; +} + +/* Projects header with badge */ +.projectsSectionHeader { + display: flex; + justify-content: space-between; + align-items: center; + border-bottom: 1px solid #e0e0e0; + padding-bottom: 6px; + margin-bottom: 12px; +} + +.projectsSectionTitle { + font-size: 0.85rem; + font-weight: 700; + color: #333333; + margin: 0; +} + +.projectsTotalBadge { + background: #e05a2b; + color: #ffffff; + font-size: 0.65rem; + font-weight: 700; + padding: 2px 6px; + border-radius: 10px; +} + +/* Search Box */ +.projectSearchBox { + width: 100%; + padding: 8px 10px; + border: 1px solid #cccccc; + border-radius: 4px; + font-size: 0.75rem; + margin-bottom: 12px; + outline: none; + font-family: inherit; +} + +.projectSearchBox:focus { + border-color: #e05a2b; +} + +/* Projects Filters */ +.projectFilterTabs { + display: flex; + background: #eeeeee; + padding: 2px; + border-radius: 4px; + margin-bottom: 14px; +} + +.projectFilterBtn { + flex: 1; + background: transparent; + border: none; + padding: 5px 0; + font-size: 0.68rem; + font-weight: 600; + color: #666666; + cursor: pointer; + border-radius: 3px; + text-align: center; + transition: all 0.15s; +} + +.projectFilterBtnActive { + background: #e05a2b; + color: #ffffff; +} + +/* Project Cards list */ +.projectListLandscape { + display: flex; + flex-direction: column; + gap: 10px; +} + +.projectListItemCard { + border-left: 3px solid #e05a2b; + box-shadow: 0 1px 3px rgba(0,0,0,0.1); + padding: 10px 12px; + background: #ffffff; + border-top-right-radius: 4px; + border-bottom-right-radius: 4px; + display: flex; + flex-direction: column; + gap: 6px; + position: relative; + cursor: pointer; +} + +.projectListItemCard:hover { + background: #fafafa; +} + +.projectListItemHeader { + display: flex; + justify-content: space-between; + align-items: flex-start; + gap: 8px; +} + +.projectListItemName { + font-size: 0.78rem; + font-weight: 700; + color: #333333; + margin: 0; + line-height: 1.25; +} + +.projectListItemTime { + font-size: 0.72rem; + font-weight: 700; + color: #e05a2b; + white-space: nowrap; +} + +.projectListItemTasks { + font-size: 0.65rem; + color: #777777; +} + +.projectProgressBg { + width: 100%; + height: 4px; + background: #eeeeee; + border-radius: 2px; + overflow: hidden; +} + +.projectProgressBar { + height: 100%; + background: #e05a2b; + border-radius: 2px; +} + +/* Home collapsed bar in bottom */ +.indicatorBarActual { + height: 10px; + background: #ffffff; + display: flex; + justify-content: center; + align-items: center; + cursor: pointer; + border-top: 1px solid rgba(0,0,0,0.04); + flex-shrink: 0; +} + +.indicatorBarActual::after { + content: ""; + width: 32px; + height: 4px; + background: #cccccc; + border-radius: 2px; + transition: background 0.2s; +} + +.indicatorBarActual:hover::after { + background: #e05a2b; +} + + From 8e1b44c427d1c785e69a0cf1ede76b8d8e581594 Mon Sep 17 00:00:00 2001 From: Suraj Yadav Date: Wed, 17 Jun 2026 17:55:33 +0530 Subject: [PATCH 37/67] feat: add theme-aware UI components, timesheet/task data models, and screen rendering logic --- website/src/pages/index.js | 620 ++++++++++++++++++++++++++--- website/src/pages/index.module.css | 432 ++++++++++++++++++++ 2 files changed, 986 insertions(+), 66 deletions(-) diff --git a/website/src/pages/index.js b/website/src/pages/index.js index f4468647..66c6981c 100644 --- a/website/src/pages/index.js +++ b/website/src/pages/index.js @@ -183,17 +183,18 @@ function DeviceSimulator() { const [activeScreen, setActiveScreen] = useState("Dashboard"); const [searchQuery, setSearchQuery] = useState(""); const [filterType, setFilterType] = useState("most-time"); + const [themeMode, setThemeMode] = useState("dark"); // Default dark mode to match the visual screenshots const menuItems = [ - { name: "Dashboard", icon: "🏠" }, - { name: "Timesheet", icon: "⏱" }, - { name: "Activities", icon: "📅" }, - { name: "My Tasks", icon: "⭐" }, - { name: "All Tasks", icon: "☑" }, - { name: "Projects", icon: "📁" }, - { name: "Project Updates", icon: "🕒" }, - { name: "About Us", icon: "ℹ" }, - { name: "Settings", icon: "⚙" } + { name: "Dashboard", icon: "🏠", target: "Dashboard" }, + { name: "Timesheet", icon: "⏱", target: "Timesheets" }, + { name: "Activities", icon: "📅", target: "Activities" }, + { name: "My Tasks", icon: "⭐", target: "My Tasks" }, + { name: "All Tasks", icon: "☑", target: "All Tasks" }, + { name: "Projects", icon: "📁", target: "Projects" }, + { name: "Project Updates", icon: "🕒", target: "Project Updates" }, + { name: "About Us", icon: "ℹ", target: "About Us" }, + { name: "Settings", icon: "⚙", target: "Settings" } ]; const projectsData = [ @@ -207,6 +208,125 @@ function DeviceSimulator() { { name: "CURQ documentation", time: "150.0 h", percent: 8, color: "#d81b60", tasks: 2 } ]; + const timesheetsData = [ + { + title: "test timesheet this thing this...", + project: "Main Parent Project / Child pr... (testCit)", + task: "User manual", + author: "Suraj Yadav", + hours: "5:00 H", + date: "2026-04-24", + action: "Do", + borderColor: "#e07a24" + }, + { + title: "Test", + project: "Main Parent Project / Child pr... (testCit)", + task: "This is a Notification Test.", + author: "Parvathy", + hours: "4500:00 H", + date: "2026-05-05", + action: "Unknown", + borderColor: "#999999" + }, + { + title: "sub taSK 2 TIMESHEETY", + project: "Main Parent Project / Child pr... (testCit)", + task: "HR Bundle", + author: "Parvathy", + hours: "2:00 H", + date: "2026-04-24", + action: "Unknown", + borderColor: "#e07a24" + }, + { + title: "test", + project: "UT App Development / Dekko App... (testCit)", + task: "Coordination", + author: "Parvathy", + hours: "3:00 H", + date: "2026-04-24", + action: "Unknown", + borderColor: "#e07a24" + }, + { + title: "Time Off (1/1)", + project: "Internal (testCit)", + task: "Time Off", + author: "Suraj Yadav", + hours: "8:00 H", + date: "2026-05-01", + action: "Unknown", + borderColor: "#999999" + }, + { + title: "Time Off (1/1)", + project: "Internal (testCit)", + task: "Time Off", + author: "Anusha PP", + hours: "8:00 H", + date: "2026-05-01", + action: "Unknown", + borderColor: "#999999" + } + ]; + + const tasksData = [ + { + title: "[Req] Content hub", + project: "UT time management", + stage: "Analysis", + stars: [false, false, false], + planned: "N/A", + start: "2025-08-08", + end: "2025-08-22", + overdue: "299 days overdue" + }, + { + title: "[IMP - Weblates improvements]", + project: "UT time management", + stage: "Analysis", + stars: [true, false, false], + planned: "N/A", + start: "2025-11-17", + end: "2026-01-16", + overdue: "152 days overdue" + }, + { + title: "Activity Retention", + project: "UT time management", + stage: "Design", + stars: [false, false, false], + planned: "N/A", + start: "2026-01-20", + end: "Not set", + overdue: null + }, + { + title: "Parent task", + project: "Child project of", + stage: "Analysis", + stars: [false, false, false], + planned: "N/A", + start: "2026-04-24", + end: "2026-06-08", + overdue: "9 days overdue", + locked: true, + hasTasks: true, + borderColor: "#e07a24" + }, + { + title: "UI Improvements And Bug Fixes", + project: "UT time management", + stage: "Development", + stars: [false, false, false], + planned: "N/A", + start: "2026-01-21", + end: "Not set", + overdue: null + } + ]; + const filteredProjects = projectsData.filter(p => p.name.toLowerCase().includes(searchQuery.toLowerCase()) ); @@ -219,10 +339,10 @@ function DeviceSimulator() { key={item.name} className={clsx( styles.menuItemActual, - activeScreen === item.name && styles.menuItemActiveActual + activeScreen === item.target && styles.menuItemActiveActual )} onClick={() => { - setActiveScreen(item.name); + setActiveScreen(item.target); setMenuOpen(false); }} > @@ -253,7 +373,7 @@ function DeviceSimulator() {
Do First
-
9521H
+
{themeMode === "dark" ? "100H" : "9521H"}
@@ -277,7 +397,7 @@ function DeviceSimulator() {
🗑
Don't do
-
13H
+
{themeMode === "dark" ? "0H" : "13H"}
@@ -330,7 +450,7 @@ function DeviceSimulator() { stroke="#00acc1" strokeWidth="12" strokeDasharray="19.8 220" strokeDashoffset="-200.2" /> - + @@ -342,6 +462,192 @@ function DeviceSimulator() { ); + // Render Timesheets List Screen + const renderTimesheetsList = () => ( +
+
+ + + +
+ + {timesheetsData.map((t, idx) => ( +
+
+
+

{t.title}

+ {t.project} + {t.task} + {t.author} +
+
+ {t.hours} + {t.date} + {t.action} +
+
+ ))} +
+ ); + + // Render My Tasks Screen + const renderMyTasksList = () => ( +
+
+ + + + +
+ +
+ {tasksData.map((task, idx) => ( +
+ {task.borderColor && ( +
+ )} +
+

{task.title}

+ + {task.project} {task.locked && "🔒"} + +
+ {task.stars.map((filled, sIdx) => ( + + ★ + + ))} +
+ {task.hasTasks && ( + [+1] Tasks + )} + {task.stage} +
+
+ Planned (H): {task.planned} + Start Date: {task.start} + End Date: {task.end} + {task.overdue && ( + {task.overdue} + )} +
+
+ ))} +
+
+ ); + + // Render Timesheet Entry Form + const renderTimesheetEntryForm = () => ( +
+
+ Account + {themeMode === "dark" ? "dem" : "testCit"} +
+ +
+ Project + + {themeMode === "dark" ? '"Task-wise Time Allocation an...' : "Child project of"} + +
+ +
+ Subproject + Tap to select +
+ +
+ Task + {themeMode === "dark" ? "111Ojne" : "sub task1"} +
+ +
+ Subtask + Tap to select +
+ +
+ Priority + +
+ +
+
+
+
+
+ Important, Urgent (1) +
+
+
+ Important, Not Urgent (2) +
+
+
+ Urgent, Not Important (3) +
+
+
+ Not Urgent, Not Important (4) +
+
+ +
+ Time Tracking +
+ +
+
+
+
+
+ Manual +
+
+
+ Automated +
+
+ +
+ +
+ +
+ Date + {themeMode === "dark" ? ( + 10-03-2026 + ) : ( + + )} +
+ +
+ Description +
+