aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJoanne <zehan_ding@brown.edu>2025-06-20 10:18:38 -0400
committerJoanne <zehan_ding@brown.edu>2025-06-20 10:18:38 -0400
commit61787b3c1cf53c0230f6142bee0df30c65971012 (patch)
tree36c43ca031722b9a92f3f344288c8f6cf7fff5e1
parent2aa2c26b95a539d220e46b20cdfbef6ae39d6c43 (diff)
parente7a96fa043cfc9c3c426e09bbef42c8df88a45f6 (diff)
Merge branch 'master' of https://github.com/brown-dash/Dash-Web into joanne-tutorialagent
-rw-r--r--.eslintrc.json11
-rw-r--r--.gitignore1
-rw-r--r--.stylelintrc.json15
-rw-r--r--deploy/index.html1
-rw-r--r--env7
-rw-r--r--package-lock.json7888
-rw-r--r--package.json18
-rw-r--r--packages/components/src/components/Button/Button.scss10
-rw-r--r--packages/components/src/components/Button/Button.stories.tsx149
-rw-r--r--packages/components/src/components/Dropdown/Dropdown.scss4
-rw-r--r--packages/components/src/components/EditableText/EditableText.scss8
-rw-r--r--packages/components/src/components/FormInput/FormInput.scss2
-rw-r--r--packages/components/src/components/Overlay/Overlay.scss6
-rw-r--r--packages/components/src/components/Template/Template.tsx14
-rw-r--r--packages/components/src/components/Toggle/Toggle.stories.tsx54
-rw-r--r--packages/components/src/global/globalCssVariables.scss2
-rw-r--r--src/ClientUtils.ts3
-rw-r--r--src/client/apis/GoogleAuthenticationManager.tsx84
-rw-r--r--src/client/apis/gpt/GPT.ts80
-rw-r--r--src/client/documents/DocUtils.ts33
-rw-r--r--src/client/documents/DocumentTypes.ts3
-rw-r--r--src/client/documents/Documents.ts61
-rw-r--r--src/client/util/BranchingTrailManager.tsx3
-rw-r--r--src/client/util/CalendarManager.tsx2
-rw-r--r--src/client/util/CaptureManager.scss6
-rw-r--r--src/client/util/CurrentUserUtils.ts8
-rw-r--r--src/client/util/DocumentManager.ts3
-rw-r--r--src/client/util/GroupManager.scss19
-rw-r--r--src/client/util/GroupMemberView.scss20
-rw-r--r--src/client/util/LinkFollower.ts2
-rw-r--r--src/client/util/PingManager.ts2
-rw-r--r--src/client/util/SearchUtil.ts36
-rw-r--r--src/client/util/SettingsManager.scss30
-rw-r--r--src/client/util/SettingsManager.tsx2
-rw-r--r--src/client/util/SharingManager.scss51
-rw-r--r--src/client/util/TrackMovements.ts2
-rw-r--r--src/client/util/clamp.js24
-rw-r--r--src/client/util/convertToCSSPTValue.js9
-rw-r--r--src/client/util/reportManager/ReportManager.scss30
-rw-r--r--src/client/util/reportManager/ReportManager.tsx2
-rw-r--r--src/client/views/ContextMenu.scss12
-rw-r--r--src/client/views/DashboardView.scss8
-rw-r--r--src/client/views/DocumentButtonBar.tsx4
-rw-r--r--src/client/views/DocumentDecorations.scss38
-rw-r--r--src/client/views/DocumentDecorations.tsx115
-rw-r--r--src/client/views/EditableView.scss9
-rw-r--r--src/client/views/FieldsDropdown.tsx17
-rw-r--r--src/client/views/FilterPanel.scss54
-rw-r--r--src/client/views/GestureOverlay.scss2
-rw-r--r--src/client/views/InkStroke.scss4
-rw-r--r--src/client/views/InkStrokeProperties.ts23
-rw-r--r--src/client/views/InkTangentHandles.tsx2
-rw-r--r--src/client/views/InkTranscription.tsx21
-rw-r--r--src/client/views/LightboxView.scss48
-rw-r--r--src/client/views/Main.scss6
-rw-r--r--src/client/views/Main.tsx7
-rw-r--r--src/client/views/MainView.scss40
-rw-r--r--src/client/views/MainView.tsx5
-rw-r--r--src/client/views/MainViewModal.tsx2
-rw-r--r--src/client/views/MarqueeAnnotator.tsx3
-rw-r--r--src/client/views/MetadataEntryMenu.scss20
-rw-r--r--src/client/views/OverlayView.scss12
-rw-r--r--src/client/views/PreviewCursor.scss4
-rw-r--r--src/client/views/PropertiesButtons.tsx4
-rw-r--r--src/client/views/PropertiesSection.tsx1
-rw-r--r--src/client/views/PropertiesView.scss50
-rw-r--r--src/client/views/PropertiesView.tsx6
-rw-r--r--src/client/views/SidebarAnnos.scss12
-rw-r--r--src/client/views/SidebarAnnos.tsx29
-rw-r--r--src/client/views/StyleProvider.scss22
-rw-r--r--src/client/views/StyleProvider.tsx8
-rw-r--r--src/client/views/StyleProviderQuiz.scss8
-rw-r--r--src/client/views/ViewBoxInterface.ts3
-rw-r--r--src/client/views/animationtimeline/Timeline.scss4
-rw-r--r--src/client/views/animationtimeline/TimelineMenu.tsx4
-rw-r--r--src/client/views/animationtimeline/TimelineOverview.tsx5
-rw-r--r--src/client/views/collections/CollectionCardDeckView.scss4
-rw-r--r--src/client/views/collections/CollectionCarousel3DView.scss12
-rw-r--r--src/client/views/collections/CollectionCarouselView.scss16
-rw-r--r--src/client/views/collections/CollectionDockingView.scss132
-rw-r--r--src/client/views/collections/CollectionMasonryViewFieldRow.tsx44
-rw-r--r--src/client/views/collections/CollectionNoteTakingView.scss30
-rw-r--r--src/client/views/collections/CollectionPivotView.tsx8
-rw-r--r--src/client/views/collections/CollectionStackedTimeline.scss16
-rw-r--r--src/client/views/collections/CollectionStackingView.scss39
-rw-r--r--src/client/views/collections/CollectionStackingView.tsx167
-rw-r--r--src/client/views/collections/CollectionStackingViewFieldColumn.tsx32
-rw-r--r--src/client/views/collections/CollectionTimeView.scss13
-rw-r--r--src/client/views/collections/CollectionTreeView.scss6
-rw-r--r--src/client/views/collections/CollectionView.scss8
-rw-r--r--src/client/views/collections/CollectionView.tsx2
-rw-r--r--src/client/views/collections/FlashcardPracticeUI.scss8
-rw-r--r--src/client/views/collections/FlashcardPracticeUI.tsx9
-rw-r--r--src/client/views/collections/KeyRestrictionRow.tsx72
-rw-r--r--src/client/views/collections/TabDocView.scss4
-rw-r--r--src/client/views/collections/TabDocView.tsx4
-rw-r--r--src/client/views/collections/TreeView.scss4
-rw-r--r--src/client/views/collections/collectionFreeForm/CollectionFreeFormRemoteCursors.scss2
-rw-r--r--src/client/views/collections/collectionFreeForm/CollectionFreeFormView.scss32
-rw-r--r--src/client/views/collections/collectionFreeForm/CollectionFreeFormView.tsx52
-rw-r--r--src/client/views/collections/collectionFreeForm/FaceCollectionBox.scss14
-rw-r--r--src/client/views/collections/collectionFreeForm/ImageLabelBox.tsx5
-rw-r--r--src/client/views/collections/collectionFreeForm/MarqueeOptionsMenu.tsx2
-rw-r--r--src/client/views/collections/collectionFreeForm/MarqueeView.scss8
-rw-r--r--src/client/views/collections/collectionFreeForm/MarqueeView.tsx126
-rw-r--r--src/client/views/collections/collectionGrid/CollectionGridView.scss6
-rw-r--r--src/client/views/collections/collectionLinear/CollectionLinearView.scss8
-rw-r--r--src/client/views/collections/collectionMulticolumn/CollectionMulticolumnView.scss8
-rw-r--r--src/client/views/collections/collectionMulticolumn/CollectionMultirowView.scss4
-rw-r--r--src/client/views/collections/collectionMulticolumn/MulticolumnResizer.tsx1
-rw-r--r--src/client/views/collections/collectionMulticolumn/MultirowHeightLabel.tsx1
-rw-r--r--src/client/views/collections/collectionMulticolumn/MultirowResizer.tsx3
-rw-r--r--src/client/views/collections/collectionSchema/CollectionSchemaView.scss10
-rw-r--r--src/client/views/global/globalCssVariables.module.scss2
-rw-r--r--src/client/views/linking/LinkMenuItem.scss4
-rw-r--r--src/client/views/linking/LinkMenuItem.tsx18
-rw-r--r--src/client/views/linking/LinkPopup.scss6
-rw-r--r--src/client/views/linking/LinkPopup.tsx1
-rw-r--r--src/client/views/newlightbox/NewLightboxView.scss4
-rw-r--r--src/client/views/newlightbox/components/Recommendation/Recommendation.scss2
-rw-r--r--src/client/views/nodes/AudioBox.scss4
-rw-r--r--src/client/views/nodes/CollectionFreeFormDocumentView.scss4
-rw-r--r--src/client/views/nodes/ComparisonBox.scss18
-rw-r--r--src/client/views/nodes/DataVizBox/DataVizBox.scss10
-rw-r--r--src/client/views/nodes/DataVizBox/DocCreatorMenu/Backend/TemplateManager.ts91
-rw-r--r--src/client/views/nodes/DataVizBox/DocCreatorMenu/Backend/TemplateMenuAIUtils.ts122
-rw-r--r--src/client/views/nodes/DataVizBox/DocCreatorMenu/DocCreatorMenu.scss621
-rw-r--r--src/client/views/nodes/DataVizBox/DocCreatorMenu/DocCreatorMenu.tsx1153
-rw-r--r--src/client/views/nodes/DataVizBox/DocCreatorMenu/FieldTypes/DynamicField.tsx117
-rw-r--r--src/client/views/nodes/DataVizBox/DocCreatorMenu/FieldTypes/Field.tsx66
-rw-r--r--src/client/views/nodes/DataVizBox/DocCreatorMenu/FieldTypes/FieldUtils.tsx79
-rw-r--r--src/client/views/nodes/DataVizBox/DocCreatorMenu/FieldTypes/StaticField.tsx147
-rw-r--r--src/client/views/nodes/DataVizBox/DocCreatorMenu/Menu/ConditionalsTextarea.tsx65
-rw-r--r--src/client/views/nodes/DataVizBox/DocCreatorMenu/Menu/DocCreatorMenuButton.tsx42
-rw-r--r--src/client/views/nodes/DataVizBox/DocCreatorMenu/Menu/TemplateEditingWindow.tsx220
-rw-r--r--src/client/views/nodes/DataVizBox/DocCreatorMenu/Menu/TemplateMenuFieldOptions.tsx185
-rw-r--r--src/client/views/nodes/DataVizBox/DocCreatorMenu/Menu/TemplatePreviewBox.tsx89
-rw-r--r--src/client/views/nodes/DataVizBox/DocCreatorMenu/Menu/TemplatePreviewGrid.tsx60
-rw-r--r--src/client/views/nodes/DataVizBox/DocCreatorMenu/Menu/TemplateRenderPreviewWindow.tsx346
-rw-r--r--src/client/views/nodes/DataVizBox/DocCreatorMenu/Template.ts179
-rw-r--r--src/client/views/nodes/DataVizBox/DocCreatorMenu/Template.tsx139
-rw-r--r--src/client/views/nodes/DataVizBox/DocCreatorMenu/TemplateBackend.ts (renamed from src/client/views/nodes/DataVizBox/DocCreatorMenu/TemplateBackend.tsx)309
-rw-r--r--src/client/views/nodes/DataVizBox/DocCreatorMenu/TemplateFieldTypes/DataField.ts20
-rw-r--r--src/client/views/nodes/DataVizBox/DocCreatorMenu/TemplateFieldTypes/DecorationField.ts3
-rw-r--r--src/client/views/nodes/DataVizBox/DocCreatorMenu/TemplateFieldTypes/DynamicField.ts131
-rw-r--r--src/client/views/nodes/DataVizBox/DocCreatorMenu/TemplateFieldTypes/StaticContentField.ts62
-rw-r--r--src/client/views/nodes/DataVizBox/DocCreatorMenu/TemplateFieldTypes/TemplateField.ts172
-rw-r--r--src/client/views/nodes/DataVizBox/DocCreatorMenu/TemplateFieldTypes/TemplateFieldUtils.ts71
-rw-r--r--src/client/views/nodes/DataVizBox/DocCreatorMenu/TemplateManager.tsx22
-rw-r--r--src/client/views/nodes/DataVizBox/SchemaCSVPopUp.scss8
-rw-r--r--src/client/views/nodes/DataVizBox/components/Chart.scss4
-rw-r--r--src/client/views/nodes/DataVizBox/components/TableBox.tsx16
-rw-r--r--src/client/views/nodes/DocumentLinksButton.scss4
-rw-r--r--src/client/views/nodes/DocumentLinksButton.tsx1
-rw-r--r--src/client/views/nodes/DocumentView.scss37
-rw-r--r--src/client/views/nodes/DocumentView.tsx6
-rw-r--r--src/client/views/nodes/EquationBox.tsx41
-rw-r--r--src/client/views/nodes/FontIconBox/FontIconBadge.scss2
-rw-r--r--src/client/views/nodes/FontIconBox/FontIconBox.scss20
-rw-r--r--src/client/views/nodes/IconTagBox.scss2
-rw-r--r--src/client/views/nodes/ImageBox.scss26
-rw-r--r--src/client/views/nodes/ImageBox.tsx147
-rw-r--r--src/client/views/nodes/KeyValueBox.scss10
-rw-r--r--src/client/views/nodes/KeyValueBox.tsx8
-rw-r--r--src/client/views/nodes/KeyValuePair.scss2
-rw-r--r--src/client/views/nodes/LabelBox.scss12
-rw-r--r--src/client/views/nodes/LabelBox.tsx8
-rw-r--r--src/client/views/nodes/LinkDocPreview.scss2
-rw-r--r--src/client/views/nodes/LinkDocPreview.tsx1
-rw-r--r--src/client/views/nodes/LoadingBox.scss4
-rw-r--r--src/client/views/nodes/LoadingBox.tsx2
-rw-r--r--src/client/views/nodes/MapBox/MapAnchorMenu.scss37
-rw-r--r--src/client/views/nodes/MapBox/MapBox.scss10
-rw-r--r--src/client/views/nodes/MapBox/MapBox.tsx59
-rw-r--r--src/client/views/nodes/MapboxMapBox/MapboxContainer.tsx51
-rw-r--r--src/client/views/nodes/PDFBox.scss36
-rw-r--r--src/client/views/nodes/PDFBox.tsx88
-rw-r--r--src/client/views/nodes/PhysicsBox/PhysicsSimulationBox.scss4
-rw-r--r--src/client/views/nodes/RecordingBox/ProgressBar.scss141
-rw-r--r--src/client/views/nodes/RecordingBox/RecordingView.scss12
-rw-r--r--src/client/views/nodes/ScreenshotBox.scss8
-rw-r--r--src/client/views/nodes/ScriptingBox.scss6
-rw-r--r--src/client/views/nodes/TaskBox.scss132
-rw-r--r--src/client/views/nodes/TaskBox.tsx670
-rw-r--r--src/client/views/nodes/VideoBox.scss10
-rw-r--r--src/client/views/nodes/VideoBox.tsx64
-rw-r--r--src/client/views/nodes/WebBox.scss44
-rw-r--r--src/client/views/nodes/WebBox.tsx29
-rw-r--r--src/client/views/nodes/audio/AudioWaveform.scss10
-rw-r--r--src/client/views/nodes/calendarBox/CalendarBox.scss38
-rw-r--r--src/client/views/nodes/calendarBox/CalendarBox.tsx339
-rw-r--r--src/client/views/nodes/chatbot/chatboxcomponents/ChatBox.scss2
-rw-r--r--src/client/views/nodes/chatbot/chatboxcomponents/ProgressBar.scss69
-rw-r--r--src/client/views/nodes/formattedText/DailyJournal.tsx248
-rw-r--r--src/client/views/nodes/formattedText/DashFieldView.scss2
-rw-r--r--src/client/views/nodes/formattedText/DashFieldView.tsx3
-rw-r--r--src/client/views/nodes/formattedText/EquationEditor.scss10
-rw-r--r--src/client/views/nodes/formattedText/EquationEditor.tsx4
-rw-r--r--src/client/views/nodes/formattedText/FormattedTextBox.scss54
-rw-r--r--src/client/views/nodes/formattedText/FormattedTextBox.tsx109
-rw-r--r--src/client/views/nodes/formattedText/FormattedTextBoxComment.scss16
-rw-r--r--src/client/views/nodes/formattedText/RichTextMenu.scss4
-rw-r--r--src/client/views/nodes/formattedText/TooltipTextMenu.scss8
-rw-r--r--src/client/views/nodes/formattedText/marks_rts.ts14
-rw-r--r--src/client/views/nodes/imageEditor/ImageEditor.scss10
-rw-r--r--src/client/views/nodes/scrapbook/AIPresetGenerator.ts31
-rw-r--r--src/client/views/nodes/scrapbook/EmbeddedDocView.tsx52
-rw-r--r--src/client/views/nodes/scrapbook/ScrapbookBox.scss66
-rw-r--r--src/client/views/nodes/scrapbook/ScrapbookBox.tsx302
-rw-r--r--src/client/views/nodes/scrapbook/ScrapbookContent.tsx23
-rw-r--r--src/client/views/nodes/scrapbook/ScrapbookPreset.tsx94
-rw-r--r--src/client/views/nodes/scrapbook/ScrapbookPresetRegistry.ts36
-rw-r--r--src/client/views/nodes/scrapbook/ScrapbookSlot.scss85
-rw-r--r--src/client/views/nodes/scrapbook/ScrapbookSlot.tsx28
-rw-r--r--src/client/views/nodes/scrapbook/ScrapbookSlotTypes.ts25
-rw-r--r--src/client/views/nodes/trails/PresBox.scss104
-rw-r--r--src/client/views/nodes/trails/PresBox.tsx2
-rw-r--r--src/client/views/nodes/trails/PresSlideBox.scss10
-rw-r--r--src/client/views/pdf/AnchorMenu.scss14
-rw-r--r--src/client/views/pdf/GPTPopup/GPTPopup.scss10
-rw-r--r--src/client/views/pdf/PDFViewer.scss13
-rw-r--r--src/client/views/pdf/PDFViewer.tsx6
-rw-r--r--src/client/views/search/FaceRecognitionHandler.tsx13
-rw-r--r--src/client/views/smartdraw/SmartDrawHandler.tsx5
-rw-r--r--src/client/views/topbar/TopBar.scss2
-rw-r--r--src/debug/Viewer.tsx3
-rw-r--r--src/fields/Doc.ts64
-rw-r--r--src/fields/FieldLoader.scss2
-rw-r--r--src/server/ApiManagers/FireflyManager.ts18
-rw-r--r--src/server/ApiManagers/GeneralGoogleManager.ts135
-rw-r--r--src/server/ApiManagers/UploadManager.ts2
-rw-r--r--src/server/PdfTypes.ts2
-rw-r--r--src/server/RouteManager.ts8
-rw-r--r--src/server/apis/google/GoogleApiServerUtils.ts11
-rw-r--r--src/server/apis/google/google_project_credentials.json8
-rw-r--r--src/server/authentication/DashUserModel.ts14
-rw-r--r--src/server/authentication/Passport.ts6
-rw-r--r--src/server/server_Initialization.ts5
-rw-r--r--views/stylesheets/authentication.css21
239 files changed, 10587 insertions, 8150 deletions
diff --git a/.eslintrc.json b/.eslintrc.json
index aba260657..187ddbdc7 100644
--- a/.eslintrc.json
+++ b/.eslintrc.json
@@ -1,6 +1,6 @@
{
"extends": ["airbnb", "prettier", "plugin:node/recommended", "plugin:import/react"],
- "plugins": ["prettier", "import", "@typescript-eslint"],
+ "plugins": ["prettier", "import", "@typescript-eslint", "css-modules"],
"ignorePatterns": ["solr-8.3.1/*", "deploy/*"], // <<< ignore all files in test folder
"settings": {
"import/parsers": {
@@ -14,7 +14,10 @@
"extensions": [".js", ".ts", ".tsx"]
}
},
- "import/extensions": [".js", ".jsx", ".ts", ".tsx"]
+ "import/extensions": [".js", ".jsx", ".ts", ".tsx"],
+ "css-modules": {
+ "basePath": "src" // Adjust this to your project's base path
+ }
},
"rules": {
"import/extensions": [
@@ -60,7 +63,9 @@
"no-param-reassign": ["error", { "props": false }],
// "import/no-cycle": 0,
"no-alert": 0,
- "radix": "off"
+ "radix": "off",
+ "css-modules/no-unused-class": "warn", // Warn for unused CSS classes
+ "css-modules/no-undef-class": "error" // Error for undefined CSS classes
},
"overrides": [
{
diff --git a/.gitignore b/.gitignore
index 8ffa03e80..8d515e592 100644
--- a/.gitignore
+++ b/.gitignore
@@ -16,7 +16,6 @@ src/server/session_manager/logs/**/*.log
debug.log
.vscodeignore
Dockerfile
-.vscode/launch.json
src/server/chunker/venv
# Workspace
diff --git a/.stylelintrc.json b/.stylelintrc.json
new file mode 100644
index 000000000..c9198c5dc
--- /dev/null
+++ b/.stylelintrc.json
@@ -0,0 +1,15 @@
+{
+ "extends": ["stylelint-config-standard-scss"],
+ "plugins": ["stylelint-scss"],
+ "rules": {
+ "unit-no-unknown": true,
+ "length-zero-no-unit": true,
+ "declaration-property-unit-required": {
+ "width": ["px", "%", "em", "rem", "vw", "vh"],
+ "height": ["px", "%", "em", "rem", "vw", "vh"]
+ },
+ "property-no-unknown": true,
+ "value-no-vendor-prefix": true,
+ "scss/at-rule-no-unknown": true
+ }
+}
diff --git a/deploy/index.html b/deploy/index.html
index 1c48f24bf..b469c7032 100644
--- a/deploy/index.html
+++ b/deploy/index.html
@@ -1,3 +1,4 @@
+<!doctype html>
<html style="overflow: hidden">
<head>
<title>Dash</title>
diff --git a/env b/env
new file mode 100644
index 000000000..3d58aaa69
--- /dev/null
+++ b/env
@@ -0,0 +1,7 @@
+_CLIENT_OPENAI_API_KEY='sk-None-qp5q1YBYH0UrPfKPaZs8T3BlbkFJBfbngnegpBt6iRgv07zW'
+_CLIENT_OPENAI_KEY='sk-None-qp5q1YBYH0UrPfKPaZs8T3BlbkFJBfbngnegpBt6iRgv07zW'
+OPENAI_API_KEY='sk-None-qp5q1YBYH0UrPfKPaZs8T3BlbkFJBfbngnegpBt6iRgv07zW'
+_CLIENT_PINECONE_API_KEY='pcsk_7Fhmen_HSo9VM4goUACBx5fmTS6Ku6kTJuZx3q1NeBA8FYc1ve6VTtH4H7vMchRnMwjYTM'
+PINECONE_API_KEY='pcsk_2Zyegr_G3nn67rBfrXbSzQV5B8AR3LpVS8QuTo7PAT99uuQwZbxWatSJXgWUCUQ8friVf5'
+_CLIENT_FIREFLY_CLIENT_ID='ef5bfe14a470404db1e8b0bbf28de62f'
+_CLIENT_FIREFLY_SECRET='p8e-GMrJKLIolXz-H77vrs2uzhvjuPhMh7-L'
diff --git a/package-lock.json b/package-lock.json
index 28b81dbc7..73b8b007b 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -20,6 +20,7 @@
"@dash/components": "file:packages/components",
"@emotion/react": "^11.11.1",
"@emotion/styled": "^11.11.0",
+ "@eslint/css": "^0.8.1",
"@ffmpeg-installer/ffmpeg": "^1.1.0",
"@ffmpeg/core": "^0.12.5",
"@ffmpeg/ffmpeg": "^0.12.10",
@@ -28,9 +29,10 @@
"@fortawesome/free-regular-svg-icons": "^6.5.1",
"@fortawesome/free-solid-svg-icons": "^6.5.1",
"@fortawesome/react-fontawesome": "^0.2.2",
- "@fullcalendar/core": "^6.1.15",
- "@fullcalendar/daygrid": "^6.1.10",
- "@fullcalendar/multimonth": "^6.1.10",
+ "@fullcalendar/core": "^6.1.17",
+ "@fullcalendar/daygrid": "^6.1.17",
+ "@fullcalendar/multimonth": "^6.1.17",
+ "@fullcalendar/react": "^6.1.17",
"@fullcalendar/timegrid": "^6.1.15",
"@internationalized/date": "^3.5.0",
"@mozilla/readability": "^0.6.0",
@@ -108,6 +110,7 @@
"dompurify": "^3.1.7",
"dotenv": "^16.4.7",
"dropbox": "^10.34.0",
+ "eslint-plugin-css-modules": "^2.12.0",
"eslint-webpack-plugin": "^5.0.0",
"exif": "^0.6.0",
"exifr": "^7.1.3",
@@ -243,7 +246,7 @@
"sass-loader": "^16.0.4",
"scrapfly-sdk": "^0.6.4",
"serializr": "^3.0.2",
- "shelljs": "^0.9.1",
+ "shelljs": "^0.10.0",
"socket.io": "^4.7.2",
"socket.io-client": "^4.7.2",
"standard-http-error": "^2.0.1",
@@ -262,7 +265,7 @@
"typescript-collections": "^1.3.3",
"typescript-language-server": "^4.1.3",
"uninstall": "^0.0.0",
- "unstructured-client": "^0.22.0",
+ "unstructured-client": "^0.24.3",
"url": "^0.11.3",
"url-loader": "^4.1.1",
"util": "^0.12.5",
@@ -319,7 +322,7 @@
"@types/react-dom": "^18.2.17",
"@types/react-grid-layout": "^1.3.5",
"@types/react-measure": "^2.0.12",
- "@types/react-reconciler": "^0.31.0",
+ "@types/react-reconciler": "^0.32.0",
"@types/request": "^2.48.12",
"@types/request-promise": "^4.1.51",
"@types/shelljs": "^0.8.15",
@@ -350,81 +353,81 @@
}
},
"node_modules/@adobe/css-tools": {
- "version": "4.4.2",
- "resolved": "https://registry.npmjs.org/@adobe/css-tools/-/css-tools-4.4.2.tgz",
- "integrity": "sha512-baYZExFpsdkBNuvGKTKWCwKH57HRZLVtycZS05WTQNVOiXVSeAki3nU35zlRbToeMW8aHlJfyS+1C4BOv27q0A==",
+ "version": "4.4.3",
+ "resolved": "https://registry.npmjs.org/@adobe/css-tools/-/css-tools-4.4.3.tgz",
+ "integrity": "sha512-VQKMkwriZbaOgVCby1UDY/LDk5fIjhQicCvVPFqfe+69fWaPWydbWJ3wRt59/YzIwda1I81loas3oCoHxnqvdA==",
"dev": true,
"license": "MIT"
},
"node_modules/@adobe/react-spectrum": {
- "version": "3.41.0",
- "resolved": "https://registry.npmjs.org/@adobe/react-spectrum/-/react-spectrum-3.41.0.tgz",
- "integrity": "sha512-hueQDTZK89OgptjHZb1TbDKSi6urafOQDvHj0ZKkdGThsKEePoVhAvpaz6l2w+dBNNUL5XlYFUc1qrE+sgdK2w==",
+ "version": "3.42.0",
+ "resolved": "https://registry.npmjs.org/@adobe/react-spectrum/-/react-spectrum-3.42.0.tgz",
+ "integrity": "sha512-kpn6qaBeF70Fvqc8GYyFXzOmH1DFpkV4N2daQwI3iwSPi/0VhHmB9AOaWftNNIknAyL4D1Oix/C+R8tTP3MzTw==",
"license": "Apache-2.0",
"dependencies": {
"@internationalized/string": "^3.2.6",
- "@react-aria/collections": "3.0.0-rc.0",
- "@react-aria/i18n": "^3.12.8",
+ "@react-aria/collections": "3.0.0-rc.1",
+ "@react-aria/i18n": "^3.12.9",
"@react-aria/ssr": "^3.9.8",
- "@react-aria/utils": "^3.28.2",
- "@react-aria/visually-hidden": "^3.8.22",
- "@react-spectrum/accordion": "^3.0.5",
- "@react-spectrum/actionbar": "^3.6.6",
- "@react-spectrum/actiongroup": "^3.10.14",
- "@react-spectrum/avatar": "^3.0.21",
- "@react-spectrum/badge": "^3.1.22",
- "@react-spectrum/breadcrumbs": "^3.9.16",
- "@react-spectrum/button": "^3.16.13",
- "@react-spectrum/buttongroup": "^3.6.21",
- "@react-spectrum/calendar": "^3.7.0",
- "@react-spectrum/checkbox": "^3.9.15",
- "@react-spectrum/color": "^3.0.6",
- "@react-spectrum/combobox": "^3.15.2",
- "@react-spectrum/contextualhelp": "^3.6.20",
- "@react-spectrum/datepicker": "^3.14.0",
- "@react-spectrum/dialog": "^3.8.20",
- "@react-spectrum/divider": "^3.5.22",
- "@react-spectrum/dnd": "^3.5.4",
- "@react-spectrum/dropzone": "^3.0.10",
- "@react-spectrum/filetrigger": "^3.0.10",
- "@react-spectrum/form": "^3.7.14",
- "@react-spectrum/icon": "^3.8.4",
- "@react-spectrum/illustratedmessage": "^3.5.9",
- "@react-spectrum/image": "^3.5.10",
- "@react-spectrum/inlinealert": "^3.2.14",
- "@react-spectrum/labeledvalue": "^3.2.2",
- "@react-spectrum/layout": "^3.6.14",
- "@react-spectrum/link": "^3.6.16",
- "@react-spectrum/list": "^3.10.0",
- "@react-spectrum/listbox": "^3.15.0",
- "@react-spectrum/menu": "^3.22.0",
- "@react-spectrum/meter": "^3.5.9",
- "@react-spectrum/numberfield": "^3.9.12",
- "@react-spectrum/overlays": "^5.7.4",
- "@react-spectrum/picker": "^3.15.8",
- "@react-spectrum/progress": "^3.7.15",
- "@react-spectrum/provider": "^3.10.4",
- "@react-spectrum/radio": "^3.7.15",
- "@react-spectrum/searchfield": "^3.8.15",
- "@react-spectrum/slider": "^3.7.4",
- "@react-spectrum/statuslight": "^3.5.21",
- "@react-spectrum/switch": "^3.6.0",
- "@react-spectrum/table": "^3.17.0",
- "@react-spectrum/tabs": "^3.8.19",
- "@react-spectrum/tag": "^3.2.15",
- "@react-spectrum/text": "^3.5.14",
- "@react-spectrum/textfield": "^3.13.2",
- "@react-spectrum/theme-dark": "^3.5.17",
- "@react-spectrum/theme-default": "^3.5.17",
- "@react-spectrum/theme-light": "^3.4.17",
- "@react-spectrum/toast": "^3.0.2",
- "@react-spectrum/tooltip": "^3.7.4",
- "@react-spectrum/tree": "^3.1.0",
- "@react-spectrum/view": "^3.6.18",
- "@react-spectrum/well": "^3.4.22",
- "@react-stately/collections": "^3.12.3",
- "@react-stately/data": "^3.12.3",
- "@react-types/shared": "^3.29.0",
+ "@react-aria/utils": "^3.29.0",
+ "@react-aria/visually-hidden": "^3.8.23",
+ "@react-spectrum/accordion": "^3.0.6",
+ "@react-spectrum/actionbar": "^3.6.7",
+ "@react-spectrum/actiongroup": "^3.10.15",
+ "@react-spectrum/avatar": "^3.0.22",
+ "@react-spectrum/badge": "^3.1.23",
+ "@react-spectrum/breadcrumbs": "^3.9.17",
+ "@react-spectrum/button": "^3.16.14",
+ "@react-spectrum/buttongroup": "^3.6.22",
+ "@react-spectrum/calendar": "^3.7.1",
+ "@react-spectrum/checkbox": "^3.9.16",
+ "@react-spectrum/color": "^3.0.7",
+ "@react-spectrum/combobox": "^3.15.3",
+ "@react-spectrum/contextualhelp": "^3.6.21",
+ "@react-spectrum/datepicker": "^3.14.1",
+ "@react-spectrum/dialog": "^3.8.21",
+ "@react-spectrum/divider": "^3.5.23",
+ "@react-spectrum/dnd": "^3.5.5",
+ "@react-spectrum/dropzone": "^3.0.11",
+ "@react-spectrum/filetrigger": "^3.0.11",
+ "@react-spectrum/form": "^3.7.15",
+ "@react-spectrum/icon": "^3.8.5",
+ "@react-spectrum/illustratedmessage": "^3.5.10",
+ "@react-spectrum/image": "^3.5.11",
+ "@react-spectrum/inlinealert": "^3.2.15",
+ "@react-spectrum/labeledvalue": "^3.2.3",
+ "@react-spectrum/layout": "^3.6.15",
+ "@react-spectrum/link": "^3.6.17",
+ "@react-spectrum/list": "^3.10.1",
+ "@react-spectrum/listbox": "^3.15.1",
+ "@react-spectrum/menu": "^3.22.1",
+ "@react-spectrum/meter": "^3.5.10",
+ "@react-spectrum/numberfield": "^3.9.13",
+ "@react-spectrum/overlays": "^5.7.5",
+ "@react-spectrum/picker": "^3.15.9",
+ "@react-spectrum/progress": "^3.7.16",
+ "@react-spectrum/provider": "^3.10.5",
+ "@react-spectrum/radio": "^3.7.16",
+ "@react-spectrum/searchfield": "^3.8.16",
+ "@react-spectrum/slider": "^3.7.5",
+ "@react-spectrum/statuslight": "^3.5.22",
+ "@react-spectrum/switch": "^3.6.1",
+ "@react-spectrum/table": "^3.17.1",
+ "@react-spectrum/tabs": "^3.8.20",
+ "@react-spectrum/tag": "^3.3.0",
+ "@react-spectrum/text": "^3.5.15",
+ "@react-spectrum/textfield": "^3.13.3",
+ "@react-spectrum/theme-dark": "^3.5.18",
+ "@react-spectrum/theme-default": "^3.5.18",
+ "@react-spectrum/theme-light": "^3.4.18",
+ "@react-spectrum/toast": "^3.0.3",
+ "@react-spectrum/tooltip": "^3.7.5",
+ "@react-spectrum/tree": "^3.1.1",
+ "@react-spectrum/view": "^3.6.19",
+ "@react-spectrum/well": "^3.4.23",
+ "@react-stately/collections": "^3.12.4",
+ "@react-stately/data": "^3.13.0",
+ "@react-types/shared": "^3.29.1",
"client-only": "^0.0.1"
},
"peerDependencies": {
@@ -466,13 +469,13 @@
}
},
"node_modules/@antfu/install-pkg": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/@antfu/install-pkg/-/install-pkg-1.0.0.tgz",
- "integrity": "sha512-xvX6P/lo1B3ej0OsaErAjqgFYzYVcJpamjLAFLYh9vRJngBrMoUG7aVnrGTeqM7yxbyTD5p3F2+0/QUEh8Vzhw==",
+ "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": "^0.2.8",
- "tinyexec": "^0.3.2"
+ "package-manager-detector": "^1.3.0",
+ "tinyexec": "^1.0.1"
},
"funding": {
"url": "https://github.com/sponsors/antfu"
@@ -488,13 +491,13 @@
}
},
"node_modules/@asamuzakjp/css-color": {
- "version": "3.1.2",
- "resolved": "https://registry.npmjs.org/@asamuzakjp/css-color/-/css-color-3.1.2.tgz",
- "integrity": "sha512-nwgc7jPn3LpZ4JWsoHtuwBsad1qSSLDDX634DdG0PBJofIuIEtSWk4KkRmuXyu178tjuHAbwiMNNzwqIyLYxZw==",
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/@asamuzakjp/css-color/-/css-color-3.2.0.tgz",
+ "integrity": "sha512-K1A6z8tS3XsmCMM86xoWdn7Fkdn9m6RSVtocUrJYIwZnFVkng/PvkEoWtOWmP+Scc6saYWHWZYbndEEXxl24jw==",
"license": "MIT",
"dependencies": {
- "@csstools/css-calc": "^2.1.2",
- "@csstools/css-color-parser": "^3.0.8",
+ "@csstools/css-calc": "^2.1.3",
+ "@csstools/css-color-parser": "^3.0.9",
"@csstools/css-parser-algorithms": "^3.0.4",
"@csstools/css-tokenizer": "^3.0.3",
"lru-cache": "^10.4.3"
@@ -660,48 +663,48 @@
}
},
"node_modules/@aws-sdk/client-cognito-identity": {
- "version": "3.787.0",
- "resolved": "https://registry.npmjs.org/@aws-sdk/client-cognito-identity/-/client-cognito-identity-3.787.0.tgz",
- "integrity": "sha512-7v6nywZ5wcQxX7qdZ5M1ld15QdkzLU6fAKiEqbvJKu4dM8cFW6As+DbS990Mg46pp1xM/yvme+51xZDTfTfJZA==",
+ "version": "3.812.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/client-cognito-identity/-/client-cognito-identity-3.812.0.tgz",
+ "integrity": "sha512-LWkP+Vb2f6aNaway06XvFZG3altSXltAClzCz9cTFuOfKG6V2X+0VWsW9cnFRV4+MFFJW3iQAaPMQ1fBO9Rusg==",
"license": "Apache-2.0",
"dependencies": {
"@aws-crypto/sha256-browser": "5.2.0",
"@aws-crypto/sha256-js": "5.2.0",
- "@aws-sdk/core": "3.775.0",
- "@aws-sdk/credential-provider-node": "3.787.0",
- "@aws-sdk/middleware-host-header": "3.775.0",
- "@aws-sdk/middleware-logger": "3.775.0",
- "@aws-sdk/middleware-recursion-detection": "3.775.0",
- "@aws-sdk/middleware-user-agent": "3.787.0",
- "@aws-sdk/region-config-resolver": "3.775.0",
- "@aws-sdk/types": "3.775.0",
- "@aws-sdk/util-endpoints": "3.787.0",
- "@aws-sdk/util-user-agent-browser": "3.775.0",
- "@aws-sdk/util-user-agent-node": "3.787.0",
- "@smithy/config-resolver": "^4.1.0",
- "@smithy/core": "^3.2.0",
+ "@aws-sdk/core": "3.812.0",
+ "@aws-sdk/credential-provider-node": "3.812.0",
+ "@aws-sdk/middleware-host-header": "3.804.0",
+ "@aws-sdk/middleware-logger": "3.804.0",
+ "@aws-sdk/middleware-recursion-detection": "3.804.0",
+ "@aws-sdk/middleware-user-agent": "3.812.0",
+ "@aws-sdk/region-config-resolver": "3.808.0",
+ "@aws-sdk/types": "3.804.0",
+ "@aws-sdk/util-endpoints": "3.808.0",
+ "@aws-sdk/util-user-agent-browser": "3.804.0",
+ "@aws-sdk/util-user-agent-node": "3.812.0",
+ "@smithy/config-resolver": "^4.1.2",
+ "@smithy/core": "^3.3.3",
"@smithy/fetch-http-handler": "^5.0.2",
"@smithy/hash-node": "^4.0.2",
"@smithy/invalid-dependency": "^4.0.2",
"@smithy/middleware-content-length": "^4.0.2",
- "@smithy/middleware-endpoint": "^4.1.0",
- "@smithy/middleware-retry": "^4.1.0",
- "@smithy/middleware-serde": "^4.0.3",
+ "@smithy/middleware-endpoint": "^4.1.6",
+ "@smithy/middleware-retry": "^4.1.7",
+ "@smithy/middleware-serde": "^4.0.5",
"@smithy/middleware-stack": "^4.0.2",
- "@smithy/node-config-provider": "^4.0.2",
+ "@smithy/node-config-provider": "^4.1.1",
"@smithy/node-http-handler": "^4.0.4",
"@smithy/protocol-http": "^5.1.0",
- "@smithy/smithy-client": "^4.2.0",
+ "@smithy/smithy-client": "^4.2.6",
"@smithy/types": "^4.2.0",
"@smithy/url-parser": "^4.0.2",
"@smithy/util-base64": "^4.0.0",
"@smithy/util-body-length-browser": "^4.0.0",
"@smithy/util-body-length-node": "^4.0.0",
- "@smithy/util-defaults-mode-browser": "^4.0.8",
- "@smithy/util-defaults-mode-node": "^4.0.8",
- "@smithy/util-endpoints": "^3.0.2",
+ "@smithy/util-defaults-mode-browser": "^4.0.14",
+ "@smithy/util-defaults-mode-node": "^4.0.14",
+ "@smithy/util-endpoints": "^3.0.4",
"@smithy/util-middleware": "^4.0.2",
- "@smithy/util-retry": "^4.0.2",
+ "@smithy/util-retry": "^4.0.3",
"@smithy/util-utf8": "^4.0.0",
"tslib": "^2.6.2"
},
@@ -710,48 +713,48 @@
}
},
"node_modules/@aws-sdk/client-sagemaker": {
- "version": "3.787.0",
- "resolved": "https://registry.npmjs.org/@aws-sdk/client-sagemaker/-/client-sagemaker-3.787.0.tgz",
- "integrity": "sha512-uHmF6MiMus+OjFfVnkYs46CkExjUp6kZGB/gFjwiq5IU+DGnkIlmfbOlRuIlLflqPuADPcbiTiNi4IjluHGqVA==",
+ "version": "3.812.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/client-sagemaker/-/client-sagemaker-3.812.0.tgz",
+ "integrity": "sha512-KX+/Iu8Cde32low/0c+MGx03CShRJ9PB57qJtPtG6qgz0PeZc8e+t6lBjyZt33iUKZ25/Mt9277tXaSmxGpktw==",
"license": "Apache-2.0",
"dependencies": {
"@aws-crypto/sha256-browser": "5.2.0",
"@aws-crypto/sha256-js": "5.2.0",
- "@aws-sdk/core": "3.775.0",
- "@aws-sdk/credential-provider-node": "3.787.0",
- "@aws-sdk/middleware-host-header": "3.775.0",
- "@aws-sdk/middleware-logger": "3.775.0",
- "@aws-sdk/middleware-recursion-detection": "3.775.0",
- "@aws-sdk/middleware-user-agent": "3.787.0",
- "@aws-sdk/region-config-resolver": "3.775.0",
- "@aws-sdk/types": "3.775.0",
- "@aws-sdk/util-endpoints": "3.787.0",
- "@aws-sdk/util-user-agent-browser": "3.775.0",
- "@aws-sdk/util-user-agent-node": "3.787.0",
- "@smithy/config-resolver": "^4.1.0",
- "@smithy/core": "^3.2.0",
+ "@aws-sdk/core": "3.812.0",
+ "@aws-sdk/credential-provider-node": "3.812.0",
+ "@aws-sdk/middleware-host-header": "3.804.0",
+ "@aws-sdk/middleware-logger": "3.804.0",
+ "@aws-sdk/middleware-recursion-detection": "3.804.0",
+ "@aws-sdk/middleware-user-agent": "3.812.0",
+ "@aws-sdk/region-config-resolver": "3.808.0",
+ "@aws-sdk/types": "3.804.0",
+ "@aws-sdk/util-endpoints": "3.808.0",
+ "@aws-sdk/util-user-agent-browser": "3.804.0",
+ "@aws-sdk/util-user-agent-node": "3.812.0",
+ "@smithy/config-resolver": "^4.1.2",
+ "@smithy/core": "^3.3.3",
"@smithy/fetch-http-handler": "^5.0.2",
"@smithy/hash-node": "^4.0.2",
"@smithy/invalid-dependency": "^4.0.2",
"@smithy/middleware-content-length": "^4.0.2",
- "@smithy/middleware-endpoint": "^4.1.0",
- "@smithy/middleware-retry": "^4.1.0",
- "@smithy/middleware-serde": "^4.0.3",
+ "@smithy/middleware-endpoint": "^4.1.6",
+ "@smithy/middleware-retry": "^4.1.7",
+ "@smithy/middleware-serde": "^4.0.5",
"@smithy/middleware-stack": "^4.0.2",
- "@smithy/node-config-provider": "^4.0.2",
+ "@smithy/node-config-provider": "^4.1.1",
"@smithy/node-http-handler": "^4.0.4",
"@smithy/protocol-http": "^5.1.0",
- "@smithy/smithy-client": "^4.2.0",
+ "@smithy/smithy-client": "^4.2.6",
"@smithy/types": "^4.2.0",
"@smithy/url-parser": "^4.0.2",
"@smithy/util-base64": "^4.0.0",
"@smithy/util-body-length-browser": "^4.0.0",
"@smithy/util-body-length-node": "^4.0.0",
- "@smithy/util-defaults-mode-browser": "^4.0.8",
- "@smithy/util-defaults-mode-node": "^4.0.8",
- "@smithy/util-endpoints": "^3.0.2",
+ "@smithy/util-defaults-mode-browser": "^4.0.14",
+ "@smithy/util-defaults-mode-node": "^4.0.14",
+ "@smithy/util-endpoints": "^3.0.4",
"@smithy/util-middleware": "^4.0.2",
- "@smithy/util-retry": "^4.0.2",
+ "@smithy/util-retry": "^4.0.3",
"@smithy/util-utf8": "^4.0.0",
"@smithy/util-waiter": "^4.0.3",
"@types/uuid": "^9.0.1",
@@ -782,47 +785,47 @@
}
},
"node_modules/@aws-sdk/client-sso": {
- "version": "3.787.0",
- "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.787.0.tgz",
- "integrity": "sha512-L8R+Mh258G0DC73ktpSVrG4TT9i2vmDLecARTDR/4q5sRivdDQSL5bUp3LKcK80Bx+FRw3UETIlX6mYMLL9PJQ==",
+ "version": "3.812.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.812.0.tgz",
+ "integrity": "sha512-O//smQRj1+RXELB7xX54s5pZB0V69KHXpUZmz8V+8GAYO1FKTHfbpUgK+zyMNb+lFZxG9B69yl8pWPZ/K8bvxA==",
"license": "Apache-2.0",
"dependencies": {
"@aws-crypto/sha256-browser": "5.2.0",
"@aws-crypto/sha256-js": "5.2.0",
- "@aws-sdk/core": "3.775.0",
- "@aws-sdk/middleware-host-header": "3.775.0",
- "@aws-sdk/middleware-logger": "3.775.0",
- "@aws-sdk/middleware-recursion-detection": "3.775.0",
- "@aws-sdk/middleware-user-agent": "3.787.0",
- "@aws-sdk/region-config-resolver": "3.775.0",
- "@aws-sdk/types": "3.775.0",
- "@aws-sdk/util-endpoints": "3.787.0",
- "@aws-sdk/util-user-agent-browser": "3.775.0",
- "@aws-sdk/util-user-agent-node": "3.787.0",
- "@smithy/config-resolver": "^4.1.0",
- "@smithy/core": "^3.2.0",
+ "@aws-sdk/core": "3.812.0",
+ "@aws-sdk/middleware-host-header": "3.804.0",
+ "@aws-sdk/middleware-logger": "3.804.0",
+ "@aws-sdk/middleware-recursion-detection": "3.804.0",
+ "@aws-sdk/middleware-user-agent": "3.812.0",
+ "@aws-sdk/region-config-resolver": "3.808.0",
+ "@aws-sdk/types": "3.804.0",
+ "@aws-sdk/util-endpoints": "3.808.0",
+ "@aws-sdk/util-user-agent-browser": "3.804.0",
+ "@aws-sdk/util-user-agent-node": "3.812.0",
+ "@smithy/config-resolver": "^4.1.2",
+ "@smithy/core": "^3.3.3",
"@smithy/fetch-http-handler": "^5.0.2",
"@smithy/hash-node": "^4.0.2",
"@smithy/invalid-dependency": "^4.0.2",
"@smithy/middleware-content-length": "^4.0.2",
- "@smithy/middleware-endpoint": "^4.1.0",
- "@smithy/middleware-retry": "^4.1.0",
- "@smithy/middleware-serde": "^4.0.3",
+ "@smithy/middleware-endpoint": "^4.1.6",
+ "@smithy/middleware-retry": "^4.1.7",
+ "@smithy/middleware-serde": "^4.0.5",
"@smithy/middleware-stack": "^4.0.2",
- "@smithy/node-config-provider": "^4.0.2",
+ "@smithy/node-config-provider": "^4.1.1",
"@smithy/node-http-handler": "^4.0.4",
"@smithy/protocol-http": "^5.1.0",
- "@smithy/smithy-client": "^4.2.0",
+ "@smithy/smithy-client": "^4.2.6",
"@smithy/types": "^4.2.0",
"@smithy/url-parser": "^4.0.2",
"@smithy/util-base64": "^4.0.0",
"@smithy/util-body-length-browser": "^4.0.0",
"@smithy/util-body-length-node": "^4.0.0",
- "@smithy/util-defaults-mode-browser": "^4.0.8",
- "@smithy/util-defaults-mode-node": "^4.0.8",
- "@smithy/util-endpoints": "^3.0.2",
+ "@smithy/util-defaults-mode-browser": "^4.0.14",
+ "@smithy/util-defaults-mode-node": "^4.0.14",
+ "@smithy/util-endpoints": "^3.0.4",
"@smithy/util-middleware": "^4.0.2",
- "@smithy/util-retry": "^4.0.2",
+ "@smithy/util-retry": "^4.0.3",
"@smithy/util-utf8": "^4.0.0",
"tslib": "^2.6.2"
},
@@ -831,18 +834,18 @@
}
},
"node_modules/@aws-sdk/core": {
- "version": "3.775.0",
- "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.775.0.tgz",
- "integrity": "sha512-8vpW4WihVfz0DX+7WnnLGm3GuQER++b0IwQG35JlQMlgqnc44M//KbJPsIHA0aJUJVwJAEShgfr5dUbY8WUzaA==",
+ "version": "3.812.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.812.0.tgz",
+ "integrity": "sha512-myWA9oHMBVDObKrxG+puAkIGs8igcWInQ1PWCRTS/zN4BkhUMFjjh/JPV/4Vzvtvj5E36iujq2WtlrDLl1PpOw==",
"license": "Apache-2.0",
"dependencies": {
- "@aws-sdk/types": "3.775.0",
- "@smithy/core": "^3.2.0",
- "@smithy/node-config-provider": "^4.0.2",
+ "@aws-sdk/types": "3.804.0",
+ "@smithy/core": "^3.3.3",
+ "@smithy/node-config-provider": "^4.1.1",
"@smithy/property-provider": "^4.0.2",
"@smithy/protocol-http": "^5.1.0",
- "@smithy/signature-v4": "^5.0.2",
- "@smithy/smithy-client": "^4.2.0",
+ "@smithy/signature-v4": "^5.1.0",
+ "@smithy/smithy-client": "^4.2.6",
"@smithy/types": "^4.2.0",
"@smithy/util-middleware": "^4.0.2",
"fast-xml-parser": "4.4.1",
@@ -887,13 +890,13 @@
"license": "MIT"
},
"node_modules/@aws-sdk/credential-provider-cognito-identity": {
- "version": "3.787.0",
- "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-cognito-identity/-/credential-provider-cognito-identity-3.787.0.tgz",
- "integrity": "sha512-nF5XjgvZHFuyttOeTjMgfEsg6slZPQ6uI34yzq12Kq4icFgcD4bQsijnQClMN7A0u5qR8Ad8kume4b7+I2++Ig==",
+ "version": "3.812.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-cognito-identity/-/credential-provider-cognito-identity-3.812.0.tgz",
+ "integrity": "sha512-SrEGXP1zs2Cy3jjOwM8eh+UZkr28z7rvjF+cgV4bpOti5F/mzPyVoIxDkG8BQ2sZdAwa9rgEhhOl4CcKjoJoTA==",
"license": "Apache-2.0",
"dependencies": {
- "@aws-sdk/client-cognito-identity": "3.787.0",
- "@aws-sdk/types": "3.775.0",
+ "@aws-sdk/client-cognito-identity": "3.812.0",
+ "@aws-sdk/types": "3.804.0",
"@smithy/property-provider": "^4.0.2",
"@smithy/types": "^4.2.0",
"tslib": "^2.6.2"
@@ -903,13 +906,13 @@
}
},
"node_modules/@aws-sdk/credential-provider-env": {
- "version": "3.775.0",
- "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.775.0.tgz",
- "integrity": "sha512-6ESVxwCbGm7WZ17kY1fjmxQud43vzJFoLd4bmlR+idQSWdqlzGDYdcfzpjDKTcivdtNrVYmFvcH1JBUwCRAZhw==",
+ "version": "3.812.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.812.0.tgz",
+ "integrity": "sha512-Ge7IEu06ANurGBZx39q9CNN/ncqb1K8lpKZCY969uNWO0/7YPhnplrRJGMZYIS35nD2mBm3ortEKjY/wMZZd5g==",
"license": "Apache-2.0",
"dependencies": {
- "@aws-sdk/core": "3.775.0",
- "@aws-sdk/types": "3.775.0",
+ "@aws-sdk/core": "3.812.0",
+ "@aws-sdk/types": "3.804.0",
"@smithy/property-provider": "^4.0.2",
"@smithy/types": "^4.2.0",
"tslib": "^2.6.2"
@@ -919,18 +922,18 @@
}
},
"node_modules/@aws-sdk/credential-provider-http": {
- "version": "3.775.0",
- "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.775.0.tgz",
- "integrity": "sha512-PjDQeDH/J1S0yWV32wCj2k5liRo0ssXMseCBEkCsD3SqsU8o5cU82b0hMX4sAib/RkglCSZqGO0xMiN0/7ndww==",
+ "version": "3.812.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.812.0.tgz",
+ "integrity": "sha512-Vux2U42vPGXeE407Lp6v3yVA65J7hBO9rB67LXshyGVi7VZLAYWc4mrZxNJNqabEkjcDEmMQQakLPT6zc5SvFw==",
"license": "Apache-2.0",
"dependencies": {
- "@aws-sdk/core": "3.775.0",
- "@aws-sdk/types": "3.775.0",
+ "@aws-sdk/core": "3.812.0",
+ "@aws-sdk/types": "3.804.0",
"@smithy/fetch-http-handler": "^5.0.2",
"@smithy/node-http-handler": "^4.0.4",
"@smithy/property-provider": "^4.0.2",
"@smithy/protocol-http": "^5.1.0",
- "@smithy/smithy-client": "^4.2.0",
+ "@smithy/smithy-client": "^4.2.6",
"@smithy/types": "^4.2.0",
"@smithy/util-stream": "^4.2.0",
"tslib": "^2.6.2"
@@ -940,20 +943,20 @@
}
},
"node_modules/@aws-sdk/credential-provider-ini": {
- "version": "3.787.0",
- "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.787.0.tgz",
- "integrity": "sha512-hc2taRoDlXn2uuNuHWDJljVWYrp3r9JF1a/8XmOAZhVUNY+ImeeStylHXhXXKEA4JOjW+5PdJj0f1UDkVCHJiQ==",
- "license": "Apache-2.0",
- "dependencies": {
- "@aws-sdk/core": "3.775.0",
- "@aws-sdk/credential-provider-env": "3.775.0",
- "@aws-sdk/credential-provider-http": "3.775.0",
- "@aws-sdk/credential-provider-process": "3.775.0",
- "@aws-sdk/credential-provider-sso": "3.787.0",
- "@aws-sdk/credential-provider-web-identity": "3.787.0",
- "@aws-sdk/nested-clients": "3.787.0",
- "@aws-sdk/types": "3.775.0",
- "@smithy/credential-provider-imds": "^4.0.2",
+ "version": "3.812.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.812.0.tgz",
+ "integrity": "sha512-oltqGvQ488xtPY5wrNjbD+qQYYkuCjn30IDE1qKMxJ58EM6UVTQl3XV44Xq07xfF5gKwVJQkfIyOkRAguOVybg==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@aws-sdk/core": "3.812.0",
+ "@aws-sdk/credential-provider-env": "3.812.0",
+ "@aws-sdk/credential-provider-http": "3.812.0",
+ "@aws-sdk/credential-provider-process": "3.812.0",
+ "@aws-sdk/credential-provider-sso": "3.812.0",
+ "@aws-sdk/credential-provider-web-identity": "3.812.0",
+ "@aws-sdk/nested-clients": "3.812.0",
+ "@aws-sdk/types": "3.804.0",
+ "@smithy/credential-provider-imds": "^4.0.4",
"@smithy/property-provider": "^4.0.2",
"@smithy/shared-ini-file-loader": "^4.0.2",
"@smithy/types": "^4.2.0",
@@ -964,19 +967,19 @@
}
},
"node_modules/@aws-sdk/credential-provider-node": {
- "version": "3.787.0",
- "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.787.0.tgz",
- "integrity": "sha512-JioVi44B1vDMaK2CdzqimwvJD3uzvzbQhaEWXsGMBcMcNHajXAXf08EF50JG3ZhLrhhUsT1ObXpbTaPINOhh+g==",
- "license": "Apache-2.0",
- "dependencies": {
- "@aws-sdk/credential-provider-env": "3.775.0",
- "@aws-sdk/credential-provider-http": "3.775.0",
- "@aws-sdk/credential-provider-ini": "3.787.0",
- "@aws-sdk/credential-provider-process": "3.775.0",
- "@aws-sdk/credential-provider-sso": "3.787.0",
- "@aws-sdk/credential-provider-web-identity": "3.787.0",
- "@aws-sdk/types": "3.775.0",
- "@smithy/credential-provider-imds": "^4.0.2",
+ "version": "3.812.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.812.0.tgz",
+ "integrity": "sha512-SnvSWBP6cr9nqx784eETnL2Zl7ZnMB/oJgFVEG1aejAGbT1H9gTpMwuUsBXk4u/mEYe3f1lh1Wqo+HwDgNkfrg==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@aws-sdk/credential-provider-env": "3.812.0",
+ "@aws-sdk/credential-provider-http": "3.812.0",
+ "@aws-sdk/credential-provider-ini": "3.812.0",
+ "@aws-sdk/credential-provider-process": "3.812.0",
+ "@aws-sdk/credential-provider-sso": "3.812.0",
+ "@aws-sdk/credential-provider-web-identity": "3.812.0",
+ "@aws-sdk/types": "3.804.0",
+ "@smithy/credential-provider-imds": "^4.0.4",
"@smithy/property-provider": "^4.0.2",
"@smithy/shared-ini-file-loader": "^4.0.2",
"@smithy/types": "^4.2.0",
@@ -987,13 +990,13 @@
}
},
"node_modules/@aws-sdk/credential-provider-process": {
- "version": "3.775.0",
- "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.775.0.tgz",
- "integrity": "sha512-A6k68H9rQp+2+7P7SGO90Csw6nrUEm0Qfjpn9Etc4EboZhhCLs9b66umUsTsSBHus4FDIe5JQxfCUyt1wgNogg==",
+ "version": "3.812.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.812.0.tgz",
+ "integrity": "sha512-YI8bb153XeEOb59F9KtTZEwDAc14s2YHZz58+OFiJ2udnKsPV87mNiFhJPW6ba9nmOLXVat5XDcwtVT1b664wg==",
"license": "Apache-2.0",
"dependencies": {
- "@aws-sdk/core": "3.775.0",
- "@aws-sdk/types": "3.775.0",
+ "@aws-sdk/core": "3.812.0",
+ "@aws-sdk/types": "3.804.0",
"@smithy/property-provider": "^4.0.2",
"@smithy/shared-ini-file-loader": "^4.0.2",
"@smithy/types": "^4.2.0",
@@ -1004,15 +1007,15 @@
}
},
"node_modules/@aws-sdk/credential-provider-sso": {
- "version": "3.787.0",
- "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.787.0.tgz",
- "integrity": "sha512-fHc08bsvwm4+dEMEQKnQ7c1irEQmmxbgS+Fq41y09pPvPh31nAhoMcjBSTWAaPHvvsRbTYvmP4Mf12ZGr8/nfg==",
+ "version": "3.812.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.812.0.tgz",
+ "integrity": "sha512-ODsPcNhgiO6GOa82TVNskM97mml9rioe9Cbhemz48lkfDQPv1u06NaCR0o3FsvprX1sEhMvJTR3sE1fyEOzvJQ==",
"license": "Apache-2.0",
"dependencies": {
- "@aws-sdk/client-sso": "3.787.0",
- "@aws-sdk/core": "3.775.0",
- "@aws-sdk/token-providers": "3.787.0",
- "@aws-sdk/types": "3.775.0",
+ "@aws-sdk/client-sso": "3.812.0",
+ "@aws-sdk/core": "3.812.0",
+ "@aws-sdk/token-providers": "3.812.0",
+ "@aws-sdk/types": "3.804.0",
"@smithy/property-provider": "^4.0.2",
"@smithy/shared-ini-file-loader": "^4.0.2",
"@smithy/types": "^4.2.0",
@@ -1023,14 +1026,14 @@
}
},
"node_modules/@aws-sdk/credential-provider-web-identity": {
- "version": "3.787.0",
- "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.787.0.tgz",
- "integrity": "sha512-SobmCwNbk6TfEsF283mZPQEI5vV2j6eY5tOCj8Er4Lzraxu9fBPADV+Bib2A8F6jlB1lMPJzOuDCbEasSt/RIw==",
+ "version": "3.812.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.812.0.tgz",
+ "integrity": "sha512-E9Bmiujvm/Hp9DM/Vc1S+D0pQbx8/x4dR/zyAEZU9EoRq0duQOQ1reWYWbebYmL1OklcVpTfKV0a/VCwuAtGSg==",
"license": "Apache-2.0",
"dependencies": {
- "@aws-sdk/core": "3.775.0",
- "@aws-sdk/nested-clients": "3.787.0",
- "@aws-sdk/types": "3.775.0",
+ "@aws-sdk/core": "3.812.0",
+ "@aws-sdk/nested-clients": "3.812.0",
+ "@aws-sdk/types": "3.804.0",
"@smithy/property-provider": "^4.0.2",
"@smithy/types": "^4.2.0",
"tslib": "^2.6.2"
@@ -1040,27 +1043,27 @@
}
},
"node_modules/@aws-sdk/credential-providers": {
- "version": "3.787.0",
- "resolved": "https://registry.npmjs.org/@aws-sdk/credential-providers/-/credential-providers-3.787.0.tgz",
- "integrity": "sha512-kR3RtI7drOc9pho13vWbUC2Bvrx9A0G4iizBDGmTs08NOdg4w3c1I4kdLG9tyPiIMeVnH+wYrsli5CM7xIfqiA==",
- "license": "Apache-2.0",
- "dependencies": {
- "@aws-sdk/client-cognito-identity": "3.787.0",
- "@aws-sdk/core": "3.775.0",
- "@aws-sdk/credential-provider-cognito-identity": "3.787.0",
- "@aws-sdk/credential-provider-env": "3.775.0",
- "@aws-sdk/credential-provider-http": "3.775.0",
- "@aws-sdk/credential-provider-ini": "3.787.0",
- "@aws-sdk/credential-provider-node": "3.787.0",
- "@aws-sdk/credential-provider-process": "3.775.0",
- "@aws-sdk/credential-provider-sso": "3.787.0",
- "@aws-sdk/credential-provider-web-identity": "3.787.0",
- "@aws-sdk/nested-clients": "3.787.0",
- "@aws-sdk/types": "3.775.0",
- "@smithy/config-resolver": "^4.1.0",
- "@smithy/core": "^3.2.0",
- "@smithy/credential-provider-imds": "^4.0.2",
- "@smithy/node-config-provider": "^4.0.2",
+ "version": "3.812.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/credential-providers/-/credential-providers-3.812.0.tgz",
+ "integrity": "sha512-hT7Kr8Ao+NS9b8KCB/U8cmpr0DcWOZNZNRBGAOc4eq65JpsRv177QmSqjh75vhM9BzchH3VymcP4GeMoy4SuvA==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@aws-sdk/client-cognito-identity": "3.812.0",
+ "@aws-sdk/core": "3.812.0",
+ "@aws-sdk/credential-provider-cognito-identity": "3.812.0",
+ "@aws-sdk/credential-provider-env": "3.812.0",
+ "@aws-sdk/credential-provider-http": "3.812.0",
+ "@aws-sdk/credential-provider-ini": "3.812.0",
+ "@aws-sdk/credential-provider-node": "3.812.0",
+ "@aws-sdk/credential-provider-process": "3.812.0",
+ "@aws-sdk/credential-provider-sso": "3.812.0",
+ "@aws-sdk/credential-provider-web-identity": "3.812.0",
+ "@aws-sdk/nested-clients": "3.812.0",
+ "@aws-sdk/types": "3.804.0",
+ "@smithy/config-resolver": "^4.1.2",
+ "@smithy/core": "^3.3.3",
+ "@smithy/credential-provider-imds": "^4.0.4",
+ "@smithy/node-config-provider": "^4.1.1",
"@smithy/property-provider": "^4.0.2",
"@smithy/types": "^4.2.0",
"tslib": "^2.6.2"
@@ -1070,12 +1073,12 @@
}
},
"node_modules/@aws-sdk/middleware-host-header": {
- "version": "3.775.0",
- "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.775.0.tgz",
- "integrity": "sha512-tkSegM0Z6WMXpLB8oPys/d+umYIocvO298mGvcMCncpRl77L9XkvSLJIFzaHes+o7djAgIduYw8wKIMStFss2w==",
+ "version": "3.804.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.804.0.tgz",
+ "integrity": "sha512-bum1hLVBrn2lJCi423Z2fMUYtsbkGI2s4N+2RI2WSjvbaVyMSv/WcejIrjkqiiMR+2Y7m5exgoKeg4/TODLDPQ==",
"license": "Apache-2.0",
"dependencies": {
- "@aws-sdk/types": "3.775.0",
+ "@aws-sdk/types": "3.804.0",
"@smithy/protocol-http": "^5.1.0",
"@smithy/types": "^4.2.0",
"tslib": "^2.6.2"
@@ -1085,12 +1088,12 @@
}
},
"node_modules/@aws-sdk/middleware-logger": {
- "version": "3.775.0",
- "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.775.0.tgz",
- "integrity": "sha512-FaxO1xom4MAoUJsldmR92nT1G6uZxTdNYOFYtdHfd6N2wcNaTuxgjIvqzg5y7QIH9kn58XX/dzf1iTjgqUStZw==",
+ "version": "3.804.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.804.0.tgz",
+ "integrity": "sha512-w/qLwL3iq0KOPQNat0Kb7sKndl9BtceigINwBU7SpkYWX9L/Lem6f8NPEKrC9Tl4wDBht3Yztub4oRTy/horJA==",
"license": "Apache-2.0",
"dependencies": {
- "@aws-sdk/types": "3.775.0",
+ "@aws-sdk/types": "3.804.0",
"@smithy/types": "^4.2.0",
"tslib": "^2.6.2"
},
@@ -1099,12 +1102,12 @@
}
},
"node_modules/@aws-sdk/middleware-recursion-detection": {
- "version": "3.775.0",
- "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.775.0.tgz",
- "integrity": "sha512-GLCzC8D0A0YDG5u3F5U03Vb9j5tcOEFhr8oc6PDk0k0vm5VwtZOE6LvK7hcCSoAB4HXyOUM0sQuXrbaAh9OwXA==",
+ "version": "3.804.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.804.0.tgz",
+ "integrity": "sha512-zqHOrvLRdsUdN/ehYfZ9Tf8svhbiLLz5VaWUz22YndFv6m9qaAcijkpAOlKexsv3nLBMJdSdJ6GUTAeIy3BZzw==",
"license": "Apache-2.0",
"dependencies": {
- "@aws-sdk/types": "3.775.0",
+ "@aws-sdk/types": "3.804.0",
"@smithy/protocol-http": "^5.1.0",
"@smithy/types": "^4.2.0",
"tslib": "^2.6.2"
@@ -1114,15 +1117,15 @@
}
},
"node_modules/@aws-sdk/middleware-user-agent": {
- "version": "3.787.0",
- "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.787.0.tgz",
- "integrity": "sha512-Lnfj8SmPLYtrDFthNIaNj66zZsBCam+E4XiUDr55DIHTGstH6qZ/q6vg0GfbukxwSmUcGMwSR4Qbn8rb8yd77g==",
+ "version": "3.812.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.812.0.tgz",
+ "integrity": "sha512-r+HFwtSvnAs6Fydp4mijylrTX0og9p/xfxOcKsqhMuk3HpZAIcf9sSjRQI6MBusYklg7pnM4sGEnPAZIrdRotA==",
"license": "Apache-2.0",
"dependencies": {
- "@aws-sdk/core": "3.775.0",
- "@aws-sdk/types": "3.775.0",
- "@aws-sdk/util-endpoints": "3.787.0",
- "@smithy/core": "^3.2.0",
+ "@aws-sdk/core": "3.812.0",
+ "@aws-sdk/types": "3.804.0",
+ "@aws-sdk/util-endpoints": "3.808.0",
+ "@smithy/core": "^3.3.3",
"@smithy/protocol-http": "^5.1.0",
"@smithy/types": "^4.2.0",
"tslib": "^2.6.2"
@@ -1132,47 +1135,47 @@
}
},
"node_modules/@aws-sdk/nested-clients": {
- "version": "3.787.0",
- "resolved": "https://registry.npmjs.org/@aws-sdk/nested-clients/-/nested-clients-3.787.0.tgz",
- "integrity": "sha512-xk03q1xpKNHgbuo+trEf1dFrI239kuMmjKKsqLEsHlAZbuFq4yRGMlHBrVMnKYOPBhVFDS/VineM991XI52fKg==",
+ "version": "3.812.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/nested-clients/-/nested-clients-3.812.0.tgz",
+ "integrity": "sha512-FS/fImbEpJU3cXtBGR9fyVd+CP51eNKlvTMi3f4/6lSk3RmHjudNC9yEF/og3jtpT3O+7vsNOUW9mHco5IjdQQ==",
"license": "Apache-2.0",
"dependencies": {
"@aws-crypto/sha256-browser": "5.2.0",
"@aws-crypto/sha256-js": "5.2.0",
- "@aws-sdk/core": "3.775.0",
- "@aws-sdk/middleware-host-header": "3.775.0",
- "@aws-sdk/middleware-logger": "3.775.0",
- "@aws-sdk/middleware-recursion-detection": "3.775.0",
- "@aws-sdk/middleware-user-agent": "3.787.0",
- "@aws-sdk/region-config-resolver": "3.775.0",
- "@aws-sdk/types": "3.775.0",
- "@aws-sdk/util-endpoints": "3.787.0",
- "@aws-sdk/util-user-agent-browser": "3.775.0",
- "@aws-sdk/util-user-agent-node": "3.787.0",
- "@smithy/config-resolver": "^4.1.0",
- "@smithy/core": "^3.2.0",
+ "@aws-sdk/core": "3.812.0",
+ "@aws-sdk/middleware-host-header": "3.804.0",
+ "@aws-sdk/middleware-logger": "3.804.0",
+ "@aws-sdk/middleware-recursion-detection": "3.804.0",
+ "@aws-sdk/middleware-user-agent": "3.812.0",
+ "@aws-sdk/region-config-resolver": "3.808.0",
+ "@aws-sdk/types": "3.804.0",
+ "@aws-sdk/util-endpoints": "3.808.0",
+ "@aws-sdk/util-user-agent-browser": "3.804.0",
+ "@aws-sdk/util-user-agent-node": "3.812.0",
+ "@smithy/config-resolver": "^4.1.2",
+ "@smithy/core": "^3.3.3",
"@smithy/fetch-http-handler": "^5.0.2",
"@smithy/hash-node": "^4.0.2",
"@smithy/invalid-dependency": "^4.0.2",
"@smithy/middleware-content-length": "^4.0.2",
- "@smithy/middleware-endpoint": "^4.1.0",
- "@smithy/middleware-retry": "^4.1.0",
- "@smithy/middleware-serde": "^4.0.3",
+ "@smithy/middleware-endpoint": "^4.1.6",
+ "@smithy/middleware-retry": "^4.1.7",
+ "@smithy/middleware-serde": "^4.0.5",
"@smithy/middleware-stack": "^4.0.2",
- "@smithy/node-config-provider": "^4.0.2",
+ "@smithy/node-config-provider": "^4.1.1",
"@smithy/node-http-handler": "^4.0.4",
"@smithy/protocol-http": "^5.1.0",
- "@smithy/smithy-client": "^4.2.0",
+ "@smithy/smithy-client": "^4.2.6",
"@smithy/types": "^4.2.0",
"@smithy/url-parser": "^4.0.2",
"@smithy/util-base64": "^4.0.0",
"@smithy/util-body-length-browser": "^4.0.0",
"@smithy/util-body-length-node": "^4.0.0",
- "@smithy/util-defaults-mode-browser": "^4.0.8",
- "@smithy/util-defaults-mode-node": "^4.0.8",
- "@smithy/util-endpoints": "^3.0.2",
+ "@smithy/util-defaults-mode-browser": "^4.0.14",
+ "@smithy/util-defaults-mode-node": "^4.0.14",
+ "@smithy/util-endpoints": "^3.0.4",
"@smithy/util-middleware": "^4.0.2",
- "@smithy/util-retry": "^4.0.2",
+ "@smithy/util-retry": "^4.0.3",
"@smithy/util-utf8": "^4.0.0",
"tslib": "^2.6.2"
},
@@ -1220,13 +1223,13 @@
}
},
"node_modules/@aws-sdk/region-config-resolver": {
- "version": "3.775.0",
- "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.775.0.tgz",
- "integrity": "sha512-40iH3LJjrQS3LKUJAl7Wj0bln7RFPEvUYKFxtP8a+oKFDO0F65F52xZxIJbPn6sHkxWDAnZlGgdjZXM3p2g5wQ==",
+ "version": "3.808.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.808.0.tgz",
+ "integrity": "sha512-9x2QWfphkARZY5OGkl9dJxZlSlYM2l5inFeo2bKntGuwg4A4YUe5h7d5yJ6sZbam9h43eBrkOdumx03DAkQF9A==",
"license": "Apache-2.0",
"dependencies": {
- "@aws-sdk/types": "3.775.0",
- "@smithy/node-config-provider": "^4.0.2",
+ "@aws-sdk/types": "3.804.0",
+ "@smithy/node-config-provider": "^4.1.1",
"@smithy/types": "^4.2.0",
"@smithy/util-config-provider": "^4.0.0",
"@smithy/util-middleware": "^4.0.2",
@@ -1356,13 +1359,13 @@
}
},
"node_modules/@aws-sdk/token-providers": {
- "version": "3.787.0",
- "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.787.0.tgz",
- "integrity": "sha512-d7/NIqxq308Zg0RPMNrmn0QvzniL4Hx8Qdwzr6YZWLYAbUSvZYS2ppLR3BFWSkV6SsTJUx8BuDaj3P8vttkrog==",
+ "version": "3.812.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.812.0.tgz",
+ "integrity": "sha512-dbVBaKxrxE708ub5uH3w+cmKIeRQas+2Xf6rpckhohYY+IiflGOdK6aLrp3T6dOQgr/FJ37iQtcYNonAG+yVBQ==",
"license": "Apache-2.0",
"dependencies": {
- "@aws-sdk/nested-clients": "3.787.0",
- "@aws-sdk/types": "3.775.0",
+ "@aws-sdk/nested-clients": "3.812.0",
+ "@aws-sdk/types": "3.804.0",
"@smithy/property-provider": "^4.0.2",
"@smithy/shared-ini-file-loader": "^4.0.2",
"@smithy/types": "^4.2.0",
@@ -1373,9 +1376,9 @@
}
},
"node_modules/@aws-sdk/types": {
- "version": "3.775.0",
- "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.775.0.tgz",
- "integrity": "sha512-ZoGKwa4C9fC9Av6bdfqcW6Ix5ot05F/S4VxWR2nHuMv7hzfmAjTOcUiWT7UR4hM/U0whf84VhDtXN/DWAk52KA==",
+ "version": "3.804.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.804.0.tgz",
+ "integrity": "sha512-A9qnsy9zQ8G89vrPPlNG9d1d8QcKRGqJKqwyGgS0dclJpwy6d1EWgQLIolKPl6vcFpLoe6avLOLxr+h8ur5wpg==",
"license": "Apache-2.0",
"dependencies": {
"@smithy/types": "^4.2.0",
@@ -1386,14 +1389,14 @@
}
},
"node_modules/@aws-sdk/util-endpoints": {
- "version": "3.787.0",
- "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.787.0.tgz",
- "integrity": "sha512-fd3zkiOkwnbdbN0Xp9TsP5SWrmv0SpT70YEdbb8wAj2DWQwiCmFszaSs+YCvhoCdmlR3Wl9Spu0pGpSAGKeYvQ==",
+ "version": "3.808.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.808.0.tgz",
+ "integrity": "sha512-N6Lic98uc4ADB7fLWlzx+1uVnq04VgVjngZvwHoujcRg9YDhIg9dUDiTzD5VZv13g1BrPYmvYP1HhsildpGV6w==",
"license": "Apache-2.0",
"dependencies": {
- "@aws-sdk/types": "3.775.0",
+ "@aws-sdk/types": "3.804.0",
"@smithy/types": "^4.2.0",
- "@smithy/util-endpoints": "^3.0.2",
+ "@smithy/util-endpoints": "^3.0.4",
"tslib": "^2.6.2"
},
"engines": {
@@ -1401,9 +1404,9 @@
}
},
"node_modules/@aws-sdk/util-locate-window": {
- "version": "3.723.0",
- "resolved": "https://registry.npmjs.org/@aws-sdk/util-locate-window/-/util-locate-window-3.723.0.tgz",
- "integrity": "sha512-Yf2CS10BqK688DRsrKI/EO6B8ff5J86NXe4C+VCysK7UOgN0l1zOTeTukZ3H8Q9tYYX3oaF1961o8vRkFm7Nmw==",
+ "version": "3.804.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/util-locate-window/-/util-locate-window-3.804.0.tgz",
+ "integrity": "sha512-zVoRfpmBVPodYlnMjgVjfGoEZagyRF5IPn3Uo6ZvOZp24chnW/FRstH7ESDHDDRga4z3V+ElUQHKpFDXWyBW5A==",
"license": "Apache-2.0",
"dependencies": {
"tslib": "^2.6.2"
@@ -1413,26 +1416,26 @@
}
},
"node_modules/@aws-sdk/util-user-agent-browser": {
- "version": "3.775.0",
- "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.775.0.tgz",
- "integrity": "sha512-txw2wkiJmZKVdDbscK7VBK+u+TJnRtlUjRTLei+elZg2ADhpQxfVAQl436FUeIv6AhB/oRHW6/K/EAGXUSWi0A==",
+ "version": "3.804.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.804.0.tgz",
+ "integrity": "sha512-KfW6T6nQHHM/vZBBdGn6fMyG/MgX5lq82TDdX4HRQRRuHKLgBWGpKXqqvBwqIaCdXwWHgDrg2VQups6GqOWW2A==",
"license": "Apache-2.0",
"dependencies": {
- "@aws-sdk/types": "3.775.0",
+ "@aws-sdk/types": "3.804.0",
"@smithy/types": "^4.2.0",
"bowser": "^2.11.0",
"tslib": "^2.6.2"
}
},
"node_modules/@aws-sdk/util-user-agent-node": {
- "version": "3.787.0",
- "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.787.0.tgz",
- "integrity": "sha512-mG7Lz8ydfG4SF9e8WSXiPQ/Lsn3n8A5B5jtPROidafi06I3ckV2WxyMLdwG14m919NoS6IOfWHyRGSqWIwbVKA==",
+ "version": "3.812.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.812.0.tgz",
+ "integrity": "sha512-8pt+OkHhS2U0LDwnzwRnFxyKn8sjSe752OIZQCNv263odud8jQu9pYO2pKqb2kRBk9h9szynjZBDLXfnvSQ7Bg==",
"license": "Apache-2.0",
"dependencies": {
- "@aws-sdk/middleware-user-agent": "3.787.0",
- "@aws-sdk/types": "3.775.0",
- "@smithy/node-config-provider": "^4.0.2",
+ "@aws-sdk/middleware-user-agent": "3.812.0",
+ "@aws-sdk/types": "3.804.0",
+ "@smithy/node-config-provider": "^4.1.1",
"@smithy/types": "^4.2.0",
"tslib": "^2.6.2"
},
@@ -1484,14 +1487,14 @@
}
},
"node_modules/@azure/core-client": {
- "version": "1.9.3",
- "resolved": "https://registry.npmjs.org/@azure/core-client/-/core-client-1.9.3.tgz",
- "integrity": "sha512-/wGw8fJ4mdpJ1Cum7s1S+VQyXt1ihwKLzfabS1O/RDADnmzVc01dHn44qD0BvGH6KlZNzOMW95tEpKqhkCChPA==",
+ "version": "1.9.4",
+ "resolved": "https://registry.npmjs.org/@azure/core-client/-/core-client-1.9.4.tgz",
+ "integrity": "sha512-f7IxTD15Qdux30s2qFARH+JxgwxWLG2Rlr4oSkPGuLWm+1p5y1+C04XGLA0vmX6EtqfutmjvpNmAfgwVIS5hpw==",
"license": "MIT",
"dependencies": {
"@azure/abort-controller": "^2.0.0",
"@azure/core-auth": "^1.4.0",
- "@azure/core-rest-pipeline": "^1.9.1",
+ "@azure/core-rest-pipeline": "^1.20.0",
"@azure/core-tracing": "^1.0.0",
"@azure/core-util": "^1.6.1",
"@azure/logger": "^1.0.0",
@@ -1502,14 +1505,14 @@
}
},
"node_modules/@azure/core-http-compat": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/@azure/core-http-compat/-/core-http-compat-2.2.0.tgz",
- "integrity": "sha512-1kW8ZhN0CfbNOG6C688z5uh2yrzALE7dDXHiR9dY4vt+EbhGZQSbjDa5bQd2rf3X2pdWMsXbqbArxUyeNdvtmg==",
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/@azure/core-http-compat/-/core-http-compat-2.3.0.tgz",
+ "integrity": "sha512-qLQujmUypBBG0gxHd0j6/Jdmul6ttl24c8WGiLXIk7IHXdBlfoBqW27hyz3Xn6xbfdyVSarl1Ttbk0AwnZBYCw==",
"license": "MIT",
"dependencies": {
"@azure/abort-controller": "^2.0.0",
"@azure/core-client": "^1.3.0",
- "@azure/core-rest-pipeline": "^1.19.0"
+ "@azure/core-rest-pipeline": "^1.20.0"
},
"engines": {
"node": ">=18.0.0"
@@ -1543,9 +1546,9 @@
}
},
"node_modules/@azure/core-rest-pipeline": {
- "version": "1.19.1",
- "resolved": "https://registry.npmjs.org/@azure/core-rest-pipeline/-/core-rest-pipeline-1.19.1.tgz",
- "integrity": "sha512-zHeoI3NCs53lLBbWNzQycjnYKsA1CVKlnzSNuSFcUDwBp8HHVObePxrM7HaX+Ha5Ks639H7chNC9HOaIhNS03w==",
+ "version": "1.20.0",
+ "resolved": "https://registry.npmjs.org/@azure/core-rest-pipeline/-/core-rest-pipeline-1.20.0.tgz",
+ "integrity": "sha512-ASoP8uqZBS3H/8N8at/XwFr6vYrRP3syTK0EUjDXQy0Y1/AUS+QeIRThKmTNJO2RggvBBxaXDPM7YoIwDGeA0g==",
"license": "MIT",
"dependencies": {
"@azure/abort-controller": "^2.0.0",
@@ -1553,8 +1556,7 @@
"@azure/core-tracing": "^1.0.1",
"@azure/core-util": "^1.11.0",
"@azure/logger": "^1.0.0",
- "http-proxy-agent": "^7.0.0",
- "https-proxy-agent": "^7.0.0",
+ "@typespec/ts-http-runtime": "^0.2.2",
"tslib": "^2.6.2"
},
"engines": {
@@ -1574,12 +1576,13 @@
}
},
"node_modules/@azure/core-util": {
- "version": "1.11.0",
- "resolved": "https://registry.npmjs.org/@azure/core-util/-/core-util-1.11.0.tgz",
- "integrity": "sha512-DxOSLua+NdpWoSqULhjDyAZTXFdP/LKkqtYuxxz1SCN289zk3OG8UOpnCQAz/tygyACBtWp/BoO72ptK7msY8g==",
+ "version": "1.12.0",
+ "resolved": "https://registry.npmjs.org/@azure/core-util/-/core-util-1.12.0.tgz",
+ "integrity": "sha512-13IyjTQgABPARvG90+N2dXpC+hwp466XCdQXPCRlbWHgd3SJd5Q1VvaBGv6k1BIa4MQm6hAF1UBU1m8QUxV8sQ==",
"license": "MIT",
"dependencies": {
"@azure/abort-controller": "^2.0.0",
+ "@typespec/ts-http-runtime": "^0.2.2",
"tslib": "^2.6.2"
},
"engines": {
@@ -1600,11 +1603,12 @@
}
},
"node_modules/@azure/logger": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/@azure/logger/-/logger-1.1.4.tgz",
- "integrity": "sha512-4IXXzcCdLdlXuCG+8UKEwLA1T1NHqUfanhXYHiQTn+6sfWCZXduqbtXDGceg3Ce5QxTGo7EqmbV6Bi+aqKuClQ==",
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/@azure/logger/-/logger-1.2.0.tgz",
+ "integrity": "sha512-0hKEzLhpw+ZTAfNJyRrn6s+V0nDWzXk9OjBr2TiGIu0OfMr5s2V4FpKLTAK3Ca5r5OKLbf4hkOGDPyiRjie/jA==",
"license": "MIT",
"dependencies": {
+ "@typespec/ts-http-runtime": "^0.2.2",
"tslib": "^2.6.2"
},
"engines": {
@@ -1636,44 +1640,44 @@
}
},
"node_modules/@babel/code-frame": {
- "version": "7.26.2",
- "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.26.2.tgz",
- "integrity": "sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==",
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz",
+ "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==",
"license": "MIT",
"dependencies": {
- "@babel/helper-validator-identifier": "^7.25.9",
+ "@babel/helper-validator-identifier": "^7.27.1",
"js-tokens": "^4.0.0",
- "picocolors": "^1.0.0"
+ "picocolors": "^1.1.1"
},
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/compat-data": {
- "version": "7.26.8",
- "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.26.8.tgz",
- "integrity": "sha512-oH5UPLMWR3L2wEFLnFJ1TZXqHufiTKAiLfqw5zkhS4dKXLJ10yVztfil/twG8EDTA4F/tvVNw9nOl4ZMslB8rQ==",
+ "version": "7.27.2",
+ "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.27.2.tgz",
+ "integrity": "sha512-TUtMJYRPyUb/9aU8f3K0mjmjf6M9N5Woshn2CS6nqJSeJtTtQcpLUXjGt9vbF8ZGff0El99sWkLgzwW3VXnxZQ==",
"license": "MIT",
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/core": {
- "version": "7.26.10",
- "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.26.10.tgz",
- "integrity": "sha512-vMqyb7XCDMPvJFFOaT9kxtiRh42GwlZEg1/uIgtZshS5a/8OaduUfCi7kynKgc3Tw/6Uo2D+db9qBttghhmxwQ==",
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.27.1.tgz",
+ "integrity": "sha512-IaaGWsQqfsQWVLqMn9OB92MNN7zukfVA4s7KKAI0KfrrDsZ0yhi5uV4baBuLuN7n3vsZpwP8asPPcVwApxvjBQ==",
"license": "MIT",
"dependencies": {
"@ampproject/remapping": "^2.2.0",
- "@babel/code-frame": "^7.26.2",
- "@babel/generator": "^7.26.10",
- "@babel/helper-compilation-targets": "^7.26.5",
- "@babel/helper-module-transforms": "^7.26.0",
- "@babel/helpers": "^7.26.10",
- "@babel/parser": "^7.26.10",
- "@babel/template": "^7.26.9",
- "@babel/traverse": "^7.26.10",
- "@babel/types": "^7.26.10",
+ "@babel/code-frame": "^7.27.1",
+ "@babel/generator": "^7.27.1",
+ "@babel/helper-compilation-targets": "^7.27.1",
+ "@babel/helper-module-transforms": "^7.27.1",
+ "@babel/helpers": "^7.27.1",
+ "@babel/parser": "^7.27.1",
+ "@babel/template": "^7.27.1",
+ "@babel/traverse": "^7.27.1",
+ "@babel/types": "^7.27.1",
"convert-source-map": "^2.0.0",
"debug": "^4.1.0",
"gensync": "^1.0.0-beta.2",
@@ -1689,13 +1693,13 @@
}
},
"node_modules/@babel/generator": {
- "version": "7.27.0",
- "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.27.0.tgz",
- "integrity": "sha512-VybsKvpiN1gU1sdMZIp7FcqphVVKEwcuj02x73uvcHE0PTihx1nlBcowYWhDwjpoAXRv43+gDzyggGnn1XZhVw==",
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.27.1.tgz",
+ "integrity": "sha512-UnJfnIpc/+JO0/+KRVQNGU+y5taA5vCbwN8+azkX6beii/ZF+enZJSOKo11ZSzGJjlNfJHfQtmQT8H+9TXPG2w==",
"license": "MIT",
"dependencies": {
- "@babel/parser": "^7.27.0",
- "@babel/types": "^7.27.0",
+ "@babel/parser": "^7.27.1",
+ "@babel/types": "^7.27.1",
"@jridgewell/gen-mapping": "^0.3.5",
"@jridgewell/trace-mapping": "^0.3.25",
"jsesc": "^3.0.2"
@@ -1705,25 +1709,25 @@
}
},
"node_modules/@babel/helper-annotate-as-pure": {
- "version": "7.25.9",
- "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.25.9.tgz",
- "integrity": "sha512-gv7320KBUFJz1RnylIg5WWYPRXKZ884AGkYpgpWW02TH66Dl+HaC1t1CKd0z3R4b6hdYEcmrNZHUmfCP+1u3/g==",
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.27.1.tgz",
+ "integrity": "sha512-WnuuDILl9oOBbKnb4L+DyODx7iC47XfzmNCpTttFsSp6hTG7XZxu60+4IO+2/hPfcGOoKbFiwoI/+zwARbNQow==",
"license": "MIT",
"dependencies": {
- "@babel/types": "^7.25.9"
+ "@babel/types": "^7.27.1"
},
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/helper-compilation-targets": {
- "version": "7.27.0",
- "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.0.tgz",
- "integrity": "sha512-LVk7fbXml0H2xH34dFzKQ7TDZ2G4/rVTOrq9V+icbbadjbVxxeFeDsNHv2SrZeWoA+6ZiTyWYWtScEIW07EAcA==",
+ "version": "7.27.2",
+ "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.2.tgz",
+ "integrity": "sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==",
"license": "MIT",
"dependencies": {
- "@babel/compat-data": "^7.26.8",
- "@babel/helper-validator-option": "^7.25.9",
+ "@babel/compat-data": "^7.27.2",
+ "@babel/helper-validator-option": "^7.27.1",
"browserslist": "^4.24.0",
"lru-cache": "^5.1.1",
"semver": "^6.3.1"
@@ -1733,17 +1737,17 @@
}
},
"node_modules/@babel/helper-create-class-features-plugin": {
- "version": "7.27.0",
- "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.27.0.tgz",
- "integrity": "sha512-vSGCvMecvFCd/BdpGlhpXYNhhC4ccxyvQWpbGL4CWbvfEoLFWUZuSuf7s9Aw70flgQF+6vptvgK2IfOnKlRmBg==",
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.27.1.tgz",
+ "integrity": "sha512-QwGAmuvM17btKU5VqXfb+Giw4JcN0hjuufz3DYnpeVDvZLAObloM77bhMXiqry3Iio+Ai4phVRDwl6WU10+r5A==",
"license": "MIT",
"dependencies": {
- "@babel/helper-annotate-as-pure": "^7.25.9",
- "@babel/helper-member-expression-to-functions": "^7.25.9",
- "@babel/helper-optimise-call-expression": "^7.25.9",
- "@babel/helper-replace-supers": "^7.26.5",
- "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9",
- "@babel/traverse": "^7.27.0",
+ "@babel/helper-annotate-as-pure": "^7.27.1",
+ "@babel/helper-member-expression-to-functions": "^7.27.1",
+ "@babel/helper-optimise-call-expression": "^7.27.1",
+ "@babel/helper-replace-supers": "^7.27.1",
+ "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1",
+ "@babel/traverse": "^7.27.1",
"semver": "^6.3.1"
},
"engines": {
@@ -1754,12 +1758,12 @@
}
},
"node_modules/@babel/helper-create-regexp-features-plugin": {
- "version": "7.27.0",
- "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.27.0.tgz",
- "integrity": "sha512-fO8l08T76v48BhpNRW/nQ0MxfnSdoSKUJBMjubOAYffsVuGG5qOfMq7N6Es7UJvi7Y8goXXo07EfcHZXDPuELQ==",
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.27.1.tgz",
+ "integrity": "sha512-uVDC72XVf8UbrH5qQTc18Agb8emwjTiZrQE11Nv3CuBEZmVvTwwE9CBUEvHku06gQCAyYf8Nv6ja1IN+6LMbxQ==",
"license": "MIT",
"dependencies": {
- "@babel/helper-annotate-as-pure": "^7.25.9",
+ "@babel/helper-annotate-as-pure": "^7.27.1",
"regexpu-core": "^6.2.0",
"semver": "^6.3.1"
},
@@ -1787,40 +1791,40 @@
}
},
"node_modules/@babel/helper-member-expression-to-functions": {
- "version": "7.25.9",
- "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.25.9.tgz",
- "integrity": "sha512-wbfdZ9w5vk0C0oyHqAJbc62+vet5prjj01jjJ8sKn3j9h3MQQlflEdXYvuqRWjHnM12coDEqiC1IRCi0U/EKwQ==",
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.27.1.tgz",
+ "integrity": "sha512-E5chM8eWjTp/aNoVpcbfM7mLxu9XGLWYise2eBKGQomAk/Mb4XoxyqXTZbuTohbsl8EKqdlMhnDI2CCLfcs9wA==",
"license": "MIT",
"dependencies": {
- "@babel/traverse": "^7.25.9",
- "@babel/types": "^7.25.9"
+ "@babel/traverse": "^7.27.1",
+ "@babel/types": "^7.27.1"
},
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/helper-module-imports": {
- "version": "7.25.9",
- "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.25.9.tgz",
- "integrity": "sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==",
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.27.1.tgz",
+ "integrity": "sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==",
"license": "MIT",
"dependencies": {
- "@babel/traverse": "^7.25.9",
- "@babel/types": "^7.25.9"
+ "@babel/traverse": "^7.27.1",
+ "@babel/types": "^7.27.1"
},
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/helper-module-transforms": {
- "version": "7.26.0",
- "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.26.0.tgz",
- "integrity": "sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==",
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.27.1.tgz",
+ "integrity": "sha512-9yHn519/8KvTU5BjTVEEeIM3w9/2yXNKoD82JifINImhpKkARMJKPP59kLo+BafpdN5zgNeIcS4jsGDmd3l58g==",
"license": "MIT",
"dependencies": {
- "@babel/helper-module-imports": "^7.25.9",
- "@babel/helper-validator-identifier": "^7.25.9",
- "@babel/traverse": "^7.25.9"
+ "@babel/helper-module-imports": "^7.27.1",
+ "@babel/helper-validator-identifier": "^7.27.1",
+ "@babel/traverse": "^7.27.1"
},
"engines": {
"node": ">=6.9.0"
@@ -1830,35 +1834,35 @@
}
},
"node_modules/@babel/helper-optimise-call-expression": {
- "version": "7.25.9",
- "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.25.9.tgz",
- "integrity": "sha512-FIpuNaz5ow8VyrYcnXQTDRGvV6tTjkNtCK/RYNDXGSLlUD6cBuQTSw43CShGxjvfBTfcUA/r6UhUCbtYqkhcuQ==",
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.27.1.tgz",
+ "integrity": "sha512-URMGH08NzYFhubNSGJrpUEphGKQwMQYBySzat5cAByY1/YgIRkULnIy3tAMeszlL/so2HbeilYloUmSpd7GdVw==",
"license": "MIT",
"dependencies": {
- "@babel/types": "^7.25.9"
+ "@babel/types": "^7.27.1"
},
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/helper-plugin-utils": {
- "version": "7.26.5",
- "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.26.5.tgz",
- "integrity": "sha512-RS+jZcRdZdRFzMyr+wcsaqOmld1/EqTghfaBGQQd/WnRdzdlvSZ//kF7U8VQTxf1ynZ4cjUcYgjVGx13ewNPMg==",
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.27.1.tgz",
+ "integrity": "sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==",
"license": "MIT",
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/helper-remap-async-to-generator": {
- "version": "7.25.9",
- "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.25.9.tgz",
- "integrity": "sha512-IZtukuUeBbhgOcaW2s06OXTzVNJR0ybm4W5xC1opWFFJMZbwRj5LCk+ByYH7WdZPZTt8KnFwA8pvjN2yqcPlgw==",
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.27.1.tgz",
+ "integrity": "sha512-7fiA521aVw8lSPeI4ZOD3vRFkoqkJcS+z4hFo82bFSH/2tNd6eJ5qCVMS5OzDmZh/kaHQeBaeyxK6wljcPtveA==",
"license": "MIT",
"dependencies": {
- "@babel/helper-annotate-as-pure": "^7.25.9",
- "@babel/helper-wrap-function": "^7.25.9",
- "@babel/traverse": "^7.25.9"
+ "@babel/helper-annotate-as-pure": "^7.27.1",
+ "@babel/helper-wrap-function": "^7.27.1",
+ "@babel/traverse": "^7.27.1"
},
"engines": {
"node": ">=6.9.0"
@@ -1868,14 +1872,14 @@
}
},
"node_modules/@babel/helper-replace-supers": {
- "version": "7.26.5",
- "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.26.5.tgz",
- "integrity": "sha512-bJ6iIVdYX1YooY2X7w1q6VITt+LnUILtNk7zT78ykuwStx8BauCzxvFqFaHjOpW1bVnSUM1PN1f0p5P21wHxvg==",
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.27.1.tgz",
+ "integrity": "sha512-7EHz6qDZc8RYS5ElPoShMheWvEgERonFCs7IAonWLLUTXW59DP14bCZt89/GKyreYn8g3S83m21FelHKbeDCKA==",
"license": "MIT",
"dependencies": {
- "@babel/helper-member-expression-to-functions": "^7.25.9",
- "@babel/helper-optimise-call-expression": "^7.25.9",
- "@babel/traverse": "^7.26.5"
+ "@babel/helper-member-expression-to-functions": "^7.27.1",
+ "@babel/helper-optimise-call-expression": "^7.27.1",
+ "@babel/traverse": "^7.27.1"
},
"engines": {
"node": ">=6.9.0"
@@ -1885,79 +1889,79 @@
}
},
"node_modules/@babel/helper-skip-transparent-expression-wrappers": {
- "version": "7.25.9",
- "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.25.9.tgz",
- "integrity": "sha512-K4Du3BFa3gvyhzgPcntrkDgZzQaq6uozzcpGbOO1OEJaI+EJdqWIMTLgFgQf6lrfiDFo5FU+BxKepI9RmZqahA==",
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.27.1.tgz",
+ "integrity": "sha512-Tub4ZKEXqbPjXgWLl2+3JpQAYBJ8+ikpQ2Ocj/q/r0LwE3UhENh7EUabyHjz2kCEsrRY83ew2DQdHluuiDQFzg==",
"license": "MIT",
"dependencies": {
- "@babel/traverse": "^7.25.9",
- "@babel/types": "^7.25.9"
+ "@babel/traverse": "^7.27.1",
+ "@babel/types": "^7.27.1"
},
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/helper-string-parser": {
- "version": "7.25.9",
- "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz",
- "integrity": "sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==",
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz",
+ "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==",
"license": "MIT",
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/helper-validator-identifier": {
- "version": "7.25.9",
- "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz",
- "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==",
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz",
+ "integrity": "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==",
"license": "MIT",
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/helper-validator-option": {
- "version": "7.25.9",
- "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.25.9.tgz",
- "integrity": "sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==",
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz",
+ "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==",
"license": "MIT",
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/helper-wrap-function": {
- "version": "7.25.9",
- "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.25.9.tgz",
- "integrity": "sha512-ETzz9UTjQSTmw39GboatdymDq4XIQbR8ySgVrylRhPOFpsd+JrKHIuF0de7GCWmem+T4uC5z7EZguod7Wj4A4g==",
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.27.1.tgz",
+ "integrity": "sha512-NFJK2sHUvrjo8wAU/nQTWU890/zB2jj0qBcCbZbbf+005cAsv6tMjXz31fBign6M5ov1o0Bllu+9nbqkfsjjJQ==",
"license": "MIT",
"dependencies": {
- "@babel/template": "^7.25.9",
- "@babel/traverse": "^7.25.9",
- "@babel/types": "^7.25.9"
+ "@babel/template": "^7.27.1",
+ "@babel/traverse": "^7.27.1",
+ "@babel/types": "^7.27.1"
},
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/helpers": {
- "version": "7.27.0",
- "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.27.0.tgz",
- "integrity": "sha512-U5eyP/CTFPuNE3qk+WZMxFkp/4zUzdceQlfzf7DdGdhp+Fezd7HD+i8Y24ZuTMKX3wQBld449jijbGq6OdGNQg==",
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.27.1.tgz",
+ "integrity": "sha512-FCvFTm0sWV8Fxhpp2McP5/W53GPllQ9QeQ7SiqGWjMf/LVG07lFa5+pgK05IRhVwtvafT22KF+ZSnM9I545CvQ==",
"license": "MIT",
"dependencies": {
- "@babel/template": "^7.27.0",
- "@babel/types": "^7.27.0"
+ "@babel/template": "^7.27.1",
+ "@babel/types": "^7.27.1"
},
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/parser": {
- "version": "7.27.0",
- "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.27.0.tgz",
- "integrity": "sha512-iaepho73/2Pz7w2eMS0Q5f83+0RKI7i4xmiYeBmDzfRVbQtTOG7Ts0S4HzJVsTMGI9keU8rNfuZr8DKfSt7Yyg==",
+ "version": "7.27.2",
+ "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.27.2.tgz",
+ "integrity": "sha512-QYLs8299NA7WM/bZAdp+CviYYkVoYXlDW2rzliy3chxd1PQjej7JORuMJDJXJUb9g0TT+B99EwaVLKmX+sPXWw==",
"license": "MIT",
"dependencies": {
- "@babel/types": "^7.27.0"
+ "@babel/types": "^7.27.1"
},
"bin": {
"parser": "bin/babel-parser.js"
@@ -1967,13 +1971,13 @@
}
},
"node_modules/@babel/plugin-bugfix-firefox-class-in-computed-class-key": {
- "version": "7.25.9",
- "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.25.9.tgz",
- "integrity": "sha512-ZkRyVkThtxQ/J6nv3JFYv1RYY+JT5BvU0y3k5bWrmuG4woXypRa4PXmm9RhOwodRkYFWqC0C0cqcJ4OqR7kW+g==",
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.27.1.tgz",
+ "integrity": "sha512-QPG3C9cCVRQLxAVwmefEmwdTanECuUBMQZ/ym5kiw3XKCGA7qkuQLcjWWHcrD/GKbn/WmJwaezfuuAOcyKlRPA==",
"license": "MIT",
"dependencies": {
- "@babel/helper-plugin-utils": "^7.25.9",
- "@babel/traverse": "^7.25.9"
+ "@babel/helper-plugin-utils": "^7.27.1",
+ "@babel/traverse": "^7.27.1"
},
"engines": {
"node": ">=6.9.0"
@@ -1983,12 +1987,12 @@
}
},
"node_modules/@babel/plugin-bugfix-safari-class-field-initializer-scope": {
- "version": "7.25.9",
- "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-class-field-initializer-scope/-/plugin-bugfix-safari-class-field-initializer-scope-7.25.9.tgz",
- "integrity": "sha512-MrGRLZxLD/Zjj0gdU15dfs+HH/OXvnw/U4jJD8vpcP2CJQapPEv1IWwjc/qMg7ItBlPwSv1hRBbb7LeuANdcnw==",
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-class-field-initializer-scope/-/plugin-bugfix-safari-class-field-initializer-scope-7.27.1.tgz",
+ "integrity": "sha512-qNeq3bCKnGgLkEXUuFry6dPlGfCdQNZbn7yUAPCInwAJHMU7THJfrBSozkcWq5sNM6RcF3S8XyQL2A52KNR9IA==",
"license": "MIT",
"dependencies": {
- "@babel/helper-plugin-utils": "^7.25.9"
+ "@babel/helper-plugin-utils": "^7.27.1"
},
"engines": {
"node": ">=6.9.0"
@@ -1998,12 +2002,12 @@
}
},
"node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": {
- "version": "7.25.9",
- "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.25.9.tgz",
- "integrity": "sha512-2qUwwfAFpJLZqxd02YW9btUCZHl+RFvdDkNfZwaIJrvB8Tesjsk8pEQkTvGwZXLqXUx/2oyY3ySRhm6HOXuCug==",
+ "version": "7.27.1",
+ "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.27.1.tgz",
+ "integrity": "sha512-g4L7OYun04N1WyqMNjldFwlfPCLVkgB54A/YCXICZYBsvJJE3kByKv9c9+R/nAfmIfjl2rKYLNyMHboYbZaWaA==",
"license": "MIT",
"dependencies": {
- "@babel/helper-plugin-utils": "^7.25.9"
+ "@babel/helper-plugin-utils": "^7.27.1"
},
"engines": {
"node": ">=6.9.0"
@@ -2013,14 +2017,14 @@
}
},
"node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": {
- "version": "7.25.9",
- "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.25.9.tgz",
- "integrity": "sha512-6xWgLZTJXwilVjlnV7ospI3xi+sl8lN8rXXbBD6vYn3UYDlGsag8wrZkKcSI8G6KgqKP7vNFaDgeDnfAABq61g==",
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.27.1.tgz",
+ "integrity": "sha512-oO02gcONcD5O1iTLi/6frMJBIwWEHceWGSGqrpCmEL8nogiS6J9PBlE48CaK20/Jx1LuRml9aDftLgdjXT8+Cw==",
"license": "MIT",
"dependencies": {
- "@babel/helper-plugin-utils": "^7.25.9",
- "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9",
- "@babel/plugin-transform-optional-chaining": "^7.25.9"
+ "@babel/helper-plugin-utils": "^7.27.1",
+ "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1",
+ "@babel/plugin-transform-optional-chaining": "^7.27.1"
},
"engines": {
"node": ">=6.9.0"
@@ -2030,13 +2034,13 @@
}
},
"node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": {
- "version": "7.25.9",
- "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.25.9.tgz",
- "integrity": "sha512-aLnMXYPnzwwqhYSCyXfKkIkYgJ8zv9RK+roo9DkTXz38ynIhd9XCbN08s3MGvqL2MYGVUGdRQLL/JqBIeJhJBg==",
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.27.1.tgz",
+ "integrity": "sha512-6BpaYGDavZqkI6yT+KSPdpZFfpnd68UKXbcjI9pJ13pvHhPrCKWOOLp+ysvMeA+DxnhuPpgIaRpxRxo5A9t5jw==",
"license": "MIT",
"dependencies": {
- "@babel/helper-plugin-utils": "^7.25.9",
- "@babel/traverse": "^7.25.9"
+ "@babel/helper-plugin-utils": "^7.27.1",
+ "@babel/traverse": "^7.27.1"
},
"engines": {
"node": ">=6.9.0"
@@ -2058,12 +2062,12 @@
}
},
"node_modules/@babel/plugin-syntax-import-assertions": {
- "version": "7.26.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.26.0.tgz",
- "integrity": "sha512-QCWT5Hh830hK5EQa7XzuqIkQU9tT/whqbDz7kuaZMHFl1inRRg7JnuAEOQ0Ur0QUl0NufCk1msK2BeY79Aj/eg==",
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.27.1.tgz",
+ "integrity": "sha512-UT/Jrhw57xg4ILHLFnzFpPDlMbcdEicaAtjPQpbj9wa8T4r5KVWCimHcL/460g8Ht0DMxDyjsLgiWSkVjnwPFg==",
"license": "MIT",
"dependencies": {
- "@babel/helper-plugin-utils": "^7.25.9"
+ "@babel/helper-plugin-utils": "^7.27.1"
},
"engines": {
"node": ">=6.9.0"
@@ -2073,12 +2077,12 @@
}
},
"node_modules/@babel/plugin-syntax-import-attributes": {
- "version": "7.26.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.26.0.tgz",
- "integrity": "sha512-e2dttdsJ1ZTpi3B9UYGLw41hifAubg19AtCu/2I/F1QNVclOBr1dYpTdmdyZ84Xiz43BS/tCUkMAZNLv12Pi+A==",
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.27.1.tgz",
+ "integrity": "sha512-oFT0FrKHgF53f4vOsZGi2Hh3I35PfSmVs4IBFLFj4dnafP+hIWDLg3VyKmUHfLoLHlyxY4C7DGtmHuJgn+IGww==",
"license": "MIT",
"dependencies": {
- "@babel/helper-plugin-utils": "^7.25.9"
+ "@babel/helper-plugin-utils": "^7.27.1"
},
"engines": {
"node": ">=6.9.0"
@@ -2088,12 +2092,12 @@
}
},
"node_modules/@babel/plugin-syntax-jsx": {
- "version": "7.25.9",
- "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.25.9.tgz",
- "integrity": "sha512-ld6oezHQMZsZfp6pWtbjaNDF2tiiCYYDqQszHt5VV437lewP9aSi2Of99CK0D0XB21k7FLgnLcmQKyKzynfeAA==",
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.27.1.tgz",
+ "integrity": "sha512-y8YTNIeKoyhGd9O0Jiyzyyqk8gdjnumGTQPsz0xOZOQ2RmkVJeZ1vmmfIvFEKqucBG6axJGBZDE/7iI5suUI/w==",
"license": "MIT",
"dependencies": {
- "@babel/helper-plugin-utils": "^7.25.9"
+ "@babel/helper-plugin-utils": "^7.27.1"
},
"engines": {
"node": ">=6.9.0"
@@ -2119,12 +2123,12 @@
}
},
"node_modules/@babel/plugin-transform-arrow-functions": {
- "version": "7.25.9",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.25.9.tgz",
- "integrity": "sha512-6jmooXYIwn9ca5/RylZADJ+EnSxVUS5sjeJ9UPk6RWRzXCmOJCy6dqItPJFpw2cuCangPK4OYr5uhGKcmrm5Qg==",
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.27.1.tgz",
+ "integrity": "sha512-8Z4TGic6xW70FKThA5HYEKKyBpOOsucTOD1DjU3fZxDg+K3zBJcXMFnt/4yQiZnf5+MiOMSXQ9PaEK/Ilh1DeA==",
"license": "MIT",
"dependencies": {
- "@babel/helper-plugin-utils": "^7.25.9"
+ "@babel/helper-plugin-utils": "^7.27.1"
},
"engines": {
"node": ">=6.9.0"
@@ -2134,14 +2138,14 @@
}
},
"node_modules/@babel/plugin-transform-async-generator-functions": {
- "version": "7.26.8",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.26.8.tgz",
- "integrity": "sha512-He9Ej2X7tNf2zdKMAGOsmg2MrFc+hfoAhd3po4cWfo/NWjzEAKa0oQruj1ROVUdl0e6fb6/kE/G3SSxE0lRJOg==",
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.27.1.tgz",
+ "integrity": "sha512-eST9RrwlpaoJBDHShc+DS2SG4ATTi2MYNb4OxYkf3n+7eb49LWpnS+HSpVfW4x927qQwgk8A2hGNVaajAEw0EA==",
"license": "MIT",
"dependencies": {
- "@babel/helper-plugin-utils": "^7.26.5",
- "@babel/helper-remap-async-to-generator": "^7.25.9",
- "@babel/traverse": "^7.26.8"
+ "@babel/helper-plugin-utils": "^7.27.1",
+ "@babel/helper-remap-async-to-generator": "^7.27.1",
+ "@babel/traverse": "^7.27.1"
},
"engines": {
"node": ">=6.9.0"
@@ -2151,14 +2155,14 @@
}
},
"node_modules/@babel/plugin-transform-async-to-generator": {
- "version": "7.25.9",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.25.9.tgz",
- "integrity": "sha512-NT7Ejn7Z/LjUH0Gv5KsBCxh7BH3fbLTV0ptHvpeMvrt3cPThHfJfst9Wrb7S8EvJ7vRTFI7z+VAvFVEQn/m5zQ==",
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.27.1.tgz",
+ "integrity": "sha512-NREkZsZVJS4xmTr8qzE5y8AfIPqsdQfRuUiLRTEzb7Qii8iFWCyDKaUV2c0rCuh4ljDZ98ALHP/PetiBV2nddA==",
"license": "MIT",
"dependencies": {
- "@babel/helper-module-imports": "^7.25.9",
- "@babel/helper-plugin-utils": "^7.25.9",
- "@babel/helper-remap-async-to-generator": "^7.25.9"
+ "@babel/helper-module-imports": "^7.27.1",
+ "@babel/helper-plugin-utils": "^7.27.1",
+ "@babel/helper-remap-async-to-generator": "^7.27.1"
},
"engines": {
"node": ">=6.9.0"
@@ -2168,12 +2172,12 @@
}
},
"node_modules/@babel/plugin-transform-block-scoped-functions": {
- "version": "7.26.5",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.26.5.tgz",
- "integrity": "sha512-chuTSY+hq09+/f5lMj8ZSYgCFpppV2CbYrhNFJ1BFoXpiWPnnAb7R0MqrafCpN8E1+YRrtM1MXZHJdIx8B6rMQ==",
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.27.1.tgz",
+ "integrity": "sha512-cnqkuOtZLapWYZUYM5rVIdv1nXYuFVIltZ6ZJ7nIj585QsjKM5dhL2Fu/lICXZ1OyIAFc7Qy+bvDAtTXqGrlhg==",
"license": "MIT",
"dependencies": {
- "@babel/helper-plugin-utils": "^7.26.5"
+ "@babel/helper-plugin-utils": "^7.27.1"
},
"engines": {
"node": ">=6.9.0"
@@ -2183,12 +2187,12 @@
}
},
"node_modules/@babel/plugin-transform-block-scoping": {
- "version": "7.27.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.27.0.tgz",
- "integrity": "sha512-u1jGphZ8uDI2Pj/HJj6YQ6XQLZCNjOlprjxB5SVz6rq2T6SwAR+CdrWK0CP7F+9rDVMXdB0+r6Am5G5aobOjAQ==",
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.27.1.tgz",
+ "integrity": "sha512-QEcFlMl9nGTgh1rn2nIeU5bkfb9BAjaQcWbiP4LvKxUot52ABcTkpcyJ7f2Q2U2RuQ84BNLgts3jRme2dTx6Fw==",
"license": "MIT",
"dependencies": {
- "@babel/helper-plugin-utils": "^7.26.5"
+ "@babel/helper-plugin-utils": "^7.27.1"
},
"engines": {
"node": ">=6.9.0"
@@ -2198,13 +2202,13 @@
}
},
"node_modules/@babel/plugin-transform-class-properties": {
- "version": "7.25.9",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.25.9.tgz",
- "integrity": "sha512-bbMAII8GRSkcd0h0b4X+36GksxuheLFjP65ul9w6C3KgAamI3JqErNgSrosX6ZPj+Mpim5VvEbawXxJCyEUV3Q==",
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.27.1.tgz",
+ "integrity": "sha512-D0VcalChDMtuRvJIu3U/fwWjf8ZMykz5iZsg77Nuj821vCKI3zCyRLwRdWbsuJ/uRwZhZ002QtCqIkwC/ZkvbA==",
"license": "MIT",
"dependencies": {
- "@babel/helper-create-class-features-plugin": "^7.25.9",
- "@babel/helper-plugin-utils": "^7.25.9"
+ "@babel/helper-create-class-features-plugin": "^7.27.1",
+ "@babel/helper-plugin-utils": "^7.27.1"
},
"engines": {
"node": ">=6.9.0"
@@ -2214,13 +2218,13 @@
}
},
"node_modules/@babel/plugin-transform-class-static-block": {
- "version": "7.26.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.26.0.tgz",
- "integrity": "sha512-6J2APTs7BDDm+UMqP1useWqhcRAXo0WIoVj26N7kPFB6S73Lgvyka4KTZYIxtgYXiN5HTyRObA72N2iu628iTQ==",
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.27.1.tgz",
+ "integrity": "sha512-s734HmYU78MVzZ++joYM+NkJusItbdRcbm+AGRgJCt3iA+yux0QpD9cBVdz3tKyrjVYWRl7j0mHSmv4lhV0aoA==",
"license": "MIT",
"dependencies": {
- "@babel/helper-create-class-features-plugin": "^7.25.9",
- "@babel/helper-plugin-utils": "^7.25.9"
+ "@babel/helper-create-class-features-plugin": "^7.27.1",
+ "@babel/helper-plugin-utils": "^7.27.1"
},
"engines": {
"node": ">=6.9.0"
@@ -2230,16 +2234,16 @@
}
},
"node_modules/@babel/plugin-transform-classes": {
- "version": "7.25.9",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.25.9.tgz",
- "integrity": "sha512-mD8APIXmseE7oZvZgGABDyM34GUmK45Um2TXiBUt7PnuAxrgoSVf123qUzPxEr/+/BHrRn5NMZCdE2m/1F8DGg==",
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.27.1.tgz",
+ "integrity": "sha512-7iLhfFAubmpeJe/Wo2TVuDrykh/zlWXLzPNdL0Jqn/Xu8R3QQ8h9ff8FQoISZOsw74/HFqFI7NX63HN7QFIHKA==",
"license": "MIT",
"dependencies": {
- "@babel/helper-annotate-as-pure": "^7.25.9",
- "@babel/helper-compilation-targets": "^7.25.9",
- "@babel/helper-plugin-utils": "^7.25.9",
- "@babel/helper-replace-supers": "^7.25.9",
- "@babel/traverse": "^7.25.9",
+ "@babel/helper-annotate-as-pure": "^7.27.1",
+ "@babel/helper-compilation-targets": "^7.27.1",
+ "@babel/helper-plugin-utils": "^7.27.1",
+ "@babel/helper-replace-supers": "^7.27.1",
+ "@babel/traverse": "^7.27.1",
"globals": "^11.1.0"
},
"engines": {
@@ -2259,13 +2263,13 @@
}
},
"node_modules/@babel/plugin-transform-computed-properties": {
- "version": "7.25.9",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.25.9.tgz",
- "integrity": "sha512-HnBegGqXZR12xbcTHlJ9HGxw1OniltT26J5YpfruGqtUHlz/xKf/G2ak9e+t0rVqrjXa9WOhvYPz1ERfMj23AA==",
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.27.1.tgz",
+ "integrity": "sha512-lj9PGWvMTVksbWiDT2tW68zGS/cyo4AkZ/QTp0sQT0mjPopCmrSkzxeXkznjqBxzDI6TclZhOJbBmbBLjuOZUw==",
"license": "MIT",
"dependencies": {
- "@babel/helper-plugin-utils": "^7.25.9",
- "@babel/template": "^7.25.9"
+ "@babel/helper-plugin-utils": "^7.27.1",
+ "@babel/template": "^7.27.1"
},
"engines": {
"node": ">=6.9.0"
@@ -2275,12 +2279,12 @@
}
},
"node_modules/@babel/plugin-transform-destructuring": {
- "version": "7.25.9",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.25.9.tgz",
- "integrity": "sha512-WkCGb/3ZxXepmMiX101nnGiU+1CAdut8oHyEOHxkKuS1qKpU2SMXE2uSvfz8PBuLd49V6LEsbtyPhWC7fnkgvQ==",
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.27.1.tgz",
+ "integrity": "sha512-ttDCqhfvpE9emVkXbPD8vyxxh4TWYACVybGkDj+oReOGwnp066ITEivDlLwe0b1R0+evJ13IXQuLNB5w1fhC5Q==",
"license": "MIT",
"dependencies": {
- "@babel/helper-plugin-utils": "^7.25.9"
+ "@babel/helper-plugin-utils": "^7.27.1"
},
"engines": {
"node": ">=6.9.0"
@@ -2290,13 +2294,13 @@
}
},
"node_modules/@babel/plugin-transform-dotall-regex": {
- "version": "7.25.9",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.25.9.tgz",
- "integrity": "sha512-t7ZQ7g5trIgSRYhI9pIJtRl64KHotutUJsh4Eze5l7olJv+mRSg4/MmbZ0tv1eeqRbdvo/+trvJD/Oc5DmW2cA==",
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.27.1.tgz",
+ "integrity": "sha512-gEbkDVGRvjj7+T1ivxrfgygpT7GUd4vmODtYpbs0gZATdkX8/iSnOtZSxiZnsgm1YjTgjI6VKBGSJJevkrclzw==",
"license": "MIT",
"dependencies": {
- "@babel/helper-create-regexp-features-plugin": "^7.25.9",
- "@babel/helper-plugin-utils": "^7.25.9"
+ "@babel/helper-create-regexp-features-plugin": "^7.27.1",
+ "@babel/helper-plugin-utils": "^7.27.1"
},
"engines": {
"node": ">=6.9.0"
@@ -2306,12 +2310,12 @@
}
},
"node_modules/@babel/plugin-transform-duplicate-keys": {
- "version": "7.25.9",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.25.9.tgz",
- "integrity": "sha512-LZxhJ6dvBb/f3x8xwWIuyiAHy56nrRG3PeYTpBkkzkYRRQ6tJLu68lEF5VIqMUZiAV7a8+Tb78nEoMCMcqjXBw==",
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.27.1.tgz",
+ "integrity": "sha512-MTyJk98sHvSs+cvZ4nOauwTTG1JeonDjSGvGGUNHreGQns+Mpt6WX/dVzWBHgg+dYZhkC4X+zTDfkTU+Vy9y7Q==",
"license": "MIT",
"dependencies": {
- "@babel/helper-plugin-utils": "^7.25.9"
+ "@babel/helper-plugin-utils": "^7.27.1"
},
"engines": {
"node": ">=6.9.0"
@@ -2321,13 +2325,13 @@
}
},
"node_modules/@babel/plugin-transform-duplicate-named-capturing-groups-regex": {
- "version": "7.25.9",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-named-capturing-groups-regex/-/plugin-transform-duplicate-named-capturing-groups-regex-7.25.9.tgz",
- "integrity": "sha512-0UfuJS0EsXbRvKnwcLjFtJy/Sxc5J5jhLHnFhy7u4zih97Hz6tJkLU+O+FMMrNZrosUPxDi6sYxJ/EA8jDiAog==",
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-named-capturing-groups-regex/-/plugin-transform-duplicate-named-capturing-groups-regex-7.27.1.tgz",
+ "integrity": "sha512-hkGcueTEzuhB30B3eJCbCYeCaaEQOmQR0AdvzpD4LoN0GXMWzzGSuRrxR2xTnCrvNbVwK9N6/jQ92GSLfiZWoQ==",
"license": "MIT",
"dependencies": {
- "@babel/helper-create-regexp-features-plugin": "^7.25.9",
- "@babel/helper-plugin-utils": "^7.25.9"
+ "@babel/helper-create-regexp-features-plugin": "^7.27.1",
+ "@babel/helper-plugin-utils": "^7.27.1"
},
"engines": {
"node": ">=6.9.0"
@@ -2337,12 +2341,12 @@
}
},
"node_modules/@babel/plugin-transform-dynamic-import": {
- "version": "7.25.9",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.25.9.tgz",
- "integrity": "sha512-GCggjexbmSLaFhqsojeugBpeaRIgWNTcgKVq/0qIteFEqY2A+b9QidYadrWlnbWQUrW5fn+mCvf3tr7OeBFTyg==",
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.27.1.tgz",
+ "integrity": "sha512-MHzkWQcEmjzzVW9j2q8LGjwGWpG2mjwaaB0BNQwst3FIjqsg8Ct/mIZlvSPJvfi9y2AC8mi/ktxbFVL9pZ1I4A==",
"license": "MIT",
"dependencies": {
- "@babel/helper-plugin-utils": "^7.25.9"
+ "@babel/helper-plugin-utils": "^7.27.1"
},
"engines": {
"node": ">=6.9.0"
@@ -2352,12 +2356,12 @@
}
},
"node_modules/@babel/plugin-transform-exponentiation-operator": {
- "version": "7.26.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.26.3.tgz",
- "integrity": "sha512-7CAHcQ58z2chuXPWblnn1K6rLDnDWieghSOEmqQsrBenH0P9InCUtOJYD89pvngljmZlJcz3fcmgYsXFNGa1ZQ==",
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.27.1.tgz",
+ "integrity": "sha512-uspvXnhHvGKf2r4VVtBpeFnuDWsJLQ6MF6lGJLC89jBR1uoVeqM416AZtTuhTezOfgHicpJQmoD5YUakO/YmXQ==",
"license": "MIT",
"dependencies": {
- "@babel/helper-plugin-utils": "^7.25.9"
+ "@babel/helper-plugin-utils": "^7.27.1"
},
"engines": {
"node": ">=6.9.0"
@@ -2367,12 +2371,12 @@
}
},
"node_modules/@babel/plugin-transform-export-namespace-from": {
- "version": "7.25.9",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.25.9.tgz",
- "integrity": "sha512-2NsEz+CxzJIVOPx2o9UsW1rXLqtChtLoVnwYHHiB04wS5sgn7mrV45fWMBX0Kk+ub9uXytVYfNP2HjbVbCB3Ww==",
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.27.1.tgz",
+ "integrity": "sha512-tQvHWSZ3/jH2xuq/vZDy0jNn+ZdXJeM8gHvX4lnJmsc3+50yPlWdZXIc5ay+umX+2/tJIqHqiEqcJvxlmIvRvQ==",
"license": "MIT",
"dependencies": {
- "@babel/helper-plugin-utils": "^7.25.9"
+ "@babel/helper-plugin-utils": "^7.27.1"
},
"engines": {
"node": ">=6.9.0"
@@ -2382,13 +2386,13 @@
}
},
"node_modules/@babel/plugin-transform-for-of": {
- "version": "7.26.9",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.26.9.tgz",
- "integrity": "sha512-Hry8AusVm8LW5BVFgiyUReuoGzPUpdHQQqJY5bZnbbf+ngOHWuCuYFKw/BqaaWlvEUrF91HMhDtEaI1hZzNbLg==",
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.27.1.tgz",
+ "integrity": "sha512-BfbWFFEJFQzLCQ5N8VocnCtA8J1CLkNTe2Ms2wocj75dd6VpiqS5Z5quTYcUoo4Yq+DN0rtikODccuv7RU81sw==",
"license": "MIT",
"dependencies": {
- "@babel/helper-plugin-utils": "^7.26.5",
- "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9"
+ "@babel/helper-plugin-utils": "^7.27.1",
+ "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1"
},
"engines": {
"node": ">=6.9.0"
@@ -2398,14 +2402,14 @@
}
},
"node_modules/@babel/plugin-transform-function-name": {
- "version": "7.25.9",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.25.9.tgz",
- "integrity": "sha512-8lP+Yxjv14Vc5MuWBpJsoUCd3hD6V9DgBon2FVYL4jJgbnVQ9fTgYmonchzZJOVNgzEgbxp4OwAf6xz6M/14XA==",
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.27.1.tgz",
+ "integrity": "sha512-1bQeydJF9Nr1eBCMMbC+hdwmRlsv5XYOMu03YSWFwNs0HsAmtSxxF1fyuYPqemVldVyFmlCU7w8UE14LupUSZQ==",
"license": "MIT",
"dependencies": {
- "@babel/helper-compilation-targets": "^7.25.9",
- "@babel/helper-plugin-utils": "^7.25.9",
- "@babel/traverse": "^7.25.9"
+ "@babel/helper-compilation-targets": "^7.27.1",
+ "@babel/helper-plugin-utils": "^7.27.1",
+ "@babel/traverse": "^7.27.1"
},
"engines": {
"node": ">=6.9.0"
@@ -2415,12 +2419,12 @@
}
},
"node_modules/@babel/plugin-transform-json-strings": {
- "version": "7.25.9",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.25.9.tgz",
- "integrity": "sha512-xoTMk0WXceiiIvsaquQQUaLLXSW1KJ159KP87VilruQm0LNNGxWzahxSS6T6i4Zg3ezp4vA4zuwiNUR53qmQAw==",
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.27.1.tgz",
+ "integrity": "sha512-6WVLVJiTjqcQauBhn1LkICsR2H+zm62I3h9faTDKt1qP4jn2o72tSvqMwtGFKGTpojce0gJs+76eZ2uCHRZh0Q==",
"license": "MIT",
"dependencies": {
- "@babel/helper-plugin-utils": "^7.25.9"
+ "@babel/helper-plugin-utils": "^7.27.1"
},
"engines": {
"node": ">=6.9.0"
@@ -2430,12 +2434,12 @@
}
},
"node_modules/@babel/plugin-transform-literals": {
- "version": "7.25.9",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.25.9.tgz",
- "integrity": "sha512-9N7+2lFziW8W9pBl2TzaNht3+pgMIRP74zizeCSrtnSKVdUl8mAjjOP2OOVQAfZ881P2cNjDj1uAMEdeD50nuQ==",
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.27.1.tgz",
+ "integrity": "sha512-0HCFSepIpLTkLcsi86GG3mTUzxV5jpmbv97hTETW3yzrAij8aqlD36toB1D0daVFJM8NK6GvKO0gslVQmm+zZA==",
"license": "MIT",
"dependencies": {
- "@babel/helper-plugin-utils": "^7.25.9"
+ "@babel/helper-plugin-utils": "^7.27.1"
},
"engines": {
"node": ">=6.9.0"
@@ -2445,12 +2449,12 @@
}
},
"node_modules/@babel/plugin-transform-logical-assignment-operators": {
- "version": "7.25.9",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.25.9.tgz",
- "integrity": "sha512-wI4wRAzGko551Y8eVf6iOY9EouIDTtPb0ByZx+ktDGHwv6bHFimrgJM/2T021txPZ2s4c7bqvHbd+vXG6K948Q==",
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.27.1.tgz",
+ "integrity": "sha512-SJvDs5dXxiae4FbSL1aBJlG4wvl594N6YEVVn9e3JGulwioy6z3oPjx/sQBO3Y4NwUu5HNix6KJ3wBZoewcdbw==",
"license": "MIT",
"dependencies": {
- "@babel/helper-plugin-utils": "^7.25.9"
+ "@babel/helper-plugin-utils": "^7.27.1"
},
"engines": {
"node": ">=6.9.0"
@@ -2460,12 +2464,12 @@
}
},
"node_modules/@babel/plugin-transform-member-expression-literals": {
- "version": "7.25.9",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.25.9.tgz",
- "integrity": "sha512-PYazBVfofCQkkMzh2P6IdIUaCEWni3iYEerAsRWuVd8+jlM1S9S9cz1dF9hIzyoZ8IA3+OwVYIp9v9e+GbgZhA==",
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.27.1.tgz",
+ "integrity": "sha512-hqoBX4dcZ1I33jCSWcXrP+1Ku7kdqXf1oeah7ooKOIiAdKQ+uqftgCFNOSzA5AMS2XIHEYeGFg4cKRCdpxzVOQ==",
"license": "MIT",
"dependencies": {
- "@babel/helper-plugin-utils": "^7.25.9"
+ "@babel/helper-plugin-utils": "^7.27.1"
},
"engines": {
"node": ">=6.9.0"
@@ -2475,13 +2479,13 @@
}
},
"node_modules/@babel/plugin-transform-modules-amd": {
- "version": "7.25.9",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.25.9.tgz",
- "integrity": "sha512-g5T11tnI36jVClQlMlt4qKDLlWnG5pP9CSM4GhdRciTNMRgkfpo5cR6b4rGIOYPgRRuFAvwjPQ/Yk+ql4dyhbw==",
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.27.1.tgz",
+ "integrity": "sha512-iCsytMg/N9/oFq6n+gFTvUYDZQOMK5kEdeYxmxt91fcJGycfxVP9CnrxoliM0oumFERba2i8ZtwRUCMhvP1LnA==",
"license": "MIT",
"dependencies": {
- "@babel/helper-module-transforms": "^7.25.9",
- "@babel/helper-plugin-utils": "^7.25.9"
+ "@babel/helper-module-transforms": "^7.27.1",
+ "@babel/helper-plugin-utils": "^7.27.1"
},
"engines": {
"node": ">=6.9.0"
@@ -2491,13 +2495,13 @@
}
},
"node_modules/@babel/plugin-transform-modules-commonjs": {
- "version": "7.26.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.26.3.tgz",
- "integrity": "sha512-MgR55l4q9KddUDITEzEFYn5ZsGDXMSsU9E+kh7fjRXTIC3RHqfCo8RPRbyReYJh44HQ/yomFkqbOFohXvDCiIQ==",
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.27.1.tgz",
+ "integrity": "sha512-OJguuwlTYlN0gBZFRPqwOGNWssZjfIUdS7HMYtN8c1KmwpwHFBwTeFZrg9XZa+DFTitWOW5iTAG7tyCUPsCCyw==",
"license": "MIT",
"dependencies": {
- "@babel/helper-module-transforms": "^7.26.0",
- "@babel/helper-plugin-utils": "^7.25.9"
+ "@babel/helper-module-transforms": "^7.27.1",
+ "@babel/helper-plugin-utils": "^7.27.1"
},
"engines": {
"node": ">=6.9.0"
@@ -2507,15 +2511,15 @@
}
},
"node_modules/@babel/plugin-transform-modules-systemjs": {
- "version": "7.25.9",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.25.9.tgz",
- "integrity": "sha512-hyss7iIlH/zLHaehT+xwiymtPOpsiwIIRlCAOwBB04ta5Tt+lNItADdlXw3jAWZ96VJ2jlhl/c+PNIQPKNfvcA==",
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.27.1.tgz",
+ "integrity": "sha512-w5N1XzsRbc0PQStASMksmUeqECuzKuTJer7kFagK8AXgpCMkeDMO5S+aaFb7A51ZYDF7XI34qsTX+fkHiIm5yA==",
"license": "MIT",
"dependencies": {
- "@babel/helper-module-transforms": "^7.25.9",
- "@babel/helper-plugin-utils": "^7.25.9",
- "@babel/helper-validator-identifier": "^7.25.9",
- "@babel/traverse": "^7.25.9"
+ "@babel/helper-module-transforms": "^7.27.1",
+ "@babel/helper-plugin-utils": "^7.27.1",
+ "@babel/helper-validator-identifier": "^7.27.1",
+ "@babel/traverse": "^7.27.1"
},
"engines": {
"node": ">=6.9.0"
@@ -2525,13 +2529,13 @@
}
},
"node_modules/@babel/plugin-transform-modules-umd": {
- "version": "7.25.9",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.25.9.tgz",
- "integrity": "sha512-bS9MVObUgE7ww36HEfwe6g9WakQ0KF07mQF74uuXdkoziUPfKyu/nIm663kz//e5O1nPInPFx36z7WJmJ4yNEw==",
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.27.1.tgz",
+ "integrity": "sha512-iQBE/xC5BV1OxJbp6WG7jq9IWiD+xxlZhLrdwpPkTX3ydmXdvoCpyfJN7acaIBZaOqTfr76pgzqBJflNbeRK+w==",
"license": "MIT",
"dependencies": {
- "@babel/helper-module-transforms": "^7.25.9",
- "@babel/helper-plugin-utils": "^7.25.9"
+ "@babel/helper-module-transforms": "^7.27.1",
+ "@babel/helper-plugin-utils": "^7.27.1"
},
"engines": {
"node": ">=6.9.0"
@@ -2541,13 +2545,13 @@
}
},
"node_modules/@babel/plugin-transform-named-capturing-groups-regex": {
- "version": "7.25.9",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.25.9.tgz",
- "integrity": "sha512-oqB6WHdKTGl3q/ItQhpLSnWWOpjUJLsOCLVyeFgeTktkBSCiurvPOsyt93gibI9CmuKvTUEtWmG5VhZD+5T/KA==",
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.27.1.tgz",
+ "integrity": "sha512-SstR5JYy8ddZvD6MhV0tM/j16Qds4mIpJTOd1Yu9J9pJjH93bxHECF7pgtc28XvkzTD6Pxcm/0Z73Hvk7kb3Ng==",
"license": "MIT",
"dependencies": {
- "@babel/helper-create-regexp-features-plugin": "^7.25.9",
- "@babel/helper-plugin-utils": "^7.25.9"
+ "@babel/helper-create-regexp-features-plugin": "^7.27.1",
+ "@babel/helper-plugin-utils": "^7.27.1"
},
"engines": {
"node": ">=6.9.0"
@@ -2557,12 +2561,12 @@
}
},
"node_modules/@babel/plugin-transform-new-target": {
- "version": "7.25.9",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.25.9.tgz",
- "integrity": "sha512-U/3p8X1yCSoKyUj2eOBIx3FOn6pElFOKvAAGf8HTtItuPyB+ZeOqfn+mvTtg9ZlOAjsPdK3ayQEjqHjU/yLeVQ==",
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.27.1.tgz",
+ "integrity": "sha512-f6PiYeqXQ05lYq3TIfIDu/MtliKUbNwkGApPUvyo6+tc7uaR4cPjPe7DFPr15Uyycg2lZU6btZ575CuQoYh7MQ==",
"license": "MIT",
"dependencies": {
- "@babel/helper-plugin-utils": "^7.25.9"
+ "@babel/helper-plugin-utils": "^7.27.1"
},
"engines": {
"node": ">=6.9.0"
@@ -2572,12 +2576,12 @@
}
},
"node_modules/@babel/plugin-transform-nullish-coalescing-operator": {
- "version": "7.26.6",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.26.6.tgz",
- "integrity": "sha512-CKW8Vu+uUZneQCPtXmSBUC6NCAUdya26hWCElAWh5mVSlSRsmiCPUUDKb3Z0szng1hiAJa098Hkhg9o4SE35Qw==",
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.27.1.tgz",
+ "integrity": "sha512-aGZh6xMo6q9vq1JGcw58lZ1Z0+i0xB2x0XaauNIUXd6O1xXc3RwoWEBlsTQrY4KQ9Jf0s5rgD6SiNkaUdJegTA==",
"license": "MIT",
"dependencies": {
- "@babel/helper-plugin-utils": "^7.26.5"
+ "@babel/helper-plugin-utils": "^7.27.1"
},
"engines": {
"node": ">=6.9.0"
@@ -2587,12 +2591,12 @@
}
},
"node_modules/@babel/plugin-transform-numeric-separator": {
- "version": "7.25.9",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.25.9.tgz",
- "integrity": "sha512-TlprrJ1GBZ3r6s96Yq8gEQv82s8/5HnCVHtEJScUj90thHQbwe+E5MLhi2bbNHBEJuzrvltXSru+BUxHDoog7Q==",
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.27.1.tgz",
+ "integrity": "sha512-fdPKAcujuvEChxDBJ5c+0BTaS6revLV7CJL08e4m3de8qJfNIuCc2nc7XJYOjBoTMJeqSmwXJ0ypE14RCjLwaw==",
"license": "MIT",
"dependencies": {
- "@babel/helper-plugin-utils": "^7.25.9"
+ "@babel/helper-plugin-utils": "^7.27.1"
},
"engines": {
"node": ">=6.9.0"
@@ -2602,14 +2606,15 @@
}
},
"node_modules/@babel/plugin-transform-object-rest-spread": {
- "version": "7.25.9",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.25.9.tgz",
- "integrity": "sha512-fSaXafEE9CVHPweLYw4J0emp1t8zYTXyzN3UuG+lylqkvYd7RMrsOQ8TYx5RF231be0vqtFC6jnx3UmpJmKBYg==",
+ "version": "7.27.2",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.27.2.tgz",
+ "integrity": "sha512-AIUHD7xJ1mCrj3uPozvtngY3s0xpv7Nu7DoUSnzNY6Xam1Cy4rUznR//pvMHOhQ4AvbCexhbqXCtpxGHOGOO6g==",
"license": "MIT",
"dependencies": {
- "@babel/helper-compilation-targets": "^7.25.9",
- "@babel/helper-plugin-utils": "^7.25.9",
- "@babel/plugin-transform-parameters": "^7.25.9"
+ "@babel/helper-compilation-targets": "^7.27.2",
+ "@babel/helper-plugin-utils": "^7.27.1",
+ "@babel/plugin-transform-destructuring": "^7.27.1",
+ "@babel/plugin-transform-parameters": "^7.27.1"
},
"engines": {
"node": ">=6.9.0"
@@ -2619,13 +2624,13 @@
}
},
"node_modules/@babel/plugin-transform-object-super": {
- "version": "7.25.9",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.25.9.tgz",
- "integrity": "sha512-Kj/Gh+Rw2RNLbCK1VAWj2U48yxxqL2x0k10nPtSdRa0O2xnHXalD0s+o1A6a0W43gJ00ANo38jxkQreckOzv5A==",
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.27.1.tgz",
+ "integrity": "sha512-SFy8S9plRPbIcxlJ8A6mT/CxFdJx/c04JEctz4jf8YZaVS2px34j7NXRrlGlHkN/M2gnpL37ZpGRGVFLd3l8Ng==",
"license": "MIT",
"dependencies": {
- "@babel/helper-plugin-utils": "^7.25.9",
- "@babel/helper-replace-supers": "^7.25.9"
+ "@babel/helper-plugin-utils": "^7.27.1",
+ "@babel/helper-replace-supers": "^7.27.1"
},
"engines": {
"node": ">=6.9.0"
@@ -2635,12 +2640,12 @@
}
},
"node_modules/@babel/plugin-transform-optional-catch-binding": {
- "version": "7.25.9",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.25.9.tgz",
- "integrity": "sha512-qM/6m6hQZzDcZF3onzIhZeDHDO43bkNNlOX0i8n3lR6zLbu0GN2d8qfM/IERJZYauhAHSLHy39NF0Ctdvcid7g==",
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.27.1.tgz",
+ "integrity": "sha512-txEAEKzYrHEX4xSZN4kJ+OfKXFVSWKB2ZxM9dpcE3wT7smwkNmXo5ORRlVzMVdJbD+Q8ILTgSD7959uj+3Dm3Q==",
"license": "MIT",
"dependencies": {
- "@babel/helper-plugin-utils": "^7.25.9"
+ "@babel/helper-plugin-utils": "^7.27.1"
},
"engines": {
"node": ">=6.9.0"
@@ -2650,13 +2655,13 @@
}
},
"node_modules/@babel/plugin-transform-optional-chaining": {
- "version": "7.25.9",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.25.9.tgz",
- "integrity": "sha512-6AvV0FsLULbpnXeBjrY4dmWF8F7gf8QnvTEoO/wX/5xm/xE1Xo8oPuD3MPS+KS9f9XBEAWN7X1aWr4z9HdOr7A==",
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.27.1.tgz",
+ "integrity": "sha512-BQmKPPIuc8EkZgNKsv0X4bPmOoayeu4F1YCwx2/CfmDSXDbp7GnzlUH+/ul5VGfRg1AoFPsrIThlEBj2xb4CAg==",
"license": "MIT",
"dependencies": {
- "@babel/helper-plugin-utils": "^7.25.9",
- "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9"
+ "@babel/helper-plugin-utils": "^7.27.1",
+ "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1"
},
"engines": {
"node": ">=6.9.0"
@@ -2666,12 +2671,12 @@
}
},
"node_modules/@babel/plugin-transform-parameters": {
- "version": "7.25.9",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.25.9.tgz",
- "integrity": "sha512-wzz6MKwpnshBAiRmn4jR8LYz/g8Ksg0o80XmwZDlordjwEk9SxBzTWC7F5ef1jhbrbOW2DJ5J6ayRukrJmnr0g==",
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.27.1.tgz",
+ "integrity": "sha512-018KRk76HWKeZ5l4oTj2zPpSh+NbGdt0st5S6x0pga6HgrjBOJb24mMDHorFopOOd6YHkLgOZ+zaCjZGPO4aKg==",
"license": "MIT",
"dependencies": {
- "@babel/helper-plugin-utils": "^7.25.9"
+ "@babel/helper-plugin-utils": "^7.27.1"
},
"engines": {
"node": ">=6.9.0"
@@ -2681,13 +2686,13 @@
}
},
"node_modules/@babel/plugin-transform-private-methods": {
- "version": "7.25.9",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.25.9.tgz",
- "integrity": "sha512-D/JUozNpQLAPUVusvqMxyvjzllRaF8/nSrP1s2YGQT/W4LHK4xxsMcHjhOGTS01mp9Hda8nswb+FblLdJornQw==",
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.27.1.tgz",
+ "integrity": "sha512-10FVt+X55AjRAYI9BrdISN9/AQWHqldOeZDUoLyif1Kn05a56xVBXb8ZouL8pZ9jem8QpXaOt8TS7RHUIS+GPA==",
"license": "MIT",
"dependencies": {
- "@babel/helper-create-class-features-plugin": "^7.25.9",
- "@babel/helper-plugin-utils": "^7.25.9"
+ "@babel/helper-create-class-features-plugin": "^7.27.1",
+ "@babel/helper-plugin-utils": "^7.27.1"
},
"engines": {
"node": ">=6.9.0"
@@ -2697,14 +2702,14 @@
}
},
"node_modules/@babel/plugin-transform-private-property-in-object": {
- "version": "7.25.9",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.25.9.tgz",
- "integrity": "sha512-Evf3kcMqzXA3xfYJmZ9Pg1OvKdtqsDMSWBDzZOPLvHiTt36E75jLDQo5w1gtRU95Q4E5PDttrTf25Fw8d/uWLw==",
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.27.1.tgz",
+ "integrity": "sha512-5J+IhqTi1XPa0DXF83jYOaARrX+41gOewWbkPyjMNRDqgOCqdffGh8L3f/Ek5utaEBZExjSAzcyjmV9SSAWObQ==",
"license": "MIT",
"dependencies": {
- "@babel/helper-annotate-as-pure": "^7.25.9",
- "@babel/helper-create-class-features-plugin": "^7.25.9",
- "@babel/helper-plugin-utils": "^7.25.9"
+ "@babel/helper-annotate-as-pure": "^7.27.1",
+ "@babel/helper-create-class-features-plugin": "^7.27.1",
+ "@babel/helper-plugin-utils": "^7.27.1"
},
"engines": {
"node": ">=6.9.0"
@@ -2714,12 +2719,12 @@
}
},
"node_modules/@babel/plugin-transform-property-literals": {
- "version": "7.25.9",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.25.9.tgz",
- "integrity": "sha512-IvIUeV5KrS/VPavfSM/Iu+RE6llrHrYIKY1yfCzyO/lMXHQ+p7uGhonmGVisv6tSBSVgWzMBohTcvkC9vQcQFA==",
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.27.1.tgz",
+ "integrity": "sha512-oThy3BCuCha8kDZ8ZkgOg2exvPYUlprMukKQXI1r1pJ47NCvxfkEy8vK+r/hT9nF0Aa4H1WUPZZjHTFtAhGfmQ==",
"license": "MIT",
"dependencies": {
- "@babel/helper-plugin-utils": "^7.25.9"
+ "@babel/helper-plugin-utils": "^7.27.1"
},
"engines": {
"node": ">=6.9.0"
@@ -2729,12 +2734,12 @@
}
},
"node_modules/@babel/plugin-transform-react-display-name": {
- "version": "7.25.9",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.25.9.tgz",
- "integrity": "sha512-KJfMlYIUxQB1CJfO3e0+h0ZHWOTLCPP115Awhaz8U0Zpq36Gl/cXlpoyMRnUWlhNUBAzldnCiAZNvCDj7CrKxQ==",
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.27.1.tgz",
+ "integrity": "sha512-p9+Vl3yuHPmkirRrg021XiP+EETmPMQTLr6Ayjj85RLNEbb3Eya/4VI0vAdzQG9SEAl2Lnt7fy5lZyMzjYoZQQ==",
"license": "MIT",
"dependencies": {
- "@babel/helper-plugin-utils": "^7.25.9"
+ "@babel/helper-plugin-utils": "^7.27.1"
},
"engines": {
"node": ">=6.9.0"
@@ -2744,16 +2749,16 @@
}
},
"node_modules/@babel/plugin-transform-react-jsx": {
- "version": "7.25.9",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.25.9.tgz",
- "integrity": "sha512-s5XwpQYCqGerXl+Pu6VDL3x0j2d82eiV77UJ8a2mDHAW7j9SWRqQ2y1fNo1Z74CdcYipl5Z41zvjj4Nfzq36rw==",
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.27.1.tgz",
+ "integrity": "sha512-2KH4LWGSrJIkVf5tSiBFYuXDAoWRq2MMwgivCf+93dd0GQi8RXLjKA/0EvRnVV5G0hrHczsquXuD01L8s6dmBw==",
"license": "MIT",
"dependencies": {
- "@babel/helper-annotate-as-pure": "^7.25.9",
- "@babel/helper-module-imports": "^7.25.9",
- "@babel/helper-plugin-utils": "^7.25.9",
- "@babel/plugin-syntax-jsx": "^7.25.9",
- "@babel/types": "^7.25.9"
+ "@babel/helper-annotate-as-pure": "^7.27.1",
+ "@babel/helper-module-imports": "^7.27.1",
+ "@babel/helper-plugin-utils": "^7.27.1",
+ "@babel/plugin-syntax-jsx": "^7.27.1",
+ "@babel/types": "^7.27.1"
},
"engines": {
"node": ">=6.9.0"
@@ -2763,12 +2768,12 @@
}
},
"node_modules/@babel/plugin-transform-react-jsx-development": {
- "version": "7.25.9",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.25.9.tgz",
- "integrity": "sha512-9mj6rm7XVYs4mdLIpbZnHOYdpW42uoiBCTVowg7sP1thUOiANgMb4UtpRivR0pp5iL+ocvUv7X4mZgFRpJEzGw==",
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.27.1.tgz",
+ "integrity": "sha512-ykDdF5yI4f1WrAolLqeF3hmYU12j9ntLQl/AOG1HAS21jxyg1Q0/J/tpREuYLfatGdGmXp/3yS0ZA76kOlVq9Q==",
"license": "MIT",
"dependencies": {
- "@babel/plugin-transform-react-jsx": "^7.25.9"
+ "@babel/plugin-transform-react-jsx": "^7.27.1"
},
"engines": {
"node": ">=6.9.0"
@@ -2778,13 +2783,13 @@
}
},
"node_modules/@babel/plugin-transform-react-pure-annotations": {
- "version": "7.25.9",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.25.9.tgz",
- "integrity": "sha512-KQ/Takk3T8Qzj5TppkS1be588lkbTp5uj7w6a0LeQaTMSckU/wK0oJ/pih+T690tkgI5jfmg2TqDJvd41Sj1Cg==",
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.27.1.tgz",
+ "integrity": "sha512-JfuinvDOsD9FVMTHpzA/pBLisxpv1aSf+OIV8lgH3MuWrks19R27e6a6DipIg4aX1Zm9Wpb04p8wljfKrVSnPA==",
"license": "MIT",
"dependencies": {
- "@babel/helper-annotate-as-pure": "^7.25.9",
- "@babel/helper-plugin-utils": "^7.25.9"
+ "@babel/helper-annotate-as-pure": "^7.27.1",
+ "@babel/helper-plugin-utils": "^7.27.1"
},
"engines": {
"node": ">=6.9.0"
@@ -2794,13 +2799,12 @@
}
},
"node_modules/@babel/plugin-transform-regenerator": {
- "version": "7.27.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.27.0.tgz",
- "integrity": "sha512-LX/vCajUJQDqE7Aum/ELUMZAY19+cDpghxrnyt5I1tV6X5PyC86AOoWXWFYFeIvauyeSA6/ktn4tQVn/3ZifsA==",
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.27.1.tgz",
+ "integrity": "sha512-B19lbbL7PMrKr52BNPjCqg1IyNUIjTcxKj8uX9zHO+PmWN93s19NDr/f69mIkEp2x9nmDJ08a7lgHaTTzvW7mw==",
"license": "MIT",
"dependencies": {
- "@babel/helper-plugin-utils": "^7.26.5",
- "regenerator-transform": "^0.15.2"
+ "@babel/helper-plugin-utils": "^7.27.1"
},
"engines": {
"node": ">=6.9.0"
@@ -2810,13 +2814,13 @@
}
},
"node_modules/@babel/plugin-transform-regexp-modifiers": {
- "version": "7.26.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regexp-modifiers/-/plugin-transform-regexp-modifiers-7.26.0.tgz",
- "integrity": "sha512-vN6saax7lrA2yA/Pak3sCxuD6F5InBjn9IcrIKQPjpsLvuHYLVroTxjdlVRHjjBWxKOqIwpTXDkOssYT4BFdRw==",
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regexp-modifiers/-/plugin-transform-regexp-modifiers-7.27.1.tgz",
+ "integrity": "sha512-TtEciroaiODtXvLZv4rmfMhkCv8jx3wgKpL68PuiPh2M4fvz5jhsA7697N1gMvkvr/JTF13DrFYyEbY9U7cVPA==",
"license": "MIT",
"dependencies": {
- "@babel/helper-create-regexp-features-plugin": "^7.25.9",
- "@babel/helper-plugin-utils": "^7.25.9"
+ "@babel/helper-create-regexp-features-plugin": "^7.27.1",
+ "@babel/helper-plugin-utils": "^7.27.1"
},
"engines": {
"node": ">=6.9.0"
@@ -2826,12 +2830,12 @@
}
},
"node_modules/@babel/plugin-transform-reserved-words": {
- "version": "7.25.9",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.25.9.tgz",
- "integrity": "sha512-7DL7DKYjn5Su++4RXu8puKZm2XBPHyjWLUidaPEkCUBbE7IPcsrkRHggAOOKydH1dASWdcUBxrkOGNxUv5P3Jg==",
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.27.1.tgz",
+ "integrity": "sha512-V2ABPHIJX4kC7HegLkYoDpfg9PVmuWy/i6vUM5eGK22bx4YVFD3M5F0QQnWQoDs6AGsUWTVOopBiMFQgHaSkVw==",
"license": "MIT",
"dependencies": {
- "@babel/helper-plugin-utils": "^7.25.9"
+ "@babel/helper-plugin-utils": "^7.27.1"
},
"engines": {
"node": ">=6.9.0"
@@ -2841,12 +2845,12 @@
}
},
"node_modules/@babel/plugin-transform-shorthand-properties": {
- "version": "7.25.9",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.25.9.tgz",
- "integrity": "sha512-MUv6t0FhO5qHnS/W8XCbHmiRWOphNufpE1IVxhK5kuN3Td9FT1x4rx4K42s3RYdMXCXpfWkGSbCSd0Z64xA7Ng==",
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.27.1.tgz",
+ "integrity": "sha512-N/wH1vcn4oYawbJ13Y/FxcQrWk63jhfNa7jef0ih7PHSIHX2LB7GWE1rkPrOnka9kwMxb6hMl19p7lidA+EHmQ==",
"license": "MIT",
"dependencies": {
- "@babel/helper-plugin-utils": "^7.25.9"
+ "@babel/helper-plugin-utils": "^7.27.1"
},
"engines": {
"node": ">=6.9.0"
@@ -2856,13 +2860,13 @@
}
},
"node_modules/@babel/plugin-transform-spread": {
- "version": "7.25.9",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.25.9.tgz",
- "integrity": "sha512-oNknIB0TbURU5pqJFVbOOFspVlrpVwo2H1+HUIsVDvp5VauGGDP1ZEvO8Nn5xyMEs3dakajOxlmkNW7kNgSm6A==",
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.27.1.tgz",
+ "integrity": "sha512-kpb3HUqaILBJcRFVhFUs6Trdd4mkrzcGXss+6/mxUd273PfbWqSDHRzMT2234gIg2QYfAjvXLSquP1xECSg09Q==",
"license": "MIT",
"dependencies": {
- "@babel/helper-plugin-utils": "^7.25.9",
- "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9"
+ "@babel/helper-plugin-utils": "^7.27.1",
+ "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1"
},
"engines": {
"node": ">=6.9.0"
@@ -2872,12 +2876,12 @@
}
},
"node_modules/@babel/plugin-transform-sticky-regex": {
- "version": "7.25.9",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.25.9.tgz",
- "integrity": "sha512-WqBUSgeVwucYDP9U/xNRQam7xV8W5Zf+6Eo7T2SRVUFlhRiMNFdFz58u0KZmCVVqs2i7SHgpRnAhzRNmKfi2uA==",
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.27.1.tgz",
+ "integrity": "sha512-lhInBO5bi/Kowe2/aLdBAawijx+q1pQzicSgnkB6dUPc1+RC8QmJHKf2OjvU+NZWitguJHEaEmbV6VWEouT58g==",
"license": "MIT",
"dependencies": {
- "@babel/helper-plugin-utils": "^7.25.9"
+ "@babel/helper-plugin-utils": "^7.27.1"
},
"engines": {
"node": ">=6.9.0"
@@ -2887,12 +2891,12 @@
}
},
"node_modules/@babel/plugin-transform-template-literals": {
- "version": "7.26.8",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.26.8.tgz",
- "integrity": "sha512-OmGDL5/J0CJPJZTHZbi2XpO0tyT2Ia7fzpW5GURwdtp2X3fMmN8au/ej6peC/T33/+CRiIpA8Krse8hFGVmT5Q==",
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.27.1.tgz",
+ "integrity": "sha512-fBJKiV7F2DxZUkg5EtHKXQdbsbURW3DZKQUWphDum0uRP6eHGGa/He9mc0mypL680pb+e/lDIthRohlv8NCHkg==",
"license": "MIT",
"dependencies": {
- "@babel/helper-plugin-utils": "^7.26.5"
+ "@babel/helper-plugin-utils": "^7.27.1"
},
"engines": {
"node": ">=6.9.0"
@@ -2902,12 +2906,12 @@
}
},
"node_modules/@babel/plugin-transform-typeof-symbol": {
- "version": "7.27.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.27.0.tgz",
- "integrity": "sha512-+LLkxA9rKJpNoGsbLnAgOCdESl73vwYn+V6b+5wHbrE7OGKVDPHIQvbFSzqE6rwqaCw2RE+zdJrlLkcf8YOA0w==",
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.27.1.tgz",
+ "integrity": "sha512-RiSILC+nRJM7FY5srIyc4/fGIwUhyDuuBSdWn4y6yT6gm652DpCHZjIipgn6B7MQ1ITOUnAKWixEUjQRIBIcLw==",
"license": "MIT",
"dependencies": {
- "@babel/helper-plugin-utils": "^7.26.5"
+ "@babel/helper-plugin-utils": "^7.27.1"
},
"engines": {
"node": ">=6.9.0"
@@ -2917,12 +2921,12 @@
}
},
"node_modules/@babel/plugin-transform-unicode-escapes": {
- "version": "7.25.9",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.25.9.tgz",
- "integrity": "sha512-s5EDrE6bW97LtxOcGj1Khcx5AaXwiMmi4toFWRDP9/y0Woo6pXC+iyPu/KuhKtfSrNFd7jJB+/fkOtZy6aIC6Q==",
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.27.1.tgz",
+ "integrity": "sha512-Ysg4v6AmF26k9vpfFuTZg8HRfVWzsh1kVfowA23y9j/Gu6dOuahdUVhkLqpObp3JIv27MLSii6noRnuKN8H0Mg==",
"license": "MIT",
"dependencies": {
- "@babel/helper-plugin-utils": "^7.25.9"
+ "@babel/helper-plugin-utils": "^7.27.1"
},
"engines": {
"node": ">=6.9.0"
@@ -2932,13 +2936,13 @@
}
},
"node_modules/@babel/plugin-transform-unicode-property-regex": {
- "version": "7.25.9",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.25.9.tgz",
- "integrity": "sha512-Jt2d8Ga+QwRluxRQ307Vlxa6dMrYEMZCgGxoPR8V52rxPyldHu3hdlHspxaqYmE7oID5+kB+UKUB/eWS+DkkWg==",
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.27.1.tgz",
+ "integrity": "sha512-uW20S39PnaTImxp39O5qFlHLS9LJEmANjMG7SxIhap8rCHqu0Ik+tLEPX5DKmHn6CsWQ7j3lix2tFOa5YtL12Q==",
"license": "MIT",
"dependencies": {
- "@babel/helper-create-regexp-features-plugin": "^7.25.9",
- "@babel/helper-plugin-utils": "^7.25.9"
+ "@babel/helper-create-regexp-features-plugin": "^7.27.1",
+ "@babel/helper-plugin-utils": "^7.27.1"
},
"engines": {
"node": ">=6.9.0"
@@ -2948,13 +2952,13 @@
}
},
"node_modules/@babel/plugin-transform-unicode-regex": {
- "version": "7.25.9",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.25.9.tgz",
- "integrity": "sha512-yoxstj7Rg9dlNn9UQxzk4fcNivwv4nUYz7fYXBaKxvw/lnmPuOm/ikoELygbYq68Bls3D/D+NBPHiLwZdZZ4HA==",
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.27.1.tgz",
+ "integrity": "sha512-xvINq24TRojDuyt6JGtHmkVkrfVV3FPT16uytxImLeBZqW3/H52yN+kM1MGuyPkIQxrzKwPHs5U/MP3qKyzkGw==",
"license": "MIT",
"dependencies": {
- "@babel/helper-create-regexp-features-plugin": "^7.25.9",
- "@babel/helper-plugin-utils": "^7.25.9"
+ "@babel/helper-create-regexp-features-plugin": "^7.27.1",
+ "@babel/helper-plugin-utils": "^7.27.1"
},
"engines": {
"node": ">=6.9.0"
@@ -2964,13 +2968,13 @@
}
},
"node_modules/@babel/plugin-transform-unicode-sets-regex": {
- "version": "7.25.9",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.25.9.tgz",
- "integrity": "sha512-8BYqO3GeVNHtx69fdPshN3fnzUNLrWdHhk/icSwigksJGczKSizZ+Z6SBCxTs723Fr5VSNorTIK7a+R2tISvwQ==",
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.27.1.tgz",
+ "integrity": "sha512-EtkOujbc4cgvb0mlpQefi4NTPBzhSIevblFevACNLUspmrALgmEBdL/XfnyyITfd8fKBZrZys92zOWcik7j9Tw==",
"license": "MIT",
"dependencies": {
- "@babel/helper-create-regexp-features-plugin": "^7.25.9",
- "@babel/helper-plugin-utils": "^7.25.9"
+ "@babel/helper-create-regexp-features-plugin": "^7.27.1",
+ "@babel/helper-plugin-utils": "^7.27.1"
},
"engines": {
"node": ">=6.9.0"
@@ -2980,74 +2984,74 @@
}
},
"node_modules/@babel/preset-env": {
- "version": "7.26.9",
- "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.26.9.tgz",
- "integrity": "sha512-vX3qPGE8sEKEAZCWk05k3cpTAE3/nOYca++JA+Rd0z2NCNzabmYvEiSShKzm10zdquOIAVXsy2Ei/DTW34KlKQ==",
- "license": "MIT",
- "dependencies": {
- "@babel/compat-data": "^7.26.8",
- "@babel/helper-compilation-targets": "^7.26.5",
- "@babel/helper-plugin-utils": "^7.26.5",
- "@babel/helper-validator-option": "^7.25.9",
- "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.25.9",
- "@babel/plugin-bugfix-safari-class-field-initializer-scope": "^7.25.9",
- "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.25.9",
- "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.25.9",
- "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.25.9",
+ "version": "7.27.2",
+ "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.27.2.tgz",
+ "integrity": "sha512-Ma4zSuYSlGNRlCLO+EAzLnCmJK2vdstgv+n7aUP+/IKZrOfWHOJVdSJtuub8RzHTj3ahD37k5OKJWvzf16TQyQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/compat-data": "^7.27.2",
+ "@babel/helper-compilation-targets": "^7.27.2",
+ "@babel/helper-plugin-utils": "^7.27.1",
+ "@babel/helper-validator-option": "^7.27.1",
+ "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.27.1",
+ "@babel/plugin-bugfix-safari-class-field-initializer-scope": "^7.27.1",
+ "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.27.1",
+ "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.27.1",
+ "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.27.1",
"@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2",
- "@babel/plugin-syntax-import-assertions": "^7.26.0",
- "@babel/plugin-syntax-import-attributes": "^7.26.0",
+ "@babel/plugin-syntax-import-assertions": "^7.27.1",
+ "@babel/plugin-syntax-import-attributes": "^7.27.1",
"@babel/plugin-syntax-unicode-sets-regex": "^7.18.6",
- "@babel/plugin-transform-arrow-functions": "^7.25.9",
- "@babel/plugin-transform-async-generator-functions": "^7.26.8",
- "@babel/plugin-transform-async-to-generator": "^7.25.9",
- "@babel/plugin-transform-block-scoped-functions": "^7.26.5",
- "@babel/plugin-transform-block-scoping": "^7.25.9",
- "@babel/plugin-transform-class-properties": "^7.25.9",
- "@babel/plugin-transform-class-static-block": "^7.26.0",
- "@babel/plugin-transform-classes": "^7.25.9",
- "@babel/plugin-transform-computed-properties": "^7.25.9",
- "@babel/plugin-transform-destructuring": "^7.25.9",
- "@babel/plugin-transform-dotall-regex": "^7.25.9",
- "@babel/plugin-transform-duplicate-keys": "^7.25.9",
- "@babel/plugin-transform-duplicate-named-capturing-groups-regex": "^7.25.9",
- "@babel/plugin-transform-dynamic-import": "^7.25.9",
- "@babel/plugin-transform-exponentiation-operator": "^7.26.3",
- "@babel/plugin-transform-export-namespace-from": "^7.25.9",
- "@babel/plugin-transform-for-of": "^7.26.9",
- "@babel/plugin-transform-function-name": "^7.25.9",
- "@babel/plugin-transform-json-strings": "^7.25.9",
- "@babel/plugin-transform-literals": "^7.25.9",
- "@babel/plugin-transform-logical-assignment-operators": "^7.25.9",
- "@babel/plugin-transform-member-expression-literals": "^7.25.9",
- "@babel/plugin-transform-modules-amd": "^7.25.9",
- "@babel/plugin-transform-modules-commonjs": "^7.26.3",
- "@babel/plugin-transform-modules-systemjs": "^7.25.9",
- "@babel/plugin-transform-modules-umd": "^7.25.9",
- "@babel/plugin-transform-named-capturing-groups-regex": "^7.25.9",
- "@babel/plugin-transform-new-target": "^7.25.9",
- "@babel/plugin-transform-nullish-coalescing-operator": "^7.26.6",
- "@babel/plugin-transform-numeric-separator": "^7.25.9",
- "@babel/plugin-transform-object-rest-spread": "^7.25.9",
- "@babel/plugin-transform-object-super": "^7.25.9",
- "@babel/plugin-transform-optional-catch-binding": "^7.25.9",
- "@babel/plugin-transform-optional-chaining": "^7.25.9",
- "@babel/plugin-transform-parameters": "^7.25.9",
- "@babel/plugin-transform-private-methods": "^7.25.9",
- "@babel/plugin-transform-private-property-in-object": "^7.25.9",
- "@babel/plugin-transform-property-literals": "^7.25.9",
- "@babel/plugin-transform-regenerator": "^7.25.9",
- "@babel/plugin-transform-regexp-modifiers": "^7.26.0",
- "@babel/plugin-transform-reserved-words": "^7.25.9",
- "@babel/plugin-transform-shorthand-properties": "^7.25.9",
- "@babel/plugin-transform-spread": "^7.25.9",
- "@babel/plugin-transform-sticky-regex": "^7.25.9",
- "@babel/plugin-transform-template-literals": "^7.26.8",
- "@babel/plugin-transform-typeof-symbol": "^7.26.7",
- "@babel/plugin-transform-unicode-escapes": "^7.25.9",
- "@babel/plugin-transform-unicode-property-regex": "^7.25.9",
- "@babel/plugin-transform-unicode-regex": "^7.25.9",
- "@babel/plugin-transform-unicode-sets-regex": "^7.25.9",
+ "@babel/plugin-transform-arrow-functions": "^7.27.1",
+ "@babel/plugin-transform-async-generator-functions": "^7.27.1",
+ "@babel/plugin-transform-async-to-generator": "^7.27.1",
+ "@babel/plugin-transform-block-scoped-functions": "^7.27.1",
+ "@babel/plugin-transform-block-scoping": "^7.27.1",
+ "@babel/plugin-transform-class-properties": "^7.27.1",
+ "@babel/plugin-transform-class-static-block": "^7.27.1",
+ "@babel/plugin-transform-classes": "^7.27.1",
+ "@babel/plugin-transform-computed-properties": "^7.27.1",
+ "@babel/plugin-transform-destructuring": "^7.27.1",
+ "@babel/plugin-transform-dotall-regex": "^7.27.1",
+ "@babel/plugin-transform-duplicate-keys": "^7.27.1",
+ "@babel/plugin-transform-duplicate-named-capturing-groups-regex": "^7.27.1",
+ "@babel/plugin-transform-dynamic-import": "^7.27.1",
+ "@babel/plugin-transform-exponentiation-operator": "^7.27.1",
+ "@babel/plugin-transform-export-namespace-from": "^7.27.1",
+ "@babel/plugin-transform-for-of": "^7.27.1",
+ "@babel/plugin-transform-function-name": "^7.27.1",
+ "@babel/plugin-transform-json-strings": "^7.27.1",
+ "@babel/plugin-transform-literals": "^7.27.1",
+ "@babel/plugin-transform-logical-assignment-operators": "^7.27.1",
+ "@babel/plugin-transform-member-expression-literals": "^7.27.1",
+ "@babel/plugin-transform-modules-amd": "^7.27.1",
+ "@babel/plugin-transform-modules-commonjs": "^7.27.1",
+ "@babel/plugin-transform-modules-systemjs": "^7.27.1",
+ "@babel/plugin-transform-modules-umd": "^7.27.1",
+ "@babel/plugin-transform-named-capturing-groups-regex": "^7.27.1",
+ "@babel/plugin-transform-new-target": "^7.27.1",
+ "@babel/plugin-transform-nullish-coalescing-operator": "^7.27.1",
+ "@babel/plugin-transform-numeric-separator": "^7.27.1",
+ "@babel/plugin-transform-object-rest-spread": "^7.27.2",
+ "@babel/plugin-transform-object-super": "^7.27.1",
+ "@babel/plugin-transform-optional-catch-binding": "^7.27.1",
+ "@babel/plugin-transform-optional-chaining": "^7.27.1",
+ "@babel/plugin-transform-parameters": "^7.27.1",
+ "@babel/plugin-transform-private-methods": "^7.27.1",
+ "@babel/plugin-transform-private-property-in-object": "^7.27.1",
+ "@babel/plugin-transform-property-literals": "^7.27.1",
+ "@babel/plugin-transform-regenerator": "^7.27.1",
+ "@babel/plugin-transform-regexp-modifiers": "^7.27.1",
+ "@babel/plugin-transform-reserved-words": "^7.27.1",
+ "@babel/plugin-transform-shorthand-properties": "^7.27.1",
+ "@babel/plugin-transform-spread": "^7.27.1",
+ "@babel/plugin-transform-sticky-regex": "^7.27.1",
+ "@babel/plugin-transform-template-literals": "^7.27.1",
+ "@babel/plugin-transform-typeof-symbol": "^7.27.1",
+ "@babel/plugin-transform-unicode-escapes": "^7.27.1",
+ "@babel/plugin-transform-unicode-property-regex": "^7.27.1",
+ "@babel/plugin-transform-unicode-regex": "^7.27.1",
+ "@babel/plugin-transform-unicode-sets-regex": "^7.27.1",
"@babel/preset-modules": "0.1.6-no-external-plugins",
"babel-plugin-polyfill-corejs2": "^0.4.10",
"babel-plugin-polyfill-corejs3": "^0.11.0",
@@ -3077,17 +3081,17 @@
}
},
"node_modules/@babel/preset-react": {
- "version": "7.26.3",
- "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.26.3.tgz",
- "integrity": "sha512-Nl03d6T9ky516DGK2YMxrTqvnpUW63TnJMOMonj+Zae0JiPC5BC9xPMSL6L8fiSpA5vP88qfygavVQvnLp+6Cw==",
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.27.1.tgz",
+ "integrity": "sha512-oJHWh2gLhU9dW9HHr42q0cI0/iHHXTLGe39qvpAZZzagHy0MzYLCnCVV0symeRvzmjHyVU7mw2K06E6u/JwbhA==",
"license": "MIT",
"dependencies": {
- "@babel/helper-plugin-utils": "^7.25.9",
- "@babel/helper-validator-option": "^7.25.9",
- "@babel/plugin-transform-react-display-name": "^7.25.9",
- "@babel/plugin-transform-react-jsx": "^7.25.9",
- "@babel/plugin-transform-react-jsx-development": "^7.25.9",
- "@babel/plugin-transform-react-pure-annotations": "^7.25.9"
+ "@babel/helper-plugin-utils": "^7.27.1",
+ "@babel/helper-validator-option": "^7.27.1",
+ "@babel/plugin-transform-react-display-name": "^7.27.1",
+ "@babel/plugin-transform-react-jsx": "^7.27.1",
+ "@babel/plugin-transform-react-jsx-development": "^7.27.1",
+ "@babel/plugin-transform-react-pure-annotations": "^7.27.1"
},
"engines": {
"node": ">=6.9.0"
@@ -3097,55 +3101,51 @@
}
},
"node_modules/@babel/runtime": {
- "version": "7.27.0",
- "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.27.0.tgz",
- "integrity": "sha512-VtPOkrdPHZsKc/clNqyi9WUA8TINkZ4cGk63UUE3u4pmB2k+ZMQRDuIOagv8UVd6j7k0T3+RRIb7beKTebNbcw==",
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.27.1.tgz",
+ "integrity": "sha512-1x3D2xEk2fRo3PAhwQwu5UubzgiVWSXTBfWpVd2Mx2AzRqJuDJCsgaDVZ7HB5iGzDW1Hl1sWN2mFyKjmR9uAog==",
"license": "MIT",
- "dependencies": {
- "regenerator-runtime": "^0.14.0"
- },
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/runtime-corejs3": {
- "version": "7.27.0",
- "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.27.0.tgz",
- "integrity": "sha512-UWjX6t+v+0ckwZ50Y5ShZLnlk95pP5MyW/pon9tiYzl3+18pkTHTFNTKr7rQbfRXPkowt2QAn30o1b6oswszew==",
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.27.1.tgz",
+ "integrity": "sha512-909rVuj3phpjW6y0MCXAZ5iNeORePa6ldJvp2baWGcTjwqbBDDz6xoS5JHJ7lS88NlwLYj07ImL/8IUMtDZzTA==",
"license": "MIT",
"dependencies": {
- "core-js-pure": "^3.30.2",
- "regenerator-runtime": "^0.14.0"
+ "core-js-pure": "^3.30.2"
},
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/template": {
- "version": "7.27.0",
- "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.0.tgz",
- "integrity": "sha512-2ncevenBqXI6qRMukPlXwHKHchC7RyMuu4xv5JBXRfOGVcTy1mXCD12qrp7Jsoxll1EV3+9sE4GugBVRjT2jFA==",
+ "version": "7.27.2",
+ "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.2.tgz",
+ "integrity": "sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==",
"license": "MIT",
"dependencies": {
- "@babel/code-frame": "^7.26.2",
- "@babel/parser": "^7.27.0",
- "@babel/types": "^7.27.0"
+ "@babel/code-frame": "^7.27.1",
+ "@babel/parser": "^7.27.2",
+ "@babel/types": "^7.27.1"
},
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/traverse": {
- "version": "7.27.0",
- "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.27.0.tgz",
- "integrity": "sha512-19lYZFzYVQkkHkl4Cy4WrAVcqBkgvV2YM2TU3xG6DIwO7O3ecbDPfW3yM3bjAGcqcQHi+CCtjMR3dIEHxsd6bA==",
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.27.1.tgz",
+ "integrity": "sha512-ZCYtZciz1IWJB4U61UPu4KEaqyfj+r5T1Q5mqPo+IBpcG9kHv30Z0aD8LXPgC1trYa6rK0orRyAhqUgk4MjmEg==",
"license": "MIT",
"dependencies": {
- "@babel/code-frame": "^7.26.2",
- "@babel/generator": "^7.27.0",
- "@babel/parser": "^7.27.0",
- "@babel/template": "^7.27.0",
- "@babel/types": "^7.27.0",
+ "@babel/code-frame": "^7.27.1",
+ "@babel/generator": "^7.27.1",
+ "@babel/parser": "^7.27.1",
+ "@babel/template": "^7.27.1",
+ "@babel/types": "^7.27.1",
"debug": "^4.3.1",
"globals": "^11.1.0"
},
@@ -3163,13 +3163,13 @@
}
},
"node_modules/@babel/types": {
- "version": "7.27.0",
- "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.27.0.tgz",
- "integrity": "sha512-H45s8fVLYjbhFH62dIJ3WtmJ6RSPt/3DRO0ZcT2SUiYiQyz3BLVb9ADEnLl91m74aQPS3AzzeajZHYOalWe3bg==",
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.27.1.tgz",
+ "integrity": "sha512-+EzkxvLNfiUeKMgy/3luqfsCWFRXLb7U6wNQTk60tovuckwB15B191tJWvpp4HjiQWdJkCxO3Wbvc6jlk3Xb2Q==",
"license": "MIT",
"dependencies": {
- "@babel/helper-string-parser": "^7.25.9",
- "@babel/helper-validator-identifier": "^7.25.9"
+ "@babel/helper-string-parser": "^7.27.1",
+ "@babel/helper-validator-identifier": "^7.27.1"
},
"engines": {
"node": ">=6.9.0"
@@ -3291,9 +3291,9 @@
}
},
"node_modules/@csstools/css-calc": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/@csstools/css-calc/-/css-calc-2.1.2.tgz",
- "integrity": "sha512-TklMyb3uBB28b5uQdxjReG4L80NxAqgrECqLZFQbyLekwwlcDDS8r3f07DKqeo8C4926Br0gf/ZDe17Zv4wIuw==",
+ "version": "2.1.3",
+ "resolved": "https://registry.npmjs.org/@csstools/css-calc/-/css-calc-2.1.3.tgz",
+ "integrity": "sha512-XBG3talrhid44BY1x3MHzUx/aTG8+x/Zi57M4aTKK9RFB4aLlF3TTSzfzn8nWVHWL3FgAXAxmupmDd6VWww+pw==",
"funding": [
{
"type": "github",
@@ -3314,9 +3314,9 @@
}
},
"node_modules/@csstools/css-color-parser": {
- "version": "3.0.8",
- "resolved": "https://registry.npmjs.org/@csstools/css-color-parser/-/css-color-parser-3.0.8.tgz",
- "integrity": "sha512-pdwotQjCCnRPuNi06jFuP68cykU1f3ZWExLe/8MQ1LOs8Xq+fTkYgd+2V8mWUWMrOn9iS2HftPVaMZDaXzGbhQ==",
+ "version": "3.0.9",
+ "resolved": "https://registry.npmjs.org/@csstools/css-color-parser/-/css-color-parser-3.0.9.tgz",
+ "integrity": "sha512-wILs5Zk7BU86UArYBJTPy/FMPPKVKHMj1ycCEyf3VUptol0JNRLFU/BZsJ4aiIHJEbSLiizzRrw8Pc1uAEDrXw==",
"funding": [
{
"type": "github",
@@ -3330,7 +3330,7 @@
"license": "MIT",
"dependencies": {
"@csstools/color-helpers": "^5.0.2",
- "@csstools/css-calc": "^2.1.2"
+ "@csstools/css-calc": "^2.1.3"
},
"engines": {
"node": ">=18"
@@ -3587,9 +3587,9 @@
"license": "MIT"
},
"node_modules/@esbuild/aix-ppc64": {
- "version": "0.25.2",
- "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.2.tgz",
- "integrity": "sha512-wCIboOL2yXZym2cgm6mlA742s9QeJ8DjGVaL39dLN4rRwrOgOyYSnOaFPhKZGLb2ngj4EyfAFjsNJwPXZvseag==",
+ "version": "0.25.4",
+ "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.4.tgz",
+ "integrity": "sha512-1VCICWypeQKhVbE9oW/sJaAmjLxhVqacdkvPLEjwlttjfwENRSClS8EjBz0KzRyFSCPDIkuXW34Je/vk7zdB7Q==",
"cpu": [
"ppc64"
],
@@ -3604,9 +3604,9 @@
}
},
"node_modules/@esbuild/android-arm": {
- "version": "0.25.2",
- "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.2.tgz",
- "integrity": "sha512-NQhH7jFstVY5x8CKbcfa166GoV0EFkaPkCKBQkdPJFvo5u+nGXLEH/ooniLb3QI8Fk58YAx7nsPLozUWfCBOJA==",
+ "version": "0.25.4",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.4.tgz",
+ "integrity": "sha512-QNdQEps7DfFwE3hXiU4BZeOV68HHzYwGd0Nthhd3uCkkEKK7/R6MTgM0P7H7FAs5pU/DIWsviMmEGxEoxIZ+ZQ==",
"cpu": [
"arm"
],
@@ -3621,9 +3621,9 @@
}
},
"node_modules/@esbuild/android-arm64": {
- "version": "0.25.2",
- "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.2.tgz",
- "integrity": "sha512-5ZAX5xOmTligeBaeNEPnPaeEuah53Id2tX4c2CVP3JaROTH+j4fnfHCkr1PjXMd78hMst+TlkfKcW/DlTq0i4w==",
+ "version": "0.25.4",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.4.tgz",
+ "integrity": "sha512-bBy69pgfhMGtCnwpC/x5QhfxAz/cBgQ9enbtwjf6V9lnPI/hMyT9iWpR1arm0l3kttTr4L0KSLpKmLp/ilKS9A==",
"cpu": [
"arm64"
],
@@ -3638,9 +3638,9 @@
}
},
"node_modules/@esbuild/android-x64": {
- "version": "0.25.2",
- "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.2.tgz",
- "integrity": "sha512-Ffcx+nnma8Sge4jzddPHCZVRvIfQ0kMsUsCMcJRHkGJ1cDmhe4SsrYIjLUKn1xpHZybmOqCWwB0zQvsjdEHtkg==",
+ "version": "0.25.4",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.4.tgz",
+ "integrity": "sha512-TVhdVtQIFuVpIIR282btcGC2oGQoSfZfmBdTip2anCaVYcqWlZXGcdcKIUklfX2wj0JklNYgz39OBqh2cqXvcQ==",
"cpu": [
"x64"
],
@@ -3655,9 +3655,9 @@
}
},
"node_modules/@esbuild/darwin-arm64": {
- "version": "0.25.2",
- "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.2.tgz",
- "integrity": "sha512-MpM6LUVTXAzOvN4KbjzU/q5smzryuoNjlriAIx+06RpecwCkL9JpenNzpKd2YMzLJFOdPqBpuub6eVRP5IgiSA==",
+ "version": "0.25.4",
+ "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.4.tgz",
+ "integrity": "sha512-Y1giCfM4nlHDWEfSckMzeWNdQS31BQGs9/rouw6Ub91tkK79aIMTH3q9xHvzH8d0wDru5Ci0kWB8b3up/nl16g==",
"cpu": [
"arm64"
],
@@ -3672,9 +3672,9 @@
}
},
"node_modules/@esbuild/darwin-x64": {
- "version": "0.25.2",
- "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.2.tgz",
- "integrity": "sha512-5eRPrTX7wFyuWe8FqEFPG2cU0+butQQVNcT4sVipqjLYQjjh8a8+vUTfgBKM88ObB85ahsnTwF7PSIt6PG+QkA==",
+ "version": "0.25.4",
+ "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.4.tgz",
+ "integrity": "sha512-CJsry8ZGM5VFVeyUYB3cdKpd/H69PYez4eJh1W/t38vzutdjEjtP7hB6eLKBoOdxcAlCtEYHzQ/PJ/oU9I4u0A==",
"cpu": [
"x64"
],
@@ -3689,9 +3689,9 @@
}
},
"node_modules/@esbuild/freebsd-arm64": {
- "version": "0.25.2",
- "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.2.tgz",
- "integrity": "sha512-mLwm4vXKiQ2UTSX4+ImyiPdiHjiZhIaE9QvC7sw0tZ6HoNMjYAqQpGyui5VRIi5sGd+uWq940gdCbY3VLvsO1w==",
+ "version": "0.25.4",
+ "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.4.tgz",
+ "integrity": "sha512-yYq+39NlTRzU2XmoPW4l5Ifpl9fqSk0nAJYM/V/WUGPEFfek1epLHJIkTQM6bBs1swApjO5nWgvr843g6TjxuQ==",
"cpu": [
"arm64"
],
@@ -3706,9 +3706,9 @@
}
},
"node_modules/@esbuild/freebsd-x64": {
- "version": "0.25.2",
- "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.2.tgz",
- "integrity": "sha512-6qyyn6TjayJSwGpm8J9QYYGQcRgc90nmfdUb0O7pp1s4lTY+9D0H9O02v5JqGApUyiHOtkz6+1hZNvNtEhbwRQ==",
+ "version": "0.25.4",
+ "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.4.tgz",
+ "integrity": "sha512-0FgvOJ6UUMflsHSPLzdfDnnBBVoCDtBTVyn/MrWloUNvq/5SFmh13l3dvgRPkDihRxb77Y17MbqbCAa2strMQQ==",
"cpu": [
"x64"
],
@@ -3723,9 +3723,9 @@
}
},
"node_modules/@esbuild/linux-arm": {
- "version": "0.25.2",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.2.tgz",
- "integrity": "sha512-UHBRgJcmjJv5oeQF8EpTRZs/1knq6loLxTsjc3nxO9eXAPDLcWW55flrMVc97qFPbmZP31ta1AZVUKQzKTzb0g==",
+ "version": "0.25.4",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.4.tgz",
+ "integrity": "sha512-kro4c0P85GMfFYqW4TWOpvmF8rFShbWGnrLqlzp4X1TNWjRY3JMYUfDCtOxPKOIY8B0WC8HN51hGP4I4hz4AaQ==",
"cpu": [
"arm"
],
@@ -3740,9 +3740,9 @@
}
},
"node_modules/@esbuild/linux-arm64": {
- "version": "0.25.2",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.2.tgz",
- "integrity": "sha512-gq/sjLsOyMT19I8obBISvhoYiZIAaGF8JpeXu1u8yPv8BE5HlWYobmlsfijFIZ9hIVGYkbdFhEqC0NvM4kNO0g==",
+ "version": "0.25.4",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.4.tgz",
+ "integrity": "sha512-+89UsQTfXdmjIvZS6nUnOOLoXnkUTB9hR5QAeLrQdzOSWZvNSAXAtcRDHWtqAUtAmv7ZM1WPOOeSxDzzzMogiQ==",
"cpu": [
"arm64"
],
@@ -3757,9 +3757,9 @@
}
},
"node_modules/@esbuild/linux-ia32": {
- "version": "0.25.2",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.2.tgz",
- "integrity": "sha512-bBYCv9obgW2cBP+2ZWfjYTU+f5cxRoGGQ5SeDbYdFCAZpYWrfjjfYwvUpP8MlKbP0nwZ5gyOU/0aUzZ5HWPuvQ==",
+ "version": "0.25.4",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.4.tgz",
+ "integrity": "sha512-yTEjoapy8UP3rv8dB0ip3AfMpRbyhSN3+hY8mo/i4QXFeDxmiYbEKp3ZRjBKcOP862Ua4b1PDfwlvbuwY7hIGQ==",
"cpu": [
"ia32"
],
@@ -3774,9 +3774,9 @@
}
},
"node_modules/@esbuild/linux-loong64": {
- "version": "0.25.2",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.2.tgz",
- "integrity": "sha512-SHNGiKtvnU2dBlM5D8CXRFdd+6etgZ9dXfaPCeJtz+37PIUlixvlIhI23L5khKXs3DIzAn9V8v+qb1TRKrgT5w==",
+ "version": "0.25.4",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.4.tgz",
+ "integrity": "sha512-NeqqYkrcGzFwi6CGRGNMOjWGGSYOpqwCjS9fvaUlX5s3zwOtn1qwg1s2iE2svBe4Q/YOG1q6875lcAoQK/F4VA==",
"cpu": [
"loong64"
],
@@ -3791,9 +3791,9 @@
}
},
"node_modules/@esbuild/linux-mips64el": {
- "version": "0.25.2",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.2.tgz",
- "integrity": "sha512-hDDRlzE6rPeoj+5fsADqdUZl1OzqDYow4TB4Y/3PlKBD0ph1e6uPHzIQcv2Z65u2K0kpeByIyAjCmjn1hJgG0Q==",
+ "version": "0.25.4",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.4.tgz",
+ "integrity": "sha512-IcvTlF9dtLrfL/M8WgNI/qJYBENP3ekgsHbYUIzEzq5XJzzVEV/fXY9WFPfEEXmu3ck2qJP8LG/p3Q8f7Zc2Xg==",
"cpu": [
"mips64el"
],
@@ -3808,9 +3808,9 @@
}
},
"node_modules/@esbuild/linux-ppc64": {
- "version": "0.25.2",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.2.tgz",
- "integrity": "sha512-tsHu2RRSWzipmUi9UBDEzc0nLc4HtpZEI5Ba+Omms5456x5WaNuiG3u7xh5AO6sipnJ9r4cRWQB2tUjPyIkc6g==",
+ "version": "0.25.4",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.4.tgz",
+ "integrity": "sha512-HOy0aLTJTVtoTeGZh4HSXaO6M95qu4k5lJcH4gxv56iaycfz1S8GO/5Jh6X4Y1YiI0h7cRyLi+HixMR+88swag==",
"cpu": [
"ppc64"
],
@@ -3825,9 +3825,9 @@
}
},
"node_modules/@esbuild/linux-riscv64": {
- "version": "0.25.2",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.2.tgz",
- "integrity": "sha512-k4LtpgV7NJQOml/10uPU0s4SAXGnowi5qBSjaLWMojNCUICNu7TshqHLAEbkBdAszL5TabfvQ48kK84hyFzjnw==",
+ "version": "0.25.4",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.4.tgz",
+ "integrity": "sha512-i8JUDAufpz9jOzo4yIShCTcXzS07vEgWzyX3NH2G7LEFVgrLEhjwL3ajFE4fZI3I4ZgiM7JH3GQ7ReObROvSUA==",
"cpu": [
"riscv64"
],
@@ -3842,9 +3842,9 @@
}
},
"node_modules/@esbuild/linux-s390x": {
- "version": "0.25.2",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.2.tgz",
- "integrity": "sha512-GRa4IshOdvKY7M/rDpRR3gkiTNp34M0eLTaC1a08gNrh4u488aPhuZOCpkF6+2wl3zAN7L7XIpOFBhnaE3/Q8Q==",
+ "version": "0.25.4",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.4.tgz",
+ "integrity": "sha512-jFnu+6UbLlzIjPQpWCNh5QtrcNfMLjgIavnwPQAfoGx4q17ocOU9MsQ2QVvFxwQoWpZT8DvTLooTvmOQXkO51g==",
"cpu": [
"s390x"
],
@@ -3859,9 +3859,9 @@
}
},
"node_modules/@esbuild/linux-x64": {
- "version": "0.25.2",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.2.tgz",
- "integrity": "sha512-QInHERlqpTTZ4FRB0fROQWXcYRD64lAoiegezDunLpalZMjcUcld3YzZmVJ2H/Cp0wJRZ8Xtjtj0cEHhYc/uUg==",
+ "version": "0.25.4",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.4.tgz",
+ "integrity": "sha512-6e0cvXwzOnVWJHq+mskP8DNSrKBr1bULBvnFLpc1KY+d+irZSgZ02TGse5FsafKS5jg2e4pbvK6TPXaF/A6+CA==",
"cpu": [
"x64"
],
@@ -3876,9 +3876,9 @@
}
},
"node_modules/@esbuild/netbsd-arm64": {
- "version": "0.25.2",
- "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.2.tgz",
- "integrity": "sha512-talAIBoY5M8vHc6EeI2WW9d/CkiO9MQJ0IOWX8hrLhxGbro/vBXJvaQXefW2cP0z0nQVTdQ/eNyGFV1GSKrxfw==",
+ "version": "0.25.4",
+ "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.4.tgz",
+ "integrity": "sha512-vUnkBYxZW4hL/ie91hSqaSNjulOnYXE1VSLusnvHg2u3jewJBz3YzB9+oCw8DABeVqZGg94t9tyZFoHma8gWZQ==",
"cpu": [
"arm64"
],
@@ -3893,9 +3893,9 @@
}
},
"node_modules/@esbuild/netbsd-x64": {
- "version": "0.25.2",
- "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.2.tgz",
- "integrity": "sha512-voZT9Z+tpOxrvfKFyfDYPc4DO4rk06qamv1a/fkuzHpiVBMOhpjK+vBmWM8J1eiB3OLSMFYNaOaBNLXGChf5tg==",
+ "version": "0.25.4",
+ "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.4.tgz",
+ "integrity": "sha512-XAg8pIQn5CzhOB8odIcAm42QsOfa98SBeKUdo4xa8OvX8LbMZqEtgeWE9P/Wxt7MlG2QqvjGths+nq48TrUiKw==",
"cpu": [
"x64"
],
@@ -3910,9 +3910,9 @@
}
},
"node_modules/@esbuild/openbsd-arm64": {
- "version": "0.25.2",
- "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.2.tgz",
- "integrity": "sha512-dcXYOC6NXOqcykeDlwId9kB6OkPUxOEqU+rkrYVqJbK2hagWOMrsTGsMr8+rW02M+d5Op5NNlgMmjzecaRf7Tg==",
+ "version": "0.25.4",
+ "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.4.tgz",
+ "integrity": "sha512-Ct2WcFEANlFDtp1nVAXSNBPDxyU+j7+tId//iHXU2f/lN5AmO4zLyhDcpR5Cz1r08mVxzt3Jpyt4PmXQ1O6+7A==",
"cpu": [
"arm64"
],
@@ -3927,9 +3927,9 @@
}
},
"node_modules/@esbuild/openbsd-x64": {
- "version": "0.25.2",
- "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.2.tgz",
- "integrity": "sha512-t/TkWwahkH0Tsgoq1Ju7QfgGhArkGLkF1uYz8nQS/PPFlXbP5YgRpqQR3ARRiC2iXoLTWFxc6DJMSK10dVXluw==",
+ "version": "0.25.4",
+ "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.4.tgz",
+ "integrity": "sha512-xAGGhyOQ9Otm1Xu8NT1ifGLnA6M3sJxZ6ixylb+vIUVzvvd6GOALpwQrYrtlPouMqd/vSbgehz6HaVk4+7Afhw==",
"cpu": [
"x64"
],
@@ -3944,9 +3944,9 @@
}
},
"node_modules/@esbuild/sunos-x64": {
- "version": "0.25.2",
- "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.2.tgz",
- "integrity": "sha512-cfZH1co2+imVdWCjd+D1gf9NjkchVhhdpgb1q5y6Hcv9TP6Zi9ZG/beI3ig8TvwT9lH9dlxLq5MQBBgwuj4xvA==",
+ "version": "0.25.4",
+ "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.4.tgz",
+ "integrity": "sha512-Mw+tzy4pp6wZEK0+Lwr76pWLjrtjmJyUB23tHKqEDP74R3q95luY/bXqXZeYl4NYlvwOqoRKlInQialgCKy67Q==",
"cpu": [
"x64"
],
@@ -3961,9 +3961,9 @@
}
},
"node_modules/@esbuild/win32-arm64": {
- "version": "0.25.2",
- "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.2.tgz",
- "integrity": "sha512-7Loyjh+D/Nx/sOTzV8vfbB3GJuHdOQyrOryFdZvPHLf42Tk9ivBU5Aedi7iyX+x6rbn2Mh68T4qq1SDqJBQO5Q==",
+ "version": "0.25.4",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.4.tgz",
+ "integrity": "sha512-AVUP428VQTSddguz9dO9ngb+E5aScyg7nOeJDrF1HPYu555gmza3bDGMPhmVXL8svDSoqPCsCPjb265yG/kLKQ==",
"cpu": [
"arm64"
],
@@ -3978,9 +3978,9 @@
}
},
"node_modules/@esbuild/win32-ia32": {
- "version": "0.25.2",
- "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.2.tgz",
- "integrity": "sha512-WRJgsz9un0nqZJ4MfhabxaD9Ft8KioqU3JMinOTvobbX6MOSUigSBlogP8QB3uxpJDsFS6yN+3FDBdqE5lg9kg==",
+ "version": "0.25.4",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.4.tgz",
+ "integrity": "sha512-i1sW+1i+oWvQzSgfRcxxG2k4I9n3O9NRqy8U+uugaT2Dy7kLO9Y7wI72haOahxceMX8hZAzgGou1FhndRldxRg==",
"cpu": [
"ia32"
],
@@ -3995,9 +3995,9 @@
}
},
"node_modules/@esbuild/win32-x64": {
- "version": "0.25.2",
- "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.2.tgz",
- "integrity": "sha512-kM3HKb16VIXZyIeVrM1ygYmZBKybX8N4p754bw390wGO3Tf2j4L2/WYL+4suWujpgf6GBYs3jv7TyUivdd05JA==",
+ "version": "0.25.4",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.4.tgz",
+ "integrity": "sha512-nOT2vZNw6hJ+z43oP1SPea/G/6AbN6X+bGNhNuq8NtRHy4wsMhw765IKLNmnjek7GvjWBYQ8Q5VBoYTFg9y1UQ==",
"cpu": [
"x64"
],
@@ -4012,9 +4012,9 @@
}
},
"node_modules/@eslint-community/eslint-utils": {
- "version": "4.6.1",
- "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.6.1.tgz",
- "integrity": "sha512-KTsJMmobmbrFLe3LDh0PC2FXpcSYJt/MLjlkh/9LEnmKYLSYmT/0EW9JWANjeoemiuZrmogti0tW5Ch+qNUYDw==",
+ "version": "4.7.0",
+ "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.7.0.tgz",
+ "integrity": "sha512-dyybb3AcajC7uha6CvhdVRJqaKyn7w2YKqKyAN37NKYgZT36w+iRb0Dymmc5qEJ549c/S31cMMSFd75bteCpCw==",
"license": "MIT",
"dependencies": {
"eslint-visitor-keys": "^3.4.3"
@@ -4065,18 +4065,18 @@
}
},
"node_modules/@eslint/config-helpers": {
- "version": "0.2.1",
- "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.2.1.tgz",
- "integrity": "sha512-RI17tsD2frtDu/3dmI7QRrD4bedNKPM08ziRYaC5AhkGrzIAJelm9kJU1TznK+apx6V+cqRz8tfpEeG3oIyjxw==",
+ "version": "0.2.2",
+ "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.2.2.tgz",
+ "integrity": "sha512-+GPzk8PlG0sPpzdU5ZvIRMPidzAnZDl/s9L+y13iodqvb8leL53bTannOrQ/Im7UkpsmFU5Ily5U60LWixnmLg==",
"license": "Apache-2.0",
"engines": {
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
}
},
"node_modules/@eslint/core": {
- "version": "0.12.0",
- "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.12.0.tgz",
- "integrity": "sha512-cmrR6pytBuSMTaBweKoGMwu3EiHiEC+DoyupPmlZ0HxBJBtIxwe+j/E4XPIKNx+Q74c8lXKPwYawBf5glsTkHg==",
+ "version": "0.14.0",
+ "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.14.0.tgz",
+ "integrity": "sha512-qIbV0/JZr7iSDjqAc60IqbLdsj9GDt16xQtWD+B78d/HAlvysGdZZ6rpJHGAc2T0FQx1X6thsSPdnoiGKdNtdg==",
"license": "Apache-2.0",
"dependencies": {
"@types/json-schema": "^7.0.15"
@@ -4085,6 +4085,33 @@
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
}
},
+ "node_modules/@eslint/css": {
+ "version": "0.8.1",
+ "resolved": "https://registry.npmjs.org/@eslint/css/-/css-0.8.1.tgz",
+ "integrity": "sha512-674JJD1q8sDlJORLep+gGnm3VRCQo/qLmKQgCIf2LnUK/tHf96StWjLX2IF3yyp3yeU9npZ6ixySMr2G256eiQ==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@eslint/core": "^0.14.0",
+ "@eslint/css-tree": "^3.3.3",
+ "@eslint/plugin-kit": "^0.3.1"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ }
+ },
+ "node_modules/@eslint/css-tree": {
+ "version": "3.6.1",
+ "resolved": "https://registry.npmjs.org/@eslint/css-tree/-/css-tree-3.6.1.tgz",
+ "integrity": "sha512-5DIsBME23tUQD5zHD+T38lC2DG4jB8x8JRa+yDncLne2TIZA0VuCpcSazOX1EC+sM/q8w24qeevXfmfsIxAeqA==",
+ "license": "MIT",
+ "dependencies": {
+ "mdn-data": "2.21.0",
+ "source-map-js": "^1.0.1"
+ },
+ "engines": {
+ "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0"
+ }
+ },
"node_modules/@eslint/eslintrc": {
"version": "3.3.1",
"resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.1.tgz",
@@ -4161,12 +4188,15 @@
"license": "MIT"
},
"node_modules/@eslint/js": {
- "version": "9.24.0",
- "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.24.0.tgz",
- "integrity": "sha512-uIY/y3z0uvOGX8cp1C2fiC4+ZmBhp6yZWkojtHL1YEMnRt1Y63HB9TM17proGEmeG7HeUY+UP36F0aknKYTpYA==",
+ "version": "9.27.0",
+ "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.27.0.tgz",
+ "integrity": "sha512-G5JD9Tu5HJEu4z2Uo4aHY2sLV64B7CDMXxFzqzjl3NKd6RVzSXNoE80jk7Y0lJkTTkjiIhBAqmlYwjuBY3tvpA==",
"license": "MIT",
"engines": {
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "url": "https://eslint.org/donate"
}
},
"node_modules/@eslint/object-schema": {
@@ -4179,30 +4209,18 @@
}
},
"node_modules/@eslint/plugin-kit": {
- "version": "0.2.8",
- "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.2.8.tgz",
- "integrity": "sha512-ZAoA40rNMPwSm+AeHpCq8STiNAwzWLJuP8Xv4CHIc9wv/PSuExjMrmjfYNj682vW0OOiZ1HKxzvjQr9XZIisQA==",
+ "version": "0.3.1",
+ "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.3.1.tgz",
+ "integrity": "sha512-0J+zgWxHN+xXONWIyPWKFMgVuJoZuGiIFu8yxk7RJjxkzpGmyja5wRFqZIVtjDVOQpV+Rw0iOAjYPE2eQyjr0w==",
"license": "Apache-2.0",
"dependencies": {
- "@eslint/core": "^0.13.0",
+ "@eslint/core": "^0.14.0",
"levn": "^0.4.1"
},
"engines": {
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
}
},
- "node_modules/@eslint/plugin-kit/node_modules/@eslint/core": {
- "version": "0.13.0",
- "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.13.0.tgz",
- "integrity": "sha512-yfkgDw1KR66rkT5A8ci4irzDysN7FRpq3ttJolR88OqQikAWqwA8j5VZyas+vjyBNFIJ7MfybJ9plMILI2UrCw==",
- "license": "Apache-2.0",
- "dependencies": {
- "@types/json-schema": "^7.0.15"
- },
- "engines": {
- "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
- }
- },
"node_modules/@ffmpeg-installer/darwin-arm64": {
"version": "4.1.5",
"resolved": "https://registry.npmjs.org/@ffmpeg-installer/darwin-arm64/-/darwin-arm64-4.1.5.tgz",
@@ -4360,28 +4378,28 @@
}
},
"node_modules/@floating-ui/core": {
- "version": "1.6.9",
- "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.6.9.tgz",
- "integrity": "sha512-uMXCuQ3BItDUbAMhIXw7UPXRfAlOAvZzdK9BWpE60MCn+Svt3aLn9jsPTi/WNGlRUu2uI0v5S7JiIUsbsvh3fw==",
+ "version": "1.7.0",
+ "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.7.0.tgz",
+ "integrity": "sha512-FRdBLykrPPA6P76GGGqlex/e7fbe0F1ykgxHYNXQsH/iTEtjMj/f9bpY5oQqbjt5VgZvgz/uKXbGuROijh3VLA==",
"license": "MIT",
"dependencies": {
"@floating-ui/utils": "^0.2.9"
}
},
"node_modules/@floating-ui/dom": {
- "version": "1.6.13",
- "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.6.13.tgz",
- "integrity": "sha512-umqzocjDgNRGTuO7Q8CU32dkHkECqI8ZdMZ5Swb6QAM0t5rnlrN3lGo1hdpscRd3WS8T6DKYK4ephgIH9iRh3w==",
+ "version": "1.7.0",
+ "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.7.0.tgz",
+ "integrity": "sha512-lGTor4VlXcesUMh1cupTUTDoCxMb0V6bm3CnxHzQcw8Eaf1jQbgQX4i02fYgT0vJ82tb5MZ4CZk1LRGkktJCzg==",
"license": "MIT",
"dependencies": {
- "@floating-ui/core": "^1.6.0",
+ "@floating-ui/core": "^1.7.0",
"@floating-ui/utils": "^0.2.9"
}
},
"node_modules/@floating-ui/react": {
- "version": "0.27.7",
- "resolved": "https://registry.npmjs.org/@floating-ui/react/-/react-0.27.7.tgz",
- "integrity": "sha512-5V9pwFeiv+95Jlowq/7oiGISSrdXMTs2jfoSy8k+WM6oI/Skm1WWjPdJWeporN2O4UGcsaCJdirKffKayMoPgw==",
+ "version": "0.27.8",
+ "resolved": "https://registry.npmjs.org/@floating-ui/react/-/react-0.27.8.tgz",
+ "integrity": "sha512-EQJ4Th328y2wyHR3KzOUOoTW2UKjFk53fmyahfwExnFQ8vnsMYqKc+fFPOkeYtj5tcp1DUMiNJ7BFhed7e9ONw==",
"license": "MIT",
"dependencies": {
"@floating-ui/react-dom": "^2.1.2",
@@ -4581,6 +4599,17 @@
"@fullcalendar/core": "~6.1.17"
}
},
+ "node_modules/@fullcalendar/react": {
+ "version": "6.1.17",
+ "resolved": "https://registry.npmjs.org/@fullcalendar/react/-/react-6.1.17.tgz",
+ "integrity": "sha512-AA8soHhlfRH5dUeqHnfAtzDiXa2vrgWocJSK/F5qzw/pOxc9MqpuoS/nQBROWtHHg6yQUg3DoGqOOhi7dmylXQ==",
+ "license": "MIT",
+ "peerDependencies": {
+ "@fullcalendar/core": "~6.1.17",
+ "react": "^16.7.0 || ^17 || ^18 || ^19",
+ "react-dom": "^16.7.0 || ^17 || ^18 || ^19"
+ }
+ },
"node_modules/@fullcalendar/timegrid": {
"version": "6.1.17",
"resolved": "https://registry.npmjs.org/@fullcalendar/timegrid/-/timegrid-6.1.17.tgz",
@@ -4658,9 +4687,9 @@
}
},
"node_modules/@humanwhocodes/retry": {
- "version": "0.4.2",
- "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.2.tgz",
- "integrity": "sha512-xeO57FpIu4p1Ri3Jq/EXq4ClRm86dVF2z/+kvFnyqVYRavTZmaFaUBbWCOuuTh0o/g7DSsk6kc2vrS4Vl5oPOQ==",
+ "version": "0.4.3",
+ "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz",
+ "integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==",
"license": "Apache-2.0",
"engines": {
"node": ">=18.18"
@@ -4714,9 +4743,9 @@
}
},
"node_modules/@internationalized/date": {
- "version": "3.8.0",
- "resolved": "https://registry.npmjs.org/@internationalized/date/-/date-3.8.0.tgz",
- "integrity": "sha512-J51AJ0fEL68hE4CwGPa6E0PO6JDaVLd8aln48xFCSy7CZkZc96dGEGmLs2OEEbBxcsVZtfrqkXJwI2/MSG8yKw==",
+ "version": "3.8.1",
+ "resolved": "https://registry.npmjs.org/@internationalized/date/-/date-3.8.1.tgz",
+ "integrity": "sha512-PgVE6B6eIZtzf9Gu5HvJxRK3ufUFz9DhspELuhW/N0GuMGMTLvPQNRkHP2hTuP9lblOk+f+1xi96sPiPXANXAA==",
"license": "Apache-2.0",
"dependencies": {
"@swc/helpers": "^0.5.0"
@@ -4733,9 +4762,9 @@
}
},
"node_modules/@internationalized/number": {
- "version": "3.6.1",
- "resolved": "https://registry.npmjs.org/@internationalized/number/-/number-3.6.1.tgz",
- "integrity": "sha512-UVsb4bCwbL944E0SX50CHFtWEeZ2uB5VozZ5yDXJdq6iPZsZO5p+bjVMZh2GxHf4Bs/7xtDCcPwEa2NU9DaG/g==",
+ "version": "3.6.2",
+ "resolved": "https://registry.npmjs.org/@internationalized/number/-/number-3.6.2.tgz",
+ "integrity": "sha512-E5QTOlMg9wo5OrKdHD6edo1JJlIoOsylh0+mbf0evi1tHJwMZfJSaBpGtnJV9N7w3jeiioox9EG/EWRWPh82vg==",
"license": "Apache-2.0",
"dependencies": {
"@swc/helpers": "^0.5.0"
@@ -5311,9 +5340,9 @@
}
},
"node_modules/@jsonjoy.com/util": {
- "version": "1.5.0",
- "resolved": "https://registry.npmjs.org/@jsonjoy.com/util/-/util-1.5.0.tgz",
- "integrity": "sha512-ojoNsrIuPI9g6o8UxhraZQSyF2ByJanAY4cTFbc8Mf2AXEF4aQRGY1dJxyJpuyav8r9FGflEt/Ff3u5Nt6YMPA==",
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/@jsonjoy.com/util/-/util-1.6.0.tgz",
+ "integrity": "sha512-sw/RMbehRhN68WRtcKCpQOPfnH6lLP4GJfqzi3iYej8tnzpZUDr6UkZYJjcjjC0FWEJOJbyM3PTIwxucUmDG2A==",
"license": "Apache-2.0",
"engines": {
"node": ">=10.0"
@@ -5684,31 +5713,31 @@
}
},
"node_modules/@napi-rs/canvas": {
- "version": "0.1.69",
- "resolved": "https://registry.npmjs.org/@napi-rs/canvas/-/canvas-0.1.69.tgz",
- "integrity": "sha512-ydvNeJMRm+l3T14yCoUKqjYQiEdXDq1isznI93LEBGYssXKfSaLNLHOkeM4z9Fnw9Pkt2EKOCAtW9cS4b00Zcg==",
+ "version": "0.1.70",
+ "resolved": "https://registry.npmjs.org/@napi-rs/canvas/-/canvas-0.1.70.tgz",
+ "integrity": "sha512-nD6NGa4JbNYSZYsTnLGrqe9Kn/lCkA4ybXt8sx5ojDqZjr2i0TWAHxx/vhgfjX+i3hCdKWufxYwi7CfXqtITSA==",
"license": "MIT",
"optional": true,
"engines": {
"node": ">= 10"
},
"optionalDependencies": {
- "@napi-rs/canvas-android-arm64": "0.1.69",
- "@napi-rs/canvas-darwin-arm64": "0.1.69",
- "@napi-rs/canvas-darwin-x64": "0.1.69",
- "@napi-rs/canvas-linux-arm-gnueabihf": "0.1.69",
- "@napi-rs/canvas-linux-arm64-gnu": "0.1.69",
- "@napi-rs/canvas-linux-arm64-musl": "0.1.69",
- "@napi-rs/canvas-linux-riscv64-gnu": "0.1.69",
- "@napi-rs/canvas-linux-x64-gnu": "0.1.69",
- "@napi-rs/canvas-linux-x64-musl": "0.1.69",
- "@napi-rs/canvas-win32-x64-msvc": "0.1.69"
+ "@napi-rs/canvas-android-arm64": "0.1.70",
+ "@napi-rs/canvas-darwin-arm64": "0.1.70",
+ "@napi-rs/canvas-darwin-x64": "0.1.70",
+ "@napi-rs/canvas-linux-arm-gnueabihf": "0.1.70",
+ "@napi-rs/canvas-linux-arm64-gnu": "0.1.70",
+ "@napi-rs/canvas-linux-arm64-musl": "0.1.70",
+ "@napi-rs/canvas-linux-riscv64-gnu": "0.1.70",
+ "@napi-rs/canvas-linux-x64-gnu": "0.1.70",
+ "@napi-rs/canvas-linux-x64-musl": "0.1.70",
+ "@napi-rs/canvas-win32-x64-msvc": "0.1.70"
}
},
"node_modules/@napi-rs/canvas-android-arm64": {
- "version": "0.1.69",
- "resolved": "https://registry.npmjs.org/@napi-rs/canvas-android-arm64/-/canvas-android-arm64-0.1.69.tgz",
- "integrity": "sha512-4icWTByY8zPvM9SelfQKf3I6kwXw0aI5drBOVrwfER5kjwXJd78FPSDSZkxDHjvIo9Q86ljl18Yr963ehA4sHQ==",
+ "version": "0.1.70",
+ "resolved": "https://registry.npmjs.org/@napi-rs/canvas-android-arm64/-/canvas-android-arm64-0.1.70.tgz",
+ "integrity": "sha512-I/YOuQ0wbkVYxVaYtCgN42WKTYxNqFA0gTcTrHIGG1jfpDSyZWII/uHcjOo4nzd19io6Y4+/BqP8E5hJgf9OmQ==",
"cpu": [
"arm64"
],
@@ -5722,9 +5751,9 @@
}
},
"node_modules/@napi-rs/canvas-darwin-arm64": {
- "version": "0.1.69",
- "resolved": "https://registry.npmjs.org/@napi-rs/canvas-darwin-arm64/-/canvas-darwin-arm64-0.1.69.tgz",
- "integrity": "sha512-HOanhhYlHdukA+unjelT4Dg3ta7e820x87/AG2dKUMsUzH19jaeZs9bcYjzEy2vYi/dFWKz7cSv2yaIOudB8Yg==",
+ "version": "0.1.70",
+ "resolved": "https://registry.npmjs.org/@napi-rs/canvas-darwin-arm64/-/canvas-darwin-arm64-0.1.70.tgz",
+ "integrity": "sha512-4pPGyXetHIHkw2TOJHujt3mkCP8LdDu8+CT15ld9Id39c752RcI0amDHSuMLMQfAjvusA9B5kKxazwjMGjEJpQ==",
"cpu": [
"arm64"
],
@@ -5738,9 +5767,9 @@
}
},
"node_modules/@napi-rs/canvas-darwin-x64": {
- "version": "0.1.69",
- "resolved": "https://registry.npmjs.org/@napi-rs/canvas-darwin-x64/-/canvas-darwin-x64-0.1.69.tgz",
- "integrity": "sha512-SIp7WfhxAPnSVK9bkFfJp+84rbATCIq9jMUzDwpCLhQ+v+OqtXe4pggX1oeV+62/HK6BT1t18qRmJfyqwJ9f3g==",
+ "version": "0.1.70",
+ "resolved": "https://registry.npmjs.org/@napi-rs/canvas-darwin-x64/-/canvas-darwin-x64-0.1.70.tgz",
+ "integrity": "sha512-+2N6Os9LbkmDMHL+raknrUcLQhsXzc5CSXRbXws9C3pv/mjHRVszQ9dhFUUe9FjfPhCJznO6USVdwOtu7pOrzQ==",
"cpu": [
"x64"
],
@@ -5754,9 +5783,9 @@
}
},
"node_modules/@napi-rs/canvas-linux-arm-gnueabihf": {
- "version": "0.1.69",
- "resolved": "https://registry.npmjs.org/@napi-rs/canvas-linux-arm-gnueabihf/-/canvas-linux-arm-gnueabihf-0.1.69.tgz",
- "integrity": "sha512-Ls+KujCp6TGpkuMVFvrlx+CxtL+casdkrprFjqIuOAnB30Mct6bCEr+I83Tu29s3nNq4EzIGjdmA3fFAZG/Dtw==",
+ "version": "0.1.70",
+ "resolved": "https://registry.npmjs.org/@napi-rs/canvas-linux-arm-gnueabihf/-/canvas-linux-arm-gnueabihf-0.1.70.tgz",
+ "integrity": "sha512-QjscX9OaKq/990sVhSMj581xuqLgiaPVMjjYvWaCmAJRkNQ004QfoSMEm3FoTqM4DRoquP8jvuEXScVJsc1rqQ==",
"cpu": [
"arm"
],
@@ -5770,9 +5799,9 @@
}
},
"node_modules/@napi-rs/canvas-linux-arm64-gnu": {
- "version": "0.1.69",
- "resolved": "https://registry.npmjs.org/@napi-rs/canvas-linux-arm64-gnu/-/canvas-linux-arm64-gnu-0.1.69.tgz",
- "integrity": "sha512-m8VcGmeSBNRbHZBd1srvdM1aq/ScS2y8KqGqmCCEgJlytYK4jdULzAo2K/BPKE1v3xvn8oUPZDLI/NBJbJkEoA==",
+ "version": "0.1.70",
+ "resolved": "https://registry.npmjs.org/@napi-rs/canvas-linux-arm64-gnu/-/canvas-linux-arm64-gnu-0.1.70.tgz",
+ "integrity": "sha512-LNakMOwwqwiHIwMpnMAbFRczQMQ7TkkMyATqFCOtUJNlE6LPP/QiUj/mlFrNbUn/hctqShJ60gWEb52ZTALbVw==",
"cpu": [
"arm64"
],
@@ -5786,9 +5815,9 @@
}
},
"node_modules/@napi-rs/canvas-linux-arm64-musl": {
- "version": "0.1.69",
- "resolved": "https://registry.npmjs.org/@napi-rs/canvas-linux-arm64-musl/-/canvas-linux-arm64-musl-0.1.69.tgz",
- "integrity": "sha512-a3xjNRIeK2m2ZORGv2moBvv3vbkaFZG1QKMeiEv/BKij+rkztuEhTJGMar+buICFgS0fLgphXXsKNkUSJb7eRQ==",
+ "version": "0.1.70",
+ "resolved": "https://registry.npmjs.org/@napi-rs/canvas-linux-arm64-musl/-/canvas-linux-arm64-musl-0.1.70.tgz",
+ "integrity": "sha512-wBTOllEYNfJCHOdZj9v8gLzZ4oY3oyPX8MSRvaxPm/s7RfEXxCyZ8OhJ5xAyicsDdbE5YBZqdmaaeP5+xKxvtg==",
"cpu": [
"arm64"
],
@@ -5802,9 +5831,9 @@
}
},
"node_modules/@napi-rs/canvas-linux-riscv64-gnu": {
- "version": "0.1.69",
- "resolved": "https://registry.npmjs.org/@napi-rs/canvas-linux-riscv64-gnu/-/canvas-linux-riscv64-gnu-0.1.69.tgz",
- "integrity": "sha512-pClUoJF5wdC9AvD0mc15G9JffL1Q85nuH1rLSQPRkGmGmQOtRjw5E9xNbanz7oFUiPbjH7xcAXUjVAcf7tdgPQ==",
+ "version": "0.1.70",
+ "resolved": "https://registry.npmjs.org/@napi-rs/canvas-linux-riscv64-gnu/-/canvas-linux-riscv64-gnu-0.1.70.tgz",
+ "integrity": "sha512-GVUUPC8TuuFqHip0rxHkUqArQnlzmlXmTEBuXAWdgCv85zTCFH8nOHk/YCF5yo0Z2eOm8nOi90aWs0leJ4OE5Q==",
"cpu": [
"riscv64"
],
@@ -5818,9 +5847,9 @@
}
},
"node_modules/@napi-rs/canvas-linux-x64-gnu": {
- "version": "0.1.69",
- "resolved": "https://registry.npmjs.org/@napi-rs/canvas-linux-x64-gnu/-/canvas-linux-x64-gnu-0.1.69.tgz",
- "integrity": "sha512-96X3bFAmzemfw84Ts6Jg/omL86uuynvK06MWGR/mp3JYNumY9RXofA14eF/kJIYelbYFWXcwpbcBR71lJ6G/YQ==",
+ "version": "0.1.70",
+ "resolved": "https://registry.npmjs.org/@napi-rs/canvas-linux-x64-gnu/-/canvas-linux-x64-gnu-0.1.70.tgz",
+ "integrity": "sha512-/kvUa2lZRwGNyfznSn5t1ShWJnr/m5acSlhTV3eXECafObjl0VBuA1HJw0QrilLpb4Fe0VLywkpD1NsMoVDROQ==",
"cpu": [
"x64"
],
@@ -5834,9 +5863,9 @@
}
},
"node_modules/@napi-rs/canvas-linux-x64-musl": {
- "version": "0.1.69",
- "resolved": "https://registry.npmjs.org/@napi-rs/canvas-linux-x64-musl/-/canvas-linux-x64-musl-0.1.69.tgz",
- "integrity": "sha512-2QTsEFO72Kwkj53W9hc5y1FAUvdGx0V+pjJB+9oQF6Ys9+y989GyPIl5wZDzeh8nIJW6koZZ1eFa8pD+pA5BFQ==",
+ "version": "0.1.70",
+ "resolved": "https://registry.npmjs.org/@napi-rs/canvas-linux-x64-musl/-/canvas-linux-x64-musl-0.1.70.tgz",
+ "integrity": "sha512-aqlv8MLpycoMKRmds7JWCfVwNf1fiZxaU7JwJs9/ExjTD8lX2KjsO7CTeAj5Cl4aEuzxUWbJPUUE2Qu9cZ1vfg==",
"cpu": [
"x64"
],
@@ -5850,9 +5879,9 @@
}
},
"node_modules/@napi-rs/canvas-win32-x64-msvc": {
- "version": "0.1.69",
- "resolved": "https://registry.npmjs.org/@napi-rs/canvas-win32-x64-msvc/-/canvas-win32-x64-msvc-0.1.69.tgz",
- "integrity": "sha512-Q4YA8kVnKarApBVLu7F8icGlIfSll5Glswo5hY6gPS4Is2dCI8+ig9OeDM8RlwYevUIxKq8lZBypN8Q1iLAQ7w==",
+ "version": "0.1.70",
+ "resolved": "https://registry.npmjs.org/@napi-rs/canvas-win32-x64-msvc/-/canvas-win32-x64-msvc-0.1.70.tgz",
+ "integrity": "sha512-Q9QU3WIpwBTVHk4cPfBjGHGU4U0llQYRXgJtFtYqqGNEOKVN4OT6PQ+ve63xwIPODMpZ0HHyj/KLGc9CWc3EtQ==",
"cpu": [
"x64"
],
@@ -5865,6 +5894,18 @@
"node": ">= 10"
}
},
+ "node_modules/@noble/hashes": {
+ "version": "1.8.0",
+ "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.8.0.tgz",
+ "integrity": "sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==",
+ "license": "MIT",
+ "engines": {
+ "node": "^14.21.3 || >=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",
@@ -5997,6 +6038,15 @@
"@octokit/openapi-types": "^25.0.0"
}
},
+ "node_modules/@paralleldrive/cuid2": {
+ "version": "2.2.2",
+ "resolved": "https://registry.npmjs.org/@paralleldrive/cuid2/-/cuid2-2.2.2.tgz",
+ "integrity": "sha512-ZOBkgDwEdoYVlSeRbYYXs0S9MejQofiVYoTbKzy/6GQa39/q5tQU2IX46+shYnUkpEl3wc+J6wRlar7r2EK2xA==",
+ "license": "MIT",
+ "dependencies": {
+ "@noble/hashes": "^1.1.5"
+ }
+ },
"node_modules/@parcel/watcher": {
"version": "2.5.1",
"resolved": "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.5.1.tgz",
@@ -6360,17 +6410,18 @@
}
},
"node_modules/@puppeteer/browsers": {
- "version": "2.10.0",
- "resolved": "https://registry.npmjs.org/@puppeteer/browsers/-/browsers-2.10.0.tgz",
- "integrity": "sha512-HdHF4rny4JCvIcm7V1dpvpctIGqM3/Me255CB44vW7hDG1zYMmcBMjpNqZEDxdCfXGLkx5kP0+Jz5DUS+ukqtA==",
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/@puppeteer/browsers/-/browsers-2.7.0.tgz",
+ "integrity": "sha512-bO61XnTuopsz9kvtfqhVbH6LTM1koxK0IlBR+yuVrM2LB7mk8+5o1w18l5zqd5cs8xlf+ntgambqRqGifMDjog==",
"license": "Apache-2.0",
"dependencies": {
"debug": "^4.4.0",
"extract-zip": "^2.0.1",
"progress": "^2.0.3",
"proxy-agent": "^6.5.0",
- "semver": "^7.7.1",
- "tar-fs": "^3.0.8",
+ "semver": "^7.6.3",
+ "tar-fs": "^3.0.6",
+ "unbzip2-stream": "^1.4.3",
"yargs": "^17.7.2"
},
"bin": {
@@ -6410,9 +6461,9 @@
"license": "MIT"
},
"node_modules/@puppeteer/browsers/node_modules/semver": {
- "version": "7.7.1",
- "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz",
- "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==",
+ "version": "7.7.2",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz",
+ "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==",
"license": "ISC",
"bin": {
"semver": "bin/semver.js"
@@ -6506,18 +6557,18 @@
}
},
"node_modules/@react-aria/actiongroup": {
- "version": "3.7.15",
- "resolved": "https://registry.npmjs.org/@react-aria/actiongroup/-/actiongroup-3.7.15.tgz",
- "integrity": "sha512-5wEBp4HvSq7RWJKLm7QWwKtiyUGZOmBsbiVg1aAWsHIbMJ1BgcgRO/IHK5vnxJ+Gd2zBg+XLV+zbmfCZhysrAg==",
- "license": "Apache-2.0",
- "dependencies": {
- "@react-aria/focus": "^3.20.2",
- "@react-aria/i18n": "^3.12.8",
- "@react-aria/interactions": "^3.25.0",
- "@react-aria/utils": "^3.28.2",
- "@react-stately/list": "^3.12.1",
- "@react-types/actiongroup": "^3.4.16",
- "@react-types/shared": "^3.29.0",
+ "version": "3.7.16",
+ "resolved": "https://registry.npmjs.org/@react-aria/actiongroup/-/actiongroup-3.7.16.tgz",
+ "integrity": "sha512-LD6hEur45g0Pm4Z/7Izm/clayM0/aEZYkkjA1fwZ8XO+7Uu2LszmqwpGrATaeHywpujrBjLfJaQvbpGIACyVTQ==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@react-aria/focus": "^3.20.3",
+ "@react-aria/i18n": "^3.12.9",
+ "@react-aria/interactions": "^3.25.1",
+ "@react-aria/utils": "^3.29.0",
+ "@react-stately/list": "^3.12.2",
+ "@react-types/actiongroup": "^3.4.17",
+ "@react-types/shared": "^3.29.1",
"@swc/helpers": "^0.5.0"
},
"peerDependencies": {
@@ -6526,24 +6577,24 @@
}
},
"node_modules/@react-aria/autocomplete": {
- "version": "3.0.0-beta.2",
- "resolved": "https://registry.npmjs.org/@react-aria/autocomplete/-/autocomplete-3.0.0-beta.2.tgz",
- "integrity": "sha512-oxsFCIGj5yooQkZzdqjvsdfr9fOlmAq4v6njIOAyQFsta3H0yQiv+YU3XnrnCBxVX+Mz/mZtZgfhAA9JBDukHg==",
- "license": "Apache-2.0",
- "dependencies": {
- "@react-aria/combobox": "^3.12.2",
- "@react-aria/focus": "^3.20.2",
- "@react-aria/i18n": "^3.12.8",
- "@react-aria/interactions": "^3.25.0",
- "@react-aria/listbox": "^3.14.3",
- "@react-aria/searchfield": "^3.8.3",
- "@react-aria/textfield": "^3.17.2",
- "@react-aria/utils": "^3.28.2",
+ "version": "3.0.0-beta.3",
+ "resolved": "https://registry.npmjs.org/@react-aria/autocomplete/-/autocomplete-3.0.0-beta.3.tgz",
+ "integrity": "sha512-8haBygHNMqVt4Ge90VOk+iVlLW+zhiOGHYz2IKCE6+Sy1dTE6mzhHjxrtwWYnSez/OQLbxjHlwLch4CDd5JkLA==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@react-aria/combobox": "^3.12.3",
+ "@react-aria/focus": "^3.20.3",
+ "@react-aria/i18n": "^3.12.9",
+ "@react-aria/interactions": "^3.25.1",
+ "@react-aria/listbox": "^3.14.4",
+ "@react-aria/searchfield": "^3.8.4",
+ "@react-aria/textfield": "^3.17.3",
+ "@react-aria/utils": "^3.29.0",
"@react-stately/autocomplete": "3.0.0-beta.1",
- "@react-stately/combobox": "^3.10.4",
- "@react-types/autocomplete": "3.0.0-alpha.30",
- "@react-types/button": "^3.12.0",
- "@react-types/shared": "^3.29.0",
+ "@react-stately/combobox": "^3.10.5",
+ "@react-types/autocomplete": "3.0.0-alpha.31",
+ "@react-types/button": "^3.12.1",
+ "@react-types/shared": "^3.29.1",
"@swc/helpers": "^0.5.0"
},
"peerDependencies": {
@@ -6552,16 +6603,16 @@
}
},
"node_modules/@react-aria/breadcrumbs": {
- "version": "3.5.23",
- "resolved": "https://registry.npmjs.org/@react-aria/breadcrumbs/-/breadcrumbs-3.5.23.tgz",
- "integrity": "sha512-4uLxuAgPfXds8sBc/Cg0ml7LKWzK+YTwHL7xclhQUkPO32rzlHDl+BJ5cyWhvZgGUf8JJXbXhD5VlJJzbbl8Xg==",
+ "version": "3.5.24",
+ "resolved": "https://registry.npmjs.org/@react-aria/breadcrumbs/-/breadcrumbs-3.5.24.tgz",
+ "integrity": "sha512-CRheGyyM8afPJvDHLXn/mmGG/WAr/z2LReK3DlPdxVKcsOn7g3NIRxAcAIAJQlDLdOiu1SXHiZe6uu2jPhHrxA==",
"license": "Apache-2.0",
"dependencies": {
- "@react-aria/i18n": "^3.12.8",
- "@react-aria/link": "^3.8.0",
- "@react-aria/utils": "^3.28.2",
- "@react-types/breadcrumbs": "^3.7.12",
- "@react-types/shared": "^3.29.0",
+ "@react-aria/i18n": "^3.12.9",
+ "@react-aria/link": "^3.8.1",
+ "@react-aria/utils": "^3.29.0",
+ "@react-types/breadcrumbs": "^3.7.13",
+ "@react-types/shared": "^3.29.1",
"@swc/helpers": "^0.5.0"
},
"peerDependencies": {
@@ -6570,17 +6621,17 @@
}
},
"node_modules/@react-aria/button": {
- "version": "3.13.0",
- "resolved": "https://registry.npmjs.org/@react-aria/button/-/button-3.13.0.tgz",
- "integrity": "sha512-BEcTQb7Q8ZrAtn0scPDv/ErZoGC1FI0sLk0UTPGskuh/RV9ZZGFbuSWTqOwV8w5CS6VMvPjH6vaE8hS7sb5DIw==",
+ "version": "3.13.1",
+ "resolved": "https://registry.npmjs.org/@react-aria/button/-/button-3.13.1.tgz",
+ "integrity": "sha512-E49qcbBRgofXYfWbli50bepWVNtQBq7qewL9XsX7nHkwPPUe1IRwJOnWZqYMgwwhUBOXfnsR6/TssiXqZsrJdw==",
"license": "Apache-2.0",
"dependencies": {
- "@react-aria/interactions": "^3.25.0",
- "@react-aria/toolbar": "3.0.0-beta.15",
- "@react-aria/utils": "^3.28.2",
- "@react-stately/toggle": "^3.8.3",
- "@react-types/button": "^3.12.0",
- "@react-types/shared": "^3.29.0",
+ "@react-aria/interactions": "^3.25.1",
+ "@react-aria/toolbar": "3.0.0-beta.16",
+ "@react-aria/utils": "^3.29.0",
+ "@react-stately/toggle": "^3.8.4",
+ "@react-types/button": "^3.12.1",
+ "@react-types/shared": "^3.29.1",
"@swc/helpers": "^0.5.0"
},
"peerDependencies": {
@@ -6589,20 +6640,20 @@
}
},
"node_modules/@react-aria/calendar": {
- "version": "3.8.0",
- "resolved": "https://registry.npmjs.org/@react-aria/calendar/-/calendar-3.8.0.tgz",
- "integrity": "sha512-9vms/fWjJPZkJcMxciwWWOjGy/Q0nqI6FV0pYbMZbqepkzglEaVd98kl506r/4hLhWKwLdTfqCgbntRecj8jBg==",
+ "version": "3.8.1",
+ "resolved": "https://registry.npmjs.org/@react-aria/calendar/-/calendar-3.8.1.tgz",
+ "integrity": "sha512-S931yi8jJ6CgUQJk+h/PEl+V0n1dUYr9n6nKXmZeU3940to4DauqwvmD9sg67hFHJ0QGroHT/s29yIfa5MfQcg==",
"license": "Apache-2.0",
"dependencies": {
- "@internationalized/date": "^3.8.0",
- "@react-aria/i18n": "^3.12.8",
- "@react-aria/interactions": "^3.25.0",
+ "@internationalized/date": "^3.8.1",
+ "@react-aria/i18n": "^3.12.9",
+ "@react-aria/interactions": "^3.25.1",
"@react-aria/live-announcer": "^3.4.2",
- "@react-aria/utils": "^3.28.2",
- "@react-stately/calendar": "^3.8.0",
- "@react-types/button": "^3.12.0",
- "@react-types/calendar": "^3.7.0",
- "@react-types/shared": "^3.29.0",
+ "@react-aria/utils": "^3.29.0",
+ "@react-stately/calendar": "^3.8.1",
+ "@react-types/button": "^3.12.1",
+ "@react-types/calendar": "^3.7.1",
+ "@react-types/shared": "^3.29.1",
"@swc/helpers": "^0.5.0"
},
"peerDependencies": {
@@ -6611,21 +6662,21 @@
}
},
"node_modules/@react-aria/checkbox": {
- "version": "3.15.4",
- "resolved": "https://registry.npmjs.org/@react-aria/checkbox/-/checkbox-3.15.4.tgz",
- "integrity": "sha512-ZkDJFs2EfMBXVIpBSo4ouB+NXyr2LRgZNp2x8/v+7n3aTmMU8j2PzT+Ra2geTQbC0glMP7UrSg4qZblqrxEBcQ==",
- "license": "Apache-2.0",
- "dependencies": {
- "@react-aria/form": "^3.0.15",
- "@react-aria/interactions": "^3.25.0",
- "@react-aria/label": "^3.7.17",
- "@react-aria/toggle": "^3.11.2",
- "@react-aria/utils": "^3.28.2",
- "@react-stately/checkbox": "^3.6.13",
- "@react-stately/form": "^3.1.3",
- "@react-stately/toggle": "^3.8.3",
- "@react-types/checkbox": "^3.9.3",
- "@react-types/shared": "^3.29.0",
+ "version": "3.15.5",
+ "resolved": "https://registry.npmjs.org/@react-aria/checkbox/-/checkbox-3.15.5.tgz",
+ "integrity": "sha512-b9c76DBSYTdacSogbsvjkdZomTo5yhBNMmR5ufO544HQ718Ry8q8JmVbtmF/+dkZN7KGnBQCltzGLzXH0Vc0Zg==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@react-aria/form": "^3.0.16",
+ "@react-aria/interactions": "^3.25.1",
+ "@react-aria/label": "^3.7.18",
+ "@react-aria/toggle": "^3.11.3",
+ "@react-aria/utils": "^3.29.0",
+ "@react-stately/checkbox": "^3.6.14",
+ "@react-stately/form": "^3.1.4",
+ "@react-stately/toggle": "^3.8.4",
+ "@react-types/checkbox": "^3.9.4",
+ "@react-types/shared": "^3.29.1",
"@swc/helpers": "^0.5.0"
},
"peerDependencies": {
@@ -6634,15 +6685,15 @@
}
},
"node_modules/@react-aria/collections": {
- "version": "3.0.0-rc.0",
- "resolved": "https://registry.npmjs.org/@react-aria/collections/-/collections-3.0.0-rc.0.tgz",
- "integrity": "sha512-WcRcE3wKtbprOJlBaMbdYS5Suu2KIGq1gVT2fLXVbmDY0CjGemqp2m5aDblQOO8pxvsAqHV8pyznkhANTnK1CQ==",
+ "version": "3.0.0-rc.1",
+ "resolved": "https://registry.npmjs.org/@react-aria/collections/-/collections-3.0.0-rc.1.tgz",
+ "integrity": "sha512-R8FE4z82lsXsNJgMu545U9BzDlnjEOVh8hDFWDwFFTf/NZSPw2ESgEZhFnVusvn5mHtr4mTzb2MyfGY5E2wVYw==",
"license": "Apache-2.0",
"dependencies": {
- "@react-aria/interactions": "^3.25.0",
+ "@react-aria/interactions": "^3.25.1",
"@react-aria/ssr": "^3.9.8",
- "@react-aria/utils": "^3.28.2",
- "@react-types/shared": "^3.29.0",
+ "@react-aria/utils": "^3.29.0",
+ "@react-types/shared": "^3.29.1",
"@swc/helpers": "^0.5.0",
"use-sync-external-store": "^1.4.0"
},
@@ -6652,23 +6703,23 @@
}
},
"node_modules/@react-aria/color": {
- "version": "3.0.6",
- "resolved": "https://registry.npmjs.org/@react-aria/color/-/color-3.0.6.tgz",
- "integrity": "sha512-ik4Db9hrN1yIT0CQMB888ktBmrwA/kNhkfiDACtoUHv8Ev+YEpmagnmih9vMyW2vcnozYJpnn/aCMl59J5uMew==",
- "license": "Apache-2.0",
- "dependencies": {
- "@react-aria/i18n": "^3.12.8",
- "@react-aria/interactions": "^3.25.0",
- "@react-aria/numberfield": "^3.11.13",
- "@react-aria/slider": "^3.7.18",
- "@react-aria/spinbutton": "^3.6.14",
- "@react-aria/textfield": "^3.17.2",
- "@react-aria/utils": "^3.28.2",
- "@react-aria/visually-hidden": "^3.8.22",
- "@react-stately/color": "^3.8.4",
- "@react-stately/form": "^3.1.3",
- "@react-types/color": "^3.0.4",
- "@react-types/shared": "^3.29.0",
+ "version": "3.0.7",
+ "resolved": "https://registry.npmjs.org/@react-aria/color/-/color-3.0.7.tgz",
+ "integrity": "sha512-3DcYxEWBrcuHSBq0OqCs6GySuy6eOue8/ngC31j/8aMXR+O4mGpXi0wo3rSQGFmGq/4Ri986cI2iGwZOkzpMHg==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@react-aria/i18n": "^3.12.9",
+ "@react-aria/interactions": "^3.25.1",
+ "@react-aria/numberfield": "^3.11.14",
+ "@react-aria/slider": "^3.7.19",
+ "@react-aria/spinbutton": "^3.6.15",
+ "@react-aria/textfield": "^3.17.3",
+ "@react-aria/utils": "^3.29.0",
+ "@react-aria/visually-hidden": "^3.8.23",
+ "@react-stately/color": "^3.8.5",
+ "@react-stately/form": "^3.1.4",
+ "@react-types/color": "^3.0.5",
+ "@react-types/shared": "^3.29.1",
"@swc/helpers": "^0.5.0"
},
"peerDependencies": {
@@ -6677,26 +6728,26 @@
}
},
"node_modules/@react-aria/combobox": {
- "version": "3.12.2",
- "resolved": "https://registry.npmjs.org/@react-aria/combobox/-/combobox-3.12.2.tgz",
- "integrity": "sha512-EgddiF8VnAjB4EynJERPn4IoDMUabI8GiKOQZ6Ar3MlRWxQnUfxPpZwXs8qWR3dPCzYUt2PhBinhBMjyR1yRIw==",
+ "version": "3.12.3",
+ "resolved": "https://registry.npmjs.org/@react-aria/combobox/-/combobox-3.12.3.tgz",
+ "integrity": "sha512-nCLFSQjOR3r3tB1AURtZKSZhi2euBMw0QxsIjnMVF73BQOfwfHMrIFctNULbL070gEnXofzeBd3ykJQpnsGH+Q==",
"license": "Apache-2.0",
"dependencies": {
- "@react-aria/focus": "^3.20.2",
- "@react-aria/i18n": "^3.12.8",
- "@react-aria/listbox": "^3.14.3",
+ "@react-aria/focus": "^3.20.3",
+ "@react-aria/i18n": "^3.12.9",
+ "@react-aria/listbox": "^3.14.4",
"@react-aria/live-announcer": "^3.4.2",
- "@react-aria/menu": "^3.18.2",
- "@react-aria/overlays": "^3.27.0",
- "@react-aria/selection": "^3.24.0",
- "@react-aria/textfield": "^3.17.2",
- "@react-aria/utils": "^3.28.2",
- "@react-stately/collections": "^3.12.3",
- "@react-stately/combobox": "^3.10.4",
- "@react-stately/form": "^3.1.3",
- "@react-types/button": "^3.12.0",
- "@react-types/combobox": "^3.13.4",
- "@react-types/shared": "^3.29.0",
+ "@react-aria/menu": "^3.18.3",
+ "@react-aria/overlays": "^3.27.1",
+ "@react-aria/selection": "^3.24.1",
+ "@react-aria/textfield": "^3.17.3",
+ "@react-aria/utils": "^3.29.0",
+ "@react-stately/collections": "^3.12.4",
+ "@react-stately/combobox": "^3.10.5",
+ "@react-stately/form": "^3.1.4",
+ "@react-types/button": "^3.12.1",
+ "@react-types/combobox": "^3.13.5",
+ "@react-types/shared": "^3.29.1",
"@swc/helpers": "^0.5.0"
},
"peerDependencies": {
@@ -6705,28 +6756,28 @@
}
},
"node_modules/@react-aria/datepicker": {
- "version": "3.14.2",
- "resolved": "https://registry.npmjs.org/@react-aria/datepicker/-/datepicker-3.14.2.tgz",
- "integrity": "sha512-O7fdzcqIJ7i/+8SGYvx4tloTZgK4Ws8OChdbFcd2rZoRPqxM50M6J+Ota8hTet2wIhojUXnM3x2na3EvoucBXA==",
+ "version": "3.14.3",
+ "resolved": "https://registry.npmjs.org/@react-aria/datepicker/-/datepicker-3.14.3.tgz",
+ "integrity": "sha512-gDc+bM0EaY3BuIW8IJu/ARJV78bRpOaHp+B08EW4N2qJvc7Bs+EmGLnxMrB6Ny+YxNxsYdQRA/FqiytVYOEk8w==",
"license": "Apache-2.0",
"dependencies": {
- "@internationalized/date": "^3.8.0",
- "@internationalized/number": "^3.6.1",
+ "@internationalized/date": "^3.8.1",
+ "@internationalized/number": "^3.6.2",
"@internationalized/string": "^3.2.6",
- "@react-aria/focus": "^3.20.2",
- "@react-aria/form": "^3.0.15",
- "@react-aria/i18n": "^3.12.8",
- "@react-aria/interactions": "^3.25.0",
- "@react-aria/label": "^3.7.17",
- "@react-aria/spinbutton": "^3.6.14",
- "@react-aria/utils": "^3.28.2",
- "@react-stately/datepicker": "^3.14.0",
- "@react-stately/form": "^3.1.3",
- "@react-types/button": "^3.12.0",
- "@react-types/calendar": "^3.7.0",
- "@react-types/datepicker": "^3.12.0",
- "@react-types/dialog": "^3.5.17",
- "@react-types/shared": "^3.29.0",
+ "@react-aria/focus": "^3.20.3",
+ "@react-aria/form": "^3.0.16",
+ "@react-aria/i18n": "^3.12.9",
+ "@react-aria/interactions": "^3.25.1",
+ "@react-aria/label": "^3.7.18",
+ "@react-aria/spinbutton": "^3.6.15",
+ "@react-aria/utils": "^3.29.0",
+ "@react-stately/datepicker": "^3.14.1",
+ "@react-stately/form": "^3.1.4",
+ "@react-types/button": "^3.12.1",
+ "@react-types/calendar": "^3.7.1",
+ "@react-types/datepicker": "^3.12.1",
+ "@react-types/dialog": "^3.5.18",
+ "@react-types/shared": "^3.29.1",
"@swc/helpers": "^0.5.0"
},
"peerDependencies": {
@@ -6735,16 +6786,16 @@
}
},
"node_modules/@react-aria/dialog": {
- "version": "3.5.24",
- "resolved": "https://registry.npmjs.org/@react-aria/dialog/-/dialog-3.5.24.tgz",
- "integrity": "sha512-tw0WH89gVpHMI5KUQhuzRE+IYCc9clRfDvCppuXNueKDrZmrQKbeoU6d0b5WYRsBur2+d7ErtvpLzHVqE1HzfA==",
+ "version": "3.5.25",
+ "resolved": "https://registry.npmjs.org/@react-aria/dialog/-/dialog-3.5.25.tgz",
+ "integrity": "sha512-hVP/TvjUnPgckg4qibc/TDH54O+BzW95hxApxBw1INyViRm95PxdCQDqBdQ/ZW7Gv6J2aUBCGihX7kINPf70ow==",
"license": "Apache-2.0",
"dependencies": {
- "@react-aria/interactions": "^3.25.0",
- "@react-aria/overlays": "^3.27.0",
- "@react-aria/utils": "^3.28.2",
- "@react-types/dialog": "^3.5.17",
- "@react-types/shared": "^3.29.0",
+ "@react-aria/interactions": "^3.25.1",
+ "@react-aria/overlays": "^3.27.1",
+ "@react-aria/utils": "^3.29.0",
+ "@react-types/dialog": "^3.5.18",
+ "@react-types/shared": "^3.29.1",
"@swc/helpers": "^0.5.0"
},
"peerDependencies": {
@@ -6753,15 +6804,15 @@
}
},
"node_modules/@react-aria/disclosure": {
- "version": "3.0.4",
- "resolved": "https://registry.npmjs.org/@react-aria/disclosure/-/disclosure-3.0.4.tgz",
- "integrity": "sha512-HXGVLA06BH0b/gN8dCTzWATwMikz8D+ahRxZiI0HDZxLADWGsSPqRXKN0GNAiBKbvPtvAbrwslE3pktk/SlU/w==",
+ "version": "3.0.5",
+ "resolved": "https://registry.npmjs.org/@react-aria/disclosure/-/disclosure-3.0.5.tgz",
+ "integrity": "sha512-YrazXoIzVq48soJpVMb2Iq/CB+lglwfKLsml5UfpE0MGlJJ/jWtIZtodqQ8ree1YguMNTvtESazTlMo7ZLsasQ==",
"license": "Apache-2.0",
"dependencies": {
"@react-aria/ssr": "^3.9.8",
- "@react-aria/utils": "^3.28.2",
- "@react-stately/disclosure": "^3.0.3",
- "@react-types/button": "^3.12.0",
+ "@react-aria/utils": "^3.29.0",
+ "@react-stately/disclosure": "^3.0.4",
+ "@react-types/button": "^3.12.1",
"@swc/helpers": "^0.5.0"
},
"peerDependencies": {
@@ -6770,20 +6821,20 @@
}
},
"node_modules/@react-aria/dnd": {
- "version": "3.9.2",
- "resolved": "https://registry.npmjs.org/@react-aria/dnd/-/dnd-3.9.2.tgz",
- "integrity": "sha512-pPYygmJTjSPV2K/r48TvF75WuddG8d8nlIxAXSW22++WKqZ0z+eun6gDUXoKeB2rgY7sVfLqpRdnPV52AnBX+Q==",
+ "version": "3.9.3",
+ "resolved": "https://registry.npmjs.org/@react-aria/dnd/-/dnd-3.9.3.tgz",
+ "integrity": "sha512-Sjb+UQxG58/paOZXsVKiqLautV4FyILr3tLxMG4Q04QOUzatqlz91APt7RsVMdizk6bVB7Lg74AEypHbXVzhDQ==",
"license": "Apache-2.0",
"dependencies": {
"@internationalized/string": "^3.2.6",
- "@react-aria/i18n": "^3.12.8",
- "@react-aria/interactions": "^3.25.0",
+ "@react-aria/i18n": "^3.12.9",
+ "@react-aria/interactions": "^3.25.1",
"@react-aria/live-announcer": "^3.4.2",
- "@react-aria/overlays": "^3.27.0",
- "@react-aria/utils": "^3.28.2",
- "@react-stately/dnd": "^3.5.3",
- "@react-types/button": "^3.12.0",
- "@react-types/shared": "^3.29.0",
+ "@react-aria/overlays": "^3.27.1",
+ "@react-aria/utils": "^3.29.0",
+ "@react-stately/dnd": "^3.5.4",
+ "@react-types/button": "^3.12.1",
+ "@react-types/shared": "^3.29.1",
"@swc/helpers": "^0.5.0"
},
"peerDependencies": {
@@ -6792,14 +6843,14 @@
}
},
"node_modules/@react-aria/focus": {
- "version": "3.20.2",
- "resolved": "https://registry.npmjs.org/@react-aria/focus/-/focus-3.20.2.tgz",
- "integrity": "sha512-Q3rouk/rzoF/3TuH6FzoAIKrl+kzZi9LHmr8S5EqLAOyP9TXIKG34x2j42dZsAhrw7TbF9gA8tBKwnCNH4ZV+Q==",
+ "version": "3.20.3",
+ "resolved": "https://registry.npmjs.org/@react-aria/focus/-/focus-3.20.3.tgz",
+ "integrity": "sha512-rR5uZUMSY4xLHmpK/I8bP1V6vUNHFo33gTvrvNUsAKKqvMfa7R2nu5A6v97dr5g6tVH6xzpdkPsOJCWh90H2cw==",
"license": "Apache-2.0",
"dependencies": {
- "@react-aria/interactions": "^3.25.0",
- "@react-aria/utils": "^3.28.2",
- "@react-types/shared": "^3.29.0",
+ "@react-aria/interactions": "^3.25.1",
+ "@react-aria/utils": "^3.29.0",
+ "@react-types/shared": "^3.29.1",
"@swc/helpers": "^0.5.0",
"clsx": "^2.0.0"
},
@@ -6809,15 +6860,15 @@
}
},
"node_modules/@react-aria/form": {
- "version": "3.0.15",
- "resolved": "https://registry.npmjs.org/@react-aria/form/-/form-3.0.15.tgz",
- "integrity": "sha512-kk8AnLz+EOgnn3sTaXYmtw+YzVDc1of/+xAkuOupQi6zQFnNRjc99JlDbKHoUZ39urMl+8lsp/1b9VPPhNrBNw==",
+ "version": "3.0.16",
+ "resolved": "https://registry.npmjs.org/@react-aria/form/-/form-3.0.16.tgz",
+ "integrity": "sha512-N1bDsJfmnyDesayK0Ii6UPH6JWiF6Wz8WSveQ2y5004XHoIWn5LpWmOqnRedvyw4Yedw33schlvrY7ENEwMdpg==",
"license": "Apache-2.0",
"dependencies": {
- "@react-aria/interactions": "^3.25.0",
- "@react-aria/utils": "^3.28.2",
- "@react-stately/form": "^3.1.3",
- "@react-types/shared": "^3.29.0",
+ "@react-aria/interactions": "^3.25.1",
+ "@react-aria/utils": "^3.29.0",
+ "@react-stately/form": "^3.1.4",
+ "@react-types/shared": "^3.29.1",
"@swc/helpers": "^0.5.0"
},
"peerDependencies": {
@@ -6826,23 +6877,23 @@
}
},
"node_modules/@react-aria/grid": {
- "version": "3.13.0",
- "resolved": "https://registry.npmjs.org/@react-aria/grid/-/grid-3.13.0.tgz",
- "integrity": "sha512-RcuJYA4fyJ83MH3SunU+P5BGkx3LJdQ6kxwqwWGIuI9eUKc7uVbqvN9WN3fI+L0QfxqBFmh7ffRxIdQn7puuzw==",
+ "version": "3.14.0",
+ "resolved": "https://registry.npmjs.org/@react-aria/grid/-/grid-3.14.0.tgz",
+ "integrity": "sha512-/tJB7xnSruORJ8tlFHja4SfL8/EW5v4cBLiyD5z48m7IdG33jXR8Cv4Pi5uQqs8zKdnpqZ1wDG3GQxNDwZavpg==",
"license": "Apache-2.0",
"dependencies": {
- "@react-aria/focus": "^3.20.2",
- "@react-aria/i18n": "^3.12.8",
- "@react-aria/interactions": "^3.25.0",
+ "@react-aria/focus": "^3.20.3",
+ "@react-aria/i18n": "^3.12.9",
+ "@react-aria/interactions": "^3.25.1",
"@react-aria/live-announcer": "^3.4.2",
- "@react-aria/selection": "^3.24.0",
- "@react-aria/utils": "^3.28.2",
- "@react-stately/collections": "^3.12.3",
- "@react-stately/grid": "^3.11.1",
- "@react-stately/selection": "^3.20.1",
- "@react-types/checkbox": "^3.9.3",
- "@react-types/grid": "^3.3.1",
- "@react-types/shared": "^3.29.0",
+ "@react-aria/selection": "^3.24.1",
+ "@react-aria/utils": "^3.29.0",
+ "@react-stately/collections": "^3.12.4",
+ "@react-stately/grid": "^3.11.2",
+ "@react-stately/selection": "^3.20.2",
+ "@react-types/checkbox": "^3.9.4",
+ "@react-types/grid": "^3.3.2",
+ "@react-types/shared": "^3.29.1",
"@swc/helpers": "^0.5.0"
},
"peerDependencies": {
@@ -6851,21 +6902,21 @@
}
},
"node_modules/@react-aria/gridlist": {
- "version": "3.12.0",
- "resolved": "https://registry.npmjs.org/@react-aria/gridlist/-/gridlist-3.12.0.tgz",
- "integrity": "sha512-KSpnSBYQ7ozGQNaRR2NGq7Fl2zIv5w9KNyO9V/IE2mxUNfX6fwqUPoANFcy9ySosksE7pPnFtuYIB+TQtUjYqQ==",
- "license": "Apache-2.0",
- "dependencies": {
- "@react-aria/focus": "^3.20.2",
- "@react-aria/grid": "^3.13.0",
- "@react-aria/i18n": "^3.12.8",
- "@react-aria/interactions": "^3.25.0",
- "@react-aria/selection": "^3.24.0",
- "@react-aria/utils": "^3.28.2",
- "@react-stately/collections": "^3.12.3",
- "@react-stately/list": "^3.12.1",
- "@react-stately/tree": "^3.8.9",
- "@react-types/shared": "^3.29.0",
+ "version": "3.13.0",
+ "resolved": "https://registry.npmjs.org/@react-aria/gridlist/-/gridlist-3.13.0.tgz",
+ "integrity": "sha512-RHURMo063qbbA8WXCJxGL+5xmSx6yW7Z/V2jycrVcZFOYqj2EgU953aVjpaT/FSyH8/AEioU9oE64YmiEfWUUA==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@react-aria/focus": "^3.20.3",
+ "@react-aria/grid": "^3.14.0",
+ "@react-aria/i18n": "^3.12.9",
+ "@react-aria/interactions": "^3.25.1",
+ "@react-aria/selection": "^3.24.1",
+ "@react-aria/utils": "^3.29.0",
+ "@react-stately/collections": "^3.12.4",
+ "@react-stately/list": "^3.12.2",
+ "@react-stately/tree": "^3.8.10",
+ "@react-types/shared": "^3.29.1",
"@swc/helpers": "^0.5.0"
},
"peerDependencies": {
@@ -6874,18 +6925,18 @@
}
},
"node_modules/@react-aria/i18n": {
- "version": "3.12.8",
- "resolved": "https://registry.npmjs.org/@react-aria/i18n/-/i18n-3.12.8.tgz",
- "integrity": "sha512-V/Nau9WuwTwxfFffQL4URyKyY2HhRlu9zmzkF2Hw/j5KmEQemD+9jfaLueG2CJu85lYL06JrZXUdnhZgKnqMkA==",
+ "version": "3.12.9",
+ "resolved": "https://registry.npmjs.org/@react-aria/i18n/-/i18n-3.12.9.tgz",
+ "integrity": "sha512-Fim0FLfY05kcpIILdOtqcw58c3sksvmVY8kICSwKCuSek4wYfwJdU28p/sRptw4adJhqN8Cbssvkf/J8zL2GgA==",
"license": "Apache-2.0",
"dependencies": {
- "@internationalized/date": "^3.8.0",
+ "@internationalized/date": "^3.8.1",
"@internationalized/message": "^3.1.7",
- "@internationalized/number": "^3.6.1",
+ "@internationalized/number": "^3.6.2",
"@internationalized/string": "^3.2.6",
"@react-aria/ssr": "^3.9.8",
- "@react-aria/utils": "^3.28.2",
- "@react-types/shared": "^3.29.0",
+ "@react-aria/utils": "^3.29.0",
+ "@react-types/shared": "^3.29.1",
"@swc/helpers": "^0.5.0"
},
"peerDependencies": {
@@ -6894,15 +6945,15 @@
}
},
"node_modules/@react-aria/interactions": {
- "version": "3.25.0",
- "resolved": "https://registry.npmjs.org/@react-aria/interactions/-/interactions-3.25.0.tgz",
- "integrity": "sha512-GgIsDLlO8rDU/nFn6DfsbP9rfnzhm8QFjZkB9K9+r+MTSCn7bMntiWQgMM+5O6BiA8d7C7x4zuN4bZtc0RBdXQ==",
+ "version": "3.25.1",
+ "resolved": "https://registry.npmjs.org/@react-aria/interactions/-/interactions-3.25.1.tgz",
+ "integrity": "sha512-ntLrlgqkmZupbbjekz3fE/n3eQH2vhncx8gUp0+N+GttKWevx7jos11JUBjnJwb1RSOPgRUFcrluOqBp0VgcfQ==",
"license": "Apache-2.0",
"dependencies": {
"@react-aria/ssr": "^3.9.8",
- "@react-aria/utils": "^3.28.2",
+ "@react-aria/utils": "^3.29.0",
"@react-stately/flags": "^3.1.1",
- "@react-types/shared": "^3.29.0",
+ "@react-types/shared": "^3.29.1",
"@swc/helpers": "^0.5.0"
},
"peerDependencies": {
@@ -6911,13 +6962,13 @@
}
},
"node_modules/@react-aria/label": {
- "version": "3.7.17",
- "resolved": "https://registry.npmjs.org/@react-aria/label/-/label-3.7.17.tgz",
- "integrity": "sha512-Fz7IC2LQT2Y/sAoV+gFEXoULtkznzmK2MmeTv5shTNjeTxzB1BhQbD4wyCypi7eGsnD/9Zy+8viULCsIUbvjWw==",
+ "version": "3.7.18",
+ "resolved": "https://registry.npmjs.org/@react-aria/label/-/label-3.7.18.tgz",
+ "integrity": "sha512-Ht9D+xkI2Aysn+JNiHE+UZT4FUOGPF7Lfrmp7xdJCA/tEqqF3xW/pAh+UCNOnnWmH8jTYnUg3bCp4G6GQUxKCQ==",
"license": "Apache-2.0",
"dependencies": {
- "@react-aria/utils": "^3.28.2",
- "@react-types/shared": "^3.29.0",
+ "@react-aria/utils": "^3.29.0",
+ "@react-types/shared": "^3.29.1",
"@swc/helpers": "^0.5.0"
},
"peerDependencies": {
@@ -6926,13 +6977,13 @@
}
},
"node_modules/@react-aria/landmark": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/@react-aria/landmark/-/landmark-3.0.2.tgz",
- "integrity": "sha512-KVXa9s3fSgo/PiUjdbnPh3a1yS4t2bMZeVBPPzYAgQ4wcU2WjuLkhviw+5GWSWRfT+jpIMV7R/cmyvr0UHvRfg==",
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/@react-aria/landmark/-/landmark-3.0.3.tgz",
+ "integrity": "sha512-mcmHijInDZZY3W9r0SeRuXsHW8Km9rBWKB3eoBz+PVuyJYMuabhQ2mUB5xTbqbnV++Srr7j/59g+Lbw5gAN4lw==",
"license": "Apache-2.0",
"dependencies": {
- "@react-aria/utils": "^3.28.2",
- "@react-types/shared": "^3.29.0",
+ "@react-aria/utils": "^3.29.0",
+ "@react-types/shared": "^3.29.1",
"@swc/helpers": "^0.5.0",
"use-sync-external-store": "^1.4.0"
},
@@ -6942,15 +6993,15 @@
}
},
"node_modules/@react-aria/link": {
- "version": "3.8.0",
- "resolved": "https://registry.npmjs.org/@react-aria/link/-/link-3.8.0.tgz",
- "integrity": "sha512-gpDD6t3FqtFR9QjSIKNpmSR3tS4JG2anVKx2wixuRDHO6Ddexxv4SBzsE1+230p+FlFGjftFa2lEgQ7RNjZrmA==",
+ "version": "3.8.1",
+ "resolved": "https://registry.npmjs.org/@react-aria/link/-/link-3.8.1.tgz",
+ "integrity": "sha512-ujq7+XIP7OXHu7m2NObvHsl41B/oIBAYI0D+hsxEQo3+x6Q/OUxp9EX2sX4d7TBWvchFmhr6jJdER0QMmeSO/A==",
"license": "Apache-2.0",
"dependencies": {
- "@react-aria/interactions": "^3.25.0",
- "@react-aria/utils": "^3.28.2",
- "@react-types/link": "^3.6.0",
- "@react-types/shared": "^3.29.0",
+ "@react-aria/interactions": "^3.25.1",
+ "@react-aria/utils": "^3.29.0",
+ "@react-types/link": "^3.6.1",
+ "@react-types/shared": "^3.29.1",
"@swc/helpers": "^0.5.0"
},
"peerDependencies": {
@@ -6959,19 +7010,19 @@
}
},
"node_modules/@react-aria/listbox": {
- "version": "3.14.3",
- "resolved": "https://registry.npmjs.org/@react-aria/listbox/-/listbox-3.14.3.tgz",
- "integrity": "sha512-wzelam1KENUvKjsTq8gfrOW2/iab8SyIaSXfFvGmWW82XlDTlW+oQeA39tvOZktMVGspr+xp8FySY09rtz6UXw==",
- "license": "Apache-2.0",
- "dependencies": {
- "@react-aria/interactions": "^3.25.0",
- "@react-aria/label": "^3.7.17",
- "@react-aria/selection": "^3.24.0",
- "@react-aria/utils": "^3.28.2",
- "@react-stately/collections": "^3.12.3",
- "@react-stately/list": "^3.12.1",
- "@react-types/listbox": "^3.6.0",
- "@react-types/shared": "^3.29.0",
+ "version": "3.14.4",
+ "resolved": "https://registry.npmjs.org/@react-aria/listbox/-/listbox-3.14.4.tgz",
+ "integrity": "sha512-bW3D7KcnQIF77F3zDRMIGQ6e5e1wHTNUtbKJLE423u1Dhc7K2x0pksir0gLGwElhiBW544lY1jv3kFLOeKa6ng==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@react-aria/interactions": "^3.25.1",
+ "@react-aria/label": "^3.7.18",
+ "@react-aria/selection": "^3.24.1",
+ "@react-aria/utils": "^3.29.0",
+ "@react-stately/collections": "^3.12.4",
+ "@react-stately/list": "^3.12.2",
+ "@react-types/listbox": "^3.7.0",
+ "@react-types/shared": "^3.29.1",
"@swc/helpers": "^0.5.0"
},
"peerDependencies": {
@@ -6989,24 +7040,24 @@
}
},
"node_modules/@react-aria/menu": {
- "version": "3.18.2",
- "resolved": "https://registry.npmjs.org/@react-aria/menu/-/menu-3.18.2.tgz",
- "integrity": "sha512-90k+Ke1bhFWhR2zuRI6OwKWQrCpOD99n+9jhG96JZJZlNo5lB+5kS+ufG1LRv5GBnCug0ciLQmPMAfguVsCjEQ==",
- "license": "Apache-2.0",
- "dependencies": {
- "@react-aria/focus": "^3.20.2",
- "@react-aria/i18n": "^3.12.8",
- "@react-aria/interactions": "^3.25.0",
- "@react-aria/overlays": "^3.27.0",
- "@react-aria/selection": "^3.24.0",
- "@react-aria/utils": "^3.28.2",
- "@react-stately/collections": "^3.12.3",
- "@react-stately/menu": "^3.9.3",
- "@react-stately/selection": "^3.20.1",
- "@react-stately/tree": "^3.8.9",
- "@react-types/button": "^3.12.0",
- "@react-types/menu": "^3.10.0",
- "@react-types/shared": "^3.29.0",
+ "version": "3.18.3",
+ "resolved": "https://registry.npmjs.org/@react-aria/menu/-/menu-3.18.3.tgz",
+ "integrity": "sha512-D0C4CM/QaxhCo2pLWNP+nfgnAeaSZWOdPMo9pnH/toRsoeTbnD6xO1hLhYsOx5ge+hrzjQvthjUrsjPB1AM/BQ==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@react-aria/focus": "^3.20.3",
+ "@react-aria/i18n": "^3.12.9",
+ "@react-aria/interactions": "^3.25.1",
+ "@react-aria/overlays": "^3.27.1",
+ "@react-aria/selection": "^3.24.1",
+ "@react-aria/utils": "^3.29.0",
+ "@react-stately/collections": "^3.12.4",
+ "@react-stately/menu": "^3.9.4",
+ "@react-stately/selection": "^3.20.2",
+ "@react-stately/tree": "^3.8.10",
+ "@react-types/button": "^3.12.1",
+ "@react-types/menu": "^3.10.1",
+ "@react-types/shared": "^3.29.1",
"@swc/helpers": "^0.5.0"
},
"peerDependencies": {
@@ -7015,14 +7066,14 @@
}
},
"node_modules/@react-aria/meter": {
- "version": "3.4.22",
- "resolved": "https://registry.npmjs.org/@react-aria/meter/-/meter-3.4.22.tgz",
- "integrity": "sha512-A/30vrtJO0xqctS/ngE1Lp/w3Aq3MPcpdRHU5E06EUYotzRzHFE9sNmezWslkZ3NfYwA/mxLvgmrsOJSR0Hx6A==",
+ "version": "3.4.23",
+ "resolved": "https://registry.npmjs.org/@react-aria/meter/-/meter-3.4.23.tgz",
+ "integrity": "sha512-FgmB/+cTE/sz+wTpTSmj9hFXw4nzfMUJGvXIePnF6f5Gx6J/U7aLEvNk7sXCp76apOu8k7ccma1nCsEvj74x7w==",
"license": "Apache-2.0",
"dependencies": {
- "@react-aria/progress": "^3.4.22",
- "@react-types/meter": "^3.4.8",
- "@react-types/shared": "^3.29.0",
+ "@react-aria/progress": "^3.4.23",
+ "@react-types/meter": "^3.4.9",
+ "@react-types/shared": "^3.29.1",
"@swc/helpers": "^0.5.0"
},
"peerDependencies": {
@@ -7031,21 +7082,21 @@
}
},
"node_modules/@react-aria/numberfield": {
- "version": "3.11.13",
- "resolved": "https://registry.npmjs.org/@react-aria/numberfield/-/numberfield-3.11.13.tgz",
- "integrity": "sha512-F73BVdIRV8VvKl0omhGaf0E7mdJ7pdPjDP3wYNf410t55BXPxmndItUKpGfxSbl8k6ZYLvQyOqkD6oWSfZXpZw==",
- "license": "Apache-2.0",
- "dependencies": {
- "@react-aria/i18n": "^3.12.8",
- "@react-aria/interactions": "^3.25.0",
- "@react-aria/spinbutton": "^3.6.14",
- "@react-aria/textfield": "^3.17.2",
- "@react-aria/utils": "^3.28.2",
- "@react-stately/form": "^3.1.3",
- "@react-stately/numberfield": "^3.9.11",
- "@react-types/button": "^3.12.0",
- "@react-types/numberfield": "^3.8.10",
- "@react-types/shared": "^3.29.0",
+ "version": "3.11.14",
+ "resolved": "https://registry.npmjs.org/@react-aria/numberfield/-/numberfield-3.11.14.tgz",
+ "integrity": "sha512-UvhPlRwVmbNEBBqfgL41P10H1jL4C7P2hWqsVw72tZQJl5k5ujeOzRWk8mkmg+D4FCZvv4iSPJhmyEP8HkgsWg==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@react-aria/i18n": "^3.12.9",
+ "@react-aria/interactions": "^3.25.1",
+ "@react-aria/spinbutton": "^3.6.15",
+ "@react-aria/textfield": "^3.17.3",
+ "@react-aria/utils": "^3.29.0",
+ "@react-stately/form": "^3.1.4",
+ "@react-stately/numberfield": "^3.9.12",
+ "@react-types/button": "^3.12.1",
+ "@react-types/numberfield": "^3.8.11",
+ "@react-types/shared": "^3.29.1",
"@swc/helpers": "^0.5.0"
},
"peerDependencies": {
@@ -7054,21 +7105,21 @@
}
},
"node_modules/@react-aria/overlays": {
- "version": "3.27.0",
- "resolved": "https://registry.npmjs.org/@react-aria/overlays/-/overlays-3.27.0.tgz",
- "integrity": "sha512-2vZVgL7FrloN5Rh8sAhadGADJbuWg69DdSJB3fd2/h5VvcEhnIfNPu9Ma5XmdkApDoTboIEsKZ4QLYwRl98w6w==",
+ "version": "3.27.1",
+ "resolved": "https://registry.npmjs.org/@react-aria/overlays/-/overlays-3.27.1.tgz",
+ "integrity": "sha512-wepzwNLkgem6kVlLm6yk7zNIMAt0KPy8vAWlxdfpXWD/hBI30ULl71gL/BxRa5EYG1GMvlOwNti3whzy9lm3eQ==",
"license": "Apache-2.0",
"dependencies": {
- "@react-aria/focus": "^3.20.2",
- "@react-aria/i18n": "^3.12.8",
- "@react-aria/interactions": "^3.25.0",
+ "@react-aria/focus": "^3.20.3",
+ "@react-aria/i18n": "^3.12.9",
+ "@react-aria/interactions": "^3.25.1",
"@react-aria/ssr": "^3.9.8",
- "@react-aria/utils": "^3.28.2",
- "@react-aria/visually-hidden": "^3.8.22",
- "@react-stately/overlays": "^3.6.15",
- "@react-types/button": "^3.12.0",
- "@react-types/overlays": "^3.8.14",
- "@react-types/shared": "^3.29.0",
+ "@react-aria/utils": "^3.29.0",
+ "@react-aria/visually-hidden": "^3.8.23",
+ "@react-stately/overlays": "^3.6.16",
+ "@react-types/button": "^3.12.1",
+ "@react-types/overlays": "^3.8.15",
+ "@react-types/shared": "^3.29.1",
"@swc/helpers": "^0.5.0"
},
"peerDependencies": {
@@ -7077,16 +7128,16 @@
}
},
"node_modules/@react-aria/progress": {
- "version": "3.4.22",
- "resolved": "https://registry.npmjs.org/@react-aria/progress/-/progress-3.4.22.tgz",
- "integrity": "sha512-wK2hath4C9HKgmjCH+iSrAs86sUKqqsYKbEKk9/Rj9rzXqHyaEK9EG0YZDnSjd8kX+N9hYcs5MfJl6AZMH4juQ==",
+ "version": "3.4.23",
+ "resolved": "https://registry.npmjs.org/@react-aria/progress/-/progress-3.4.23.tgz",
+ "integrity": "sha512-uSQBVY64k+CCey82U67KyWnjAfuuHF0fG6y76kIB8GHI8tGfd1NkXo4ioaxiY0SS+BYGqwqJYYMUzQMpOBTN1A==",
"license": "Apache-2.0",
"dependencies": {
- "@react-aria/i18n": "^3.12.8",
- "@react-aria/label": "^3.7.17",
- "@react-aria/utils": "^3.28.2",
- "@react-types/progress": "^3.5.11",
- "@react-types/shared": "^3.29.0",
+ "@react-aria/i18n": "^3.12.9",
+ "@react-aria/label": "^3.7.18",
+ "@react-aria/utils": "^3.29.0",
+ "@react-types/progress": "^3.5.12",
+ "@react-types/shared": "^3.29.1",
"@swc/helpers": "^0.5.0"
},
"peerDependencies": {
@@ -7095,20 +7146,20 @@
}
},
"node_modules/@react-aria/radio": {
- "version": "3.11.2",
- "resolved": "https://registry.npmjs.org/@react-aria/radio/-/radio-3.11.2.tgz",
- "integrity": "sha512-6AFJHXMewJBgHNhqkN1qjgwwx6kmagwYD+3Z+hNK1UHTsKe1Uud5/IF7gPFCqlZeKxA+Lvn9gWiqJrQbtD2+wg==",
- "license": "Apache-2.0",
- "dependencies": {
- "@react-aria/focus": "^3.20.2",
- "@react-aria/form": "^3.0.15",
- "@react-aria/i18n": "^3.12.8",
- "@react-aria/interactions": "^3.25.0",
- "@react-aria/label": "^3.7.17",
- "@react-aria/utils": "^3.28.2",
- "@react-stately/radio": "^3.10.12",
- "@react-types/radio": "^3.8.8",
- "@react-types/shared": "^3.29.0",
+ "version": "3.11.3",
+ "resolved": "https://registry.npmjs.org/@react-aria/radio/-/radio-3.11.3.tgz",
+ "integrity": "sha512-o10G8RUuHnAGZYzkc5PQw7mj4LMZqmGkoihDeHF2NDa9h44Ce5oeCPwRvCKYbumZDOyDY15ZIZhTUzjHt2w6fA==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@react-aria/focus": "^3.20.3",
+ "@react-aria/form": "^3.0.16",
+ "@react-aria/i18n": "^3.12.9",
+ "@react-aria/interactions": "^3.25.1",
+ "@react-aria/label": "^3.7.18",
+ "@react-aria/utils": "^3.29.0",
+ "@react-stately/radio": "^3.10.13",
+ "@react-types/radio": "^3.8.9",
+ "@react-types/shared": "^3.29.1",
"@swc/helpers": "^0.5.0"
},
"peerDependencies": {
@@ -7117,18 +7168,18 @@
}
},
"node_modules/@react-aria/searchfield": {
- "version": "3.8.3",
- "resolved": "https://registry.npmjs.org/@react-aria/searchfield/-/searchfield-3.8.3.tgz",
- "integrity": "sha512-t1DW3nUkPHyZhFhUbT+TdhvI8yZYvUPCuwl0FyraMRCQ4+ww5Ieu4n8JB9IGYmIUB/GWEbZlDHplu4s3efmliA==",
+ "version": "3.8.4",
+ "resolved": "https://registry.npmjs.org/@react-aria/searchfield/-/searchfield-3.8.4.tgz",
+ "integrity": "sha512-WnAvU9ct8+Asb8FFhGw6bggBmRaPe9qZPgYacenmRItwN+7UVTwEBVB9umO2bN3PLGm3CKgop10znd6ATiAbJA==",
"license": "Apache-2.0",
"dependencies": {
- "@react-aria/i18n": "^3.12.8",
- "@react-aria/textfield": "^3.17.2",
- "@react-aria/utils": "^3.28.2",
- "@react-stately/searchfield": "^3.5.11",
- "@react-types/button": "^3.12.0",
- "@react-types/searchfield": "^3.6.1",
- "@react-types/shared": "^3.29.0",
+ "@react-aria/i18n": "^3.12.9",
+ "@react-aria/textfield": "^3.17.3",
+ "@react-aria/utils": "^3.29.0",
+ "@react-stately/searchfield": "^3.5.12",
+ "@react-types/button": "^3.12.1",
+ "@react-types/searchfield": "^3.6.2",
+ "@react-types/shared": "^3.29.1",
"@swc/helpers": "^0.5.0"
},
"peerDependencies": {
@@ -7137,24 +7188,24 @@
}
},
"node_modules/@react-aria/select": {
- "version": "3.15.4",
- "resolved": "https://registry.npmjs.org/@react-aria/select/-/select-3.15.4.tgz",
- "integrity": "sha512-CipqXgdOfWsiHw/chfqd8t9IQpvehP+3uKLJx3ic4Uyj+FT/SxVmmjX0gyvVbZd00ltFCMJYO2xYKQUlbW2AtQ==",
- "license": "Apache-2.0",
- "dependencies": {
- "@react-aria/form": "^3.0.15",
- "@react-aria/i18n": "^3.12.8",
- "@react-aria/interactions": "^3.25.0",
- "@react-aria/label": "^3.7.17",
- "@react-aria/listbox": "^3.14.3",
- "@react-aria/menu": "^3.18.2",
- "@react-aria/selection": "^3.24.0",
- "@react-aria/utils": "^3.28.2",
- "@react-aria/visually-hidden": "^3.8.22",
- "@react-stately/select": "^3.6.12",
- "@react-types/button": "^3.12.0",
- "@react-types/select": "^3.9.11",
- "@react-types/shared": "^3.29.0",
+ "version": "3.15.5",
+ "resolved": "https://registry.npmjs.org/@react-aria/select/-/select-3.15.5.tgz",
+ "integrity": "sha512-2v8QmcPsZzlOjc/zsLbMcKeMKZoa+FZboxfjq4koUXtuaLhgopENChkfPLaXEGxqsejANs4dAoqiOiwwrGAaLQ==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@react-aria/form": "^3.0.16",
+ "@react-aria/i18n": "^3.12.9",
+ "@react-aria/interactions": "^3.25.1",
+ "@react-aria/label": "^3.7.18",
+ "@react-aria/listbox": "^3.14.4",
+ "@react-aria/menu": "^3.18.3",
+ "@react-aria/selection": "^3.24.1",
+ "@react-aria/utils": "^3.29.0",
+ "@react-aria/visually-hidden": "^3.8.23",
+ "@react-stately/select": "^3.6.13",
+ "@react-types/button": "^3.12.1",
+ "@react-types/select": "^3.9.12",
+ "@react-types/shared": "^3.29.1",
"@swc/helpers": "^0.5.0"
},
"peerDependencies": {
@@ -7163,17 +7214,17 @@
}
},
"node_modules/@react-aria/selection": {
- "version": "3.24.0",
- "resolved": "https://registry.npmjs.org/@react-aria/selection/-/selection-3.24.0.tgz",
- "integrity": "sha512-RfGXVc04zz41NVIW89/a3quURZ4LT/GJLkiajQK2VjhisidPdrAWkcfjjWJj0n+tm5gPWbi9Rs5R/Rc8mrvq8Q==",
+ "version": "3.24.1",
+ "resolved": "https://registry.npmjs.org/@react-aria/selection/-/selection-3.24.1.tgz",
+ "integrity": "sha512-nHUksgjg92iHgseH9L+krk9rX19xGJLTDeobKBX7eoAXQMqQjefu+oDwT0VYdI/qqNURNELE/KPZIVLC4PB81w==",
"license": "Apache-2.0",
"dependencies": {
- "@react-aria/focus": "^3.20.2",
- "@react-aria/i18n": "^3.12.8",
- "@react-aria/interactions": "^3.25.0",
- "@react-aria/utils": "^3.28.2",
- "@react-stately/selection": "^3.20.1",
- "@react-types/shared": "^3.29.0",
+ "@react-aria/focus": "^3.20.3",
+ "@react-aria/i18n": "^3.12.9",
+ "@react-aria/interactions": "^3.25.1",
+ "@react-aria/utils": "^3.29.0",
+ "@react-stately/selection": "^3.20.2",
+ "@react-types/shared": "^3.29.1",
"@swc/helpers": "^0.5.0"
},
"peerDependencies": {
@@ -7182,13 +7233,13 @@
}
},
"node_modules/@react-aria/separator": {
- "version": "3.4.8",
- "resolved": "https://registry.npmjs.org/@react-aria/separator/-/separator-3.4.8.tgz",
- "integrity": "sha512-ncuOSTBF/qbNumnW/IRz+xyr+Ud85eCF0Expw4XWhKjAZfzJd86MxPY5ZsxE7pYLOcRWdOSIH1/obwwwSz8ALQ==",
+ "version": "3.4.9",
+ "resolved": "https://registry.npmjs.org/@react-aria/separator/-/separator-3.4.9.tgz",
+ "integrity": "sha512-5ZKVQ/5I2+fw8WyVCQLGjQKsMKlTIieLPf8NvdC24a+pmiUluyUuqfPYdI8s6lcnjG0gbOzZB+jKvDRQbIvMPQ==",
"license": "Apache-2.0",
"dependencies": {
- "@react-aria/utils": "^3.28.2",
- "@react-types/shared": "^3.29.0",
+ "@react-aria/utils": "^3.29.0",
+ "@react-types/shared": "^3.29.1",
"@swc/helpers": "^0.5.0"
},
"peerDependencies": {
@@ -7197,18 +7248,18 @@
}
},
"node_modules/@react-aria/slider": {
- "version": "3.7.18",
- "resolved": "https://registry.npmjs.org/@react-aria/slider/-/slider-3.7.18.tgz",
- "integrity": "sha512-GBVv5Rpvj/6JH2LnF1zVAhBmxGiuq7R8Ekqyr5kBrCc2ToF3PrTjfGc/mlh0eEtbj+NvAcnlgTx1/qosYt1sGw==",
- "license": "Apache-2.0",
- "dependencies": {
- "@react-aria/i18n": "^3.12.8",
- "@react-aria/interactions": "^3.25.0",
- "@react-aria/label": "^3.7.17",
- "@react-aria/utils": "^3.28.2",
- "@react-stately/slider": "^3.6.3",
- "@react-types/shared": "^3.29.0",
- "@react-types/slider": "^3.7.10",
+ "version": "3.7.19",
+ "resolved": "https://registry.npmjs.org/@react-aria/slider/-/slider-3.7.19.tgz",
+ "integrity": "sha512-GONrMMz9zsx0ySbUTebWdqRjAuu6EEW+lLf3qUzcqkIYR8QZVTS8RLPt7FmGHKCTDIaBs8D2yv9puIfKAo1QAA==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@react-aria/i18n": "^3.12.9",
+ "@react-aria/interactions": "^3.25.1",
+ "@react-aria/label": "^3.7.18",
+ "@react-aria/utils": "^3.29.0",
+ "@react-stately/slider": "^3.6.4",
+ "@react-types/shared": "^3.29.1",
+ "@react-types/slider": "^3.7.11",
"@swc/helpers": "^0.5.0"
},
"peerDependencies": {
@@ -7217,16 +7268,16 @@
}
},
"node_modules/@react-aria/spinbutton": {
- "version": "3.6.14",
- "resolved": "https://registry.npmjs.org/@react-aria/spinbutton/-/spinbutton-3.6.14.tgz",
- "integrity": "sha512-oSKe9p0Q/7W39eXRnLxlwJG5dQo4ffosRT3u2AtOcFkk2Zzj+tSQFzHQ4202nrWdzRnQ2KLTgUUNnUvXf0BJcg==",
+ "version": "3.6.15",
+ "resolved": "https://registry.npmjs.org/@react-aria/spinbutton/-/spinbutton-3.6.15.tgz",
+ "integrity": "sha512-dVKaRgrSU2utxCd4kqAA8BPrC1PVI1eiJ8gvlVbg25LbwK4dg1WPXQUK+80TbrJc9mOEooPiJvzw59IoQLMNRg==",
"license": "Apache-2.0",
"dependencies": {
- "@react-aria/i18n": "^3.12.8",
+ "@react-aria/i18n": "^3.12.9",
"@react-aria/live-announcer": "^3.4.2",
- "@react-aria/utils": "^3.28.2",
- "@react-types/button": "^3.12.0",
- "@react-types/shared": "^3.29.0",
+ "@react-aria/utils": "^3.29.0",
+ "@react-types/button": "^3.12.1",
+ "@react-types/shared": "^3.29.1",
"@swc/helpers": "^0.5.0"
},
"peerDependencies": {
@@ -7250,15 +7301,15 @@
}
},
"node_modules/@react-aria/switch": {
- "version": "3.7.2",
- "resolved": "https://registry.npmjs.org/@react-aria/switch/-/switch-3.7.2.tgz",
- "integrity": "sha512-vaREbp1gFjv+jEMXoXpNK7JYFO/jhwnSYAwEINNWnwf54IGeHvTPaB2NwolYSFvP4HAj8TKYbGFUSz7RKLhLgw==",
+ "version": "3.7.3",
+ "resolved": "https://registry.npmjs.org/@react-aria/switch/-/switch-3.7.3.tgz",
+ "integrity": "sha512-tFdJmcHaLgW23cS2R713vcJdVbsjDTRk8OLdG/sMziPBY3C00/exuSIb57xTS7KrE0hBYfnLJQTcmDNqdM8+9Q==",
"license": "Apache-2.0",
"dependencies": {
- "@react-aria/toggle": "^3.11.2",
- "@react-stately/toggle": "^3.8.3",
- "@react-types/shared": "^3.29.0",
- "@react-types/switch": "^3.5.10",
+ "@react-aria/toggle": "^3.11.3",
+ "@react-stately/toggle": "^3.8.4",
+ "@react-types/shared": "^3.29.1",
+ "@react-types/switch": "^3.5.11",
"@swc/helpers": "^0.5.0"
},
"peerDependencies": {
@@ -7267,25 +7318,25 @@
}
},
"node_modules/@react-aria/table": {
- "version": "3.17.2",
- "resolved": "https://registry.npmjs.org/@react-aria/table/-/table-3.17.2.tgz",
- "integrity": "sha512-wsF3JqiAKcol1sfeNqTxyzH6+nxu0sAfyuh+XQfp1tvSGx15NifYeNKovNX4EPpUVkAI7jL5Le+eYeYYGELfnw==",
+ "version": "3.17.3",
+ "resolved": "https://registry.npmjs.org/@react-aria/table/-/table-3.17.3.tgz",
+ "integrity": "sha512-hs3akyNMeeAPIfa+YKMxJyupSjywW5OGzJtOw/Z0j6pV8KXSeMEXNYkSuJY+m5Q1mdunoiiogs0kE3B0r2izQA==",
"license": "Apache-2.0",
"dependencies": {
- "@react-aria/focus": "^3.20.2",
- "@react-aria/grid": "^3.13.0",
- "@react-aria/i18n": "^3.12.8",
- "@react-aria/interactions": "^3.25.0",
+ "@react-aria/focus": "^3.20.3",
+ "@react-aria/grid": "^3.14.0",
+ "@react-aria/i18n": "^3.12.9",
+ "@react-aria/interactions": "^3.25.1",
"@react-aria/live-announcer": "^3.4.2",
- "@react-aria/utils": "^3.28.2",
- "@react-aria/visually-hidden": "^3.8.22",
- "@react-stately/collections": "^3.12.3",
+ "@react-aria/utils": "^3.29.0",
+ "@react-aria/visually-hidden": "^3.8.23",
+ "@react-stately/collections": "^3.12.4",
"@react-stately/flags": "^3.1.1",
- "@react-stately/table": "^3.14.1",
- "@react-types/checkbox": "^3.9.3",
- "@react-types/grid": "^3.3.1",
- "@react-types/shared": "^3.29.0",
- "@react-types/table": "^3.12.0",
+ "@react-stately/table": "^3.14.2",
+ "@react-types/checkbox": "^3.9.4",
+ "@react-types/grid": "^3.3.2",
+ "@react-types/shared": "^3.29.1",
+ "@react-types/table": "^3.13.0",
"@swc/helpers": "^0.5.0"
},
"peerDependencies": {
@@ -7294,18 +7345,18 @@
}
},
"node_modules/@react-aria/tabs": {
- "version": "3.10.2",
- "resolved": "https://registry.npmjs.org/@react-aria/tabs/-/tabs-3.10.2.tgz",
- "integrity": "sha512-rpEgh//Gnew3le49tQVFOQ6ZyacJdaNUDXHt0ocguXb+2UrKtH54M8oIAE7E8KaB1puQlFXRs+Rjlr1rOlmjEQ==",
- "license": "Apache-2.0",
- "dependencies": {
- "@react-aria/focus": "^3.20.2",
- "@react-aria/i18n": "^3.12.8",
- "@react-aria/selection": "^3.24.0",
- "@react-aria/utils": "^3.28.2",
- "@react-stately/tabs": "^3.8.1",
- "@react-types/shared": "^3.29.0",
- "@react-types/tabs": "^3.3.14",
+ "version": "3.10.3",
+ "resolved": "https://registry.npmjs.org/@react-aria/tabs/-/tabs-3.10.3.tgz",
+ "integrity": "sha512-TYfwaRrI0mQMefmoHeTKXdczpb53qpPr+3nnveGl+BocG94wmjIqK6kncboVbPdykgQCIAMd2d9GFpK01+zXrA==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@react-aria/focus": "^3.20.3",
+ "@react-aria/i18n": "^3.12.9",
+ "@react-aria/selection": "^3.24.1",
+ "@react-aria/utils": "^3.29.0",
+ "@react-stately/tabs": "^3.8.2",
+ "@react-types/shared": "^3.29.1",
+ "@react-types/tabs": "^3.3.15",
"@swc/helpers": "^0.5.0"
},
"peerDependencies": {
@@ -7314,20 +7365,20 @@
}
},
"node_modules/@react-aria/tag": {
- "version": "3.5.2",
- "resolved": "https://registry.npmjs.org/@react-aria/tag/-/tag-3.5.2.tgz",
- "integrity": "sha512-xZ5Df0x+xcDg6UTDvnjP4pu+XrmYVaYcqzF7RGoCD1KyRCHU5Czg9p+888NB0K+vnJHfNsQh6rmMhDUydXu9eg==",
- "license": "Apache-2.0",
- "dependencies": {
- "@react-aria/gridlist": "^3.12.0",
- "@react-aria/i18n": "^3.12.8",
- "@react-aria/interactions": "^3.25.0",
- "@react-aria/label": "^3.7.17",
- "@react-aria/selection": "^3.24.0",
- "@react-aria/utils": "^3.28.2",
- "@react-stately/list": "^3.12.1",
- "@react-types/button": "^3.12.0",
- "@react-types/shared": "^3.29.0",
+ "version": "3.6.0",
+ "resolved": "https://registry.npmjs.org/@react-aria/tag/-/tag-3.6.0.tgz",
+ "integrity": "sha512-OkLyFYTFVUYB339eugw2r6vIcrWq47O15x4sKNkDUo6YBx9ci9tdoib4DlzwuiiKVr/vmw1WMow6VK4zOtuLng==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@react-aria/gridlist": "^3.13.0",
+ "@react-aria/i18n": "^3.12.9",
+ "@react-aria/interactions": "^3.25.1",
+ "@react-aria/label": "^3.7.18",
+ "@react-aria/selection": "^3.24.1",
+ "@react-aria/utils": "^3.29.0",
+ "@react-stately/list": "^3.12.2",
+ "@react-types/button": "^3.12.1",
+ "@react-types/shared": "^3.29.1",
"@swc/helpers": "^0.5.0"
},
"peerDependencies": {
@@ -7336,19 +7387,19 @@
}
},
"node_modules/@react-aria/textfield": {
- "version": "3.17.2",
- "resolved": "https://registry.npmjs.org/@react-aria/textfield/-/textfield-3.17.2.tgz",
- "integrity": "sha512-4KINB0HueYUHUgvi/ThTP27hu4Mv5ujG55pH3dmSRD4Olu/MRy1m/Psq72o8LTf4bTOM9ZP1rKccUg6xfaMidA==",
+ "version": "3.17.3",
+ "resolved": "https://registry.npmjs.org/@react-aria/textfield/-/textfield-3.17.3.tgz",
+ "integrity": "sha512-p/Z0fyE0CnzIrnCf42gxeSCNYon7//XkcbPwUS4U9dz2VLk2GnEn9NZXPYgTp+08ebQEn0pB1QIchX79yFEguw==",
"license": "Apache-2.0",
"dependencies": {
- "@react-aria/form": "^3.0.15",
- "@react-aria/interactions": "^3.25.0",
- "@react-aria/label": "^3.7.17",
- "@react-aria/utils": "^3.28.2",
- "@react-stately/form": "^3.1.3",
+ "@react-aria/form": "^3.0.16",
+ "@react-aria/interactions": "^3.25.1",
+ "@react-aria/label": "^3.7.18",
+ "@react-aria/utils": "^3.29.0",
+ "@react-stately/form": "^3.1.4",
"@react-stately/utils": "^3.10.6",
- "@react-types/shared": "^3.29.0",
- "@react-types/textfield": "^3.12.1",
+ "@react-types/shared": "^3.29.1",
+ "@react-types/textfield": "^3.12.2",
"@swc/helpers": "^0.5.0"
},
"peerDependencies": {
@@ -7357,18 +7408,18 @@
}
},
"node_modules/@react-aria/toast": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/@react-aria/toast/-/toast-3.0.2.tgz",
- "integrity": "sha512-iaiHDE1CKYM3BbNEp3A2Ed8YAlpXUGyY6vesKISdHEZ2lJ7r+1hbcFoTNdG8HfbB8Lz5vw8Wd2o+ZmQ2tnDY9Q==",
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/@react-aria/toast/-/toast-3.0.3.tgz",
+ "integrity": "sha512-7HWTKIVwS1JFC8//BQbRtGFaAdq4SljvI3yI5amLr90CyVM0sugTtcSX9a8BPnp1j9ao+6bmOi/wrV48mze1PA==",
"license": "Apache-2.0",
"dependencies": {
- "@react-aria/i18n": "^3.12.8",
- "@react-aria/interactions": "^3.25.0",
- "@react-aria/landmark": "^3.0.2",
- "@react-aria/utils": "^3.28.2",
+ "@react-aria/i18n": "^3.12.9",
+ "@react-aria/interactions": "^3.25.1",
+ "@react-aria/landmark": "^3.0.3",
+ "@react-aria/utils": "^3.29.0",
"@react-stately/toast": "^3.1.0",
- "@react-types/button": "^3.12.0",
- "@react-types/shared": "^3.29.0",
+ "@react-types/button": "^3.12.1",
+ "@react-types/shared": "^3.29.1",
"@swc/helpers": "^0.5.0"
},
"peerDependencies": {
@@ -7377,16 +7428,16 @@
}
},
"node_modules/@react-aria/toggle": {
- "version": "3.11.2",
- "resolved": "https://registry.npmjs.org/@react-aria/toggle/-/toggle-3.11.2.tgz",
- "integrity": "sha512-JOg8yYYCjLDnEpuggPo9GyXFaT/B238d3R8i/xQ6KLelpi3fXdJuZlFD6n9NQp3DJbE8Wj+wM5/VFFAi3cISpw==",
+ "version": "3.11.3",
+ "resolved": "https://registry.npmjs.org/@react-aria/toggle/-/toggle-3.11.3.tgz",
+ "integrity": "sha512-S6ShToNR6TukRJh8qDdyl9b2Bcsx43eurUB5USANn4ycPov8+bIxQnxiknjssZx7jD8vX4jruuNh7BjFbNsGFw==",
"license": "Apache-2.0",
"dependencies": {
- "@react-aria/interactions": "^3.25.0",
- "@react-aria/utils": "^3.28.2",
- "@react-stately/toggle": "^3.8.3",
- "@react-types/checkbox": "^3.9.3",
- "@react-types/shared": "^3.29.0",
+ "@react-aria/interactions": "^3.25.1",
+ "@react-aria/utils": "^3.29.0",
+ "@react-stately/toggle": "^3.8.4",
+ "@react-types/checkbox": "^3.9.4",
+ "@react-types/shared": "^3.29.1",
"@swc/helpers": "^0.5.0"
},
"peerDependencies": {
@@ -7395,15 +7446,15 @@
}
},
"node_modules/@react-aria/toolbar": {
- "version": "3.0.0-beta.15",
- "resolved": "https://registry.npmjs.org/@react-aria/toolbar/-/toolbar-3.0.0-beta.15.tgz",
- "integrity": "sha512-PNGpNIKIsCW8rxI9XXSADlLrSpikILJKKECyTRw9KwvXDRc44pezvdjGHCNinQcKsQoy5BtkK5cTSAyVqzzTXQ==",
+ "version": "3.0.0-beta.16",
+ "resolved": "https://registry.npmjs.org/@react-aria/toolbar/-/toolbar-3.0.0-beta.16.tgz",
+ "integrity": "sha512-TnNvtxADalMzs9Et51hWPpGyiHr1dt++UYR7pIo1H7vO+HwXl6uH4HxbFDS5CyV69j2cQlcGrkj13LoWFkBECw==",
"license": "Apache-2.0",
"dependencies": {
- "@react-aria/focus": "^3.20.2",
- "@react-aria/i18n": "^3.12.8",
- "@react-aria/utils": "^3.28.2",
- "@react-types/shared": "^3.29.0",
+ "@react-aria/focus": "^3.20.3",
+ "@react-aria/i18n": "^3.12.9",
+ "@react-aria/utils": "^3.29.0",
+ "@react-types/shared": "^3.29.1",
"@swc/helpers": "^0.5.0"
},
"peerDependencies": {
@@ -7412,16 +7463,16 @@
}
},
"node_modules/@react-aria/tooltip": {
- "version": "3.8.2",
- "resolved": "https://registry.npmjs.org/@react-aria/tooltip/-/tooltip-3.8.2.tgz",
- "integrity": "sha512-ctVTgh1LXvmr1ve3ehAWfvlJR7nHYZeqhl/g1qnA+983LQtc1IF9MraCs92g0m7KpBwCihuA+aYwTPsUHfKfXg==",
+ "version": "3.8.3",
+ "resolved": "https://registry.npmjs.org/@react-aria/tooltip/-/tooltip-3.8.3.tgz",
+ "integrity": "sha512-8JHRqffH5vUw7og6mlCRzb4h95/R5RpOxGFfEGw7aami14XMo6tZg7wMgwDUAEiVqNerRWYaw+tk7nCUQXo1Sg==",
"license": "Apache-2.0",
"dependencies": {
- "@react-aria/interactions": "^3.25.0",
- "@react-aria/utils": "^3.28.2",
- "@react-stately/tooltip": "^3.5.3",
- "@react-types/shared": "^3.29.0",
- "@react-types/tooltip": "^3.4.16",
+ "@react-aria/interactions": "^3.25.1",
+ "@react-aria/utils": "^3.29.0",
+ "@react-stately/tooltip": "^3.5.4",
+ "@react-types/shared": "^3.29.1",
+ "@react-types/tooltip": "^3.4.17",
"@swc/helpers": "^0.5.0"
},
"peerDependencies": {
@@ -7430,18 +7481,18 @@
}
},
"node_modules/@react-aria/tree": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/@react-aria/tree/-/tree-3.0.2.tgz",
- "integrity": "sha512-gr06Y1760+kdlDeUcGNR+PCuJMtlrdtNMGG1Z0fSygy8y7/zVdTOLQp0c1Q3pjL2nr7Unjz/H1xSgERParHsbg==",
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/@react-aria/tree/-/tree-3.0.3.tgz",
+ "integrity": "sha512-kdA0CCUD8luCrXZFo0rX1c0LI8jovYMuWsPiI5OpmiEKGA5HaVFFW/H9t/XSYdVc/JO08zbeZ/WacTusKeOT3Q==",
"license": "Apache-2.0",
"dependencies": {
- "@react-aria/gridlist": "^3.12.0",
- "@react-aria/i18n": "^3.12.8",
- "@react-aria/selection": "^3.24.0",
- "@react-aria/utils": "^3.28.2",
- "@react-stately/tree": "^3.8.9",
- "@react-types/button": "^3.12.0",
- "@react-types/shared": "^3.29.0",
+ "@react-aria/gridlist": "^3.13.0",
+ "@react-aria/i18n": "^3.12.9",
+ "@react-aria/selection": "^3.24.1",
+ "@react-aria/utils": "^3.29.0",
+ "@react-stately/tree": "^3.8.10",
+ "@react-types/button": "^3.12.1",
+ "@react-types/shared": "^3.29.1",
"@swc/helpers": "^0.5.0"
},
"peerDependencies": {
@@ -7450,15 +7501,15 @@
}
},
"node_modules/@react-aria/utils": {
- "version": "3.28.2",
- "resolved": "https://registry.npmjs.org/@react-aria/utils/-/utils-3.28.2.tgz",
- "integrity": "sha512-J8CcLbvnQgiBn54eeEvQQbIOfBF3A1QizxMw9P4cl9MkeR03ug7RnjTIdJY/n2p7t59kLeAB3tqiczhcj+Oi5w==",
+ "version": "3.29.0",
+ "resolved": "https://registry.npmjs.org/@react-aria/utils/-/utils-3.29.0.tgz",
+ "integrity": "sha512-jSOrZimCuT1iKNVlhjIxDkAhgF7HSp3pqyT6qjg/ZoA0wfqCi/okmrMPiWSAKBnkgX93N8GYTLT3CIEO6WZe9Q==",
"license": "Apache-2.0",
"dependencies": {
"@react-aria/ssr": "^3.9.8",
"@react-stately/flags": "^3.1.1",
"@react-stately/utils": "^3.10.6",
- "@react-types/shared": "^3.29.0",
+ "@react-types/shared": "^3.29.1",
"@swc/helpers": "^0.5.0",
"clsx": "^2.0.0"
},
@@ -7468,16 +7519,16 @@
}
},
"node_modules/@react-aria/virtualizer": {
- "version": "4.1.4",
- "resolved": "https://registry.npmjs.org/@react-aria/virtualizer/-/virtualizer-4.1.4.tgz",
- "integrity": "sha512-SBKD2K+kBc3aLMVEqnBXjpqLhUSyvoi1ubSgUS5KMIqgyn44OWn5zKTsj9SIPZot6buSlgV2700TIWDhEJzWlw==",
+ "version": "4.1.5",
+ "resolved": "https://registry.npmjs.org/@react-aria/virtualizer/-/virtualizer-4.1.5.tgz",
+ "integrity": "sha512-Z5+Zr54HCBqycIzZuHohS25dOJ7p8sdNDjAYvW33Uq8nudTvSC5JmV/5kZVN11j5kVYXa7maRnFQlDx941sygw==",
"license": "Apache-2.0",
"dependencies": {
- "@react-aria/i18n": "^3.12.8",
- "@react-aria/interactions": "^3.25.0",
- "@react-aria/utils": "^3.28.2",
- "@react-stately/virtualizer": "^4.3.2",
- "@react-types/shared": "^3.29.0",
+ "@react-aria/i18n": "^3.12.9",
+ "@react-aria/interactions": "^3.25.1",
+ "@react-aria/utils": "^3.29.0",
+ "@react-stately/virtualizer": "^4.4.0",
+ "@react-types/shared": "^3.29.1",
"@swc/helpers": "^0.5.0"
},
"peerDependencies": {
@@ -7486,14 +7537,14 @@
}
},
"node_modules/@react-aria/visually-hidden": {
- "version": "3.8.22",
- "resolved": "https://registry.npmjs.org/@react-aria/visually-hidden/-/visually-hidden-3.8.22.tgz",
- "integrity": "sha512-EO3R8YTKZ7HkLl9k1Y2uBKYBgpJagth4/4W7mfpJZE24A3fQnCP8zx1sweXiAm0mirR4J6tNaK7Ia8ssP5TpOw==",
+ "version": "3.8.23",
+ "resolved": "https://registry.npmjs.org/@react-aria/visually-hidden/-/visually-hidden-3.8.23.tgz",
+ "integrity": "sha512-D37GHtAcxCck8BtCiGTNDniGqtldJuN0cRlW1PJ684zM4CdmkSPqKbt5IUKUfqheS9Vt7HxYsj1VREDW+0kaGA==",
"license": "Apache-2.0",
"dependencies": {
- "@react-aria/interactions": "^3.25.0",
- "@react-aria/utils": "^3.28.2",
- "@react-types/shared": "^3.29.0",
+ "@react-aria/interactions": "^3.25.1",
+ "@react-aria/utils": "^3.29.0",
+ "@react-types/shared": "^3.29.1",
"@swc/helpers": "^0.5.0"
},
"peerDependencies": {
@@ -7532,17 +7583,17 @@
"license": "MIT"
},
"node_modules/@react-spectrum/accordion": {
- "version": "3.0.5",
- "resolved": "https://registry.npmjs.org/@react-spectrum/accordion/-/accordion-3.0.5.tgz",
- "integrity": "sha512-q+J9DgKVS19LXwIEohtj/GRBGDu5YbGKLLAci/boPjpdFFnUi8OvHp3xhk9Y8oUkYu1VSUpvMq2NiIRgz8M+OQ==",
+ "version": "3.0.6",
+ "resolved": "https://registry.npmjs.org/@react-spectrum/accordion/-/accordion-3.0.6.tgz",
+ "integrity": "sha512-gurgbZAGirou+3zxaXMngIkI0wdpuEpYrhpJUllZqEFe0uU2azy/ayT1swvK59WEh65My4uCkikk3hBTX30A8Q==",
"license": "Apache-2.0",
"dependencies": {
- "@react-aria/i18n": "^3.12.8",
- "@react-spectrum/utils": "^3.12.4",
- "@react-types/shared": "^3.29.0",
- "@spectrum-icons/ui": "^3.6.15",
+ "@react-aria/i18n": "^3.12.9",
+ "@react-spectrum/utils": "^3.12.5",
+ "@react-types/shared": "^3.29.1",
+ "@spectrum-icons/ui": "^3.6.16",
"@swc/helpers": "^0.5.0",
- "react-aria-components": "^1.8.0"
+ "react-aria-components": "^1.9.0"
},
"peerDependencies": {
"@react-spectrum/provider": "^3.0.0",
@@ -7551,25 +7602,25 @@
}
},
"node_modules/@react-spectrum/actionbar": {
- "version": "3.6.6",
- "resolved": "https://registry.npmjs.org/@react-spectrum/actionbar/-/actionbar-3.6.6.tgz",
- "integrity": "sha512-EVZJq7cgnWVt9toWn++gDBrD0YKleG7B9/aXRGpbHKQxu5rSf4kmb2x423mIIrSxONJ121+y5PKytGIQyTyQaw==",
+ "version": "3.6.7",
+ "resolved": "https://registry.npmjs.org/@react-spectrum/actionbar/-/actionbar-3.6.7.tgz",
+ "integrity": "sha512-UwrLJAtSawslXRyaYNbEyptofCJq0yEE8ov1jpFwJ4QD4uI3Q8cMj755MQA9i4xOF1m4f0m8vLG9qF3A2IHDQw==",
"license": "Apache-2.0",
"dependencies": {
- "@react-aria/focus": "^3.20.2",
- "@react-aria/i18n": "^3.12.8",
- "@react-aria/interactions": "^3.25.0",
+ "@react-aria/focus": "^3.20.3",
+ "@react-aria/i18n": "^3.12.9",
+ "@react-aria/interactions": "^3.25.1",
"@react-aria/live-announcer": "^3.4.2",
- "@react-aria/utils": "^3.28.2",
- "@react-spectrum/actiongroup": "^3.10.14",
- "@react-spectrum/button": "^3.16.13",
- "@react-spectrum/overlays": "^5.7.4",
- "@react-spectrum/text": "^3.5.14",
- "@react-spectrum/utils": "^3.12.4",
- "@react-stately/collections": "^3.12.3",
- "@react-types/actionbar": "^3.1.14",
- "@react-types/shared": "^3.29.0",
- "@spectrum-icons/ui": "^3.6.15",
+ "@react-aria/utils": "^3.29.0",
+ "@react-spectrum/actiongroup": "^3.10.15",
+ "@react-spectrum/button": "^3.16.14",
+ "@react-spectrum/overlays": "^5.7.5",
+ "@react-spectrum/text": "^3.5.15",
+ "@react-spectrum/utils": "^3.12.5",
+ "@react-stately/collections": "^3.12.4",
+ "@react-types/actionbar": "^3.1.15",
+ "@react-types/shared": "^3.29.1",
+ "@spectrum-icons/ui": "^3.6.16",
"@swc/helpers": "^0.5.0"
},
"peerDependencies": {
@@ -7579,26 +7630,26 @@
}
},
"node_modules/@react-spectrum/actiongroup": {
- "version": "3.10.14",
- "resolved": "https://registry.npmjs.org/@react-spectrum/actiongroup/-/actiongroup-3.10.14.tgz",
- "integrity": "sha512-0b8Mh+49QCacHVLX17gX3XfUhXM+QrTbTyHwNBjMyNE09162PZhvzIboST4f74bBqhAZunh9c4buyo2oRFZL0A==",
- "license": "Apache-2.0",
- "dependencies": {
- "@react-aria/actiongroup": "^3.7.15",
- "@react-aria/focus": "^3.20.2",
- "@react-aria/interactions": "^3.25.0",
- "@react-aria/utils": "^3.28.2",
- "@react-spectrum/button": "^3.16.13",
- "@react-spectrum/menu": "^3.22.0",
- "@react-spectrum/text": "^3.5.14",
- "@react-spectrum/tooltip": "^3.7.4",
- "@react-spectrum/utils": "^3.12.4",
- "@react-stately/collections": "^3.12.3",
- "@react-stately/list": "^3.12.1",
- "@react-types/actiongroup": "^3.4.16",
- "@react-types/shared": "^3.29.0",
- "@spectrum-icons/ui": "^3.6.15",
- "@spectrum-icons/workflow": "^4.2.20",
+ "version": "3.10.15",
+ "resolved": "https://registry.npmjs.org/@react-spectrum/actiongroup/-/actiongroup-3.10.15.tgz",
+ "integrity": "sha512-a/8GjyXCOMph0rwdSqwjLE4yJQUH4Ji7Ho+x6h5Iq5kCQSEtvqcYNrImMrVDqwjmdZST/K1uzJbnXPDvzW3B1A==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@react-aria/actiongroup": "^3.7.16",
+ "@react-aria/focus": "^3.20.3",
+ "@react-aria/interactions": "^3.25.1",
+ "@react-aria/utils": "^3.29.0",
+ "@react-spectrum/button": "^3.16.14",
+ "@react-spectrum/menu": "^3.22.1",
+ "@react-spectrum/text": "^3.5.15",
+ "@react-spectrum/tooltip": "^3.7.5",
+ "@react-spectrum/utils": "^3.12.5",
+ "@react-stately/collections": "^3.12.4",
+ "@react-stately/list": "^3.12.2",
+ "@react-types/actiongroup": "^3.4.17",
+ "@react-types/shared": "^3.29.1",
+ "@spectrum-icons/ui": "^3.6.16",
+ "@spectrum-icons/workflow": "^4.2.21",
"@swc/helpers": "^0.5.0"
},
"peerDependencies": {
@@ -7608,15 +7659,15 @@
}
},
"node_modules/@react-spectrum/avatar": {
- "version": "3.0.21",
- "resolved": "https://registry.npmjs.org/@react-spectrum/avatar/-/avatar-3.0.21.tgz",
- "integrity": "sha512-40UL8VWgOpANhwgo2CY1JOTCzYkXxTovcMZDHJZRBIFjPcBD+ikjjLl4nzohcwjGjkYIhgXptGDmH8bzO5Fzdw==",
+ "version": "3.0.22",
+ "resolved": "https://registry.npmjs.org/@react-spectrum/avatar/-/avatar-3.0.22.tgz",
+ "integrity": "sha512-uufhpuoCgoC0lQZbwXmBGjWA/kEi08Gw0qnlcC72hBhM7yMHfjdmtfYmE654cl1zqxIDQWDcquJQ9ejhxs7W1g==",
"license": "Apache-2.0",
"dependencies": {
- "@react-aria/utils": "^3.28.2",
- "@react-spectrum/utils": "^3.12.4",
- "@react-types/avatar": "^3.0.14",
- "@react-types/shared": "^3.29.0",
+ "@react-aria/utils": "^3.29.0",
+ "@react-spectrum/utils": "^3.12.5",
+ "@react-types/avatar": "^3.0.15",
+ "@react-types/shared": "^3.29.1",
"@swc/helpers": "^0.5.0"
},
"peerDependencies": {
@@ -7626,16 +7677,16 @@
}
},
"node_modules/@react-spectrum/badge": {
- "version": "3.1.22",
- "resolved": "https://registry.npmjs.org/@react-spectrum/badge/-/badge-3.1.22.tgz",
- "integrity": "sha512-+OO6HBoXuqMmtrKxb2GaVyBT3Mu3bIl3EIv/vmn7RGHX+s/2c/2izTh6wsqUkUtPyVy2rElmaWWMLd38coPVGQ==",
+ "version": "3.1.23",
+ "resolved": "https://registry.npmjs.org/@react-spectrum/badge/-/badge-3.1.23.tgz",
+ "integrity": "sha512-410XtOKm4+RoT7dbVrNFxJSeAQbnVAz16/e+T0/siPNvUuY0cDnbDEDNqPJG9XVFsoSliwB9drvAcBEHiGChhg==",
"license": "Apache-2.0",
"dependencies": {
- "@react-aria/utils": "^3.28.2",
- "@react-spectrum/text": "^3.5.14",
- "@react-spectrum/utils": "^3.12.4",
- "@react-types/badge": "^3.1.16",
- "@react-types/shared": "^3.29.0",
+ "@react-aria/utils": "^3.29.0",
+ "@react-spectrum/text": "^3.5.15",
+ "@react-spectrum/utils": "^3.12.5",
+ "@react-types/badge": "^3.1.17",
+ "@react-types/shared": "^3.29.1",
"@swc/helpers": "^0.5.0"
},
"peerDependencies": {
@@ -7645,23 +7696,23 @@
}
},
"node_modules/@react-spectrum/breadcrumbs": {
- "version": "3.9.16",
- "resolved": "https://registry.npmjs.org/@react-spectrum/breadcrumbs/-/breadcrumbs-3.9.16.tgz",
- "integrity": "sha512-+lUuHPJ6cNwLeHh9L/ufIoTP9hJCNyKjlrNIXg70YxBnXKtI06A7otSnsQITUmouenIefS//nKhQ+d1CRWsUlQ==",
- "license": "Apache-2.0",
- "dependencies": {
- "@react-aria/breadcrumbs": "^3.5.23",
- "@react-aria/focus": "^3.20.2",
- "@react-aria/i18n": "^3.12.8",
- "@react-aria/interactions": "^3.25.0",
- "@react-aria/utils": "^3.28.2",
- "@react-spectrum/button": "^3.16.13",
- "@react-spectrum/menu": "^3.22.0",
- "@react-spectrum/utils": "^3.12.4",
- "@react-stately/collections": "^3.12.3",
- "@react-types/breadcrumbs": "^3.7.12",
- "@react-types/shared": "^3.29.0",
- "@spectrum-icons/ui": "^3.6.15",
+ "version": "3.9.17",
+ "resolved": "https://registry.npmjs.org/@react-spectrum/breadcrumbs/-/breadcrumbs-3.9.17.tgz",
+ "integrity": "sha512-wrPwew84fL4uqJu+nDXaD0flym6ZQRx+I6/IFGRn6P8Ovr05IreSjuU78z587lK3shTF36qahO7MpZI672Gefg==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@react-aria/breadcrumbs": "^3.5.24",
+ "@react-aria/focus": "^3.20.3",
+ "@react-aria/i18n": "^3.12.9",
+ "@react-aria/interactions": "^3.25.1",
+ "@react-aria/utils": "^3.29.0",
+ "@react-spectrum/button": "^3.16.14",
+ "@react-spectrum/menu": "^3.22.1",
+ "@react-spectrum/utils": "^3.12.5",
+ "@react-stately/collections": "^3.12.4",
+ "@react-types/breadcrumbs": "^3.7.13",
+ "@react-types/shared": "^3.29.1",
+ "@spectrum-icons/ui": "^3.6.16",
"@swc/helpers": "^0.5.0"
},
"peerDependencies": {
@@ -7671,23 +7722,23 @@
}
},
"node_modules/@react-spectrum/button": {
- "version": "3.16.13",
- "resolved": "https://registry.npmjs.org/@react-spectrum/button/-/button-3.16.13.tgz",
- "integrity": "sha512-HnAcRM1d4DMrIRND73A6Idpyeuf60HT6ogbhdXetTkFmaj77XWaKxY2/UA0oMK5t3CGKD8Nq9mnE80SXe9hAbA==",
- "license": "Apache-2.0",
- "dependencies": {
- "@react-aria/button": "^3.13.0",
- "@react-aria/focus": "^3.20.2",
- "@react-aria/i18n": "^3.12.8",
- "@react-aria/interactions": "^3.25.0",
- "@react-aria/utils": "^3.28.2",
- "@react-spectrum/progress": "^3.7.15",
- "@react-spectrum/text": "^3.5.14",
- "@react-spectrum/utils": "^3.12.4",
- "@react-stately/toggle": "^3.8.3",
- "@react-types/button": "^3.12.0",
- "@react-types/shared": "^3.29.0",
- "@spectrum-icons/ui": "^3.6.15",
+ "version": "3.16.14",
+ "resolved": "https://registry.npmjs.org/@react-spectrum/button/-/button-3.16.14.tgz",
+ "integrity": "sha512-UCsFQ+KIcPLERcAiM2pJYDqfZt4/uUrz8yrC7Njp5vyk8n7qqLQaO5xf0xYy3ELaVntoBVvmdM6pIunP5CAtWg==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@react-aria/button": "^3.13.1",
+ "@react-aria/focus": "^3.20.3",
+ "@react-aria/i18n": "^3.12.9",
+ "@react-aria/interactions": "^3.25.1",
+ "@react-aria/utils": "^3.29.0",
+ "@react-spectrum/progress": "^3.7.16",
+ "@react-spectrum/text": "^3.5.15",
+ "@react-spectrum/utils": "^3.12.5",
+ "@react-stately/toggle": "^3.8.4",
+ "@react-types/button": "^3.12.1",
+ "@react-types/shared": "^3.29.1",
+ "@spectrum-icons/ui": "^3.6.16",
"@swc/helpers": "^0.5.0"
},
"peerDependencies": {
@@ -7697,15 +7748,15 @@
}
},
"node_modules/@react-spectrum/buttongroup": {
- "version": "3.6.21",
- "resolved": "https://registry.npmjs.org/@react-spectrum/buttongroup/-/buttongroup-3.6.21.tgz",
- "integrity": "sha512-Se2orOk7qLIMx8ifqaj/jMrhQYicOqc0ry/ib37UkYPSg8iM425U1ttCt3URfqGjDrj3c7qHd2pWINYRriVv3w==",
+ "version": "3.6.22",
+ "resolved": "https://registry.npmjs.org/@react-spectrum/buttongroup/-/buttongroup-3.6.22.tgz",
+ "integrity": "sha512-LX3q5LbHBqqd2Jbcn57Jbku5nDlH8BKugPRadvAFpbv9omKOm4qFHdb682KlaDKq8AZVjzPYcfqgWT9oS8AMYg==",
"license": "Apache-2.0",
"dependencies": {
- "@react-aria/utils": "^3.28.2",
- "@react-spectrum/utils": "^3.12.4",
- "@react-types/buttongroup": "^3.3.16",
- "@react-types/shared": "^3.29.0",
+ "@react-aria/utils": "^3.29.0",
+ "@react-spectrum/utils": "^3.12.5",
+ "@react-types/buttongroup": "^3.3.17",
+ "@react-types/shared": "^3.29.1",
"@swc/helpers": "^0.5.0"
},
"peerDependencies": {
@@ -7715,26 +7766,26 @@
}
},
"node_modules/@react-spectrum/calendar": {
- "version": "3.7.0",
- "resolved": "https://registry.npmjs.org/@react-spectrum/calendar/-/calendar-3.7.0.tgz",
- "integrity": "sha512-gPNeAWmcpVy7gAUZCN9pXBB87KewX7a7kjK3MJRAsNO0hkqCerqM88tLSA6wcY77iQrNVt1zRQVUo7BGaOz7dw==",
- "license": "Apache-2.0",
- "dependencies": {
- "@internationalized/date": "^3.8.0",
- "@react-aria/calendar": "^3.8.0",
- "@react-aria/focus": "^3.20.2",
- "@react-aria/i18n": "^3.12.8",
- "@react-aria/interactions": "^3.25.0",
- "@react-aria/utils": "^3.28.2",
- "@react-aria/visually-hidden": "^3.8.22",
- "@react-spectrum/button": "^3.16.13",
- "@react-spectrum/label": "^3.16.14",
- "@react-spectrum/utils": "^3.12.4",
- "@react-stately/calendar": "^3.8.0",
- "@react-types/button": "^3.12.0",
- "@react-types/calendar": "^3.7.0",
- "@react-types/shared": "^3.29.0",
- "@spectrum-icons/ui": "^3.6.15",
+ "version": "3.7.1",
+ "resolved": "https://registry.npmjs.org/@react-spectrum/calendar/-/calendar-3.7.1.tgz",
+ "integrity": "sha512-E0dm4Pd21/WI87aqwYOC/+9e3Dgl/tx6DRRVBMlo6Kc8bMYEd3WLR7+bX9nVIMXjjqIw8xIXsBh5/O7bZEFFzw==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@internationalized/date": "^3.8.1",
+ "@react-aria/calendar": "^3.8.1",
+ "@react-aria/focus": "^3.20.3",
+ "@react-aria/i18n": "^3.12.9",
+ "@react-aria/interactions": "^3.25.1",
+ "@react-aria/utils": "^3.29.0",
+ "@react-aria/visually-hidden": "^3.8.23",
+ "@react-spectrum/button": "^3.16.14",
+ "@react-spectrum/label": "^3.16.15",
+ "@react-spectrum/utils": "^3.12.5",
+ "@react-stately/calendar": "^3.8.1",
+ "@react-types/button": "^3.12.1",
+ "@react-types/calendar": "^3.7.1",
+ "@react-types/shared": "^3.29.1",
+ "@spectrum-icons/ui": "^3.6.16",
"@swc/helpers": "^0.5.0"
},
"peerDependencies": {
@@ -7744,24 +7795,24 @@
}
},
"node_modules/@react-spectrum/checkbox": {
- "version": "3.9.15",
- "resolved": "https://registry.npmjs.org/@react-spectrum/checkbox/-/checkbox-3.9.15.tgz",
- "integrity": "sha512-U+E/AuJBBKkYiYrPFgobO3kYT6nwXREJyCLxYXGeFzWI+kAWDfcChIsmsqRriJgByVY0tvLcjtANLyGZICVWCg==",
- "license": "Apache-2.0",
- "dependencies": {
- "@react-aria/checkbox": "^3.15.4",
- "@react-aria/focus": "^3.20.2",
- "@react-aria/interactions": "^3.25.0",
- "@react-spectrum/form": "^3.7.14",
- "@react-spectrum/label": "^3.16.14",
- "@react-spectrum/utils": "^3.12.4",
- "@react-stately/checkbox": "^3.6.13",
- "@react-stately/toggle": "^3.8.3",
- "@react-types/checkbox": "^3.9.3",
- "@react-types/shared": "^3.29.0",
- "@spectrum-icons/ui": "^3.6.15",
+ "version": "3.9.16",
+ "resolved": "https://registry.npmjs.org/@react-spectrum/checkbox/-/checkbox-3.9.16.tgz",
+ "integrity": "sha512-NcJAWtswfZefDXfJWvynnY7Mi7weGC0Hi3xl+l1mT8ufmtD9Bzz//KLH0gqBSTjFxuKEN9U/6f6EqEvZdbGM+w==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@react-aria/checkbox": "^3.15.5",
+ "@react-aria/focus": "^3.20.3",
+ "@react-aria/interactions": "^3.25.1",
+ "@react-spectrum/form": "^3.7.15",
+ "@react-spectrum/label": "^3.16.15",
+ "@react-spectrum/utils": "^3.12.5",
+ "@react-stately/checkbox": "^3.6.14",
+ "@react-stately/toggle": "^3.8.4",
+ "@react-types/checkbox": "^3.9.4",
+ "@react-types/shared": "^3.29.1",
+ "@spectrum-icons/ui": "^3.6.16",
"@swc/helpers": "^0.5.0",
- "react-aria-components": "^1.8.0"
+ "react-aria-components": "^1.9.0"
},
"peerDependencies": {
"@react-spectrum/provider": "^3.0.0",
@@ -7770,30 +7821,30 @@
}
},
"node_modules/@react-spectrum/color": {
- "version": "3.0.6",
- "resolved": "https://registry.npmjs.org/@react-spectrum/color/-/color-3.0.6.tgz",
- "integrity": "sha512-sbp1yxjG82JZOt81mARGcLCT19BjRnsn2pvUiqZhlLQCozqKE4fN8fTAYayNSPXy8OqdxGaNQyQ8L5dYCLyRkw==",
- "license": "Apache-2.0",
- "dependencies": {
- "@react-aria/color": "^3.0.6",
- "@react-aria/focus": "^3.20.2",
- "@react-aria/i18n": "^3.12.8",
- "@react-aria/interactions": "^3.25.0",
- "@react-aria/utils": "^3.28.2",
- "@react-spectrum/dialog": "^3.8.20",
- "@react-spectrum/form": "^3.7.14",
- "@react-spectrum/label": "^3.16.14",
- "@react-spectrum/overlays": "^5.7.4",
- "@react-spectrum/picker": "^3.15.8",
- "@react-spectrum/textfield": "^3.13.2",
- "@react-spectrum/utils": "^3.12.4",
- "@react-spectrum/view": "^3.6.18",
- "@react-stately/color": "^3.8.4",
- "@react-types/color": "^3.0.4",
- "@react-types/shared": "^3.29.0",
- "@react-types/textfield": "^3.12.1",
+ "version": "3.0.7",
+ "resolved": "https://registry.npmjs.org/@react-spectrum/color/-/color-3.0.7.tgz",
+ "integrity": "sha512-8anoPEw1p4PI3UeSi+/2L9EiuVbiInDUkOqMQpR2zCNQnme2tYOmMi3fSzygrQ3msgLNfGymsOHcxnIHkxp8kg==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@react-aria/color": "^3.0.7",
+ "@react-aria/focus": "^3.20.3",
+ "@react-aria/i18n": "^3.12.9",
+ "@react-aria/interactions": "^3.25.1",
+ "@react-aria/utils": "^3.29.0",
+ "@react-spectrum/dialog": "^3.8.21",
+ "@react-spectrum/form": "^3.7.15",
+ "@react-spectrum/label": "^3.16.15",
+ "@react-spectrum/overlays": "^5.7.5",
+ "@react-spectrum/picker": "^3.15.9",
+ "@react-spectrum/textfield": "^3.13.3",
+ "@react-spectrum/utils": "^3.12.5",
+ "@react-spectrum/view": "^3.6.19",
+ "@react-stately/color": "^3.8.5",
+ "@react-types/color": "^3.0.5",
+ "@react-types/shared": "^3.29.1",
+ "@react-types/textfield": "^3.12.2",
"@swc/helpers": "^0.5.0",
- "react-aria-components": "^1.8.0"
+ "react-aria-components": "^1.9.0"
},
"peerDependencies": {
"@react-spectrum/provider": "^3.0.0",
@@ -7802,35 +7853,35 @@
}
},
"node_modules/@react-spectrum/combobox": {
- "version": "3.15.2",
- "resolved": "https://registry.npmjs.org/@react-spectrum/combobox/-/combobox-3.15.2.tgz",
- "integrity": "sha512-+/bYAsvgMIzhAbVW1IHdXGGCENRzogaVjmacMMYQSic66Aj56lOY/esQS4phzfuEwpuAuvz/aISE95ApQgnrgw==",
- "license": "Apache-2.0",
- "dependencies": {
- "@react-aria/button": "^3.13.0",
- "@react-aria/combobox": "^3.12.2",
- "@react-aria/dialog": "^3.5.24",
- "@react-aria/focus": "^3.20.2",
- "@react-aria/form": "^3.0.15",
- "@react-aria/i18n": "^3.12.8",
- "@react-aria/interactions": "^3.25.0",
- "@react-aria/label": "^3.7.17",
- "@react-aria/overlays": "^3.27.0",
- "@react-aria/utils": "^3.28.2",
- "@react-spectrum/button": "^3.16.13",
- "@react-spectrum/form": "^3.7.14",
- "@react-spectrum/label": "^3.16.14",
- "@react-spectrum/listbox": "^3.15.0",
- "@react-spectrum/overlays": "^5.7.4",
- "@react-spectrum/progress": "^3.7.15",
- "@react-spectrum/textfield": "^3.13.2",
- "@react-spectrum/utils": "^3.12.4",
- "@react-stately/collections": "^3.12.3",
- "@react-stately/combobox": "^3.10.4",
- "@react-types/button": "^3.12.0",
- "@react-types/combobox": "^3.13.4",
- "@react-types/shared": "^3.29.0",
- "@spectrum-icons/ui": "^3.6.15",
+ "version": "3.15.3",
+ "resolved": "https://registry.npmjs.org/@react-spectrum/combobox/-/combobox-3.15.3.tgz",
+ "integrity": "sha512-4SL/ey/cDTIqZIb86mBqKZKnWJoQq8Q4CZ6GzU/bVPwGiS8jq3mEqk4BwO17VzhSbKyXkwVDZPJigNKFgMgNIg==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@react-aria/button": "^3.13.1",
+ "@react-aria/combobox": "^3.12.3",
+ "@react-aria/dialog": "^3.5.25",
+ "@react-aria/focus": "^3.20.3",
+ "@react-aria/form": "^3.0.16",
+ "@react-aria/i18n": "^3.12.9",
+ "@react-aria/interactions": "^3.25.1",
+ "@react-aria/label": "^3.7.18",
+ "@react-aria/overlays": "^3.27.1",
+ "@react-aria/utils": "^3.29.0",
+ "@react-spectrum/button": "^3.16.14",
+ "@react-spectrum/form": "^3.7.15",
+ "@react-spectrum/label": "^3.16.15",
+ "@react-spectrum/listbox": "^3.15.1",
+ "@react-spectrum/overlays": "^5.7.5",
+ "@react-spectrum/progress": "^3.7.16",
+ "@react-spectrum/textfield": "^3.13.3",
+ "@react-spectrum/utils": "^3.12.5",
+ "@react-stately/collections": "^3.12.4",
+ "@react-stately/combobox": "^3.10.5",
+ "@react-types/button": "^3.12.1",
+ "@react-types/combobox": "^3.13.5",
+ "@react-types/shared": "^3.29.1",
+ "@spectrum-icons/ui": "^3.6.16",
"@swc/helpers": "^0.5.0"
},
"peerDependencies": {
@@ -7840,19 +7891,19 @@
}
},
"node_modules/@react-spectrum/contextualhelp": {
- "version": "3.6.20",
- "resolved": "https://registry.npmjs.org/@react-spectrum/contextualhelp/-/contextualhelp-3.6.20.tgz",
- "integrity": "sha512-hUEN3JVo5qtvGbzo9EVtG4JN1aHsBNiW+cwHVB56CRvH0qbHHzvwy6knfSibaxK7RouP8KZhHT0gdLAd5d4vKg==",
- "license": "Apache-2.0",
- "dependencies": {
- "@react-aria/i18n": "^3.12.8",
- "@react-aria/utils": "^3.28.2",
- "@react-spectrum/button": "^3.16.13",
- "@react-spectrum/dialog": "^3.8.20",
- "@react-spectrum/utils": "^3.12.4",
- "@react-types/contextualhelp": "^3.2.17",
- "@react-types/shared": "^3.29.0",
- "@spectrum-icons/workflow": "^4.2.20",
+ "version": "3.6.21",
+ "resolved": "https://registry.npmjs.org/@react-spectrum/contextualhelp/-/contextualhelp-3.6.21.tgz",
+ "integrity": "sha512-1go2EnoTIIqGKJREVuWAK5cOJQ39+Y9XSjnYBSeLSxH4fvG5S2pVZe3BLjFTrAp+qLcyw5XZbcdzWfL+92gopg==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@react-aria/i18n": "^3.12.9",
+ "@react-aria/utils": "^3.29.0",
+ "@react-spectrum/button": "^3.16.14",
+ "@react-spectrum/dialog": "^3.8.21",
+ "@react-spectrum/utils": "^3.12.5",
+ "@react-types/contextualhelp": "^3.2.18",
+ "@react-types/shared": "^3.29.1",
+ "@spectrum-icons/workflow": "^4.2.21",
"@swc/helpers": "^0.5.0"
},
"peerDependencies": {
@@ -7862,30 +7913,30 @@
}
},
"node_modules/@react-spectrum/datepicker": {
- "version": "3.14.0",
- "resolved": "https://registry.npmjs.org/@react-spectrum/datepicker/-/datepicker-3.14.0.tgz",
- "integrity": "sha512-UmzopAB8+O5VEIBkhfxCZAAbCmq5TbbTATAd9HNnzhDzkuaOYzU5B8M1/ROpRRULR4eH0xWHc1RaeOS4UtgVQA==",
- "license": "Apache-2.0",
- "dependencies": {
- "@internationalized/date": "^3.8.0",
- "@react-aria/datepicker": "^3.14.2",
- "@react-aria/focus": "^3.20.2",
- "@react-aria/i18n": "^3.12.8",
- "@react-aria/interactions": "^3.25.0",
- "@react-aria/utils": "^3.28.2",
- "@react-spectrum/button": "^3.16.13",
- "@react-spectrum/calendar": "^3.7.0",
- "@react-spectrum/dialog": "^3.8.20",
- "@react-spectrum/form": "^3.7.14",
- "@react-spectrum/label": "^3.16.14",
- "@react-spectrum/layout": "^3.6.14",
- "@react-spectrum/utils": "^3.12.4",
- "@react-spectrum/view": "^3.6.18",
- "@react-stately/datepicker": "^3.14.0",
- "@react-types/datepicker": "^3.12.0",
- "@react-types/shared": "^3.29.0",
- "@spectrum-icons/ui": "^3.6.15",
- "@spectrum-icons/workflow": "^4.2.20",
+ "version": "3.14.1",
+ "resolved": "https://registry.npmjs.org/@react-spectrum/datepicker/-/datepicker-3.14.1.tgz",
+ "integrity": "sha512-7EPcI9IutqP30TVTCh/Kk0qB7YAhS0Bkhk2RXAaIrgvaFVdiZsDqSB0nU9i/Aev9iD7ZmFEwveVZEkvNqgB32g==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@internationalized/date": "^3.8.1",
+ "@react-aria/datepicker": "^3.14.3",
+ "@react-aria/focus": "^3.20.3",
+ "@react-aria/i18n": "^3.12.9",
+ "@react-aria/interactions": "^3.25.1",
+ "@react-aria/utils": "^3.29.0",
+ "@react-spectrum/button": "^3.16.14",
+ "@react-spectrum/calendar": "^3.7.1",
+ "@react-spectrum/dialog": "^3.8.21",
+ "@react-spectrum/form": "^3.7.15",
+ "@react-spectrum/label": "^3.16.15",
+ "@react-spectrum/layout": "^3.6.15",
+ "@react-spectrum/utils": "^3.12.5",
+ "@react-spectrum/view": "^3.6.19",
+ "@react-stately/datepicker": "^3.14.1",
+ "@react-types/datepicker": "^3.12.1",
+ "@react-types/shared": "^3.29.1",
+ "@spectrum-icons/ui": "^3.6.16",
+ "@spectrum-icons/workflow": "^4.2.21",
"@swc/helpers": "^0.5.0"
},
"peerDependencies": {
@@ -7895,29 +7946,29 @@
}
},
"node_modules/@react-spectrum/dialog": {
- "version": "3.8.20",
- "resolved": "https://registry.npmjs.org/@react-spectrum/dialog/-/dialog-3.8.20.tgz",
- "integrity": "sha512-GuMEYQTvgP17zqkJqemcv2SazD0/srY5mQ7pasCTe71FQemMEyb18suDTgJKQjYjkt7NINTBzaSlXlC4eiu1nA==",
- "license": "Apache-2.0",
- "dependencies": {
- "@react-aria/dialog": "^3.5.24",
- "@react-aria/i18n": "^3.12.8",
- "@react-aria/interactions": "^3.25.0",
- "@react-aria/overlays": "^3.27.0",
- "@react-aria/utils": "^3.28.2",
- "@react-spectrum/button": "^3.16.13",
- "@react-spectrum/buttongroup": "^3.6.21",
- "@react-spectrum/divider": "^3.5.22",
- "@react-spectrum/layout": "^3.6.14",
- "@react-spectrum/overlays": "^5.7.4",
- "@react-spectrum/text": "^3.5.14",
- "@react-spectrum/utils": "^3.12.4",
- "@react-spectrum/view": "^3.6.18",
- "@react-stately/overlays": "^3.6.15",
- "@react-types/button": "^3.12.0",
- "@react-types/dialog": "^3.5.17",
- "@react-types/shared": "^3.29.0",
- "@spectrum-icons/ui": "^3.6.15",
+ "version": "3.8.21",
+ "resolved": "https://registry.npmjs.org/@react-spectrum/dialog/-/dialog-3.8.21.tgz",
+ "integrity": "sha512-49rwisFetNgOiqR+JDNPYgFqNaT19EzdgA8LgiB9XIbM+sFFk2C5UiTotxVqDQOXJwui2CCKmcIIGzO5J5ZmFA==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@react-aria/dialog": "^3.5.25",
+ "@react-aria/i18n": "^3.12.9",
+ "@react-aria/interactions": "^3.25.1",
+ "@react-aria/overlays": "^3.27.1",
+ "@react-aria/utils": "^3.29.0",
+ "@react-spectrum/button": "^3.16.14",
+ "@react-spectrum/buttongroup": "^3.6.22",
+ "@react-spectrum/divider": "^3.5.23",
+ "@react-spectrum/layout": "^3.6.15",
+ "@react-spectrum/overlays": "^5.7.5",
+ "@react-spectrum/text": "^3.5.15",
+ "@react-spectrum/utils": "^3.12.5",
+ "@react-spectrum/view": "^3.6.19",
+ "@react-stately/overlays": "^3.6.16",
+ "@react-types/button": "^3.12.1",
+ "@react-types/dialog": "^3.5.18",
+ "@react-types/shared": "^3.29.1",
+ "@spectrum-icons/ui": "^3.6.16",
"@swc/helpers": "^0.5.0"
},
"peerDependencies": {
@@ -7927,15 +7978,15 @@
}
},
"node_modules/@react-spectrum/divider": {
- "version": "3.5.22",
- "resolved": "https://registry.npmjs.org/@react-spectrum/divider/-/divider-3.5.22.tgz",
- "integrity": "sha512-Yrs5KpU8Pa9lTnyAVO1WfIt1tDOjgGg55k/ZIeLYbDflM794TKkHPXqL+w4yE2G0yW234Pa8LRSb+tS7fyh7og==",
+ "version": "3.5.23",
+ "resolved": "https://registry.npmjs.org/@react-spectrum/divider/-/divider-3.5.23.tgz",
+ "integrity": "sha512-nkQ/wAs+VjISMFUzdMiAv5xcBPiTE3P6ghnSkTbmfZ0c1txckFHrttS+sjCBVn2WrJmQQ8BonZZoC+ezXRwncA==",
"license": "Apache-2.0",
"dependencies": {
- "@react-aria/separator": "^3.4.8",
- "@react-spectrum/utils": "^3.12.4",
- "@react-types/divider": "^3.3.16",
- "@react-types/shared": "^3.29.0",
+ "@react-aria/separator": "^3.4.9",
+ "@react-spectrum/utils": "^3.12.5",
+ "@react-types/divider": "^3.3.17",
+ "@react-types/shared": "^3.29.1",
"@swc/helpers": "^0.5.0"
},
"peerDependencies": {
@@ -7944,14 +7995,14 @@
}
},
"node_modules/@react-spectrum/dnd": {
- "version": "3.5.4",
- "resolved": "https://registry.npmjs.org/@react-spectrum/dnd/-/dnd-3.5.4.tgz",
- "integrity": "sha512-GX/2aNnbfZ3OUB89CNiQiRve7zp4bhswoTQXPa3zoqPN6OmKk3y520lRrNmFyVyh3EGUtOsdcLzElzHq4reO9A==",
+ "version": "3.5.5",
+ "resolved": "https://registry.npmjs.org/@react-spectrum/dnd/-/dnd-3.5.5.tgz",
+ "integrity": "sha512-hnsgnJjGQHQr14JkTjSD5Bn0doROqb6L+yykay4/vd0ltT3C/aVB4lxA5/80iJBOusOhkNUO+lABqgL7A3FeHQ==",
"license": "Apache-2.0",
"dependencies": {
- "@react-aria/dnd": "^3.9.2",
- "@react-stately/dnd": "^3.5.3",
- "@react-types/shared": "^3.29.0",
+ "@react-aria/dnd": "^3.9.3",
+ "@react-stately/dnd": "^3.5.4",
+ "@react-types/shared": "^3.29.1",
"@swc/helpers": "^0.5.0"
},
"peerDependencies": {
@@ -7961,17 +8012,17 @@
}
},
"node_modules/@react-spectrum/dropzone": {
- "version": "3.0.10",
- "resolved": "https://registry.npmjs.org/@react-spectrum/dropzone/-/dropzone-3.0.10.tgz",
- "integrity": "sha512-y1E3PCHWQ1yHw5VxmtLKmYRSFDBG1vZdluJzvYB8Fg9gWMIPIl9lDjOyBG0gSeDbjMS90z0HxIN1gFc3uDLAQA==",
+ "version": "3.0.11",
+ "resolved": "https://registry.npmjs.org/@react-spectrum/dropzone/-/dropzone-3.0.11.tgz",
+ "integrity": "sha512-P66MZNd190ni4K3Mz+LzmXranYGWTg0aNNzkZxomAaSHXt/IqujFfzBzO1Vb5iIMEB4w9/QDGQgMNk1DfaQyHQ==",
"license": "Apache-2.0",
"dependencies": {
- "@react-aria/i18n": "^3.12.8",
- "@react-aria/utils": "^3.28.2",
- "@react-spectrum/utils": "^3.12.4",
- "@react-types/shared": "^3.29.0",
+ "@react-aria/i18n": "^3.12.9",
+ "@react-aria/utils": "^3.29.0",
+ "@react-spectrum/utils": "^3.12.5",
+ "@react-types/shared": "^3.29.1",
"@swc/helpers": "^0.5.0",
- "react-aria-components": "^1.8.0"
+ "react-aria-components": "^1.9.0"
},
"peerDependencies": {
"@react-spectrum/provider": "^3.0.0",
@@ -7980,13 +8031,13 @@
}
},
"node_modules/@react-spectrum/filetrigger": {
- "version": "3.0.10",
- "resolved": "https://registry.npmjs.org/@react-spectrum/filetrigger/-/filetrigger-3.0.10.tgz",
- "integrity": "sha512-bFnMy7+SqXvN5VbJpEGhgFoKyTvmrb4HMYB87h48NlBFdpfpE1C/kcPKRrvbZjp6cNTg6WXyTe2Pei9z8qAjmA==",
+ "version": "3.0.11",
+ "resolved": "https://registry.npmjs.org/@react-spectrum/filetrigger/-/filetrigger-3.0.11.tgz",
+ "integrity": "sha512-6uImeSH3F/k3j3+Ocidj/sNa+/vShyZFWmKwwhZZ3R8Zn5LqSqL0VfbAG3yCWh7N2cewWwWahviyAmu8ohRr4w==",
"license": "Apache-2.0",
"dependencies": {
"@swc/helpers": "^0.5.0",
- "react-aria-components": "^1.8.0"
+ "react-aria-components": "^1.9.0"
},
"peerDependencies": {
"@react-spectrum/provider": "^3.0.0",
@@ -7995,16 +8046,16 @@
}
},
"node_modules/@react-spectrum/form": {
- "version": "3.7.14",
- "resolved": "https://registry.npmjs.org/@react-spectrum/form/-/form-3.7.14.tgz",
- "integrity": "sha512-WRnwQ8Vsk9PKsOx+ckNWnJjVNVzP53IaQ3Y+xACp+c4OET2F1HZye+XeY3ZuGjTdjJgOA/xb94w7YP6gBc8r3A==",
+ "version": "3.7.15",
+ "resolved": "https://registry.npmjs.org/@react-spectrum/form/-/form-3.7.15.tgz",
+ "integrity": "sha512-MPifb5EDbH/tYm5wDqmfWFQo7MlwRTSaaIwRAzWWH5IRRiTAfU+f+I+w8yL6CYTteb799P4McSXb5hocJQbMIw==",
"license": "Apache-2.0",
"dependencies": {
- "@react-aria/utils": "^3.28.2",
- "@react-spectrum/utils": "^3.12.4",
- "@react-stately/form": "^3.1.3",
- "@react-types/form": "^3.7.11",
- "@react-types/shared": "^3.29.0",
+ "@react-aria/utils": "^3.29.0",
+ "@react-spectrum/utils": "^3.12.5",
+ "@react-stately/form": "^3.1.4",
+ "@react-types/form": "^3.7.12",
+ "@react-types/shared": "^3.29.1",
"@swc/helpers": "^0.5.0"
},
"peerDependencies": {
@@ -8014,14 +8065,14 @@
}
},
"node_modules/@react-spectrum/icon": {
- "version": "3.8.4",
- "resolved": "https://registry.npmjs.org/@react-spectrum/icon/-/icon-3.8.4.tgz",
- "integrity": "sha512-J5djyEyQbDlPoMj/N/hitCsmJxJkzH7rIrayFKQQu+nG39Ry7RK38tRH7nHDMVDxYBxUG2OVz92u1Tjea1pUjw==",
+ "version": "3.8.5",
+ "resolved": "https://registry.npmjs.org/@react-spectrum/icon/-/icon-3.8.5.tgz",
+ "integrity": "sha512-Ur496FvvGCRMhOSnW/d10TAbUCuseMw5kB81nIQWlqHZaMJL14fJMo3z0v0NXJFVPpQus0q6Xe4IJlU9mAj7CQ==",
"license": "Apache-2.0",
"dependencies": {
- "@react-aria/utils": "^3.28.2",
- "@react-spectrum/utils": "^3.12.4",
- "@react-types/shared": "^3.29.0",
+ "@react-aria/utils": "^3.29.0",
+ "@react-spectrum/utils": "^3.12.5",
+ "@react-types/shared": "^3.29.1",
"@swc/helpers": "^0.5.0"
},
"peerDependencies": {
@@ -8031,16 +8082,16 @@
}
},
"node_modules/@react-spectrum/illustratedmessage": {
- "version": "3.5.9",
- "resolved": "https://registry.npmjs.org/@react-spectrum/illustratedmessage/-/illustratedmessage-3.5.9.tgz",
- "integrity": "sha512-jQJuDk+4sw4SFZNcditSYKhWk9aHq0hOEAhbf3EWI1AbqxRxS5DJdTIoWrH5LsI7FrrOvvDwdzMn9mSYk+hNXw==",
+ "version": "3.5.10",
+ "resolved": "https://registry.npmjs.org/@react-spectrum/illustratedmessage/-/illustratedmessage-3.5.10.tgz",
+ "integrity": "sha512-vosTlDuqKiXRpxE5m7pBy0YhggDykDFspKTvFVWK3PTR3OFWA3H5xo/OAA+QbrVU1U0vdNZdoIAd4cbLo/NkWQ==",
"license": "Apache-2.0",
"dependencies": {
- "@react-aria/utils": "^3.28.2",
- "@react-spectrum/layout": "^3.6.14",
- "@react-spectrum/utils": "^3.12.4",
- "@react-types/illustratedmessage": "^3.3.16",
- "@react-types/shared": "^3.29.0",
+ "@react-aria/utils": "^3.29.0",
+ "@react-spectrum/layout": "^3.6.15",
+ "@react-spectrum/utils": "^3.12.5",
+ "@react-types/illustratedmessage": "^3.3.17",
+ "@react-types/shared": "^3.29.1",
"@swc/helpers": "^0.5.0"
},
"peerDependencies": {
@@ -8050,15 +8101,15 @@
}
},
"node_modules/@react-spectrum/image": {
- "version": "3.5.10",
- "resolved": "https://registry.npmjs.org/@react-spectrum/image/-/image-3.5.10.tgz",
- "integrity": "sha512-c/hKlTqy0T4CuFRZUbAFX5xroSCOLVZIFSZ1KQXAk92zLQRaieRQneNrehOHjRPSsp+zmKDDhikscAyQJl0/rg==",
+ "version": "3.5.11",
+ "resolved": "https://registry.npmjs.org/@react-spectrum/image/-/image-3.5.11.tgz",
+ "integrity": "sha512-2g7JWUcUz3738dwqn3BPVUKbpoUXoJsf3vB0l7k5Vo02v5K3rrkSZ7h6YKFeJgI6KKXZR4QGsZjybR20d1f6nw==",
"license": "Apache-2.0",
"dependencies": {
- "@react-aria/utils": "^3.28.2",
- "@react-spectrum/utils": "^3.12.4",
- "@react-types/image": "^3.4.8",
- "@react-types/shared": "^3.29.0",
+ "@react-aria/utils": "^3.29.0",
+ "@react-spectrum/utils": "^3.12.5",
+ "@react-types/image": "^3.4.9",
+ "@react-types/shared": "^3.29.1",
"@swc/helpers": "^0.5.0"
},
"peerDependencies": {
@@ -8068,18 +8119,18 @@
}
},
"node_modules/@react-spectrum/inlinealert": {
- "version": "3.2.14",
- "resolved": "https://registry.npmjs.org/@react-spectrum/inlinealert/-/inlinealert-3.2.14.tgz",
- "integrity": "sha512-p7SktxTktxm65eX9Ogi41bZuwn55TANYr2PKh3AzItABW/z+pGZ2xQk9L5ln1K/lw2Xy/iUGEkj0NT/2M0IjhQ==",
- "license": "Apache-2.0",
- "dependencies": {
- "@react-aria/focus": "^3.20.2",
- "@react-aria/i18n": "^3.12.8",
- "@react-aria/utils": "^3.28.2",
- "@react-spectrum/layout": "^3.6.14",
- "@react-spectrum/utils": "^3.12.4",
- "@react-types/shared": "^3.29.0",
- "@spectrum-icons/ui": "^3.6.15",
+ "version": "3.2.15",
+ "resolved": "https://registry.npmjs.org/@react-spectrum/inlinealert/-/inlinealert-3.2.15.tgz",
+ "integrity": "sha512-sdJ1CKoAVMGPT4i0hOzW/noomxhc6wOlninUtB2hgmO07w7+lcvNMbtzVHutaySRLB96YbvWhHbRut2vUeFbiQ==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@react-aria/focus": "^3.20.3",
+ "@react-aria/i18n": "^3.12.9",
+ "@react-aria/utils": "^3.29.0",
+ "@react-spectrum/layout": "^3.6.15",
+ "@react-spectrum/utils": "^3.12.5",
+ "@react-types/shared": "^3.29.1",
+ "@spectrum-icons/ui": "^3.6.16",
"@swc/helpers": "^0.5.0"
},
"peerDependencies": {
@@ -8089,19 +8140,19 @@
}
},
"node_modules/@react-spectrum/label": {
- "version": "3.16.14",
- "resolved": "https://registry.npmjs.org/@react-spectrum/label/-/label-3.16.14.tgz",
- "integrity": "sha512-lPM5rbc7A+fKiDZGZrNYDny+rCRwj9A0lI8fjVFQKPRN9tqLtUeqC4qUpy2Y154gzk2dIPgggrBq0dx48KyCAg==",
- "license": "Apache-2.0",
- "dependencies": {
- "@react-aria/i18n": "^3.12.8",
- "@react-aria/utils": "^3.28.2",
- "@react-spectrum/form": "^3.7.14",
- "@react-spectrum/layout": "^3.6.14",
- "@react-spectrum/utils": "^3.12.4",
- "@react-types/label": "^3.9.10",
- "@react-types/shared": "^3.29.0",
- "@spectrum-icons/ui": "^3.6.15",
+ "version": "3.16.15",
+ "resolved": "https://registry.npmjs.org/@react-spectrum/label/-/label-3.16.15.tgz",
+ "integrity": "sha512-APYm59GDNwa8IPZZqV9hj6k0YcR5h+AgHu87aZ4yWXLgAaF2jLsXS8vh1T+S5cHVwh5d0qkxH7nVrBH6OII4qA==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@react-aria/i18n": "^3.12.9",
+ "@react-aria/utils": "^3.29.0",
+ "@react-spectrum/form": "^3.7.15",
+ "@react-spectrum/layout": "^3.6.15",
+ "@react-spectrum/utils": "^3.12.5",
+ "@react-types/label": "^3.9.11",
+ "@react-types/shared": "^3.29.1",
+ "@spectrum-icons/ui": "^3.6.16",
"@swc/helpers": "^0.5.0"
},
"peerDependencies": {
@@ -8111,17 +8162,17 @@
}
},
"node_modules/@react-spectrum/labeledvalue": {
- "version": "3.2.2",
- "resolved": "https://registry.npmjs.org/@react-spectrum/labeledvalue/-/labeledvalue-3.2.2.tgz",
- "integrity": "sha512-D8d9RY/1QLV3miADlvhQUGLfb7ZEzcIrV7Znpbmc1gez4zuTF5Dyi6DxY6b0Kwj6UhZjotUsY3dTicrLWjafNg==",
+ "version": "3.2.3",
+ "resolved": "https://registry.npmjs.org/@react-spectrum/labeledvalue/-/labeledvalue-3.2.3.tgz",
+ "integrity": "sha512-sjSvLNZnsBCnfQpeYWb//pp1/GNhIcC8UQajLVqKXDDQK7VYazC0HLIlTmJfCtjCEmarVutaoGIERO/G9yyfsw==",
"license": "Apache-2.0",
"dependencies": {
- "@internationalized/date": "^3.8.0",
- "@react-aria/i18n": "^3.12.8",
- "@react-aria/utils": "^3.28.2",
- "@react-spectrum/label": "^3.16.14",
- "@react-spectrum/utils": "^3.12.4",
- "@react-types/shared": "^3.29.0",
+ "@internationalized/date": "^3.8.1",
+ "@react-aria/i18n": "^3.12.9",
+ "@react-aria/utils": "^3.29.0",
+ "@react-spectrum/label": "^3.16.15",
+ "@react-spectrum/utils": "^3.12.5",
+ "@react-types/shared": "^3.29.1",
"@swc/helpers": "^0.5.0"
},
"peerDependencies": {
@@ -8131,15 +8182,15 @@
}
},
"node_modules/@react-spectrum/layout": {
- "version": "3.6.14",
- "resolved": "https://registry.npmjs.org/@react-spectrum/layout/-/layout-3.6.14.tgz",
- "integrity": "sha512-5o8jn/BGST1CN6xn8uhZVqUYZ+3zULbk2nJVyIibRAquKkYwnE5nh3pjp6Bba14fOhr7rxaU6I3gdeYxTa2Pdw==",
+ "version": "3.6.15",
+ "resolved": "https://registry.npmjs.org/@react-spectrum/layout/-/layout-3.6.15.tgz",
+ "integrity": "sha512-98ssikEJBZY+7GOVj3gDEn/57wkQGdeaspFln8xj9EiqvBI6xRlBGhNM51ZRn+po8/6WNGdaFk7nfzUrO2FyEg==",
"license": "Apache-2.0",
"dependencies": {
- "@react-aria/utils": "^3.28.2",
- "@react-spectrum/utils": "^3.12.4",
- "@react-types/layout": "^3.3.22",
- "@react-types/shared": "^3.29.0",
+ "@react-aria/utils": "^3.29.0",
+ "@react-spectrum/utils": "^3.12.5",
+ "@react-types/layout": "^3.3.23",
+ "@react-types/shared": "^3.29.1",
"@swc/helpers": "^0.5.0"
},
"peerDependencies": {
@@ -8149,18 +8200,18 @@
}
},
"node_modules/@react-spectrum/link": {
- "version": "3.6.16",
- "resolved": "https://registry.npmjs.org/@react-spectrum/link/-/link-3.6.16.tgz",
- "integrity": "sha512-vWFX37qb59PKADR4t8Vc3LwUrT/jFis7qIAzZzts8/rqxVITwJ7EYfU4E69DhmlL05LmVwfa7em2Glwgd3ZDvg==",
- "license": "Apache-2.0",
- "dependencies": {
- "@react-aria/focus": "^3.20.2",
- "@react-aria/interactions": "^3.25.0",
- "@react-aria/link": "^3.8.0",
- "@react-aria/utils": "^3.28.2",
- "@react-spectrum/utils": "^3.12.4",
- "@react-types/link": "^3.6.0",
- "@react-types/shared": "^3.29.0",
+ "version": "3.6.17",
+ "resolved": "https://registry.npmjs.org/@react-spectrum/link/-/link-3.6.17.tgz",
+ "integrity": "sha512-G6vAGB33r8EgH5/T9Yw9tOYkyzWiXHq5yoTauGbJ8y4ZTbRuIhN2o93Spg3TLybrZpt12DXqCtYYDqJ0uZFgWA==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@react-aria/focus": "^3.20.3",
+ "@react-aria/interactions": "^3.25.1",
+ "@react-aria/link": "^3.8.1",
+ "@react-aria/utils": "^3.29.0",
+ "@react-spectrum/utils": "^3.12.5",
+ "@react-types/link": "^3.6.1",
+ "@react-types/shared": "^3.29.1",
"@swc/helpers": "^0.5.0"
},
"peerDependencies": {
@@ -8170,33 +8221,33 @@
}
},
"node_modules/@react-spectrum/list": {
- "version": "3.10.0",
- "resolved": "https://registry.npmjs.org/@react-spectrum/list/-/list-3.10.0.tgz",
- "integrity": "sha512-JzbOiECQX75WDxaqmEnmliMLoKs9iN/c7OYMyAr+TZmezAYZe2XtLxoKurgGxP3mnddHEkQb1eieZuXA5IRk4w==",
- "license": "Apache-2.0",
- "dependencies": {
- "@react-aria/button": "^3.13.0",
- "@react-aria/focus": "^3.20.2",
- "@react-aria/gridlist": "^3.12.0",
- "@react-aria/i18n": "^3.12.8",
- "@react-aria/interactions": "^3.25.0",
- "@react-aria/selection": "^3.24.0",
- "@react-aria/utils": "^3.28.2",
- "@react-aria/virtualizer": "^4.1.4",
- "@react-aria/visually-hidden": "^3.8.22",
- "@react-spectrum/checkbox": "^3.9.15",
- "@react-spectrum/dnd": "^3.5.4",
- "@react-spectrum/layout": "^3.6.14",
- "@react-spectrum/progress": "^3.7.15",
- "@react-spectrum/text": "^3.5.14",
- "@react-spectrum/utils": "^3.12.4",
- "@react-stately/collections": "^3.12.3",
- "@react-stately/layout": "^4.2.2",
- "@react-stately/list": "^3.12.1",
- "@react-stately/virtualizer": "^4.3.2",
- "@react-types/grid": "^3.3.1",
- "@react-types/shared": "^3.29.0",
- "@spectrum-icons/ui": "^3.6.15",
+ "version": "3.10.1",
+ "resolved": "https://registry.npmjs.org/@react-spectrum/list/-/list-3.10.1.tgz",
+ "integrity": "sha512-tp2KyUyLu/JZCCiogo1qYJWqu+Gda15mSo4qu5ai1Xq4CH1mbPC5u3VvaCGV7pOf28p0AmRORfr8EAjtD5QMXA==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@react-aria/button": "^3.13.1",
+ "@react-aria/focus": "^3.20.3",
+ "@react-aria/gridlist": "^3.13.0",
+ "@react-aria/i18n": "^3.12.9",
+ "@react-aria/interactions": "^3.25.1",
+ "@react-aria/selection": "^3.24.1",
+ "@react-aria/utils": "^3.29.0",
+ "@react-aria/virtualizer": "^4.1.5",
+ "@react-aria/visually-hidden": "^3.8.23",
+ "@react-spectrum/checkbox": "^3.9.16",
+ "@react-spectrum/dnd": "^3.5.5",
+ "@react-spectrum/layout": "^3.6.15",
+ "@react-spectrum/progress": "^3.7.16",
+ "@react-spectrum/text": "^3.5.15",
+ "@react-spectrum/utils": "^3.12.5",
+ "@react-stately/collections": "^3.12.4",
+ "@react-stately/layout": "^4.3.0",
+ "@react-stately/list": "^3.12.2",
+ "@react-stately/virtualizer": "^4.4.0",
+ "@react-types/grid": "^3.3.2",
+ "@react-types/shared": "^3.29.1",
+ "@spectrum-icons/ui": "^3.6.16",
"@swc/helpers": "^0.5.0",
"react-transition-group": "^4.4.5"
},
@@ -8207,28 +8258,28 @@
}
},
"node_modules/@react-spectrum/listbox": {
- "version": "3.15.0",
- "resolved": "https://registry.npmjs.org/@react-spectrum/listbox/-/listbox-3.15.0.tgz",
- "integrity": "sha512-fdGRbNRSaecxzsxE5HYRcX6kOwsGlgRTYv2+f/dkdp+P59vt/Rh7QdxGeEe7Leh7K/wRr520wyOMyjL56jIcTA==",
- "license": "Apache-2.0",
- "dependencies": {
- "@react-aria/focus": "^3.20.2",
- "@react-aria/i18n": "^3.12.8",
- "@react-aria/interactions": "^3.25.0",
- "@react-aria/listbox": "^3.14.3",
- "@react-aria/utils": "^3.28.2",
- "@react-aria/virtualizer": "^4.1.4",
- "@react-spectrum/layout": "^3.6.14",
- "@react-spectrum/progress": "^3.7.15",
- "@react-spectrum/text": "^3.5.14",
- "@react-spectrum/utils": "^3.12.4",
- "@react-stately/collections": "^3.12.3",
- "@react-stately/layout": "^4.2.2",
- "@react-stately/list": "^3.12.1",
- "@react-stately/virtualizer": "^4.3.2",
- "@react-types/listbox": "^3.6.0",
- "@react-types/shared": "^3.29.0",
- "@spectrum-icons/ui": "^3.6.15",
+ "version": "3.15.1",
+ "resolved": "https://registry.npmjs.org/@react-spectrum/listbox/-/listbox-3.15.1.tgz",
+ "integrity": "sha512-tSmIb048TcswIIStc3VDNpHV+0gtTO6GN5f/h2LCQkFtV/Vww+PzCc47H/mulZ6gidNs5pZzgzjBnmnG2dAf4Q==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@react-aria/focus": "^3.20.3",
+ "@react-aria/i18n": "^3.12.9",
+ "@react-aria/interactions": "^3.25.1",
+ "@react-aria/listbox": "^3.14.4",
+ "@react-aria/utils": "^3.29.0",
+ "@react-aria/virtualizer": "^4.1.5",
+ "@react-spectrum/layout": "^3.6.15",
+ "@react-spectrum/progress": "^3.7.16",
+ "@react-spectrum/text": "^3.5.15",
+ "@react-spectrum/utils": "^3.12.5",
+ "@react-stately/collections": "^3.12.4",
+ "@react-stately/layout": "^4.3.0",
+ "@react-stately/list": "^3.12.2",
+ "@react-stately/virtualizer": "^4.4.0",
+ "@react-types/listbox": "^3.7.0",
+ "@react-types/shared": "^3.29.1",
+ "@spectrum-icons/ui": "^3.6.16",
"@swc/helpers": "^0.5.0"
},
"peerDependencies": {
@@ -8238,32 +8289,32 @@
}
},
"node_modules/@react-spectrum/menu": {
- "version": "3.22.0",
- "resolved": "https://registry.npmjs.org/@react-spectrum/menu/-/menu-3.22.0.tgz",
- "integrity": "sha512-eWlnCqEVl6Yj0sCakxlQ81Lf8pxFkpKiO3dsp7wWBzyW2HweJVpZml95e6MuWoPvcS3fvSljuLK3jZI4plq1lA==",
- "license": "Apache-2.0",
- "dependencies": {
- "@react-aria/focus": "^3.20.2",
- "@react-aria/i18n": "^3.12.8",
- "@react-aria/interactions": "^3.25.0",
- "@react-aria/menu": "^3.18.2",
- "@react-aria/overlays": "^3.27.0",
- "@react-aria/separator": "^3.4.8",
- "@react-aria/utils": "^3.28.2",
- "@react-spectrum/button": "^3.16.13",
- "@react-spectrum/layout": "^3.6.14",
- "@react-spectrum/overlays": "^5.7.4",
- "@react-spectrum/text": "^3.5.14",
- "@react-spectrum/utils": "^3.12.4",
- "@react-stately/collections": "^3.12.3",
- "@react-stately/menu": "^3.9.3",
- "@react-stately/overlays": "^3.6.15",
- "@react-stately/tree": "^3.8.9",
- "@react-types/menu": "^3.10.0",
- "@react-types/overlays": "^3.8.14",
- "@react-types/shared": "^3.29.0",
- "@spectrum-icons/ui": "^3.6.15",
- "@spectrum-icons/workflow": "^4.2.20",
+ "version": "3.22.1",
+ "resolved": "https://registry.npmjs.org/@react-spectrum/menu/-/menu-3.22.1.tgz",
+ "integrity": "sha512-5EtmDSOlTmWmeQJBW6CysU3J78a2B0SWQ0oo+YjWxFOD351Z67pNH+uVltq+VrwOn3oOZ6sIgzcnHUoTFDVeuA==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@react-aria/focus": "^3.20.3",
+ "@react-aria/i18n": "^3.12.9",
+ "@react-aria/interactions": "^3.25.1",
+ "@react-aria/menu": "^3.18.3",
+ "@react-aria/overlays": "^3.27.1",
+ "@react-aria/separator": "^3.4.9",
+ "@react-aria/utils": "^3.29.0",
+ "@react-spectrum/button": "^3.16.14",
+ "@react-spectrum/layout": "^3.6.15",
+ "@react-spectrum/overlays": "^5.7.5",
+ "@react-spectrum/text": "^3.5.15",
+ "@react-spectrum/utils": "^3.12.5",
+ "@react-stately/collections": "^3.12.4",
+ "@react-stately/menu": "^3.9.4",
+ "@react-stately/overlays": "^3.6.16",
+ "@react-stately/tree": "^3.8.10",
+ "@react-types/menu": "^3.10.1",
+ "@react-types/overlays": "^3.8.15",
+ "@react-types/shared": "^3.29.1",
+ "@spectrum-icons/ui": "^3.6.16",
+ "@spectrum-icons/workflow": "^4.2.21",
"@swc/helpers": "^0.5.0"
},
"peerDependencies": {
@@ -8273,16 +8324,16 @@
}
},
"node_modules/@react-spectrum/meter": {
- "version": "3.5.9",
- "resolved": "https://registry.npmjs.org/@react-spectrum/meter/-/meter-3.5.9.tgz",
- "integrity": "sha512-G2ITIIhx29k831C62mgshW4cQz53qpBFeMCYuuE6WYZQ4x5lSIEnrbrc9Jp+BhQQ0Zd5Ra6VydNKcchy7KfNkg==",
+ "version": "3.5.10",
+ "resolved": "https://registry.npmjs.org/@react-spectrum/meter/-/meter-3.5.10.tgz",
+ "integrity": "sha512-17vSYgnFFKpcgVeqkgXQAmRYOT0TC9BFhtjj6hdZEI8OxC1B+5EOryspDe7/73IKrttZi2jG3UKfd2WYJ15EhA==",
"license": "Apache-2.0",
"dependencies": {
- "@react-aria/meter": "^3.4.22",
- "@react-spectrum/progress": "^3.7.15",
- "@react-spectrum/utils": "^3.12.4",
- "@react-types/meter": "^3.4.8",
- "@react-types/shared": "^3.29.0",
+ "@react-aria/meter": "^3.4.23",
+ "@react-spectrum/progress": "^3.7.16",
+ "@react-spectrum/utils": "^3.12.5",
+ "@react-types/meter": "^3.4.9",
+ "@react-types/shared": "^3.29.1",
"@swc/helpers": "^0.5.0"
},
"peerDependencies": {
@@ -8292,27 +8343,27 @@
}
},
"node_modules/@react-spectrum/numberfield": {
- "version": "3.9.12",
- "resolved": "https://registry.npmjs.org/@react-spectrum/numberfield/-/numberfield-3.9.12.tgz",
- "integrity": "sha512-P7uEjVgo/co8qHgkrPLzanShpgjMjspPc95NGtL/cHSNl6lsxoGIaqWXgFqlYdfTPVNvEtfj7Hdyb0F+8V2/9g==",
- "license": "Apache-2.0",
- "dependencies": {
- "@react-aria/button": "^3.13.0",
- "@react-aria/focus": "^3.20.2",
- "@react-aria/i18n": "^3.12.8",
- "@react-aria/interactions": "^3.25.0",
- "@react-aria/numberfield": "^3.11.13",
- "@react-aria/utils": "^3.28.2",
- "@react-spectrum/form": "^3.7.14",
- "@react-spectrum/label": "^3.16.14",
- "@react-spectrum/textfield": "^3.13.2",
- "@react-spectrum/utils": "^3.12.4",
- "@react-stately/numberfield": "^3.9.11",
- "@react-types/button": "^3.12.0",
- "@react-types/numberfield": "^3.8.10",
- "@react-types/shared": "^3.29.0",
- "@spectrum-icons/ui": "^3.6.15",
- "@spectrum-icons/workflow": "^4.2.20",
+ "version": "3.9.13",
+ "resolved": "https://registry.npmjs.org/@react-spectrum/numberfield/-/numberfield-3.9.13.tgz",
+ "integrity": "sha512-VKl1RHfGI5S+gJqz2wd7I5pmWs54guimnirrRAVvTXE8ArlazB5SqfS40PsQnWzrit3BIecsTvziayYSofnb7A==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@react-aria/button": "^3.13.1",
+ "@react-aria/focus": "^3.20.3",
+ "@react-aria/i18n": "^3.12.9",
+ "@react-aria/interactions": "^3.25.1",
+ "@react-aria/numberfield": "^3.11.14",
+ "@react-aria/utils": "^3.29.0",
+ "@react-spectrum/form": "^3.7.15",
+ "@react-spectrum/label": "^3.16.15",
+ "@react-spectrum/textfield": "^3.13.3",
+ "@react-spectrum/utils": "^3.12.5",
+ "@react-stately/numberfield": "^3.9.12",
+ "@react-types/button": "^3.12.1",
+ "@react-types/numberfield": "^3.8.11",
+ "@react-types/shared": "^3.29.1",
+ "@spectrum-icons/ui": "^3.6.16",
+ "@spectrum-icons/workflow": "^4.2.21",
"@swc/helpers": "^0.5.0"
},
"peerDependencies": {
@@ -8322,18 +8373,18 @@
}
},
"node_modules/@react-spectrum/overlays": {
- "version": "5.7.4",
- "resolved": "https://registry.npmjs.org/@react-spectrum/overlays/-/overlays-5.7.4.tgz",
- "integrity": "sha512-zZ6G0+w7C8nL0YVyzCLq0Qyk/O6AX2B/X53dWXBlh2w5cqBXkrtm/ajGAGjVJU9pZGFlrwsKbnC7ZA7clfRsGA==",
- "license": "Apache-2.0",
- "dependencies": {
- "@react-aria/interactions": "^3.25.0",
- "@react-aria/overlays": "^3.27.0",
- "@react-aria/utils": "^3.28.2",
- "@react-spectrum/utils": "^3.12.4",
- "@react-stately/overlays": "^3.6.15",
- "@react-types/overlays": "^3.8.14",
- "@react-types/shared": "^3.29.0",
+ "version": "5.7.5",
+ "resolved": "https://registry.npmjs.org/@react-spectrum/overlays/-/overlays-5.7.5.tgz",
+ "integrity": "sha512-TDfnRapeqKZqK5/OdlIEcqU0y2QFcRkwKG5a+sEEApcamVjcU/s/I5qdUBbTqE7FmqW3eswlC1obe81dfhipvQ==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@react-aria/interactions": "^3.25.1",
+ "@react-aria/overlays": "^3.27.1",
+ "@react-aria/utils": "^3.29.0",
+ "@react-spectrum/utils": "^3.12.5",
+ "@react-stately/overlays": "^3.6.16",
+ "@react-types/overlays": "^3.8.15",
+ "@react-types/shared": "^3.29.1",
"@swc/helpers": "^0.5.0",
"react-transition-group": "^4.4.5"
},
@@ -8344,28 +8395,28 @@
}
},
"node_modules/@react-spectrum/picker": {
- "version": "3.15.8",
- "resolved": "https://registry.npmjs.org/@react-spectrum/picker/-/picker-3.15.8.tgz",
- "integrity": "sha512-ZS1fy7/IWwIJvWNUkqNJDXUi3bwuFFtaz5MzF5gE4UxEpC+vIMzI8X2EG8KtnmPV0PDrYiTZ9Mr2CXnUFz8WkQ==",
- "license": "Apache-2.0",
- "dependencies": {
- "@react-aria/i18n": "^3.12.8",
- "@react-aria/interactions": "^3.25.0",
- "@react-aria/select": "^3.15.4",
- "@react-aria/utils": "^3.28.2",
- "@react-spectrum/button": "^3.16.13",
- "@react-spectrum/form": "^3.7.14",
- "@react-spectrum/label": "^3.16.14",
- "@react-spectrum/listbox": "^3.15.0",
- "@react-spectrum/overlays": "^5.7.4",
- "@react-spectrum/progress": "^3.7.15",
- "@react-spectrum/text": "^3.5.14",
- "@react-spectrum/utils": "^3.12.4",
- "@react-stately/collections": "^3.12.3",
- "@react-stately/select": "^3.6.12",
- "@react-types/select": "^3.9.11",
- "@react-types/shared": "^3.29.0",
- "@spectrum-icons/ui": "^3.6.15",
+ "version": "3.15.9",
+ "resolved": "https://registry.npmjs.org/@react-spectrum/picker/-/picker-3.15.9.tgz",
+ "integrity": "sha512-69b85+mQc+qcNL+hOQPPdxS9QkbSL5j4NgAxPyCanU7rS1lefxUG3l/iAJmxpZS/WQ8r+aXinL6sx+OPPvRMyg==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@react-aria/i18n": "^3.12.9",
+ "@react-aria/interactions": "^3.25.1",
+ "@react-aria/select": "^3.15.5",
+ "@react-aria/utils": "^3.29.0",
+ "@react-spectrum/button": "^3.16.14",
+ "@react-spectrum/form": "^3.7.15",
+ "@react-spectrum/label": "^3.16.15",
+ "@react-spectrum/listbox": "^3.15.1",
+ "@react-spectrum/overlays": "^5.7.5",
+ "@react-spectrum/progress": "^3.7.16",
+ "@react-spectrum/text": "^3.5.15",
+ "@react-spectrum/utils": "^3.12.5",
+ "@react-stately/collections": "^3.12.4",
+ "@react-stately/select": "^3.6.13",
+ "@react-types/select": "^3.9.12",
+ "@react-types/shared": "^3.29.1",
+ "@spectrum-icons/ui": "^3.6.16",
"@swc/helpers": "^0.5.0"
},
"peerDependencies": {
@@ -8375,16 +8426,16 @@
}
},
"node_modules/@react-spectrum/progress": {
- "version": "3.7.15",
- "resolved": "https://registry.npmjs.org/@react-spectrum/progress/-/progress-3.7.15.tgz",
- "integrity": "sha512-V627myTu49lq4MmhgC56TZ5fevNhLay8+eWydMq+INxjgEF4kjoCUjKFomsFU4BrLEKt5RQJdgKRmp1ri2u1WQ==",
+ "version": "3.7.16",
+ "resolved": "https://registry.npmjs.org/@react-spectrum/progress/-/progress-3.7.16.tgz",
+ "integrity": "sha512-K4lC4kVM3kL4xtCkIK8OmY968SGU9IlrIJ60Wy2N3ycTzFTdzf8RaBXGSLt5ICDeOf0wfTwzaNq01zLU8KQtlw==",
"license": "Apache-2.0",
"dependencies": {
- "@react-aria/progress": "^3.4.22",
- "@react-aria/utils": "^3.28.2",
- "@react-spectrum/utils": "^3.12.4",
- "@react-types/progress": "^3.5.11",
- "@react-types/shared": "^3.29.0",
+ "@react-aria/progress": "^3.4.23",
+ "@react-aria/utils": "^3.29.0",
+ "@react-spectrum/utils": "^3.12.5",
+ "@react-types/progress": "^3.5.12",
+ "@react-types/shared": "^3.29.1",
"@swc/helpers": "^0.5.0"
},
"peerDependencies": {
@@ -8394,17 +8445,17 @@
}
},
"node_modules/@react-spectrum/provider": {
- "version": "3.10.4",
- "resolved": "https://registry.npmjs.org/@react-spectrum/provider/-/provider-3.10.4.tgz",
- "integrity": "sha512-nUrwNExGJXkXX9CuujqRl3B1cTDphH0OzPHJXsmIRltcr//BiW1HSZTOW6sprlYoqejm3GgOm4Dh7x3Y4LQhiQ==",
+ "version": "3.10.5",
+ "resolved": "https://registry.npmjs.org/@react-spectrum/provider/-/provider-3.10.5.tgz",
+ "integrity": "sha512-Kh99gFOFbaqgHY9Zrdyjq/jaYvIGo8O5AL6vs/Aj+jZoU/BoU0oJEK2cMsBumntV8vXnGJGrmNyCi772X0iPIQ==",
"license": "Apache-2.0",
"dependencies": {
- "@react-aria/i18n": "^3.12.8",
- "@react-aria/overlays": "^3.27.0",
- "@react-aria/utils": "^3.28.2",
- "@react-spectrum/utils": "^3.12.4",
- "@react-types/provider": "^3.8.8",
- "@react-types/shared": "^3.29.0",
+ "@react-aria/i18n": "^3.12.9",
+ "@react-aria/overlays": "^3.27.1",
+ "@react-aria/utils": "^3.29.0",
+ "@react-spectrum/utils": "^3.12.5",
+ "@react-types/provider": "^3.8.9",
+ "@react-types/shared": "^3.29.1",
"@swc/helpers": "^0.5.0",
"clsx": "^2.0.0"
},
@@ -8414,20 +8465,20 @@
}
},
"node_modules/@react-spectrum/radio": {
- "version": "3.7.15",
- "resolved": "https://registry.npmjs.org/@react-spectrum/radio/-/radio-3.7.15.tgz",
- "integrity": "sha512-B1Z6Kse0lGn5TzN+3mta+CnjK1bc4Nmql1GZc7trEUujRqxctYWsx5FVb+I7Rr21m26M0TZ23I0Umuh0DrqibQ==",
- "license": "Apache-2.0",
- "dependencies": {
- "@react-aria/focus": "^3.20.2",
- "@react-aria/interactions": "^3.25.0",
- "@react-aria/radio": "^3.11.2",
- "@react-spectrum/form": "^3.7.14",
- "@react-spectrum/label": "^3.16.14",
- "@react-spectrum/utils": "^3.12.4",
- "@react-stately/radio": "^3.10.12",
- "@react-types/radio": "^3.8.8",
- "@react-types/shared": "^3.29.0",
+ "version": "3.7.16",
+ "resolved": "https://registry.npmjs.org/@react-spectrum/radio/-/radio-3.7.16.tgz",
+ "integrity": "sha512-biAFzANxYMXn0ii+1V6Lui78hIZHvzH1o7ZIOXdLKIl3rBJR383k+tcAdFPttwss0ARPW5WBpBmZXnIdRHMzEQ==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@react-aria/focus": "^3.20.3",
+ "@react-aria/interactions": "^3.25.1",
+ "@react-aria/radio": "^3.11.3",
+ "@react-spectrum/form": "^3.7.15",
+ "@react-spectrum/label": "^3.16.15",
+ "@react-spectrum/utils": "^3.12.5",
+ "@react-stately/radio": "^3.10.13",
+ "@react-types/radio": "^3.8.9",
+ "@react-types/shared": "^3.29.1",
"@swc/helpers": "^0.5.0"
},
"peerDependencies": {
@@ -8437,20 +8488,20 @@
}
},
"node_modules/@react-spectrum/searchfield": {
- "version": "3.8.15",
- "resolved": "https://registry.npmjs.org/@react-spectrum/searchfield/-/searchfield-3.8.15.tgz",
- "integrity": "sha512-7vRfnVuDhNJcqTehA09M14z7dAqcXo7FmbLxAOrhxvhIVso2JX1S5exG6oeenc5DDytgEY5e1GLBXNTcNXmSXg==",
- "license": "Apache-2.0",
- "dependencies": {
- "@react-aria/searchfield": "^3.8.3",
- "@react-spectrum/button": "^3.16.13",
- "@react-spectrum/form": "^3.7.14",
- "@react-spectrum/textfield": "^3.13.2",
- "@react-spectrum/utils": "^3.12.4",
- "@react-stately/searchfield": "^3.5.11",
- "@react-types/searchfield": "^3.6.1",
- "@react-types/textfield": "^3.12.1",
- "@spectrum-icons/ui": "^3.6.15",
+ "version": "3.8.16",
+ "resolved": "https://registry.npmjs.org/@react-spectrum/searchfield/-/searchfield-3.8.16.tgz",
+ "integrity": "sha512-aD/PssVwQTqqfBtSmhLM+3dcY81P0EhqQFinRuqmL31X+l1EpN9Ru1V7carPxF69qNIMpSWosq7rdp+4GrctFg==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@react-aria/searchfield": "^3.8.4",
+ "@react-spectrum/button": "^3.16.14",
+ "@react-spectrum/form": "^3.7.15",
+ "@react-spectrum/textfield": "^3.13.3",
+ "@react-spectrum/utils": "^3.12.5",
+ "@react-stately/searchfield": "^3.5.12",
+ "@react-types/searchfield": "^3.6.2",
+ "@react-types/textfield": "^3.12.2",
+ "@spectrum-icons/ui": "^3.6.16",
"@swc/helpers": "^0.5.0"
},
"peerDependencies": {
@@ -8460,21 +8511,21 @@
}
},
"node_modules/@react-spectrum/slider": {
- "version": "3.7.4",
- "resolved": "https://registry.npmjs.org/@react-spectrum/slider/-/slider-3.7.4.tgz",
- "integrity": "sha512-va7rZa5sVP5wKn9fRZwo7by3jvYJsLIim80YVCUsUGwxNWjG97VlW59Ovfbs+TOsh1bshiI4ksuuVpEJwYG4Hg==",
- "license": "Apache-2.0",
- "dependencies": {
- "@react-aria/focus": "^3.20.2",
- "@react-aria/i18n": "^3.12.8",
- "@react-aria/interactions": "^3.25.0",
- "@react-aria/slider": "^3.7.18",
- "@react-aria/utils": "^3.28.2",
- "@react-aria/visually-hidden": "^3.8.22",
- "@react-spectrum/utils": "^3.12.4",
- "@react-stately/slider": "^3.6.3",
- "@react-types/shared": "^3.29.0",
- "@react-types/slider": "^3.7.10",
+ "version": "3.7.5",
+ "resolved": "https://registry.npmjs.org/@react-spectrum/slider/-/slider-3.7.5.tgz",
+ "integrity": "sha512-9J0UF9CtArHBs0PFDSqtia9Piui64NSMtS1jE7m554wbaEzG1AOItkw5gg+55iDhKQbL9U1TsftQl0nNiQdErQ==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@react-aria/focus": "^3.20.3",
+ "@react-aria/i18n": "^3.12.9",
+ "@react-aria/interactions": "^3.25.1",
+ "@react-aria/slider": "^3.7.19",
+ "@react-aria/utils": "^3.29.0",
+ "@react-aria/visually-hidden": "^3.8.23",
+ "@react-spectrum/utils": "^3.12.5",
+ "@react-stately/slider": "^3.6.4",
+ "@react-types/shared": "^3.29.1",
+ "@react-types/slider": "^3.7.11",
"@swc/helpers": "^0.5.0"
},
"peerDependencies": {
@@ -8484,15 +8535,15 @@
}
},
"node_modules/@react-spectrum/statuslight": {
- "version": "3.5.21",
- "resolved": "https://registry.npmjs.org/@react-spectrum/statuslight/-/statuslight-3.5.21.tgz",
- "integrity": "sha512-0fh1INJbsJe8V3SymYUkkU/55vLANemsaRFRkg+RK0qTWAYn8jmQsQvjKxKFrbad7JTNyVCIDFPeunIabVayOQ==",
+ "version": "3.5.22",
+ "resolved": "https://registry.npmjs.org/@react-spectrum/statuslight/-/statuslight-3.5.22.tgz",
+ "integrity": "sha512-n/KGLiiEv9adPxBVB+KGOQJLfBY/C4CBLW1Wuy1tXyBtoJt9h8JsLbCII3S/9bb1d92uY75pOFP/ZQUfwnfxpA==",
"license": "Apache-2.0",
"dependencies": {
- "@react-aria/utils": "^3.28.2",
- "@react-spectrum/utils": "^3.12.4",
- "@react-types/shared": "^3.29.0",
- "@react-types/statuslight": "^3.3.16",
+ "@react-aria/utils": "^3.29.0",
+ "@react-spectrum/utils": "^3.12.5",
+ "@react-types/shared": "^3.29.1",
+ "@react-types/statuslight": "^3.3.17",
"@swc/helpers": "^0.5.0"
},
"peerDependencies": {
@@ -8502,18 +8553,18 @@
}
},
"node_modules/@react-spectrum/switch": {
- "version": "3.6.0",
- "resolved": "https://registry.npmjs.org/@react-spectrum/switch/-/switch-3.6.0.tgz",
- "integrity": "sha512-4ay/oz8+e/rzjVlfOmcy/L0seZ1A+Zce8Is6FnfVA8g1RY7X0Q6Ko2vIvPISSitdgIUleeO+fVRy1J7Zfu+6CQ==",
+ "version": "3.6.1",
+ "resolved": "https://registry.npmjs.org/@react-spectrum/switch/-/switch-3.6.1.tgz",
+ "integrity": "sha512-iI5jujH+17HifWhwOZzeJQSSbASikCFyr+9HG0jC1f3mUcvm8B9Ukj8WRUoGYXO8goDskaq3Mxbc6lEgkdZoGw==",
"license": "Apache-2.0",
"dependencies": {
- "@react-aria/focus": "^3.20.2",
- "@react-aria/interactions": "^3.25.0",
- "@react-aria/switch": "^3.7.2",
- "@react-spectrum/utils": "^3.12.4",
- "@react-stately/toggle": "^3.8.3",
- "@react-types/shared": "^3.29.0",
- "@react-types/switch": "^3.5.10",
+ "@react-aria/focus": "^3.20.3",
+ "@react-aria/interactions": "^3.25.1",
+ "@react-aria/switch": "^3.7.3",
+ "@react-spectrum/utils": "^3.12.5",
+ "@react-stately/toggle": "^3.8.4",
+ "@react-types/shared": "^3.29.1",
+ "@react-types/switch": "^3.5.11",
"@swc/helpers": "^0.5.0"
},
"peerDependencies": {
@@ -8523,36 +8574,36 @@
}
},
"node_modules/@react-spectrum/table": {
- "version": "3.17.0",
- "resolved": "https://registry.npmjs.org/@react-spectrum/table/-/table-3.17.0.tgz",
- "integrity": "sha512-SeZ7Z7fhLM425y/ncscf3F4yn0dSRuZHFKuRx2n1jbyQ7lxCpgYE4kVtQTjXeDs3EV9rrHO/PjmrEtGLNKCNQg==",
- "license": "Apache-2.0",
- "dependencies": {
- "@react-aria/button": "^3.13.0",
- "@react-aria/focus": "^3.20.2",
- "@react-aria/i18n": "^3.12.8",
- "@react-aria/interactions": "^3.25.0",
- "@react-aria/overlays": "^3.27.0",
- "@react-aria/selection": "^3.24.0",
- "@react-aria/table": "^3.17.2",
- "@react-aria/utils": "^3.28.2",
- "@react-aria/virtualizer": "^4.1.4",
- "@react-aria/visually-hidden": "^3.8.22",
- "@react-spectrum/checkbox": "^3.9.15",
- "@react-spectrum/dnd": "^3.5.4",
- "@react-spectrum/layout": "^3.6.14",
- "@react-spectrum/menu": "^3.22.0",
- "@react-spectrum/progress": "^3.7.15",
- "@react-spectrum/tooltip": "^3.7.4",
- "@react-spectrum/utils": "^3.12.4",
+ "version": "3.17.1",
+ "resolved": "https://registry.npmjs.org/@react-spectrum/table/-/table-3.17.1.tgz",
+ "integrity": "sha512-2dPWE+xXi7E4iU1Hm8TQHprl5z36rOc1wKvb4xH/J5ujXhxCgNgIQUg5G9Uy00DMogU6UShZ9zTZPGVc1N81hw==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@react-aria/button": "^3.13.1",
+ "@react-aria/focus": "^3.20.3",
+ "@react-aria/i18n": "^3.12.9",
+ "@react-aria/interactions": "^3.25.1",
+ "@react-aria/overlays": "^3.27.1",
+ "@react-aria/selection": "^3.24.1",
+ "@react-aria/table": "^3.17.3",
+ "@react-aria/utils": "^3.29.0",
+ "@react-aria/virtualizer": "^4.1.5",
+ "@react-aria/visually-hidden": "^3.8.23",
+ "@react-spectrum/checkbox": "^3.9.16",
+ "@react-spectrum/dnd": "^3.5.5",
+ "@react-spectrum/layout": "^3.6.15",
+ "@react-spectrum/menu": "^3.22.1",
+ "@react-spectrum/progress": "^3.7.16",
+ "@react-spectrum/tooltip": "^3.7.5",
+ "@react-spectrum/utils": "^3.12.5",
"@react-stately/flags": "^3.1.1",
- "@react-stately/layout": "^4.2.2",
- "@react-stately/table": "^3.14.1",
- "@react-stately/virtualizer": "^4.3.2",
- "@react-types/grid": "^3.3.1",
- "@react-types/shared": "^3.29.0",
- "@react-types/table": "^3.12.0",
- "@spectrum-icons/ui": "^3.6.15",
+ "@react-stately/layout": "^4.3.0",
+ "@react-stately/table": "^3.14.2",
+ "@react-stately/virtualizer": "^4.4.0",
+ "@react-types/grid": "^3.3.2",
+ "@react-types/shared": "^3.29.1",
+ "@react-types/table": "^3.13.0",
+ "@spectrum-icons/ui": "^3.6.16",
"@swc/helpers": "^0.5.0"
},
"peerDependencies": {
@@ -8562,25 +8613,25 @@
}
},
"node_modules/@react-spectrum/tabs": {
- "version": "3.8.19",
- "resolved": "https://registry.npmjs.org/@react-spectrum/tabs/-/tabs-3.8.19.tgz",
- "integrity": "sha512-4DtgCmecey+G/1vOvsiqzzmCTRz9nyGA9t+aewOGNe866gp+lFIHjEQreHmX/RpzXGAjbNV/9LxD6hsib4qWyw==",
- "license": "Apache-2.0",
- "dependencies": {
- "@react-aria/focus": "^3.20.2",
- "@react-aria/i18n": "^3.12.8",
- "@react-aria/interactions": "^3.25.0",
- "@react-aria/tabs": "^3.10.2",
- "@react-aria/utils": "^3.28.2",
- "@react-spectrum/picker": "^3.15.8",
- "@react-spectrum/text": "^3.5.14",
- "@react-spectrum/utils": "^3.12.4",
- "@react-stately/collections": "^3.12.3",
- "@react-stately/list": "^3.12.1",
- "@react-stately/tabs": "^3.8.1",
- "@react-types/select": "^3.9.11",
- "@react-types/shared": "^3.29.0",
- "@react-types/tabs": "^3.3.14",
+ "version": "3.8.20",
+ "resolved": "https://registry.npmjs.org/@react-spectrum/tabs/-/tabs-3.8.20.tgz",
+ "integrity": "sha512-zgB/L37Y4P7xXSIWFgfmuLYe9NDYSZXqdtSjrHzfiuvsIe/1cuQHj6Mc4GLLQQjGpi1eC4bqGt60MMg1gkPs/g==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@react-aria/focus": "^3.20.3",
+ "@react-aria/i18n": "^3.12.9",
+ "@react-aria/interactions": "^3.25.1",
+ "@react-aria/tabs": "^3.10.3",
+ "@react-aria/utils": "^3.29.0",
+ "@react-spectrum/picker": "^3.15.9",
+ "@react-spectrum/text": "^3.5.15",
+ "@react-spectrum/utils": "^3.12.5",
+ "@react-stately/collections": "^3.12.4",
+ "@react-stately/list": "^3.12.2",
+ "@react-stately/tabs": "^3.8.2",
+ "@react-types/select": "^3.9.12",
+ "@react-types/shared": "^3.29.1",
+ "@react-types/tabs": "^3.3.15",
"@swc/helpers": "^0.5.0"
},
"peerDependencies": {
@@ -8590,25 +8641,25 @@
}
},
"node_modules/@react-spectrum/tag": {
- "version": "3.2.15",
- "resolved": "https://registry.npmjs.org/@react-spectrum/tag/-/tag-3.2.15.tgz",
- "integrity": "sha512-M79v84F2fDZ/Evl7rNoT3mFKUa6ClPePn75wxn7ED4jJrtkDSzixj80rCAVV44Ocxe0fXGbZVnYuq7AySc/ciA==",
- "license": "Apache-2.0",
- "dependencies": {
- "@react-aria/focus": "^3.20.2",
- "@react-aria/i18n": "^3.12.8",
- "@react-aria/interactions": "^3.25.0",
- "@react-aria/selection": "^3.24.0",
- "@react-aria/tag": "^3.5.2",
- "@react-aria/utils": "^3.28.2",
- "@react-spectrum/button": "^3.16.13",
- "@react-spectrum/form": "^3.7.14",
- "@react-spectrum/label": "^3.16.14",
- "@react-spectrum/text": "^3.5.14",
- "@react-spectrum/utils": "^3.12.4",
- "@react-stately/collections": "^3.12.3",
- "@react-stately/list": "^3.12.1",
- "@react-types/shared": "^3.29.0",
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/@react-spectrum/tag/-/tag-3.3.0.tgz",
+ "integrity": "sha512-AuA4EElyqSCGcexdcMLmuxV1qnBQkO0H/l7b/NJ13KxQ3/Vy/Z0M5uW5mSY3v4A4CvmifTo7uQkc4ryEX6xc4w==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@react-aria/focus": "^3.20.3",
+ "@react-aria/i18n": "^3.12.9",
+ "@react-aria/interactions": "^3.25.1",
+ "@react-aria/selection": "^3.24.1",
+ "@react-aria/tag": "^3.6.0",
+ "@react-aria/utils": "^3.29.0",
+ "@react-spectrum/button": "^3.16.14",
+ "@react-spectrum/form": "^3.7.15",
+ "@react-spectrum/label": "^3.16.15",
+ "@react-spectrum/text": "^3.5.15",
+ "@react-spectrum/utils": "^3.12.5",
+ "@react-stately/collections": "^3.12.4",
+ "@react-stately/list": "^3.12.2",
+ "@react-types/shared": "^3.29.1",
"@swc/helpers": "^0.5.0"
},
"peerDependencies": {
@@ -8618,17 +8669,17 @@
}
},
"node_modules/@react-spectrum/text": {
- "version": "3.5.14",
- "resolved": "https://registry.npmjs.org/@react-spectrum/text/-/text-3.5.14.tgz",
- "integrity": "sha512-+DMuTcx4La1rKxKQnfTiSDMtTWycAHER64rKZo5kN+eEmdY4m4Osg97nsYlac/2FWg42uF9pr7Tlc/UOnpJp2w==",
+ "version": "3.5.15",
+ "resolved": "https://registry.npmjs.org/@react-spectrum/text/-/text-3.5.15.tgz",
+ "integrity": "sha512-FGQQQ+qipNJ/YLja8n7sxLLhBsYNa/cBE70mL57VmMTe3BnHTOI51RyvvdGyR8173Jv8wpuzZqNguW2JukJpNw==",
"license": "Apache-2.0",
"dependencies": {
- "@react-aria/utils": "^3.28.2",
- "@react-spectrum/utils": "^3.12.4",
- "@react-types/shared": "^3.29.0",
- "@react-types/text": "^3.3.16",
+ "@react-aria/utils": "^3.29.0",
+ "@react-spectrum/utils": "^3.12.5",
+ "@react-types/shared": "^3.29.1",
+ "@react-types/text": "^3.3.17",
"@swc/helpers": "^0.5.0",
- "react-aria-components": "^1.8.0"
+ "react-aria-components": "^1.9.0"
},
"peerDependencies": {
"@react-spectrum/provider": "^3.0.0",
@@ -8637,22 +8688,22 @@
}
},
"node_modules/@react-spectrum/textfield": {
- "version": "3.13.2",
- "resolved": "https://registry.npmjs.org/@react-spectrum/textfield/-/textfield-3.13.2.tgz",
- "integrity": "sha512-kEq7al5R809qrPVWOKymPb3093ywg1CWliFnXWQCnupG284Ssrk2BGtQEQ7dcCkTSHcY+N9xMYDMp6LmJ+Nw6Q==",
- "license": "Apache-2.0",
- "dependencies": {
- "@react-aria/focus": "^3.20.2",
- "@react-aria/interactions": "^3.25.0",
- "@react-aria/textfield": "^3.17.2",
- "@react-aria/utils": "^3.28.2",
- "@react-spectrum/form": "^3.7.14",
- "@react-spectrum/label": "^3.16.14",
- "@react-spectrum/utils": "^3.12.4",
+ "version": "3.13.3",
+ "resolved": "https://registry.npmjs.org/@react-spectrum/textfield/-/textfield-3.13.3.tgz",
+ "integrity": "sha512-VaB5Snm1fvzeTUNLgw6Y55M1D/4KHdGPvk6SLzJ4z6YIYlX9yISnBB18jOojzHnAzOLPxhHez/P6m5sW/5/6yw==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@react-aria/focus": "^3.20.3",
+ "@react-aria/interactions": "^3.25.1",
+ "@react-aria/textfield": "^3.17.3",
+ "@react-aria/utils": "^3.29.0",
+ "@react-spectrum/form": "^3.7.15",
+ "@react-spectrum/label": "^3.16.15",
+ "@react-spectrum/utils": "^3.12.5",
"@react-stately/utils": "^3.10.6",
- "@react-types/shared": "^3.29.0",
- "@react-types/textfield": "^3.12.1",
- "@spectrum-icons/ui": "^3.6.15",
+ "@react-types/shared": "^3.29.1",
+ "@react-types/textfield": "^3.12.2",
+ "@spectrum-icons/ui": "^3.6.16",
"@swc/helpers": "^0.5.0"
},
"peerDependencies": {
@@ -8662,12 +8713,12 @@
}
},
"node_modules/@react-spectrum/theme-dark": {
- "version": "3.5.17",
- "resolved": "https://registry.npmjs.org/@react-spectrum/theme-dark/-/theme-dark-3.5.17.tgz",
- "integrity": "sha512-y8Decmpyp1EEhD+zzePHSQbSxR2f0STfBp8BfZtOuIdxhZ5xTHB4oSQsGgksD1QZSCwmGvJ5iLL+wRZbzZJAlQ==",
+ "version": "3.5.18",
+ "resolved": "https://registry.npmjs.org/@react-spectrum/theme-dark/-/theme-dark-3.5.18.tgz",
+ "integrity": "sha512-23DO1AS1ZevS0zubIluhxWag2ulfYqmzB9OWEd9jGqyM+f253nJJ3mscO9H1eFi4MyUEx0zG4HoumIgD3FnCEQ==",
"license": "Apache-2.0",
"dependencies": {
- "@react-types/provider": "^3.8.8",
+ "@react-types/provider": "^3.8.9",
"@swc/helpers": "^0.5.0"
},
"peerDependencies": {
@@ -8675,12 +8726,12 @@
}
},
"node_modules/@react-spectrum/theme-default": {
- "version": "3.5.17",
- "resolved": "https://registry.npmjs.org/@react-spectrum/theme-default/-/theme-default-3.5.17.tgz",
- "integrity": "sha512-TSTSXIgbjBet17MF9WezyMR+TYGUlWQXxMunHySN3YPYIk7j/NTLy+W3Lx4IoWf7nd3RnsvT40zHGrLHKPMzvQ==",
+ "version": "3.5.18",
+ "resolved": "https://registry.npmjs.org/@react-spectrum/theme-default/-/theme-default-3.5.18.tgz",
+ "integrity": "sha512-BMDV1yOW1E57EJLmtri6Kf1fm+zfDzi38zkr5y1aYJ+HO+couZLm6Be85YMebya1/n010xxS7xxoAv6Zm/evyw==",
"license": "Apache-2.0",
"dependencies": {
- "@react-types/provider": "^3.8.8",
+ "@react-types/provider": "^3.8.9",
"@swc/helpers": "^0.5.0"
},
"peerDependencies": {
@@ -8688,12 +8739,12 @@
}
},
"node_modules/@react-spectrum/theme-light": {
- "version": "3.4.17",
- "resolved": "https://registry.npmjs.org/@react-spectrum/theme-light/-/theme-light-3.4.17.tgz",
- "integrity": "sha512-rG1LE7WrbpF7M5mXfJThiRY42wQalPsccubtT2ndyVnI3UYjMHlaYpZ5nIGUBZpv1TRHDqbHmwCCldmlIEPolQ==",
+ "version": "3.4.18",
+ "resolved": "https://registry.npmjs.org/@react-spectrum/theme-light/-/theme-light-3.4.18.tgz",
+ "integrity": "sha512-HtCKXthRoVVLsxUQAwLEq5JqTyxzoxSpwurYlZkhvZjQePfczERYIWT1YVxn7v2QexRyKFAw9k7Gw8CtRmEY2Q==",
"license": "Apache-2.0",
"dependencies": {
- "@react-types/provider": "^3.8.8",
+ "@react-types/provider": "^3.8.9",
"@swc/helpers": "^0.5.0"
},
"peerDependencies": {
@@ -8701,21 +8752,21 @@
}
},
"node_modules/@react-spectrum/toast": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/@react-spectrum/toast/-/toast-3.0.2.tgz",
- "integrity": "sha512-4GUS1DkuhIkWSZ86NLgUf30bItBjUthdIEc+gQQYVcid6pKvyuZLCMCxV5mP+e0OZp++dAIXIXnu0URG28kbXg==",
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/@react-spectrum/toast/-/toast-3.0.3.tgz",
+ "integrity": "sha512-uYStvJB4bfurs97X6enGhRobFiOVkPzTLsw+Av4NW1UAjYFepT9zaSwzO4L3ZsAX/YX8L3eesOXRhjmAZpyx5Q==",
"license": "Apache-2.0",
"dependencies": {
- "@react-aria/focus": "^3.20.2",
- "@react-aria/i18n": "^3.12.8",
- "@react-aria/overlays": "^3.27.0",
- "@react-aria/toast": "^3.0.2",
- "@react-aria/utils": "^3.28.2",
- "@react-spectrum/button": "^3.16.13",
- "@react-spectrum/utils": "^3.12.4",
+ "@react-aria/focus": "^3.20.3",
+ "@react-aria/i18n": "^3.12.9",
+ "@react-aria/overlays": "^3.27.1",
+ "@react-aria/toast": "^3.0.3",
+ "@react-aria/utils": "^3.29.0",
+ "@react-spectrum/button": "^3.16.14",
+ "@react-spectrum/utils": "^3.12.5",
"@react-stately/toast": "^3.1.0",
- "@react-types/shared": "^3.29.0",
- "@spectrum-icons/ui": "^3.6.15",
+ "@react-types/shared": "^3.29.1",
+ "@spectrum-icons/ui": "^3.6.16",
"@swc/helpers": "^0.5.0",
"use-sync-external-store": "^1.4.0"
},
@@ -8726,22 +8777,22 @@
}
},
"node_modules/@react-spectrum/tooltip": {
- "version": "3.7.4",
- "resolved": "https://registry.npmjs.org/@react-spectrum/tooltip/-/tooltip-3.7.4.tgz",
- "integrity": "sha512-wj1QIEe4bZL8wo/cJWdCe23+u1QYuSBX7kF0mapmSCYvClF/I6hajLeA+Q1I6zCvWi/yg7tC05JZcFxVHTrThA==",
- "license": "Apache-2.0",
- "dependencies": {
- "@react-aria/focus": "^3.20.2",
- "@react-aria/overlays": "^3.27.0",
- "@react-aria/tooltip": "^3.8.2",
- "@react-aria/utils": "^3.28.2",
- "@react-spectrum/overlays": "^5.7.4",
- "@react-spectrum/utils": "^3.12.4",
- "@react-stately/tooltip": "^3.5.3",
- "@react-types/overlays": "^3.8.14",
- "@react-types/shared": "^3.29.0",
- "@react-types/tooltip": "^3.4.16",
- "@spectrum-icons/ui": "^3.6.15",
+ "version": "3.7.5",
+ "resolved": "https://registry.npmjs.org/@react-spectrum/tooltip/-/tooltip-3.7.5.tgz",
+ "integrity": "sha512-bRymbazFPqfQhKfgRpWJFVPaJA7ip73EdBbgmsELEhLYzbEB960r/GVOAGP0hshp0m2WRCEfvqyZfzpkq6mJBw==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@react-aria/focus": "^3.20.3",
+ "@react-aria/overlays": "^3.27.1",
+ "@react-aria/tooltip": "^3.8.3",
+ "@react-aria/utils": "^3.29.0",
+ "@react-spectrum/overlays": "^5.7.5",
+ "@react-spectrum/utils": "^3.12.5",
+ "@react-stately/tooltip": "^3.5.4",
+ "@react-types/overlays": "^3.8.15",
+ "@react-types/shared": "^3.29.1",
+ "@react-types/tooltip": "^3.4.17",
+ "@spectrum-icons/ui": "^3.6.16",
"@swc/helpers": "^0.5.0"
},
"peerDependencies": {
@@ -8751,22 +8802,22 @@
}
},
"node_modules/@react-spectrum/tree": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/@react-spectrum/tree/-/tree-3.1.0.tgz",
- "integrity": "sha512-YwaS80eSJ8mLROLTx87BKmsNQUZCv3lVaP/OPYJcLT0n3zlNKcI00proofNHE+OVy05H9i1NDMqyj3GSp09i9w==",
- "license": "Apache-2.0",
- "dependencies": {
- "@react-aria/button": "^3.13.0",
- "@react-aria/i18n": "^3.12.8",
- "@react-aria/tree": "^3.0.2",
- "@react-aria/utils": "^3.28.2",
- "@react-spectrum/checkbox": "^3.9.15",
- "@react-spectrum/text": "^3.5.14",
- "@react-spectrum/utils": "^3.12.4",
- "@react-types/shared": "^3.29.0",
- "@spectrum-icons/ui": "^3.6.15",
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/@react-spectrum/tree/-/tree-3.1.1.tgz",
+ "integrity": "sha512-UgSOT2cfuPu43f4loSu//uNYfaaU/1GE9dvbtCk8c+fpPi6mmVm7r9HWna3UVbV5W1ZDW5L5UAkf+bmmzUOxXg==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@react-aria/button": "^3.13.1",
+ "@react-aria/i18n": "^3.12.9",
+ "@react-aria/tree": "^3.0.3",
+ "@react-aria/utils": "^3.29.0",
+ "@react-spectrum/checkbox": "^3.9.16",
+ "@react-spectrum/text": "^3.5.15",
+ "@react-spectrum/utils": "^3.12.5",
+ "@react-types/shared": "^3.29.1",
+ "@spectrum-icons/ui": "^3.6.16",
"@swc/helpers": "^0.5.0",
- "react-aria-components": "^1.8.0"
+ "react-aria-components": "^1.9.0"
},
"peerDependencies": {
"@react-spectrum/provider": "^3.0.0",
@@ -8775,15 +8826,15 @@
}
},
"node_modules/@react-spectrum/utils": {
- "version": "3.12.4",
- "resolved": "https://registry.npmjs.org/@react-spectrum/utils/-/utils-3.12.4.tgz",
- "integrity": "sha512-Y/VP4nF0JRNj6tVdooy/za26QsgPA955kdkkKJ9lhFWeVYdunJydAKc7MPZtohO/NQgjT8Y8QxM1jAHwyu1K1Q==",
+ "version": "3.12.5",
+ "resolved": "https://registry.npmjs.org/@react-spectrum/utils/-/utils-3.12.5.tgz",
+ "integrity": "sha512-a6I2UUKpaC/ym4wVt44jg78T7ej4q24p4kEjAZ05KcTZ5XH6sK14Pbnm8BAP/55aNKpEcM7sfgeQOVDB67+rNQ==",
"license": "Apache-2.0",
"dependencies": {
- "@react-aria/i18n": "^3.12.8",
+ "@react-aria/i18n": "^3.12.9",
"@react-aria/ssr": "^3.9.8",
- "@react-aria/utils": "^3.28.2",
- "@react-types/shared": "^3.29.0",
+ "@react-aria/utils": "^3.29.0",
+ "@react-types/shared": "^3.29.1",
"@swc/helpers": "^0.5.0",
"clsx": "^2.0.0"
},
@@ -8793,15 +8844,15 @@
}
},
"node_modules/@react-spectrum/view": {
- "version": "3.6.18",
- "resolved": "https://registry.npmjs.org/@react-spectrum/view/-/view-3.6.18.tgz",
- "integrity": "sha512-K8YKGFo9XJvX/gyNN3OzhP4IfDpLLawE9BV9t9Q7mRH/yHwPw8FFaRJug86Vg5ZR2w+M8ou4Bde8IxbB+PjCkA==",
+ "version": "3.6.19",
+ "resolved": "https://registry.npmjs.org/@react-spectrum/view/-/view-3.6.19.tgz",
+ "integrity": "sha512-m6qSOwCvEIZL83StUftrefYAvB8n/ZQl6XuJ22y72Lm4tUO/siucLFUmK1/TtpQuqS0mklIrKKT90hA2H/k+nw==",
"license": "Apache-2.0",
"dependencies": {
- "@react-aria/utils": "^3.28.2",
- "@react-spectrum/utils": "^3.12.4",
- "@react-types/shared": "^3.29.0",
- "@react-types/view": "^3.4.16",
+ "@react-aria/utils": "^3.29.0",
+ "@react-spectrum/utils": "^3.12.5",
+ "@react-types/shared": "^3.29.1",
+ "@react-types/view": "^3.4.17",
"@swc/helpers": "^0.5.0"
},
"peerDependencies": {
@@ -8811,15 +8862,15 @@
}
},
"node_modules/@react-spectrum/well": {
- "version": "3.4.22",
- "resolved": "https://registry.npmjs.org/@react-spectrum/well/-/well-3.4.22.tgz",
- "integrity": "sha512-2+k01lze2bHj5AMze6nxARrTtDUimGeQlwLXU/lsiueJW3fSX9/mF8b+97mc0PNQckGMBvkF1Ziq6CAdJQEyNw==",
+ "version": "3.4.23",
+ "resolved": "https://registry.npmjs.org/@react-spectrum/well/-/well-3.4.23.tgz",
+ "integrity": "sha512-Q/j9QxxBBQSHkxxDGgz8PFXmSlU7N4i/n9jb9YQTgNmPQXm2NvjJKYrr28y5dCTZjlPL31C2zX6bLlIaNWwS4A==",
"license": "Apache-2.0",
"dependencies": {
- "@react-aria/utils": "^3.28.2",
- "@react-spectrum/utils": "^3.12.4",
- "@react-types/shared": "^3.29.0",
- "@react-types/well": "^3.3.16",
+ "@react-aria/utils": "^3.29.0",
+ "@react-spectrum/utils": "^3.12.5",
+ "@react-types/shared": "^3.29.1",
+ "@react-types/well": "^3.3.17",
"@swc/helpers": "^0.5.0"
},
"peerDependencies": {
@@ -8913,15 +8964,15 @@
}
},
"node_modules/@react-stately/calendar": {
- "version": "3.8.0",
- "resolved": "https://registry.npmjs.org/@react-stately/calendar/-/calendar-3.8.0.tgz",
- "integrity": "sha512-YAuJiR9EtVThX91gU2ay/6YgPe0LvZWEssu4BS0Atnwk5cAo32gvF5FMta9ztH1LIULdZFaypU/C1mvnayMf+Q==",
+ "version": "3.8.1",
+ "resolved": "https://registry.npmjs.org/@react-stately/calendar/-/calendar-3.8.1.tgz",
+ "integrity": "sha512-pTPRmPRD/0JeKhCRvXhVIH/yBimtIHnZGUxH12dcTl3MLxjXQDTn6/LWK0s4rzJcjsC+EzGUCVBBXgESb7PUlw==",
"license": "Apache-2.0",
"dependencies": {
- "@internationalized/date": "^3.8.0",
+ "@internationalized/date": "^3.8.1",
"@react-stately/utils": "^3.10.6",
- "@react-types/calendar": "^3.7.0",
- "@react-types/shared": "^3.29.0",
+ "@react-types/calendar": "^3.7.1",
+ "@react-types/shared": "^3.29.1",
"@swc/helpers": "^0.5.0"
},
"peerDependencies": {
@@ -8929,15 +8980,15 @@
}
},
"node_modules/@react-stately/checkbox": {
- "version": "3.6.13",
- "resolved": "https://registry.npmjs.org/@react-stately/checkbox/-/checkbox-3.6.13.tgz",
- "integrity": "sha512-b8+bkOhobzuJ5bAA16JpYg1tM973eNXD3U4h/8+dckLndKHRjIwPvrL25tzKN7NcQp2LKVCauFesgI+Z+/2FJg==",
+ "version": "3.6.14",
+ "resolved": "https://registry.npmjs.org/@react-stately/checkbox/-/checkbox-3.6.14.tgz",
+ "integrity": "sha512-eGl0GP/F/nUrA33gDCYikyXK+Yer7sFOx8T4EU2AF4E8n1VQIRiVNaxDg7Ar6L3CMKor01urppFHFJsBUnSgyw==",
"license": "Apache-2.0",
"dependencies": {
- "@react-stately/form": "^3.1.3",
+ "@react-stately/form": "^3.1.4",
"@react-stately/utils": "^3.10.6",
- "@react-types/checkbox": "^3.9.3",
- "@react-types/shared": "^3.29.0",
+ "@react-types/checkbox": "^3.9.4",
+ "@react-types/shared": "^3.29.1",
"@swc/helpers": "^0.5.0"
},
"peerDependencies": {
@@ -8945,12 +8996,12 @@
}
},
"node_modules/@react-stately/collections": {
- "version": "3.12.3",
- "resolved": "https://registry.npmjs.org/@react-stately/collections/-/collections-3.12.3.tgz",
- "integrity": "sha512-QfSBME2QWDjUw/RmmUjrYl/j1iCYcYCIDsgZda1OeRtt63R11k0aqmmwrDRwCsA+Sv+D5QgkOp4KK+CokTzoVQ==",
+ "version": "3.12.4",
+ "resolved": "https://registry.npmjs.org/@react-stately/collections/-/collections-3.12.4.tgz",
+ "integrity": "sha512-H+47fRkwYX2/BdSA+NLTzbR+8QclZXyBgC7tHH3dzljyxNimhrMDnbmk520nvGCebNf3nuxtFHq9iVTLpazSVA==",
"license": "Apache-2.0",
"dependencies": {
- "@react-types/shared": "^3.29.0",
+ "@react-types/shared": "^3.29.1",
"@swc/helpers": "^0.5.0"
},
"peerDependencies": {
@@ -8958,19 +9009,19 @@
}
},
"node_modules/@react-stately/color": {
- "version": "3.8.4",
- "resolved": "https://registry.npmjs.org/@react-stately/color/-/color-3.8.4.tgz",
- "integrity": "sha512-LXmfnJPWnL5q1/Z8Pn2d+9efrClLWCiK6c3IGXN8ZWcdR/cMJ/w9SY9f7evyXvmeUmdU1FTGgoSVqGfup3tSyA==",
+ "version": "3.8.5",
+ "resolved": "https://registry.npmjs.org/@react-stately/color/-/color-3.8.5.tgz",
+ "integrity": "sha512-yi1MQAbYuAYKu0AtMO+mWQWlWk6OzGMa9j4PGtQN2PI5Uv1NylWOvdquxbUJ4GUAuSYNopYG8Ci9MZMwtito8w==",
"license": "Apache-2.0",
"dependencies": {
- "@internationalized/number": "^3.6.1",
+ "@internationalized/number": "^3.6.2",
"@internationalized/string": "^3.2.6",
- "@react-stately/form": "^3.1.3",
- "@react-stately/numberfield": "^3.9.11",
- "@react-stately/slider": "^3.6.3",
+ "@react-stately/form": "^3.1.4",
+ "@react-stately/numberfield": "^3.9.12",
+ "@react-stately/slider": "^3.6.4",
"@react-stately/utils": "^3.10.6",
- "@react-types/color": "^3.0.4",
- "@react-types/shared": "^3.29.0",
+ "@react-types/color": "^3.0.5",
+ "@react-types/shared": "^3.29.1",
"@swc/helpers": "^0.5.0"
},
"peerDependencies": {
@@ -8978,19 +9029,19 @@
}
},
"node_modules/@react-stately/combobox": {
- "version": "3.10.4",
- "resolved": "https://registry.npmjs.org/@react-stately/combobox/-/combobox-3.10.4.tgz",
- "integrity": "sha512-sgujLhukIGKskLDrOL4SAbO7WOgLsD7gSdjRQZ0f/e8bWMmUOWEp22T+X1hMMcuVRkRdXlEF1kH2/E6BVanXYw==",
+ "version": "3.10.5",
+ "resolved": "https://registry.npmjs.org/@react-stately/combobox/-/combobox-3.10.5.tgz",
+ "integrity": "sha512-27SkClMqbMAKuVnmXhYzYisbLfzV7MO/DEiqWO4/3l+PZ+whL7Wi/Ek7Wqlfluid/y4pN4EkHCKNt4HJ2mhORQ==",
"license": "Apache-2.0",
"dependencies": {
- "@react-stately/collections": "^3.12.3",
- "@react-stately/form": "^3.1.3",
- "@react-stately/list": "^3.12.1",
- "@react-stately/overlays": "^3.6.15",
- "@react-stately/select": "^3.6.12",
+ "@react-stately/collections": "^3.12.4",
+ "@react-stately/form": "^3.1.4",
+ "@react-stately/list": "^3.12.2",
+ "@react-stately/overlays": "^3.6.16",
+ "@react-stately/select": "^3.6.13",
"@react-stately/utils": "^3.10.6",
- "@react-types/combobox": "^3.13.4",
- "@react-types/shared": "^3.29.0",
+ "@react-types/combobox": "^3.13.5",
+ "@react-types/shared": "^3.29.1",
"@swc/helpers": "^0.5.0"
},
"peerDependencies": {
@@ -8998,12 +9049,12 @@
}
},
"node_modules/@react-stately/data": {
- "version": "3.12.3",
- "resolved": "https://registry.npmjs.org/@react-stately/data/-/data-3.12.3.tgz",
- "integrity": "sha512-JYPNV1gd9OZm8xPay0exx5okFNgiwESNvdBHsfDC+f8BifRyFLdrvoaUGF0enKIeSQMB1oReFAxTAXtDZd27rA==",
+ "version": "3.13.0",
+ "resolved": "https://registry.npmjs.org/@react-stately/data/-/data-3.13.0.tgz",
+ "integrity": "sha512-7LYPxVbWB6tvmLYKO19H5G5YtXV6eKCSXisOUiL9fVnOcGOPDK5z310sj9TP5vaX7zVPtwy0lDBUrZuRfhvQIQ==",
"license": "Apache-2.0",
"dependencies": {
- "@react-types/shared": "^3.29.0",
+ "@react-types/shared": "^3.29.1",
"@swc/helpers": "^0.5.0"
},
"peerDependencies": {
@@ -9011,18 +9062,18 @@
}
},
"node_modules/@react-stately/datepicker": {
- "version": "3.14.0",
- "resolved": "https://registry.npmjs.org/@react-stately/datepicker/-/datepicker-3.14.0.tgz",
- "integrity": "sha512-JSkQfKW0+WpPQyOOeRPBLwXkVfpTUwgZJDnHBCud5kEuQiFFyeAIbL57RNXc4AX2pzY3piQa6OHnjDGTfqClxQ==",
+ "version": "3.14.1",
+ "resolved": "https://registry.npmjs.org/@react-stately/datepicker/-/datepicker-3.14.1.tgz",
+ "integrity": "sha512-ad3IOrRppy/F8FZpznGacsaWWHdzUGZ4vpymD+y6TYeQ+RQvS9PLA5Z1TanH9iqLZgkf6bvVggJFg/hhDh2hmg==",
"license": "Apache-2.0",
"dependencies": {
- "@internationalized/date": "^3.8.0",
+ "@internationalized/date": "^3.8.1",
"@internationalized/string": "^3.2.6",
- "@react-stately/form": "^3.1.3",
- "@react-stately/overlays": "^3.6.15",
+ "@react-stately/form": "^3.1.4",
+ "@react-stately/overlays": "^3.6.16",
"@react-stately/utils": "^3.10.6",
- "@react-types/datepicker": "^3.12.0",
- "@react-types/shared": "^3.29.0",
+ "@react-types/datepicker": "^3.12.1",
+ "@react-types/shared": "^3.29.1",
"@swc/helpers": "^0.5.0"
},
"peerDependencies": {
@@ -9030,13 +9081,13 @@
}
},
"node_modules/@react-stately/disclosure": {
- "version": "3.0.3",
- "resolved": "https://registry.npmjs.org/@react-stately/disclosure/-/disclosure-3.0.3.tgz",
- "integrity": "sha512-4kB+WDXVcrxCmJ+X6c23wa5Ax5dPSpm6Ef8DktLrLcUfJyfr+SWs5/IfkrYG0sOl3/u5OwyWe1pq3hDpzyDlLA==",
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/@react-stately/disclosure/-/disclosure-3.0.4.tgz",
+ "integrity": "sha512-RE4hYnDYgsd5bi01z/hZHShRGKxW++xCA6PCufxtipc1sxZGUF4Sb1tTSIxOjh1dq5iDVdrAQAS6en0weaGgLA==",
"license": "Apache-2.0",
"dependencies": {
"@react-stately/utils": "^3.10.6",
- "@react-types/shared": "^3.29.0",
+ "@react-types/shared": "^3.29.1",
"@swc/helpers": "^0.5.0"
},
"peerDependencies": {
@@ -9044,13 +9095,13 @@
}
},
"node_modules/@react-stately/dnd": {
- "version": "3.5.3",
- "resolved": "https://registry.npmjs.org/@react-stately/dnd/-/dnd-3.5.3.tgz",
- "integrity": "sha512-e4IodPF7fv9hR6jqSjiyrrFQ/6NbHNM5Ft1MJzCu6tJHvT+sl6qxIP5A+XR3wkjMpi4QW2WhVUmoFNbS/6ZAug==",
+ "version": "3.5.4",
+ "resolved": "https://registry.npmjs.org/@react-stately/dnd/-/dnd-3.5.4.tgz",
+ "integrity": "sha512-YkvkehpsSeGZPH7S7EYyLchSxZPhzShdf9Zjh6UAsM7mAcxjRsChMqsf6zuM+l0jgMo40Ka1mvwDYegz92Qkyg==",
"license": "Apache-2.0",
"dependencies": {
- "@react-stately/selection": "^3.20.1",
- "@react-types/shared": "^3.29.0",
+ "@react-stately/selection": "^3.20.2",
+ "@react-types/shared": "^3.29.1",
"@swc/helpers": "^0.5.0"
},
"peerDependencies": {
@@ -9067,12 +9118,12 @@
}
},
"node_modules/@react-stately/form": {
- "version": "3.1.3",
- "resolved": "https://registry.npmjs.org/@react-stately/form/-/form-3.1.3.tgz",
- "integrity": "sha512-Jisgm0facSS3sAzHfSgshoCo3LxfO0wmQj98MOBCGXyVL+MSwx2ilb38eXIyBCzHJzJnPRTLaK/E4T49aph47A==",
+ "version": "3.1.4",
+ "resolved": "https://registry.npmjs.org/@react-stately/form/-/form-3.1.4.tgz",
+ "integrity": "sha512-A6GOaZ9oEIo5/XOE+JT9Z8OBt0osIOfes4EcIxGS1C9ght/Smg0gNcIJ2/Wle8qmro4RoJcza2yJ+EglVOuE0w==",
"license": "Apache-2.0",
"dependencies": {
- "@react-types/shared": "^3.29.0",
+ "@react-types/shared": "^3.29.1",
"@swc/helpers": "^0.5.0"
},
"peerDependencies": {
@@ -9080,15 +9131,15 @@
}
},
"node_modules/@react-stately/grid": {
- "version": "3.11.1",
- "resolved": "https://registry.npmjs.org/@react-stately/grid/-/grid-3.11.1.tgz",
- "integrity": "sha512-xMk2YsaIKkF8dInRLUFpUXBIqnYt88hehhq2nb65RFgsFFhngE/OkaFudSUzaYPc1KvHpW+oHqvseC+G1iDG2w==",
+ "version": "3.11.2",
+ "resolved": "https://registry.npmjs.org/@react-stately/grid/-/grid-3.11.2.tgz",
+ "integrity": "sha512-P0vfK5B1NW8glYD6QMrR2X/7UMXx2J8v48QIQV6KgLZjFbyXhzRb+MY0BoIy4tUfJL0yQU2GKbKKVSUIQxbv0g==",
"license": "Apache-2.0",
"dependencies": {
- "@react-stately/collections": "^3.12.3",
- "@react-stately/selection": "^3.20.1",
- "@react-types/grid": "^3.3.1",
- "@react-types/shared": "^3.29.0",
+ "@react-stately/collections": "^3.12.4",
+ "@react-stately/selection": "^3.20.2",
+ "@react-types/grid": "^3.3.2",
+ "@react-types/shared": "^3.29.1",
"@swc/helpers": "^0.5.0"
},
"peerDependencies": {
@@ -9096,17 +9147,17 @@
}
},
"node_modules/@react-stately/layout": {
- "version": "4.2.2",
- "resolved": "https://registry.npmjs.org/@react-stately/layout/-/layout-4.2.2.tgz",
- "integrity": "sha512-cKojNZteaVPtJrEePoNmKOgua4LYhholsthaEpD7ldKcOacl9VsvBbaowv945HEDKj6A919YoXOLdgy5qzoPtw==",
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/@react-stately/layout/-/layout-4.3.0.tgz",
+ "integrity": "sha512-1czYPaWsEi/ecSOMBiMmH82iTeAIez/72HQjvP0i5CK2ZqLV0M1/Z10lesJHdOE+ay2EkE2qEqbHJnCdCqzkpA==",
"license": "Apache-2.0",
"dependencies": {
- "@react-stately/collections": "^3.12.3",
- "@react-stately/table": "^3.14.1",
- "@react-stately/virtualizer": "^4.3.2",
- "@react-types/grid": "^3.3.1",
- "@react-types/shared": "^3.29.0",
- "@react-types/table": "^3.12.0",
+ "@react-stately/collections": "^3.12.4",
+ "@react-stately/table": "^3.14.2",
+ "@react-stately/virtualizer": "^4.4.0",
+ "@react-types/grid": "^3.3.2",
+ "@react-types/shared": "^3.29.1",
+ "@react-types/table": "^3.13.0",
"@swc/helpers": "^0.5.0"
},
"peerDependencies": {
@@ -9115,15 +9166,15 @@
}
},
"node_modules/@react-stately/list": {
- "version": "3.12.1",
- "resolved": "https://registry.npmjs.org/@react-stately/list/-/list-3.12.1.tgz",
- "integrity": "sha512-N+YCInNZ2OpY0WUNvJWUTyFHtzE5yBtZ9DI4EHJDvm61+jmZ2s3HszOfa7j+7VOKq78VW3m5laqsQNWvMrLFrQ==",
+ "version": "3.12.2",
+ "resolved": "https://registry.npmjs.org/@react-stately/list/-/list-3.12.2.tgz",
+ "integrity": "sha512-XPGvdPidOV4hnpmaUNc4C/1jX7ZhBwmAI9p6bEXDA3du3XrWess6MWcaQvPxXbrZ6ZX8/OyOC2wp7ixJoJRGyA==",
"license": "Apache-2.0",
"dependencies": {
- "@react-stately/collections": "^3.12.3",
- "@react-stately/selection": "^3.20.1",
+ "@react-stately/collections": "^3.12.4",
+ "@react-stately/selection": "^3.20.2",
"@react-stately/utils": "^3.10.6",
- "@react-types/shared": "^3.29.0",
+ "@react-types/shared": "^3.29.1",
"@swc/helpers": "^0.5.0"
},
"peerDependencies": {
@@ -9131,14 +9182,14 @@
}
},
"node_modules/@react-stately/menu": {
- "version": "3.9.3",
- "resolved": "https://registry.npmjs.org/@react-stately/menu/-/menu-3.9.3.tgz",
- "integrity": "sha512-9x1sTX3Xq2Q3mJUHV+YN9MR36qNzgn8eBSLa40eaFDaOOtoJ+V10m7OriUfpjey7WzLBpq00Sfda54/PbQHZ0g==",
+ "version": "3.9.4",
+ "resolved": "https://registry.npmjs.org/@react-stately/menu/-/menu-3.9.4.tgz",
+ "integrity": "sha512-sqYcSBuTEtCebZuByUou2aZzwlnrrOlrvmGwFNJy49N3LXXXPENCcCERuWa8TE9eBevIVTQorBZlID6rFG+wdQ==",
"license": "Apache-2.0",
"dependencies": {
- "@react-stately/overlays": "^3.6.15",
- "@react-types/menu": "^3.10.0",
- "@react-types/shared": "^3.29.0",
+ "@react-stately/overlays": "^3.6.16",
+ "@react-types/menu": "^3.10.1",
+ "@react-types/shared": "^3.29.1",
"@swc/helpers": "^0.5.0"
},
"peerDependencies": {
@@ -9146,15 +9197,15 @@
}
},
"node_modules/@react-stately/numberfield": {
- "version": "3.9.11",
- "resolved": "https://registry.npmjs.org/@react-stately/numberfield/-/numberfield-3.9.11.tgz",
- "integrity": "sha512-gAFSZIHnZsgIWVPgGRUUpfW6zM7TCV5oS1SCY90ay5nrS7JCXurQbMrWJLOWHTdM5iSeYMgoyt68OK5KD0KHMw==",
+ "version": "3.9.12",
+ "resolved": "https://registry.npmjs.org/@react-stately/numberfield/-/numberfield-3.9.12.tgz",
+ "integrity": "sha512-E56RuRRdu/lzd8e5aEifP4n8CL/as0sZqIQFSyMv/ZUIIGeksqy+zykzo01skaHKY8u2NixrVHPVDtvPcRuooA==",
"license": "Apache-2.0",
"dependencies": {
- "@internationalized/number": "^3.6.1",
- "@react-stately/form": "^3.1.3",
+ "@internationalized/number": "^3.6.2",
+ "@react-stately/form": "^3.1.4",
"@react-stately/utils": "^3.10.6",
- "@react-types/numberfield": "^3.8.10",
+ "@react-types/numberfield": "^3.8.11",
"@swc/helpers": "^0.5.0"
},
"peerDependencies": {
@@ -9162,13 +9213,13 @@
}
},
"node_modules/@react-stately/overlays": {
- "version": "3.6.15",
- "resolved": "https://registry.npmjs.org/@react-stately/overlays/-/overlays-3.6.15.tgz",
- "integrity": "sha512-LBaGpXuI+SSd5HSGzyGJA0Gy09V2tl2G/r0lllTYqwt0RDZR6p7IrhdGVXZm6vI0oWEnih7yLC32krkVQrffgQ==",
+ "version": "3.6.16",
+ "resolved": "https://registry.npmjs.org/@react-stately/overlays/-/overlays-3.6.16.tgz",
+ "integrity": "sha512-+Ve/TBlUNg3otVC4ZfCq1a8q8FwC7xNebWkVOCGviTqiYodPCGqBwR9Z1xonuFLF/HuQYqALHHTOZtxceU+nVQ==",
"license": "Apache-2.0",
"dependencies": {
"@react-stately/utils": "^3.10.6",
- "@react-types/overlays": "^3.8.14",
+ "@react-types/overlays": "^3.8.15",
"@swc/helpers": "^0.5.0"
},
"peerDependencies": {
@@ -9176,15 +9227,15 @@
}
},
"node_modules/@react-stately/radio": {
- "version": "3.10.12",
- "resolved": "https://registry.npmjs.org/@react-stately/radio/-/radio-3.10.12.tgz",
- "integrity": "sha512-hFH45CXVa7uyXeTYQy7LGR0SnmGnNRx7XnEXS25w4Ch6BpH8m8SAbhKXqysgcmsE3xrhRas7P9zWw7wI24G28Q==",
+ "version": "3.10.13",
+ "resolved": "https://registry.npmjs.org/@react-stately/radio/-/radio-3.10.13.tgz",
+ "integrity": "sha512-q7UKcVYY7rqpxKfYRzvKVEqFhxElDFX2c+xliZQtjXuSexhxRb2xjEh+bDkhzbXzrJkrBT6VmE/rSYPurC3xTw==",
"license": "Apache-2.0",
"dependencies": {
- "@react-stately/form": "^3.1.3",
+ "@react-stately/form": "^3.1.4",
"@react-stately/utils": "^3.10.6",
- "@react-types/radio": "^3.8.8",
- "@react-types/shared": "^3.29.0",
+ "@react-types/radio": "^3.8.9",
+ "@react-types/shared": "^3.29.1",
"@swc/helpers": "^0.5.0"
},
"peerDependencies": {
@@ -9192,13 +9243,13 @@
}
},
"node_modules/@react-stately/searchfield": {
- "version": "3.5.11",
- "resolved": "https://registry.npmjs.org/@react-stately/searchfield/-/searchfield-3.5.11.tgz",
- "integrity": "sha512-vOgK3kgkYcyjTLsBABVzoQL9w6qBamnWAQICcw5OkA6octnF7NZ5DqdjkwnMY95KOGchiTlD5tNNHrz0ekeGiw==",
+ "version": "3.5.12",
+ "resolved": "https://registry.npmjs.org/@react-stately/searchfield/-/searchfield-3.5.12.tgz",
+ "integrity": "sha512-RC3QTEPVNUbgtuqzpwPUfbV9UkUC1j4XkHoynWDbMt0bE0tPe2Picnl0/r/kq6MO527idV6Ur4zuOF4x9a97LQ==",
"license": "Apache-2.0",
"dependencies": {
"@react-stately/utils": "^3.10.6",
- "@react-types/searchfield": "^3.6.1",
+ "@react-types/searchfield": "^3.6.2",
"@swc/helpers": "^0.5.0"
},
"peerDependencies": {
@@ -9206,16 +9257,16 @@
}
},
"node_modules/@react-stately/select": {
- "version": "3.6.12",
- "resolved": "https://registry.npmjs.org/@react-stately/select/-/select-3.6.12.tgz",
- "integrity": "sha512-5o/NAaENO/Gxs1yui5BHLItxLnDPSQJ5HDKycuD0/gGC17BboAGEY/F9masiQ5qwRPe3JEc0QfvMRq3yZVNXog==",
+ "version": "3.6.13",
+ "resolved": "https://registry.npmjs.org/@react-stately/select/-/select-3.6.13.tgz",
+ "integrity": "sha512-saZo67CreQZPdmqvz9+P6N4kjohpwdVncH98qBi0Q2FvxGAMnpJQgx97rtfDvnSziST5Yx1JnMI4kSSndbtFwg==",
"license": "Apache-2.0",
"dependencies": {
- "@react-stately/form": "^3.1.3",
- "@react-stately/list": "^3.12.1",
- "@react-stately/overlays": "^3.6.15",
- "@react-types/select": "^3.9.11",
- "@react-types/shared": "^3.29.0",
+ "@react-stately/form": "^3.1.4",
+ "@react-stately/list": "^3.12.2",
+ "@react-stately/overlays": "^3.6.16",
+ "@react-types/select": "^3.9.12",
+ "@react-types/shared": "^3.29.1",
"@swc/helpers": "^0.5.0"
},
"peerDependencies": {
@@ -9223,14 +9274,14 @@
}
},
"node_modules/@react-stately/selection": {
- "version": "3.20.1",
- "resolved": "https://registry.npmjs.org/@react-stately/selection/-/selection-3.20.1.tgz",
- "integrity": "sha512-K9MP6Rfg2yvFoY2Cr+ykA7bP4EBXlGaq5Dqfa1krvcXlEgMbQka5muLHdNXqjzGgcwPmS1dx1NECD15q63NtOw==",
+ "version": "3.20.2",
+ "resolved": "https://registry.npmjs.org/@react-stately/selection/-/selection-3.20.2.tgz",
+ "integrity": "sha512-Fw6nnG+VKMsncsY4SNxGYOhnHojVFzFv+Uhy6P39QBp6AXtSaRKMg2VR4MPxQ7XgOjHh5ZuSvCY1RwocweqjwQ==",
"license": "Apache-2.0",
"dependencies": {
- "@react-stately/collections": "^3.12.3",
+ "@react-stately/collections": "^3.12.4",
"@react-stately/utils": "^3.10.6",
- "@react-types/shared": "^3.29.0",
+ "@react-types/shared": "^3.29.1",
"@swc/helpers": "^0.5.0"
},
"peerDependencies": {
@@ -9238,14 +9289,14 @@
}
},
"node_modules/@react-stately/slider": {
- "version": "3.6.3",
- "resolved": "https://registry.npmjs.org/@react-stately/slider/-/slider-3.6.3.tgz",
- "integrity": "sha512-755X1jhpRD1bqf/5Ax1xuSpZbnG/0EEHGOowH28FLYKy5+1l4QVDGPFYxLB9KzXPdRAr9EF0j2kRhH2d8MCksQ==",
+ "version": "3.6.4",
+ "resolved": "https://registry.npmjs.org/@react-stately/slider/-/slider-3.6.4.tgz",
+ "integrity": "sha512-6SdG0VJZLMRIBnPjqkbIsdyQcW9zJ5Br716cl/7kLT9owiIwMJiAdjdYHab5+8ShWzU2D8Ae+LdQk8ZxIiIjkg==",
"license": "Apache-2.0",
"dependencies": {
"@react-stately/utils": "^3.10.6",
- "@react-types/shared": "^3.29.0",
- "@react-types/slider": "^3.7.10",
+ "@react-types/shared": "^3.29.1",
+ "@react-types/slider": "^3.7.11",
"@swc/helpers": "^0.5.0"
},
"peerDependencies": {
@@ -9253,19 +9304,19 @@
}
},
"node_modules/@react-stately/table": {
- "version": "3.14.1",
- "resolved": "https://registry.npmjs.org/@react-stately/table/-/table-3.14.1.tgz",
- "integrity": "sha512-7P5h4YBAv3B/7BGq/kln+xSKgJCSq4xjt4HmJA7ZkGnEksUPUokBNQdWwZsy3lX/mwunaaKR9x/YNIu7yXB02g==",
+ "version": "3.14.2",
+ "resolved": "https://registry.npmjs.org/@react-stately/table/-/table-3.14.2.tgz",
+ "integrity": "sha512-SqE5A/Ve5H2ApnAblMGBMGRzY7cgdQmNPzXB8tGVc38NsC/STmMkq9m54gAl8dBVNbLzzd6HJBe9lqz5keYIhQ==",
"license": "Apache-2.0",
"dependencies": {
- "@react-stately/collections": "^3.12.3",
+ "@react-stately/collections": "^3.12.4",
"@react-stately/flags": "^3.1.1",
- "@react-stately/grid": "^3.11.1",
- "@react-stately/selection": "^3.20.1",
+ "@react-stately/grid": "^3.11.2",
+ "@react-stately/selection": "^3.20.2",
"@react-stately/utils": "^3.10.6",
- "@react-types/grid": "^3.3.1",
- "@react-types/shared": "^3.29.0",
- "@react-types/table": "^3.12.0",
+ "@react-types/grid": "^3.3.2",
+ "@react-types/shared": "^3.29.1",
+ "@react-types/table": "^3.13.0",
"@swc/helpers": "^0.5.0"
},
"peerDependencies": {
@@ -9273,14 +9324,14 @@
}
},
"node_modules/@react-stately/tabs": {
- "version": "3.8.1",
- "resolved": "https://registry.npmjs.org/@react-stately/tabs/-/tabs-3.8.1.tgz",
- "integrity": "sha512-1TBbt2BXbemstb/gEYw/NVt3esi5WvgWQW5Z7G8nDzLkpnMHOZXueoUkMxsdm0vhE8p0M9fsJQCMXKvCG3JzJg==",
+ "version": "3.8.2",
+ "resolved": "https://registry.npmjs.org/@react-stately/tabs/-/tabs-3.8.2.tgz",
+ "integrity": "sha512-lNpby7zUVdAeqo3mjGdPBxppEskOLyqR82LWBtP8Xg4olnjA5RmDFOuoJkIFttDX689zamjN3OE+Ra6WWgJczg==",
"license": "Apache-2.0",
"dependencies": {
- "@react-stately/list": "^3.12.1",
- "@react-types/shared": "^3.29.0",
- "@react-types/tabs": "^3.3.14",
+ "@react-stately/list": "^3.12.2",
+ "@react-types/shared": "^3.29.1",
+ "@react-types/tabs": "^3.3.15",
"@swc/helpers": "^0.5.0"
},
"peerDependencies": {
@@ -9301,14 +9352,14 @@
}
},
"node_modules/@react-stately/toggle": {
- "version": "3.8.3",
- "resolved": "https://registry.npmjs.org/@react-stately/toggle/-/toggle-3.8.3.tgz",
- "integrity": "sha512-4T2V3P1RK4zEFz4vJjUXUXyB0g4Slm6stE6Ry20fzDWjltuW42cD2lmrd7ccTO/CXFmHLECcXQLD4GEbOj0epA==",
+ "version": "3.8.4",
+ "resolved": "https://registry.npmjs.org/@react-stately/toggle/-/toggle-3.8.4.tgz",
+ "integrity": "sha512-JbKoXhkJ5P5nCrNXChMos3yNqkIeGXPDEMS/dfkHlsjQYxJfylRm4j/nWoDXxxkUmfkvXcNEMofMn9iO1+H0DQ==",
"license": "Apache-2.0",
"dependencies": {
"@react-stately/utils": "^3.10.6",
- "@react-types/checkbox": "^3.9.3",
- "@react-types/shared": "^3.29.0",
+ "@react-types/checkbox": "^3.9.4",
+ "@react-types/shared": "^3.29.1",
"@swc/helpers": "^0.5.0"
},
"peerDependencies": {
@@ -9316,13 +9367,13 @@
}
},
"node_modules/@react-stately/tooltip": {
- "version": "3.5.3",
- "resolved": "https://registry.npmjs.org/@react-stately/tooltip/-/tooltip-3.5.3.tgz",
- "integrity": "sha512-btfy/gQ3Eccudx//4HkyQ+CRr3vxbLs74HYHthaoJ9GZbRj/3XDzfUM2X16zRoqTZVrIz/AkUj7AfGfsitU5nQ==",
+ "version": "3.5.4",
+ "resolved": "https://registry.npmjs.org/@react-stately/tooltip/-/tooltip-3.5.4.tgz",
+ "integrity": "sha512-HxNTqn9nMBuGbEVeeuZyhrzNbyW7sgwk+8o0mN/BrMrk7E/UBhyL2SUxXnAUQftpTjX+29hmx1sPhIprIDzR3Q==",
"license": "Apache-2.0",
"dependencies": {
- "@react-stately/overlays": "^3.6.15",
- "@react-types/tooltip": "^3.4.16",
+ "@react-stately/overlays": "^3.6.16",
+ "@react-types/tooltip": "^3.4.17",
"@swc/helpers": "^0.5.0"
},
"peerDependencies": {
@@ -9330,15 +9381,15 @@
}
},
"node_modules/@react-stately/tree": {
- "version": "3.8.9",
- "resolved": "https://registry.npmjs.org/@react-stately/tree/-/tree-3.8.9.tgz",
- "integrity": "sha512-j/LLI9UvbqcfOdl2v9m3gET3etUxoQzv3XdryNAbSkg0jTx8/13Fgi/Xp98bUcNLfynfeGW5P/fieU71sMkGog==",
+ "version": "3.8.10",
+ "resolved": "https://registry.npmjs.org/@react-stately/tree/-/tree-3.8.10.tgz",
+ "integrity": "sha512-sMqBRKAAZMiXJwlzAFpkXqUaGlNBfKnL8usAiKdoeGcLLJt2Ni9gPoPOLBJSPqLOAFCgLWtr5IYjdhel9aXRzQ==",
"license": "Apache-2.0",
"dependencies": {
- "@react-stately/collections": "^3.12.3",
- "@react-stately/selection": "^3.20.1",
+ "@react-stately/collections": "^3.12.4",
+ "@react-stately/selection": "^3.20.2",
"@react-stately/utils": "^3.10.6",
- "@react-types/shared": "^3.29.0",
+ "@react-types/shared": "^3.29.1",
"@swc/helpers": "^0.5.0"
},
"peerDependencies": {
@@ -9358,13 +9409,13 @@
}
},
"node_modules/@react-stately/virtualizer": {
- "version": "4.3.2",
- "resolved": "https://registry.npmjs.org/@react-stately/virtualizer/-/virtualizer-4.3.2.tgz",
- "integrity": "sha512-KxR0s6IBqUD2TfDM3mAOtiTZLb1zOwcuCeUOvCKNqzEdFhh7nEJPrG33mgJn64S4kM11c0AsPwBlxISqdvCXJg==",
+ "version": "4.4.0",
+ "resolved": "https://registry.npmjs.org/@react-stately/virtualizer/-/virtualizer-4.4.0.tgz",
+ "integrity": "sha512-y2jefrW0ffJpv0685IEKId6/wy0kgD/bxYuny9r9Z3utvcjjFl9fX9cBKsXII7ZxPiu0CP+wA6HQ53GU3BqCsw==",
"license": "Apache-2.0",
"dependencies": {
- "@react-aria/utils": "^3.28.2",
- "@react-types/shared": "^3.29.0",
+ "@react-aria/utils": "^3.29.0",
+ "@react-types/shared": "^3.29.1",
"@swc/helpers": "^0.5.0"
},
"peerDependencies": {
@@ -9373,539 +9424,539 @@
}
},
"node_modules/@react-types/actionbar": {
- "version": "3.1.14",
- "resolved": "https://registry.npmjs.org/@react-types/actionbar/-/actionbar-3.1.14.tgz",
- "integrity": "sha512-mg7mlmNkUayd1EXcPWmJNPoECc3GxRn7OCRE/uUQk38EkHSw2XZEDNKRvOoJ+1x4oVBVGuCE2yNiiK4Yies9TA==",
+ "version": "3.1.15",
+ "resolved": "https://registry.npmjs.org/@react-types/actionbar/-/actionbar-3.1.15.tgz",
+ "integrity": "sha512-Hy2tZa2pD20ZHHIoMccemO1w2AdHNrq8jjHBv28lqo6Qh1BeMkjApWd2uY//dNKVEpZ7dH92AN1PcotF67BhoQ==",
"license": "Apache-2.0",
"dependencies": {
- "@react-types/shared": "^3.29.0"
+ "@react-types/shared": "^3.29.1"
},
"peerDependencies": {
"react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
}
},
"node_modules/@react-types/actiongroup": {
- "version": "3.4.16",
- "resolved": "https://registry.npmjs.org/@react-types/actiongroup/-/actiongroup-3.4.16.tgz",
- "integrity": "sha512-9LPzf2TBwx5QabmCRswdQOr+thU+2OXy/U8IDIW1czC2AtUSdlqpITzJokKBt/TTe1fO4M2Sp2xqYCZcGtZKEA==",
+ "version": "3.4.17",
+ "resolved": "https://registry.npmjs.org/@react-types/actiongroup/-/actiongroup-3.4.17.tgz",
+ "integrity": "sha512-lb0AuDauSJ5SY747fEgNhagx7lmeutlXsYPgJWEiLgwgKcYRo9lKJqkzzEGeDXhxx6eSIQhIvywXv394FNCP7g==",
"license": "Apache-2.0",
"dependencies": {
- "@react-types/shared": "^3.29.0"
+ "@react-types/shared": "^3.29.1"
},
"peerDependencies": {
"react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
}
},
"node_modules/@react-types/autocomplete": {
- "version": "3.0.0-alpha.30",
- "resolved": "https://registry.npmjs.org/@react-types/autocomplete/-/autocomplete-3.0.0-alpha.30.tgz",
- "integrity": "sha512-9neGygI+stJqiEFHzoc1jMySj6lOc4MUmBmu0uGn2zdOG2zxaAZSjh1pd9AJkHNyZ4j/n5rVXMo+v3RNkUntNw==",
+ "version": "3.0.0-alpha.31",
+ "resolved": "https://registry.npmjs.org/@react-types/autocomplete/-/autocomplete-3.0.0-alpha.31.tgz",
+ "integrity": "sha512-L+5JtCAM+Y2/hCQ0BYXti6P2KGyiEM7FTYFBaTr2CoaHDN3u8e3cpDjOig83zzs9FcdUClovkqpVtvu26IZvhw==",
"license": "Apache-2.0",
"dependencies": {
- "@react-types/combobox": "^3.13.4",
- "@react-types/searchfield": "^3.6.1",
- "@react-types/shared": "^3.29.0"
+ "@react-types/combobox": "^3.13.5",
+ "@react-types/searchfield": "^3.6.2",
+ "@react-types/shared": "^3.29.1"
},
"peerDependencies": {
"react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
}
},
"node_modules/@react-types/avatar": {
- "version": "3.0.14",
- "resolved": "https://registry.npmjs.org/@react-types/avatar/-/avatar-3.0.14.tgz",
- "integrity": "sha512-YbUN6hrHAmhitR+79ymIhJurcVjAX9gZPMB2hqFkw9S5T5ry8N1genOz2lB69UHcS8KAeDhg+8crZs2B3o/fFg==",
+ "version": "3.0.15",
+ "resolved": "https://registry.npmjs.org/@react-types/avatar/-/avatar-3.0.15.tgz",
+ "integrity": "sha512-UMeokF2xL/quG91mnmMYxeZFudTRYZI6YgxIE3itjFdnV9DMD3rmqeJ6jspDcBpGydtf5ZxuKgsPnrGO9Cb+Bg==",
"license": "Apache-2.0",
"dependencies": {
- "@react-types/shared": "^3.29.0"
+ "@react-types/shared": "^3.29.1"
},
"peerDependencies": {
"react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
}
},
"node_modules/@react-types/badge": {
- "version": "3.1.16",
- "resolved": "https://registry.npmjs.org/@react-types/badge/-/badge-3.1.16.tgz",
- "integrity": "sha512-isf9PdTSyb1/ZbtARfWJ7nA5gbnXuBKWlitNMTLbSZOUUrDP5N5XOOrkl+0fhfxUJrsv/xL8zXDUVsuxNMvFjw==",
+ "version": "3.1.17",
+ "resolved": "https://registry.npmjs.org/@react-types/badge/-/badge-3.1.17.tgz",
+ "integrity": "sha512-gMUmXEwIZn45aUQ+HevDIS9js1H4uPxalKhM9DND8PxZItMRqePHvDlmVNZB/5Poelm6WXwEJBQND/ns1mzIMQ==",
"license": "Apache-2.0",
"dependencies": {
- "@react-types/shared": "^3.29.0"
+ "@react-types/shared": "^3.29.1"
},
"peerDependencies": {
"react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
}
},
"node_modules/@react-types/breadcrumbs": {
- "version": "3.7.12",
- "resolved": "https://registry.npmjs.org/@react-types/breadcrumbs/-/breadcrumbs-3.7.12.tgz",
- "integrity": "sha512-+LvGEADlv11mLQjxEAZriptSYJJTP+2OIFEKx0z9mmpp+8jTlEHFhAnRVaE6I9QCxcDB5F6q/olfizSwOPOMIg==",
+ "version": "3.7.13",
+ "resolved": "https://registry.npmjs.org/@react-types/breadcrumbs/-/breadcrumbs-3.7.13.tgz",
+ "integrity": "sha512-x94KEZaLIeHt9lqAkuaOopX5+rqCTMSHsciThUsBHK7QT64zrw6x2G1WKQ4zB4h52RGF5b+3sFXeR4bgX2sVLQ==",
"license": "Apache-2.0",
"dependencies": {
- "@react-types/link": "^3.6.0",
- "@react-types/shared": "^3.29.0"
+ "@react-types/link": "^3.6.1",
+ "@react-types/shared": "^3.29.1"
},
"peerDependencies": {
"react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
}
},
"node_modules/@react-types/button": {
- "version": "3.12.0",
- "resolved": "https://registry.npmjs.org/@react-types/button/-/button-3.12.0.tgz",
- "integrity": "sha512-YrASNa+RqGQpzJcxNAahzNuTYVID1OE6HCorrEOXIyGS3EGogHsQmFs9OyThXnGHq6q4rLlA806/jWbP9uZdxA==",
+ "version": "3.12.1",
+ "resolved": "https://registry.npmjs.org/@react-types/button/-/button-3.12.1.tgz",
+ "integrity": "sha512-z87stl4llWTi4C5qhUK1PKcEsG59uF/ZQpkRhMzX0KfgXobJY6yiIrry2xrpnlTPIVST6K1+kARhhSDOZ8zhLw==",
"license": "Apache-2.0",
"dependencies": {
- "@react-types/shared": "^3.29.0"
+ "@react-types/shared": "^3.29.1"
},
"peerDependencies": {
"react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
}
},
"node_modules/@react-types/buttongroup": {
- "version": "3.3.16",
- "resolved": "https://registry.npmjs.org/@react-types/buttongroup/-/buttongroup-3.3.16.tgz",
- "integrity": "sha512-3BNDzKNJWyRzDmDc5THYHwPlHhpZQMi+qWhbYsJ1tE0b6Asy6YdKOnjETu97+qN2ZWpQFyohRz9fBoyff2Xkhw==",
+ "version": "3.3.17",
+ "resolved": "https://registry.npmjs.org/@react-types/buttongroup/-/buttongroup-3.3.17.tgz",
+ "integrity": "sha512-rz97Zz/PquMNpMNNlwKDBSrdv8NN5kXSuZqlQOjX/C3iLoeAMrUX6xBl7uAbesfcp0ztEUxxXFE4t0ASRz8neA==",
"license": "Apache-2.0",
"dependencies": {
- "@react-types/shared": "^3.29.0"
+ "@react-types/shared": "^3.29.1"
},
"peerDependencies": {
"react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
}
},
"node_modules/@react-types/calendar": {
- "version": "3.7.0",
- "resolved": "https://registry.npmjs.org/@react-types/calendar/-/calendar-3.7.0.tgz",
- "integrity": "sha512-RiEfX2ZTcvfRktQc5obOJtNTgW+UwjNOUW5yf9CLCNOSM07e0w5jtC1ewsOZZbcctMrMCljjL8niGWiBv1wQ1Q==",
+ "version": "3.7.1",
+ "resolved": "https://registry.npmjs.org/@react-types/calendar/-/calendar-3.7.1.tgz",
+ "integrity": "sha512-a/wGT9vZewPNL72Xni8T/gv4IS2w6iRtryqMF425OL+kaCQrxJYlkDxb74bQs9+k9ZYabrxJgz9vFcFnY7S9gw==",
"license": "Apache-2.0",
"dependencies": {
- "@internationalized/date": "^3.8.0",
- "@react-types/shared": "^3.29.0"
+ "@internationalized/date": "^3.8.1",
+ "@react-types/shared": "^3.29.1"
},
"peerDependencies": {
"react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
}
},
"node_modules/@react-types/checkbox": {
- "version": "3.9.3",
- "resolved": "https://registry.npmjs.org/@react-types/checkbox/-/checkbox-3.9.3.tgz",
- "integrity": "sha512-h6wmK7CraKHKE6L13Ut+CtnjRktbMRhkCSorv7eg82M6p4PDhZ7mfDSh13IlGR4sryT8Ka+aOjOU+EvMrKiduA==",
+ "version": "3.9.4",
+ "resolved": "https://registry.npmjs.org/@react-types/checkbox/-/checkbox-3.9.4.tgz",
+ "integrity": "sha512-fU3Q1Nw+zbXKm68ba8V7cQzpiX0rIiAUKrBTl2BK97QiTlGBDvMCf4TfEuaNoGbJq+gx+X3n/3yr6c3IAb0ZIg==",
"license": "Apache-2.0",
"dependencies": {
- "@react-types/shared": "^3.29.0"
+ "@react-types/shared": "^3.29.1"
},
"peerDependencies": {
"react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
}
},
"node_modules/@react-types/color": {
- "version": "3.0.4",
- "resolved": "https://registry.npmjs.org/@react-types/color/-/color-3.0.4.tgz",
- "integrity": "sha512-D6Uea8kYGaoZRHgemJ0b0+iXbrvABP8RzsctL8Yp5QVyGgYJDMO8/7eZ3tdtGs/V8Iv+yCzG4yBexPA95i6tEg==",
+ "version": "3.0.5",
+ "resolved": "https://registry.npmjs.org/@react-types/color/-/color-3.0.5.tgz",
+ "integrity": "sha512-72uZ0B3EcaC2DGOpnhwHSVxcvQ3UDNSVR2gVx7PgUCGlEjhnn9i0UErIP8ZzV2RsAvjK6MrGs7ZCwZtl+LxCcg==",
"license": "Apache-2.0",
"dependencies": {
- "@react-types/shared": "^3.29.0",
- "@react-types/slider": "^3.7.10"
+ "@react-types/shared": "^3.29.1",
+ "@react-types/slider": "^3.7.11"
},
"peerDependencies": {
"react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
}
},
"node_modules/@react-types/combobox": {
- "version": "3.13.4",
- "resolved": "https://registry.npmjs.org/@react-types/combobox/-/combobox-3.13.4.tgz",
- "integrity": "sha512-4mX7eZ/Bv3YWzEzLEZAF/TfKM+I+SCsvnm/cHqOJq3jEE8aVU1ql4Q1+3+SvciX3pfFIfeKlu9S3oYKRT5WIgg==",
+ "version": "3.13.5",
+ "resolved": "https://registry.npmjs.org/@react-types/combobox/-/combobox-3.13.5.tgz",
+ "integrity": "sha512-wqHBF0YDkrp4Ylyxpd3xhnDECe5eao27bsu+4AvjlVKtaxaoppNq2MwSzkuSSS/GEUXT6K9DDjrGFcp07ad5gA==",
"license": "Apache-2.0",
"dependencies": {
- "@react-types/shared": "^3.29.0"
+ "@react-types/shared": "^3.29.1"
},
"peerDependencies": {
"react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
}
},
"node_modules/@react-types/contextualhelp": {
- "version": "3.2.17",
- "resolved": "https://registry.npmjs.org/@react-types/contextualhelp/-/contextualhelp-3.2.17.tgz",
- "integrity": "sha512-Ivz9rldBIS6wtjg18nXGjD8qcZ6c3mbZaxYkW+3csbTHhuGNtg+F7Gb78SVO3VCFl8BHFsQ3z1w2Pzn7hO2frw==",
+ "version": "3.2.18",
+ "resolved": "https://registry.npmjs.org/@react-types/contextualhelp/-/contextualhelp-3.2.18.tgz",
+ "integrity": "sha512-s0EHe0i57XO+Am7MdlRYNshv0K/zT0liQHoAcRR0I3xzViASf5N7YCGLLoIlWQDRYUB09KBMDsZT2zSZmsxTHA==",
"license": "Apache-2.0",
"dependencies": {
- "@react-types/overlays": "^3.8.14",
- "@react-types/shared": "^3.29.0"
+ "@react-types/overlays": "^3.8.15",
+ "@react-types/shared": "^3.29.1"
},
"peerDependencies": {
"react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
}
},
"node_modules/@react-types/datepicker": {
- "version": "3.12.0",
- "resolved": "https://registry.npmjs.org/@react-types/datepicker/-/datepicker-3.12.0.tgz",
- "integrity": "sha512-dw/xflOdQPQ3uEABaBrZRTvjsMRu5/VZjRx9ygc64sX2N7HKIt+foMPXKJ+1jhtki2p4gigNVjcnJndJHoj9SA==",
+ "version": "3.12.1",
+ "resolved": "https://registry.npmjs.org/@react-types/datepicker/-/datepicker-3.12.1.tgz",
+ "integrity": "sha512-+wv57fVd6Y/+KnHNEmVzfrQtWs85Ga1Xb63AIkBk+E294aMqFYqRg0dQds6V/qrP758TWnXUrhKza1zMbjHalw==",
"license": "Apache-2.0",
"dependencies": {
- "@internationalized/date": "^3.8.0",
- "@react-types/calendar": "^3.7.0",
- "@react-types/overlays": "^3.8.14",
- "@react-types/shared": "^3.29.0"
+ "@internationalized/date": "^3.8.1",
+ "@react-types/calendar": "^3.7.1",
+ "@react-types/overlays": "^3.8.15",
+ "@react-types/shared": "^3.29.1"
},
"peerDependencies": {
"react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
}
},
"node_modules/@react-types/dialog": {
- "version": "3.5.17",
- "resolved": "https://registry.npmjs.org/@react-types/dialog/-/dialog-3.5.17.tgz",
- "integrity": "sha512-rKe2WrT272xuCH13euegBGjJAORYXJpHsX2hlu/f02TmMG4nSLss9vKBnY2N7k7nci65k5wDTW6lcsvQ4Co5zQ==",
+ "version": "3.5.18",
+ "resolved": "https://registry.npmjs.org/@react-types/dialog/-/dialog-3.5.18.tgz",
+ "integrity": "sha512-g18CzT5xmiX/numpS6MrOGEGln8Xp9rr+zO70Dg+jM4GBOjXZp3BeclYQr9uisxGaj2uFLnORv9gNMMKxLNF6A==",
"license": "Apache-2.0",
"dependencies": {
- "@react-types/overlays": "^3.8.14",
- "@react-types/shared": "^3.29.0"
+ "@react-types/overlays": "^3.8.15",
+ "@react-types/shared": "^3.29.1"
},
"peerDependencies": {
"react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
}
},
"node_modules/@react-types/divider": {
- "version": "3.3.16",
- "resolved": "https://registry.npmjs.org/@react-types/divider/-/divider-3.3.16.tgz",
- "integrity": "sha512-+AFFTHjwi0S7zHV6jfP9KJEdDr2lhnt9Oq2dystCerQzOzL+jfSxGIG0ao6X1o/C8Vfm8MIskXuKEO6FsZCQiA==",
+ "version": "3.3.17",
+ "resolved": "https://registry.npmjs.org/@react-types/divider/-/divider-3.3.17.tgz",
+ "integrity": "sha512-lY/JuKmsgK9wdClbM7aN7FZ554g7RF9vXOqjyNS+j+OBnaXJWymevYHrFs7H+e92gY2yYAqeg6UUy0quYbteUg==",
"license": "Apache-2.0",
"dependencies": {
- "@react-types/shared": "^3.29.0"
+ "@react-types/shared": "^3.29.1"
},
"peerDependencies": {
"react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
}
},
"node_modules/@react-types/form": {
- "version": "3.7.11",
- "resolved": "https://registry.npmjs.org/@react-types/form/-/form-3.7.11.tgz",
- "integrity": "sha512-umqy2Kvg3ooJi+Wqun95tKbKN51gtNt9s7OFLdwCtfWa6GvHFOixSjqAvZbo+m5qC3X/1kMIz3Dg698l0/+oLQ==",
+ "version": "3.7.12",
+ "resolved": "https://registry.npmjs.org/@react-types/form/-/form-3.7.12.tgz",
+ "integrity": "sha512-EZ6jZDa9FbLmqvukrLoUp3LUEVE0ZnBB5H6MHhE+QmjYRAvtWljx70xOqnn7sHweuS4+O1kDt1Ec1X5DU+U+BA==",
"license": "Apache-2.0",
"dependencies": {
- "@react-types/shared": "^3.29.0"
+ "@react-types/shared": "^3.29.1"
},
"peerDependencies": {
"react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
}
},
"node_modules/@react-types/grid": {
- "version": "3.3.1",
- "resolved": "https://registry.npmjs.org/@react-types/grid/-/grid-3.3.1.tgz",
- "integrity": "sha512-bPDckheJiHSIzSeSkLqrO6rXRLWvciFJr9rpCjq/+wBj6HsLh2iMpkB/SqmRHTGpPlJvlu0b7AlxK1FYE0QSKA==",
+ "version": "3.3.2",
+ "resolved": "https://registry.npmjs.org/@react-types/grid/-/grid-3.3.2.tgz",
+ "integrity": "sha512-NwfydUbPc1zVi/Rp7+oRN2+vE1xMokc2J+nr0VcHwFGt1bR1psakHu45Pk/t763BDvPr/A3xIHc1rk3eWEhxJw==",
"license": "Apache-2.0",
"dependencies": {
- "@react-types/shared": "^3.29.0"
+ "@react-types/shared": "^3.29.1"
},
"peerDependencies": {
"react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
}
},
"node_modules/@react-types/illustratedmessage": {
- "version": "3.3.16",
- "resolved": "https://registry.npmjs.org/@react-types/illustratedmessage/-/illustratedmessage-3.3.16.tgz",
- "integrity": "sha512-VBRshJAWlaZToS/0HqA7v9EDEgS+Qie+O8TwfQ1KSBoLZa2LK6uHCDJHSrJFDR7E3ymlEfe9dCuX8aPDY+Zvyw==",
+ "version": "3.3.17",
+ "resolved": "https://registry.npmjs.org/@react-types/illustratedmessage/-/illustratedmessage-3.3.17.tgz",
+ "integrity": "sha512-8A9yfJJijoAoBhw/HQXPep9lNt6w/h/JU3sL1he9N2K8OzLgf2Jr6Cw1DN18jTjwyR6RFmoCrX4s0W3BhAD/vQ==",
"license": "Apache-2.0",
"dependencies": {
- "@react-types/shared": "^3.29.0"
+ "@react-types/shared": "^3.29.1"
},
"peerDependencies": {
"react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
}
},
"node_modules/@react-types/image": {
- "version": "3.4.8",
- "resolved": "https://registry.npmjs.org/@react-types/image/-/image-3.4.8.tgz",
- "integrity": "sha512-BgQNAMX2Qb2ZS9QyRIeHyd859q8sIbl3cBq/0IY/p6CB5/UpzbRh5XwfZVwmB40pTR0QshnDjL2jhI9ZXGMiMg==",
+ "version": "3.4.9",
+ "resolved": "https://registry.npmjs.org/@react-types/image/-/image-3.4.9.tgz",
+ "integrity": "sha512-2Pj936Iztygs6DPQLZIWr9itVrEU4iyytISjbeW+O+3DTUmYXxEfpWMo1btyNeEV1qI2GSMwU6Zm5biHk6G23Q==",
"license": "Apache-2.0",
"dependencies": {
- "@react-types/shared": "^3.29.0"
+ "@react-types/shared": "^3.29.1"
},
"peerDependencies": {
"react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
}
},
"node_modules/@react-types/label": {
- "version": "3.9.10",
- "resolved": "https://registry.npmjs.org/@react-types/label/-/label-3.9.10.tgz",
- "integrity": "sha512-SvtwvlbXAdD1ry7Y2/v0lw7SZ6ToIsjRxYbVTcsg0BA6eKBuiID9CLyEWgfDoI0G9Sy9w2FHNrPxQGKwaUldWw==",
+ "version": "3.9.11",
+ "resolved": "https://registry.npmjs.org/@react-types/label/-/label-3.9.11.tgz",
+ "integrity": "sha512-1xmF7cyCLPTvRJQbF+1BkfnCCz4j7cepr5elmwRUYXgzLGgZKQftt81zbzohFgTX/vJxW4VQrYqUg3ZjdbvJnA==",
"license": "Apache-2.0",
"dependencies": {
- "@react-types/shared": "^3.29.0"
+ "@react-types/shared": "^3.29.1"
},
"peerDependencies": {
"react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
}
},
"node_modules/@react-types/layout": {
- "version": "3.3.22",
- "resolved": "https://registry.npmjs.org/@react-types/layout/-/layout-3.3.22.tgz",
- "integrity": "sha512-l1D/gatBc2qNz5hyty48uXG/zfBjEYDml0hHrHrIGXX7ZgNofAw1bVm/nw+HojSuJrtDGHj3z7xouzjLsgkcRw==",
+ "version": "3.3.23",
+ "resolved": "https://registry.npmjs.org/@react-types/layout/-/layout-3.3.23.tgz",
+ "integrity": "sha512-LNp4ABsmTv6Zv3eW8NrUMRvS+uQEi3C6O7EtiSzNOCc42CU36lc6H9ReqVLzm/MkGn4gENq2aJiaMsiS/xdFyA==",
"license": "Apache-2.0",
"dependencies": {
- "@react-types/shared": "^3.29.0"
+ "@react-types/shared": "^3.29.1"
},
"peerDependencies": {
"react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
}
},
"node_modules/@react-types/link": {
- "version": "3.6.0",
- "resolved": "https://registry.npmjs.org/@react-types/link/-/link-3.6.0.tgz",
- "integrity": "sha512-BQ5Tktb+fUxvtqksAJZuP8Z/bpmnQ/Y/zgwxfU0OKmIWkKMUsXY+e0GBVxwFxeh39D77stpVxRsTl7NQrjgtSw==",
+ "version": "3.6.1",
+ "resolved": "https://registry.npmjs.org/@react-types/link/-/link-3.6.1.tgz",
+ "integrity": "sha512-IZDSc10AuVKe7V8Te+3q8d220oANE4N43iljQe3yHg7GZOfH/51bv8FPUukreLs1t2fgtGeNAzG71Ep+j/jXIw==",
"license": "Apache-2.0",
"dependencies": {
- "@react-types/shared": "^3.29.0"
+ "@react-types/shared": "^3.29.1"
},
"peerDependencies": {
"react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
}
},
"node_modules/@react-types/listbox": {
- "version": "3.6.0",
- "resolved": "https://registry.npmjs.org/@react-types/listbox/-/listbox-3.6.0.tgz",
- "integrity": "sha512-+1ugDKTxson/WNOQZO4BfrnQ6cGDt+72mEytXMsSsd4aEC+x3RyUv6NKwdOl4n602cOreo0MHtap1X2BOACVoQ==",
+ "version": "3.7.0",
+ "resolved": "https://registry.npmjs.org/@react-types/listbox/-/listbox-3.7.0.tgz",
+ "integrity": "sha512-26Lp0Gou502VJLDSrIpMg7LQuVHznxzyuSY/zzyNX9eopukXvHn682u90fwDqgmZz7dzxUOWtuwDea+bp/UjtA==",
"license": "Apache-2.0",
"dependencies": {
- "@react-types/shared": "^3.29.0"
+ "@react-types/shared": "^3.29.1"
},
"peerDependencies": {
"react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
}
},
"node_modules/@react-types/menu": {
- "version": "3.10.0",
- "resolved": "https://registry.npmjs.org/@react-types/menu/-/menu-3.10.0.tgz",
- "integrity": "sha512-DKMqEmUmarVCK0jblNkSlzSH53AAsxWCX9RaKZeP9EnRs2/l1oZRuiQVHlOQRgYwEigAXa2TrwcX4nnxZ+U36Q==",
+ "version": "3.10.1",
+ "resolved": "https://registry.npmjs.org/@react-types/menu/-/menu-3.10.1.tgz",
+ "integrity": "sha512-wkyWzIqaCbUYiD7YXr8YvdimB1bxQHqgj6uE4MKzryCbVqb4L8fRUM0V6AHkQS1TxBYNkNn1h4g7XNd5Vmyf3Q==",
"license": "Apache-2.0",
"dependencies": {
- "@react-types/overlays": "^3.8.14",
- "@react-types/shared": "^3.29.0"
+ "@react-types/overlays": "^3.8.15",
+ "@react-types/shared": "^3.29.1"
},
"peerDependencies": {
"react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
}
},
"node_modules/@react-types/meter": {
- "version": "3.4.8",
- "resolved": "https://registry.npmjs.org/@react-types/meter/-/meter-3.4.8.tgz",
- "integrity": "sha512-uXmHdUDbAo7L3EkytrUrU6DLOFUt63s9QSTcDp+vwyWoshY4/4Dm4JARdmhJU2ZP1nb2Sy45ASeMvSBw3ia2oA==",
+ "version": "3.4.9",
+ "resolved": "https://registry.npmjs.org/@react-types/meter/-/meter-3.4.9.tgz",
+ "integrity": "sha512-Jhd873zc/Bx/86NB9nasMUWc013VnURVtMYbbkuRWiFr/ZoEvZzO1uoSIXf+Sob4xpiVhT/ltvJZTK4t4B9lTg==",
"license": "Apache-2.0",
"dependencies": {
- "@react-types/progress": "^3.5.11"
+ "@react-types/progress": "^3.5.12"
},
"peerDependencies": {
"react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
}
},
"node_modules/@react-types/numberfield": {
- "version": "3.8.10",
- "resolved": "https://registry.npmjs.org/@react-types/numberfield/-/numberfield-3.8.10.tgz",
- "integrity": "sha512-mdb4lMC4skO8Eqd0GeU4lJgDTEvqIhtINB5WCzLVZFrFVuxgWDoU5otsu0lbWhCnUA7XWQxupGI//TC1LLppjQ==",
+ "version": "3.8.11",
+ "resolved": "https://registry.npmjs.org/@react-types/numberfield/-/numberfield-3.8.11.tgz",
+ "integrity": "sha512-D66Bop7M3JKzBV2vsECsVYfPrx8eRIx4/K2KLo/XjwMA7C34+Ou07f/bnD1TQQ/wr6XwiFxZTi6JsKDwnST+9Q==",
"license": "Apache-2.0",
"dependencies": {
- "@react-types/shared": "^3.29.0"
+ "@react-types/shared": "^3.29.1"
},
"peerDependencies": {
"react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
}
},
"node_modules/@react-types/overlays": {
- "version": "3.8.14",
- "resolved": "https://registry.npmjs.org/@react-types/overlays/-/overlays-3.8.14.tgz",
- "integrity": "sha512-XJS67KHYhdMvPNHXNGdmc85gE+29QT5TwC58V4kxxHVtQh9fYzEEPzIV8K84XWSz04rRGe3fjDgRNbcqBektWQ==",
+ "version": "3.8.15",
+ "resolved": "https://registry.npmjs.org/@react-types/overlays/-/overlays-3.8.15.tgz",
+ "integrity": "sha512-ppDfezvVYOJDHLZmTSmIXajxAo30l2a1jjy4G65uBYy8J8kTZU7mcfQql5Pii1TwybcNMsayf2WtPItiWmJnOA==",
"license": "Apache-2.0",
"dependencies": {
- "@react-types/shared": "^3.29.0"
+ "@react-types/shared": "^3.29.1"
},
"peerDependencies": {
"react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
}
},
"node_modules/@react-types/progress": {
- "version": "3.5.11",
- "resolved": "https://registry.npmjs.org/@react-types/progress/-/progress-3.5.11.tgz",
- "integrity": "sha512-CysuMld/lycOckrnlvrlsVoJysDPeBnUYBChwtqwiv4ZNRXos+wgAL1ows6dl7Nr57/FH5B4v5gf9AHEo7jUvw==",
+ "version": "3.5.12",
+ "resolved": "https://registry.npmjs.org/@react-types/progress/-/progress-3.5.12.tgz",
+ "integrity": "sha512-wvhFz6vdlfKBtnzKvD/89N+0PF3yPQ+IVFRQvZ2TBrP7nF+ZA2pNLcZVcEYbKjHzmvEZRGu//ePC9hRJD9K30w==",
"license": "Apache-2.0",
"dependencies": {
- "@react-types/shared": "^3.29.0"
+ "@react-types/shared": "^3.29.1"
},
"peerDependencies": {
"react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
}
},
"node_modules/@react-types/provider": {
- "version": "3.8.8",
- "resolved": "https://registry.npmjs.org/@react-types/provider/-/provider-3.8.8.tgz",
- "integrity": "sha512-uyNeHvZ1huiNpCfGhaHUGQzw9TfacjM0axmUm6Us5usfMGa/rtLzSeuF0KSlTJtgbqQDdmzDxJGUaMUzVWGAog==",
+ "version": "3.8.9",
+ "resolved": "https://registry.npmjs.org/@react-types/provider/-/provider-3.8.9.tgz",
+ "integrity": "sha512-qICEEMc3LROYwbvDguxdftP2/XFQKKh8jVP1X1v8Q12T28FD5/O64bX/VT4T5PUkC+lpSEa59iQWKfDwSBqnBw==",
"license": "Apache-2.0",
"dependencies": {
- "@react-types/shared": "^3.29.0"
+ "@react-types/shared": "^3.29.1"
},
"peerDependencies": {
"react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
}
},
"node_modules/@react-types/radio": {
- "version": "3.8.8",
- "resolved": "https://registry.npmjs.org/@react-types/radio/-/radio-3.8.8.tgz",
- "integrity": "sha512-QfAIp+0CnRSnoRTJVXUEPi+9AvFvRzWLIKEnE9OmgXjuvJCU3QNiwd8NWjNeE+94QBEVvAZQcqGU+44q5poxNg==",
+ "version": "3.8.9",
+ "resolved": "https://registry.npmjs.org/@react-types/radio/-/radio-3.8.9.tgz",
+ "integrity": "sha512-l4uzlxmGGuR8IkWrMYdKj1sc3Pgo/LdfEGuIgK+d8kjPu0AZcnSgp5Oz035bCosZUabY6dEWxQHIoAH2zN7YZA==",
"license": "Apache-2.0",
"dependencies": {
- "@react-types/shared": "^3.29.0"
+ "@react-types/shared": "^3.29.1"
},
"peerDependencies": {
"react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
}
},
"node_modules/@react-types/searchfield": {
- "version": "3.6.1",
- "resolved": "https://registry.npmjs.org/@react-types/searchfield/-/searchfield-3.6.1.tgz",
- "integrity": "sha512-XR4tYktxHxGJufpO0MTAPknIbmN5eZqXCZwTdBS4tecihf9iGDsXmrBOs+M7LEnil67GaZcFrMhKxOMVpLwZAg==",
+ "version": "3.6.2",
+ "resolved": "https://registry.npmjs.org/@react-types/searchfield/-/searchfield-3.6.2.tgz",
+ "integrity": "sha512-XQRQyJLNC9uLyCq+97eiqeQuM6+dCMrHu6aH6KSVt1Xh6HMmdx/TdSf6JrMkN+1xSxcW3lDE2iSf3jXDT87gag==",
"license": "Apache-2.0",
"dependencies": {
- "@react-types/shared": "^3.29.0",
- "@react-types/textfield": "^3.12.1"
+ "@react-types/shared": "^3.29.1",
+ "@react-types/textfield": "^3.12.2"
},
"peerDependencies": {
"react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
}
},
"node_modules/@react-types/select": {
- "version": "3.9.11",
- "resolved": "https://registry.npmjs.org/@react-types/select/-/select-3.9.11.tgz",
- "integrity": "sha512-uEpQCgDlrq/5fW05FgNEsqsqpvZVKfHQO9Mp7OTqGtm4UBNAbcQ6hOV7MJwQCS25Lu2luzOYdgqDUN8eAATJVQ==",
+ "version": "3.9.12",
+ "resolved": "https://registry.npmjs.org/@react-types/select/-/select-3.9.12.tgz",
+ "integrity": "sha512-qo+9JS1kfMxuibmSmMp0faGKbeVftYnSk1f7Rh5PKi4tzMe3C0A9IAr27hUOfWeJMBOdetaoTpYmoXW6+CgW3g==",
"license": "Apache-2.0",
"dependencies": {
- "@react-types/shared": "^3.29.0"
+ "@react-types/shared": "^3.29.1"
},
"peerDependencies": {
"react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
}
},
"node_modules/@react-types/shared": {
- "version": "3.29.0",
- "resolved": "https://registry.npmjs.org/@react-types/shared/-/shared-3.29.0.tgz",
- "integrity": "sha512-IDQYu/AHgZimObzCFdNl1LpZvQW/xcfLt3v20sorl5qRucDVj4S9os98sVTZ4IRIBjmS+MkjqpR5E70xan7ooA==",
+ "version": "3.29.1",
+ "resolved": "https://registry.npmjs.org/@react-types/shared/-/shared-3.29.1.tgz",
+ "integrity": "sha512-KtM+cDf2CXoUX439rfEhbnEdAgFZX20UP2A35ypNIawR7/PFFPjQDWyA2EnClCcW/dLWJDEPX2U8+EJff8xqmQ==",
"license": "Apache-2.0",
"peerDependencies": {
"react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
}
},
"node_modules/@react-types/slider": {
- "version": "3.7.10",
- "resolved": "https://registry.npmjs.org/@react-types/slider/-/slider-3.7.10.tgz",
- "integrity": "sha512-Yb8wbpu2gS7AwvJUuz0IdZBRi6eIBZq32BSss4UHX0StA8dtR1/K4JeTsArxwiA3P0BA6t0gbR6wzxCvVA9fRw==",
+ "version": "3.7.11",
+ "resolved": "https://registry.npmjs.org/@react-types/slider/-/slider-3.7.11.tgz",
+ "integrity": "sha512-uNhNLhVrt/2teXBOJSoZXyXg308A72qe1HOmlGdJcnh8iXA35y5ZHzeK1P6ZOJ37Aeh7bYGm3/UdURmFgSlW7w==",
"license": "Apache-2.0",
"dependencies": {
- "@react-types/shared": "^3.29.0"
+ "@react-types/shared": "^3.29.1"
},
"peerDependencies": {
"react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
}
},
"node_modules/@react-types/statuslight": {
- "version": "3.3.16",
- "resolved": "https://registry.npmjs.org/@react-types/statuslight/-/statuslight-3.3.16.tgz",
- "integrity": "sha512-fplsmW7Y22da9bA7YkSamSUSTDcARBto9mxJelePLe+xZocOoWSYGOfr3fwaPU+MbLn7HzMRSd/NH7woWTUfgQ==",
+ "version": "3.3.17",
+ "resolved": "https://registry.npmjs.org/@react-types/statuslight/-/statuslight-3.3.17.tgz",
+ "integrity": "sha512-yEbmo3kbkTotyNkWS2RqZpCjnCxlEzL2QHwJTnBb2fzeRrANS7l8wJtpjquSmzvBMKGe8Iuv9JAq9cg97eNbmQ==",
"license": "Apache-2.0",
"dependencies": {
- "@react-types/shared": "^3.29.0"
+ "@react-types/shared": "^3.29.1"
},
"peerDependencies": {
"react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
}
},
"node_modules/@react-types/switch": {
- "version": "3.5.10",
- "resolved": "https://registry.npmjs.org/@react-types/switch/-/switch-3.5.10.tgz",
- "integrity": "sha512-YyNhx4CvuJ0Rvv7yMuQaqQuOIeg+NwLV00NHHJ+K0xEANSLcICLOLPNMOqRIqLSQDz5vDI705UKk8gVcxqPX5g==",
+ "version": "3.5.11",
+ "resolved": "https://registry.npmjs.org/@react-types/switch/-/switch-3.5.11.tgz",
+ "integrity": "sha512-PJbZHwlE98OSuLzI6b1ei6Qa+FaiwlCRH3tOTdx/wPSdqmD3mRWEn7E9ftM6FC8hnxl/LrGLszQMT62yEQp5vQ==",
"license": "Apache-2.0",
"dependencies": {
- "@react-types/shared": "^3.29.0"
+ "@react-types/shared": "^3.29.1"
},
"peerDependencies": {
"react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
}
},
"node_modules/@react-types/table": {
- "version": "3.12.0",
- "resolved": "https://registry.npmjs.org/@react-types/table/-/table-3.12.0.tgz",
- "integrity": "sha512-dmTzjCYwHf2HBOeTa/CEL177Aox0f0mkeLF5nQw/2z6SBolfmYoAwVTPxTaYFVu4MkEJxQTz9AuAsJvCbRJbhg==",
+ "version": "3.13.0",
+ "resolved": "https://registry.npmjs.org/@react-types/table/-/table-3.13.0.tgz",
+ "integrity": "sha512-kn+OsEWJfUSSb4N4J0yl+tqx5grDpcaWcu2J8hA62hQCr/Leuj946ScYaKA9a/p0MAaOAaeCWx/Zcss6F8gJIQ==",
"license": "Apache-2.0",
"dependencies": {
- "@react-types/grid": "^3.3.1",
- "@react-types/shared": "^3.29.0"
+ "@react-types/grid": "^3.3.2",
+ "@react-types/shared": "^3.29.1"
},
"peerDependencies": {
"react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
}
},
"node_modules/@react-types/tabs": {
- "version": "3.3.14",
- "resolved": "https://registry.npmjs.org/@react-types/tabs/-/tabs-3.3.14.tgz",
- "integrity": "sha512-/uKsA7L2dctKU0JEaBWerlX+3BoXpKUFr3kHpRUoH66DSGvAo34vZ7kv/BHMZifJenIbF04GhDBsGp1zjrQKBg==",
+ "version": "3.3.15",
+ "resolved": "https://registry.npmjs.org/@react-types/tabs/-/tabs-3.3.15.tgz",
+ "integrity": "sha512-VLgh9YLQdS4FQSk0sGTNHEVN2jeC0fZvOqEFHaEDgDyDgVOukxYuHjqVIx2IavYu1yNBrGO2b6P4M6dF+hcgwQ==",
"license": "Apache-2.0",
"dependencies": {
- "@react-types/shared": "^3.29.0"
+ "@react-types/shared": "^3.29.1"
},
"peerDependencies": {
"react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
}
},
"node_modules/@react-types/text": {
- "version": "3.3.16",
- "resolved": "https://registry.npmjs.org/@react-types/text/-/text-3.3.16.tgz",
- "integrity": "sha512-jOVv8ICp2lg2y6yf2WuQ6Klb1XU+JNoz85NAn/AwbwIHUapfy+pUvfLlYxWTWVaNXo4cTJLg5SlGQuYdi4mZqw==",
+ "version": "3.3.17",
+ "resolved": "https://registry.npmjs.org/@react-types/text/-/text-3.3.17.tgz",
+ "integrity": "sha512-D9rNmzrRpAqqvuu3s5APvFhA8p8ftjFQQ9blwjS46bGQpwy3lUEgeAE86/x7sif8YI9FrEjCORj6Wu0IY8yl1A==",
"license": "Apache-2.0",
"dependencies": {
- "@react-types/shared": "^3.29.0"
+ "@react-types/shared": "^3.29.1"
},
"peerDependencies": {
"react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
}
},
"node_modules/@react-types/textfield": {
- "version": "3.12.1",
- "resolved": "https://registry.npmjs.org/@react-types/textfield/-/textfield-3.12.1.tgz",
- "integrity": "sha512-6YTAMCKjEGuXg0A4bZA77j5QJ1a6yFviMUWsCIL6Dxq5K3TklzVsbAduSbHomPPuvkNTBSW4+TUJrVSnoTjMNA==",
+ "version": "3.12.2",
+ "resolved": "https://registry.npmjs.org/@react-types/textfield/-/textfield-3.12.2.tgz",
+ "integrity": "sha512-dMm0cGLG5bkJYvt6lqXIty5HXTZjuIpa9I8jAIYua//J8tESAOE9BA285Zl43kx7cZGtgrHKHVFjITDLNUrNhA==",
"license": "Apache-2.0",
"dependencies": {
- "@react-types/shared": "^3.29.0"
+ "@react-types/shared": "^3.29.1"
},
"peerDependencies": {
"react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
}
},
"node_modules/@react-types/tooltip": {
- "version": "3.4.16",
- "resolved": "https://registry.npmjs.org/@react-types/tooltip/-/tooltip-3.4.16.tgz",
- "integrity": "sha512-XEyKeqR3YxqJcR0cpigLGEBeRTEzrB0cu++IaADdqXJ8dBzS6s8y9EgR5UvKZmX1CQOBvMfXyYkj7nmJ039fOw==",
+ "version": "3.4.17",
+ "resolved": "https://registry.npmjs.org/@react-types/tooltip/-/tooltip-3.4.17.tgz",
+ "integrity": "sha512-yjySKA1uzJAbio+xGv03DUoWIajteqtsXMd4Y3AJEdBFqSYhXbyrgAxw0oJDgRAgRxY4Rx5Hrhvbt/z7Di94QQ==",
"license": "Apache-2.0",
"dependencies": {
- "@react-types/overlays": "^3.8.14",
- "@react-types/shared": "^3.29.0"
+ "@react-types/overlays": "^3.8.15",
+ "@react-types/shared": "^3.29.1"
},
"peerDependencies": {
"react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
}
},
"node_modules/@react-types/view": {
- "version": "3.4.16",
- "resolved": "https://registry.npmjs.org/@react-types/view/-/view-3.4.16.tgz",
- "integrity": "sha512-ks82kEs0aUV42q5SJDNgc6ASJzb+byTkaNq4pZsG6DuX1QJyvc+23QDzFh5gS42qyEIzc1gGXq3QbzOIygdGJg==",
+ "version": "3.4.17",
+ "resolved": "https://registry.npmjs.org/@react-types/view/-/view-3.4.17.tgz",
+ "integrity": "sha512-QskgWmEOm5zMRSQwyjwxHDDBivnNzdh4/dADUQlYtObsWnnrTL/U7DA5mSZEmYiaRCQ1xwHvxTUsRUPXyJOcIw==",
"license": "Apache-2.0",
"dependencies": {
- "@react-types/shared": "^3.29.0"
+ "@react-types/shared": "^3.29.1"
},
"peerDependencies": {
"react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
}
},
"node_modules/@react-types/well": {
- "version": "3.3.16",
- "resolved": "https://registry.npmjs.org/@react-types/well/-/well-3.3.16.tgz",
- "integrity": "sha512-3Y3svGsiABaMfeaFRwNA4T+mvVekDJAEVbAQ2ErZxRnzdJFGSGKwkrrHjK3vWxnCYWBsIGv2SXYGHV4xcah8yg==",
+ "version": "3.3.17",
+ "resolved": "https://registry.npmjs.org/@react-types/well/-/well-3.3.17.tgz",
+ "integrity": "sha512-ZJJ7f3mJe2xTMUBCnig3b6OlUGx+TxK1EH/miO5PjhI486o1tUb+ZKjQqTUM11DpIifMcKfHHCwjIIO5oNZOJA==",
"license": "Apache-2.0",
"dependencies": {
- "@react-types/shared": "^3.29.0"
+ "@react-types/shared": "^3.29.1"
},
"peerDependencies": {
"react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
@@ -9958,12 +10009,12 @@
}
},
"node_modules/@smithy/abort-controller": {
- "version": "4.0.2",
- "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-4.0.2.tgz",
- "integrity": "sha512-Sl/78VDtgqKxN2+1qduaVE140XF+Xg+TafkncspwM4jFP/LHr76ZHmIY/y3V1M0mMLNk+Je6IGbzxy23RSToMw==",
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-4.0.3.tgz",
+ "integrity": "sha512-AqXFf6DXnuRBXy4SoK/n1mfgHaKaq36bmkphmD1KO0nHq6xK/g9KHSW4HEsPQUBCGdIEfuJifGHwxFXPIFay9Q==",
"license": "Apache-2.0",
"dependencies": {
- "@smithy/types": "^4.2.0",
+ "@smithy/types": "^4.3.0",
"tslib": "^2.6.2"
},
"engines": {
@@ -9971,15 +10022,15 @@
}
},
"node_modules/@smithy/config-resolver": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/@smithy/config-resolver/-/config-resolver-4.1.0.tgz",
- "integrity": "sha512-8smPlwhga22pwl23fM5ew4T9vfLUCeFXlcqNOCD5M5h8VmNPNUE9j6bQSuRXpDSV11L/E/SwEBQuW8hr6+nS1A==",
+ "version": "4.1.3",
+ "resolved": "https://registry.npmjs.org/@smithy/config-resolver/-/config-resolver-4.1.3.tgz",
+ "integrity": "sha512-N5e7ofiyYDmHxnPnqF8L4KtsbSDwyxFRfDK9bp1d9OyPO4ytRLd0/XxCqi5xVaaqB65v4woW8uey6jND6zxzxQ==",
"license": "Apache-2.0",
"dependencies": {
- "@smithy/node-config-provider": "^4.0.2",
- "@smithy/types": "^4.2.0",
+ "@smithy/node-config-provider": "^4.1.2",
+ "@smithy/types": "^4.3.0",
"@smithy/util-config-provider": "^4.0.0",
- "@smithy/util-middleware": "^4.0.2",
+ "@smithy/util-middleware": "^4.0.3",
"tslib": "^2.6.2"
},
"engines": {
@@ -9987,17 +10038,17 @@
}
},
"node_modules/@smithy/core": {
- "version": "3.2.0",
- "resolved": "https://registry.npmjs.org/@smithy/core/-/core-3.2.0.tgz",
- "integrity": "sha512-k17bgQhVZ7YmUvA8at4af1TDpl0NDMBuBKJl8Yg0nrefwmValU+CnA5l/AriVdQNthU/33H3nK71HrLgqOPr1Q==",
+ "version": "3.4.0",
+ "resolved": "https://registry.npmjs.org/@smithy/core/-/core-3.4.0.tgz",
+ "integrity": "sha512-dDYISQo7k0Ml/rXlFIjkTmTcQze/LxhtIRAEmZ6HJ/EI0inVxVEVnrUXJ7jPx6ZP0GHUhFm40iQcCgS5apXIXA==",
"license": "Apache-2.0",
"dependencies": {
- "@smithy/middleware-serde": "^4.0.3",
- "@smithy/protocol-http": "^5.1.0",
- "@smithy/types": "^4.2.0",
+ "@smithy/middleware-serde": "^4.0.6",
+ "@smithy/protocol-http": "^5.1.1",
+ "@smithy/types": "^4.3.0",
"@smithy/util-body-length-browser": "^4.0.0",
- "@smithy/util-middleware": "^4.0.2",
- "@smithy/util-stream": "^4.2.0",
+ "@smithy/util-middleware": "^4.0.3",
+ "@smithy/util-stream": "^4.2.1",
"@smithy/util-utf8": "^4.0.0",
"tslib": "^2.6.2"
},
@@ -10006,15 +10057,15 @@
}
},
"node_modules/@smithy/credential-provider-imds": {
- "version": "4.0.2",
- "resolved": "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-4.0.2.tgz",
- "integrity": "sha512-32lVig6jCaWBHnY+OEQ6e6Vnt5vDHaLiydGrwYMW9tPqO688hPGTYRamYJ1EptxEC2rAwJrHWmPoKRBl4iTa8w==",
+ "version": "4.0.5",
+ "resolved": "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-4.0.5.tgz",
+ "integrity": "sha512-saEAGwrIlkb9XxX/m5S5hOtzjoJPEK6Qw2f9pYTbIsMPOFyGSXBBTw95WbOyru8A1vIS2jVCCU1Qhz50QWG3IA==",
"license": "Apache-2.0",
"dependencies": {
- "@smithy/node-config-provider": "^4.0.2",
- "@smithy/property-provider": "^4.0.2",
- "@smithy/types": "^4.2.0",
- "@smithy/url-parser": "^4.0.2",
+ "@smithy/node-config-provider": "^4.1.2",
+ "@smithy/property-provider": "^4.0.3",
+ "@smithy/types": "^4.3.0",
+ "@smithy/url-parser": "^4.0.3",
"tslib": "^2.6.2"
},
"engines": {
@@ -10058,14 +10109,14 @@
}
},
"node_modules/@smithy/fetch-http-handler": {
- "version": "5.0.2",
- "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-5.0.2.tgz",
- "integrity": "sha512-+9Dz8sakS9pe7f2cBocpJXdeVjMopUDLgZs1yWeu7h++WqSbjUYv/JAJwKwXw1HV6gq1jyWjxuyn24E2GhoEcQ==",
+ "version": "5.0.3",
+ "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-5.0.3.tgz",
+ "integrity": "sha512-yBZwavI31roqTndNI7ONHqesfH01JmjJK6L3uUpZAhyAmr86LN5QiPzfyZGIxQmed8VEK2NRSQT3/JX5V1njfQ==",
"license": "Apache-2.0",
"dependencies": {
- "@smithy/protocol-http": "^5.1.0",
- "@smithy/querystring-builder": "^4.0.2",
- "@smithy/types": "^4.2.0",
+ "@smithy/protocol-http": "^5.1.1",
+ "@smithy/querystring-builder": "^4.0.3",
+ "@smithy/types": "^4.3.0",
"@smithy/util-base64": "^4.0.0",
"tslib": "^2.6.2"
},
@@ -10074,12 +10125,12 @@
}
},
"node_modules/@smithy/hash-node": {
- "version": "4.0.2",
- "resolved": "https://registry.npmjs.org/@smithy/hash-node/-/hash-node-4.0.2.tgz",
- "integrity": "sha512-VnTpYPnRUE7yVhWozFdlxcYknv9UN7CeOqSrMH+V877v4oqtVYuoqhIhtSjmGPvYrYnAkaM61sLMKHvxL138yg==",
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/@smithy/hash-node/-/hash-node-4.0.3.tgz",
+ "integrity": "sha512-W5Uhy6v/aYrgtjh9y0YP332gIQcwccQ+EcfWhllL0B9rPae42JngTTUpb8W6wuxaNFzqps4xq5klHckSSOy5fw==",
"license": "Apache-2.0",
"dependencies": {
- "@smithy/types": "^4.2.0",
+ "@smithy/types": "^4.3.0",
"@smithy/util-buffer-from": "^4.0.0",
"@smithy/util-utf8": "^4.0.0",
"tslib": "^2.6.2"
@@ -10089,12 +10140,12 @@
}
},
"node_modules/@smithy/invalid-dependency": {
- "version": "4.0.2",
- "resolved": "https://registry.npmjs.org/@smithy/invalid-dependency/-/invalid-dependency-4.0.2.tgz",
- "integrity": "sha512-GatB4+2DTpgWPday+mnUkoumP54u/MDM/5u44KF9hIu8jF0uafZtQLcdfIKkIcUNuF/fBojpLEHZS/56JqPeXQ==",
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/@smithy/invalid-dependency/-/invalid-dependency-4.0.3.tgz",
+ "integrity": "sha512-1Bo8Ur1ZGqxvwTqBmv6DZEn0rXtwJGeqiiO2/JFcCtz3nBakOqeXbJBElXJMMzd0ghe8+eB6Dkw98nMYctgizg==",
"license": "Apache-2.0",
"dependencies": {
- "@smithy/types": "^4.2.0",
+ "@smithy/types": "^4.3.0",
"tslib": "^2.6.2"
},
"engines": {
@@ -10114,13 +10165,13 @@
}
},
"node_modules/@smithy/middleware-content-length": {
- "version": "4.0.2",
- "resolved": "https://registry.npmjs.org/@smithy/middleware-content-length/-/middleware-content-length-4.0.2.tgz",
- "integrity": "sha512-hAfEXm1zU+ELvucxqQ7I8SszwQ4znWMbNv6PLMndN83JJN41EPuS93AIyh2N+gJ6x8QFhzSO6b7q2e6oClDI8A==",
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/@smithy/middleware-content-length/-/middleware-content-length-4.0.3.tgz",
+ "integrity": "sha512-NE/Zph4BP5u16bzYq2csq9qD0T6UBLeg4AuNrwNJ7Gv9uLYaGEgelZUOdRndGdMGcUfSGvNlXGb2aA2hPCwJ6g==",
"license": "Apache-2.0",
"dependencies": {
- "@smithy/protocol-http": "^5.1.0",
- "@smithy/types": "^4.2.0",
+ "@smithy/protocol-http": "^5.1.1",
+ "@smithy/types": "^4.3.0",
"tslib": "^2.6.2"
},
"engines": {
@@ -10128,18 +10179,18 @@
}
},
"node_modules/@smithy/middleware-endpoint": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-4.1.0.tgz",
- "integrity": "sha512-xhLimgNCbCzsUppRTGXWkZywksuTThxaIB0HwbpsVLY5sceac4e1TZ/WKYqufQLaUy+gUSJGNdwD2jo3cXL0iA==",
+ "version": "4.1.7",
+ "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-4.1.7.tgz",
+ "integrity": "sha512-KDzM7Iajo6K7eIWNNtukykRT4eWwlHjCEsULZUaSfi/SRSBK8BPRqG5FsVfp58lUxcvre8GT8AIPIqndA0ERKw==",
"license": "Apache-2.0",
"dependencies": {
- "@smithy/core": "^3.2.0",
- "@smithy/middleware-serde": "^4.0.3",
- "@smithy/node-config-provider": "^4.0.2",
- "@smithy/shared-ini-file-loader": "^4.0.2",
- "@smithy/types": "^4.2.0",
- "@smithy/url-parser": "^4.0.2",
- "@smithy/util-middleware": "^4.0.2",
+ "@smithy/core": "^3.4.0",
+ "@smithy/middleware-serde": "^4.0.6",
+ "@smithy/node-config-provider": "^4.1.2",
+ "@smithy/shared-ini-file-loader": "^4.0.3",
+ "@smithy/types": "^4.3.0",
+ "@smithy/url-parser": "^4.0.3",
+ "@smithy/util-middleware": "^4.0.3",
"tslib": "^2.6.2"
},
"engines": {
@@ -10147,18 +10198,18 @@
}
},
"node_modules/@smithy/middleware-retry": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-4.1.0.tgz",
- "integrity": "sha512-2zAagd1s6hAaI/ap6SXi5T3dDwBOczOMCSkkYzktqN1+tzbk1GAsHNAdo/1uzxz3Ky02jvZQwbi/vmDA6z4Oyg==",
- "license": "Apache-2.0",
- "dependencies": {
- "@smithy/node-config-provider": "^4.0.2",
- "@smithy/protocol-http": "^5.1.0",
- "@smithy/service-error-classification": "^4.0.2",
- "@smithy/smithy-client": "^4.2.0",
- "@smithy/types": "^4.2.0",
- "@smithy/util-middleware": "^4.0.2",
- "@smithy/util-retry": "^4.0.2",
+ "version": "4.1.8",
+ "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-4.1.8.tgz",
+ "integrity": "sha512-e2OtQgFzzlSG0uCjcJmi02QuFSRTrpT11Eh2EcqqDFy7DYriteHZJkkf+4AsxsrGDugAtPFcWBz1aq06sSX5fQ==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@smithy/node-config-provider": "^4.1.2",
+ "@smithy/protocol-http": "^5.1.1",
+ "@smithy/service-error-classification": "^4.0.4",
+ "@smithy/smithy-client": "^4.3.0",
+ "@smithy/types": "^4.3.0",
+ "@smithy/util-middleware": "^4.0.3",
+ "@smithy/util-retry": "^4.0.4",
"tslib": "^2.6.2",
"uuid": "^9.0.1"
},
@@ -10180,12 +10231,13 @@
}
},
"node_modules/@smithy/middleware-serde": {
- "version": "4.0.3",
- "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-4.0.3.tgz",
- "integrity": "sha512-rfgDVrgLEVMmMn0BI8O+8OVr6vXzjV7HZj57l0QxslhzbvVfikZbVfBVthjLHqib4BW44QhcIgJpvebHlRaC9A==",
+ "version": "4.0.6",
+ "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-4.0.6.tgz",
+ "integrity": "sha512-YECyl7uNII+jCr/9qEmCu8xYL79cU0fqjo0qxpcVIU18dAPHam/iYwcknAu4Jiyw1uN+sAx7/SMf/Kmef/Jjsg==",
"license": "Apache-2.0",
"dependencies": {
- "@smithy/types": "^4.2.0",
+ "@smithy/protocol-http": "^5.1.1",
+ "@smithy/types": "^4.3.0",
"tslib": "^2.6.2"
},
"engines": {
@@ -10193,12 +10245,12 @@
}
},
"node_modules/@smithy/middleware-stack": {
- "version": "4.0.2",
- "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-4.0.2.tgz",
- "integrity": "sha512-eSPVcuJJGVYrFYu2hEq8g8WWdJav3sdrI4o2c6z/rjnYDd3xH9j9E7deZQCzFn4QvGPouLngH3dQ+QVTxv5bOQ==",
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-4.0.3.tgz",
+ "integrity": "sha512-baeV7t4jQfQtFxBADFmnhmqBmqR38dNU5cvEgHcMK/Kp3D3bEI0CouoX2Sr/rGuntR+Eg0IjXdxnGGTc6SbIkw==",
"license": "Apache-2.0",
"dependencies": {
- "@smithy/types": "^4.2.0",
+ "@smithy/types": "^4.3.0",
"tslib": "^2.6.2"
},
"engines": {
@@ -10206,14 +10258,14 @@
}
},
"node_modules/@smithy/node-config-provider": {
- "version": "4.0.2",
- "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-4.0.2.tgz",
- "integrity": "sha512-WgCkILRZfJwJ4Da92a6t3ozN/zcvYyJGUTmfGbgS/FkCcoCjl7G4FJaCDN1ySdvLvemnQeo25FdkyMSTSwulsw==",
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-4.1.2.tgz",
+ "integrity": "sha512-SUvNup8iU1v7fmM8XPk+27m36udmGCfSz+VZP5Gb0aJ3Ne0X28K/25gnsrg3X1rWlhcnhzNUUysKW/Ied46ivQ==",
"license": "Apache-2.0",
"dependencies": {
- "@smithy/property-provider": "^4.0.2",
- "@smithy/shared-ini-file-loader": "^4.0.2",
- "@smithy/types": "^4.2.0",
+ "@smithy/property-provider": "^4.0.3",
+ "@smithy/shared-ini-file-loader": "^4.0.3",
+ "@smithy/types": "^4.3.0",
"tslib": "^2.6.2"
},
"engines": {
@@ -10221,15 +10273,15 @@
}
},
"node_modules/@smithy/node-http-handler": {
- "version": "4.0.4",
- "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-4.0.4.tgz",
- "integrity": "sha512-/mdqabuAT3o/ihBGjL94PUbTSPSRJ0eeVTdgADzow0wRJ0rN4A27EOrtlK56MYiO1fDvlO3jVTCxQtQmK9dZ1g==",
+ "version": "4.0.5",
+ "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-4.0.5.tgz",
+ "integrity": "sha512-T7QglZC1vS7SPT44/1qSIAQEx5bFKb3LfO6zw/o4Xzt1eC5HNoH1TkS4lMYA9cWFbacUhx4hRl/blLun4EOCkg==",
"license": "Apache-2.0",
"dependencies": {
- "@smithy/abort-controller": "^4.0.2",
- "@smithy/protocol-http": "^5.1.0",
- "@smithy/querystring-builder": "^4.0.2",
- "@smithy/types": "^4.2.0",
+ "@smithy/abort-controller": "^4.0.3",
+ "@smithy/protocol-http": "^5.1.1",
+ "@smithy/querystring-builder": "^4.0.3",
+ "@smithy/types": "^4.3.0",
"tslib": "^2.6.2"
},
"engines": {
@@ -10237,12 +10289,12 @@
}
},
"node_modules/@smithy/property-provider": {
- "version": "4.0.2",
- "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-4.0.2.tgz",
- "integrity": "sha512-wNRoQC1uISOuNc2s4hkOYwYllmiyrvVXWMtq+TysNRVQaHm4yoafYQyjN/goYZS+QbYlPIbb/QRjaUZMuzwQ7A==",
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-4.0.3.tgz",
+ "integrity": "sha512-Wcn17QNdawJZcZZPBuMuzyBENVi1AXl4TdE0jvzo4vWX2x5df/oMlmr/9M5XAAC6+yae4kWZlOYIsNsgDrMU9A==",
"license": "Apache-2.0",
"dependencies": {
- "@smithy/types": "^4.2.0",
+ "@smithy/types": "^4.3.0",
"tslib": "^2.6.2"
},
"engines": {
@@ -10250,12 +10302,12 @@
}
},
"node_modules/@smithy/protocol-http": {
- "version": "5.1.0",
- "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-5.1.0.tgz",
- "integrity": "sha512-KxAOL1nUNw2JTYrtviRRjEnykIDhxc84qMBzxvu1MUfQfHTuBlCG7PA6EdVwqpJjH7glw7FqQoFxUJSyBQgu7g==",
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-5.1.1.tgz",
+ "integrity": "sha512-Vsay2mzq05DwNi9jK01yCFtfvu9HimmgC7a4HTs7lhX12Sx8aWsH0mfz6q/02yspSp+lOB+Q2HJwi4IV2GKz7A==",
"license": "Apache-2.0",
"dependencies": {
- "@smithy/types": "^4.2.0",
+ "@smithy/types": "^4.3.0",
"tslib": "^2.6.2"
},
"engines": {
@@ -10263,12 +10315,12 @@
}
},
"node_modules/@smithy/querystring-builder": {
- "version": "4.0.2",
- "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-4.0.2.tgz",
- "integrity": "sha512-NTOs0FwHw1vimmQM4ebh+wFQvOwkEf/kQL6bSM1Lock+Bv4I89B3hGYoUEPkmvYPkDKyp5UdXJYu+PoTQ3T31Q==",
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-4.0.3.tgz",
+ "integrity": "sha512-UUzIWMVfPmDZcOutk2/r1vURZqavvQW0OHvgsyNV0cKupChvqg+/NKPRMaMEe+i8tP96IthMFeZOZWpV+E4RAw==",
"license": "Apache-2.0",
"dependencies": {
- "@smithy/types": "^4.2.0",
+ "@smithy/types": "^4.3.0",
"@smithy/util-uri-escape": "^4.0.0",
"tslib": "^2.6.2"
},
@@ -10277,12 +10329,12 @@
}
},
"node_modules/@smithy/querystring-parser": {
- "version": "4.0.2",
- "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-4.0.2.tgz",
- "integrity": "sha512-v6w8wnmZcVXjfVLjxw8qF7OwESD9wnpjp0Dqry/Pod0/5vcEA3qxCr+BhbOHlxS8O+29eLpT3aagxXGwIoEk7Q==",
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-4.0.3.tgz",
+ "integrity": "sha512-K5M4ZJQpFCblOJ5Oyw7diICpFg1qhhR47m2/5Ef1PhGE19RaIZf50tjYFrxa6usqcuXyTiFPGo4d1geZdH4YcQ==",
"license": "Apache-2.0",
"dependencies": {
- "@smithy/types": "^4.2.0",
+ "@smithy/types": "^4.3.0",
"tslib": "^2.6.2"
},
"engines": {
@@ -10290,24 +10342,24 @@
}
},
"node_modules/@smithy/service-error-classification": {
- "version": "4.0.2",
- "resolved": "https://registry.npmjs.org/@smithy/service-error-classification/-/service-error-classification-4.0.2.tgz",
- "integrity": "sha512-LA86xeFpTKn270Hbkixqs5n73S+LVM0/VZco8dqd+JT75Dyx3Lcw/MraL7ybjmz786+160K8rPOmhsq0SocoJQ==",
+ "version": "4.0.4",
+ "resolved": "https://registry.npmjs.org/@smithy/service-error-classification/-/service-error-classification-4.0.4.tgz",
+ "integrity": "sha512-W5ScbQ1bTzgH91kNEE2CvOzM4gXlDOqdow4m8vMFSIXCel2scbHwjflpVNnC60Y3F1m5i7w2gQg9lSnR+JsJAA==",
"license": "Apache-2.0",
"dependencies": {
- "@smithy/types": "^4.2.0"
+ "@smithy/types": "^4.3.0"
},
"engines": {
"node": ">=18.0.0"
}
},
"node_modules/@smithy/shared-ini-file-loader": {
- "version": "4.0.2",
- "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-4.0.2.tgz",
- "integrity": "sha512-J9/gTWBGVuFZ01oVA6vdb4DAjf1XbDhK6sLsu3OS9qmLrS6KB5ygpeHiM3miIbj1qgSJ96GYszXFWv6ErJ8QEw==",
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-4.0.3.tgz",
+ "integrity": "sha512-vHwlrqhZGIoLwaH8vvIjpHnloShqdJ7SUPNM2EQtEox+yEDFTVQ7E+DLZ+6OhnYEgFUwPByJyz6UZaOu2tny6A==",
"license": "Apache-2.0",
"dependencies": {
- "@smithy/types": "^4.2.0",
+ "@smithy/types": "^4.3.0",
"tslib": "^2.6.2"
},
"engines": {
@@ -10315,16 +10367,16 @@
}
},
"node_modules/@smithy/signature-v4": {
- "version": "5.0.2",
- "resolved": "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-5.0.2.tgz",
- "integrity": "sha512-Mz+mc7okA73Lyz8zQKJNyr7lIcHLiPYp0+oiqiMNc/t7/Kf2BENs5d63pEj7oPqdjaum6g0Fc8wC78dY1TgtXw==",
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-5.1.1.tgz",
+ "integrity": "sha512-zy8Repr5zvT0ja+Tf5wjV/Ba6vRrhdiDcp/ww6cvqYbSEudIkziDe3uppNRlFoCViyJXdPnLcwyZdDLA4CHzSg==",
"license": "Apache-2.0",
"dependencies": {
"@smithy/is-array-buffer": "^4.0.0",
- "@smithy/protocol-http": "^5.1.0",
- "@smithy/types": "^4.2.0",
+ "@smithy/protocol-http": "^5.1.1",
+ "@smithy/types": "^4.3.0",
"@smithy/util-hex-encoding": "^4.0.0",
- "@smithy/util-middleware": "^4.0.2",
+ "@smithy/util-middleware": "^4.0.3",
"@smithy/util-uri-escape": "^4.0.0",
"@smithy/util-utf8": "^4.0.0",
"tslib": "^2.6.2"
@@ -10334,17 +10386,17 @@
}
},
"node_modules/@smithy/smithy-client": {
- "version": "4.2.0",
- "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-4.2.0.tgz",
- "integrity": "sha512-Qs65/w30pWV7LSFAez9DKy0Koaoh3iHhpcpCCJ4waj/iqwsuSzJna2+vYwq46yBaqO5ZbP9TjUsATUNxrKeBdw==",
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-4.3.0.tgz",
+ "integrity": "sha512-DNsRA38pN6tYHUjebmwD9e4KcgqTLldYQb2gC6K+oxXYdCTxPn6wV9+FvOa6wrU2FQEnGJoi+3GULzOTKck/tg==",
"license": "Apache-2.0",
"dependencies": {
- "@smithy/core": "^3.2.0",
- "@smithy/middleware-endpoint": "^4.1.0",
- "@smithy/middleware-stack": "^4.0.2",
- "@smithy/protocol-http": "^5.1.0",
- "@smithy/types": "^4.2.0",
- "@smithy/util-stream": "^4.2.0",
+ "@smithy/core": "^3.4.0",
+ "@smithy/middleware-endpoint": "^4.1.7",
+ "@smithy/middleware-stack": "^4.0.3",
+ "@smithy/protocol-http": "^5.1.1",
+ "@smithy/types": "^4.3.0",
+ "@smithy/util-stream": "^4.2.1",
"tslib": "^2.6.2"
},
"engines": {
@@ -10352,9 +10404,9 @@
}
},
"node_modules/@smithy/types": {
- "version": "4.2.0",
- "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.2.0.tgz",
- "integrity": "sha512-7eMk09zQKCO+E/ivsjQv+fDlOupcFUCSC/L2YUPgwhvowVGWbPQHjEFcmjt7QQ4ra5lyowS92SV53Zc6XD4+fg==",
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.3.0.tgz",
+ "integrity": "sha512-+1iaIQHthDh9yaLhRzaoQxRk+l9xlk+JjMFxGRhNLz+m9vKOkjNeU8QuB4w3xvzHyVR/BVlp/4AXDHjoRIkfgQ==",
"license": "Apache-2.0",
"dependencies": {
"tslib": "^2.6.2"
@@ -10364,13 +10416,13 @@
}
},
"node_modules/@smithy/url-parser": {
- "version": "4.0.2",
- "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-4.0.2.tgz",
- "integrity": "sha512-Bm8n3j2ScqnT+kJaClSVCMeiSenK6jVAzZCNewsYWuZtnBehEz4r2qP0riZySZVfzB+03XZHJeqfmJDkeeSLiQ==",
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-4.0.3.tgz",
+ "integrity": "sha512-n5/DnosDu/tweOqUUNtUbu7eRIR4J/Wz9nL7V5kFYQQVb8VYdj7a4G5NJHCw6o21ul7CvZoJkOpdTnsQDLT0tQ==",
"license": "Apache-2.0",
"dependencies": {
- "@smithy/querystring-parser": "^4.0.2",
- "@smithy/types": "^4.2.0",
+ "@smithy/querystring-parser": "^4.0.3",
+ "@smithy/types": "^4.3.0",
"tslib": "^2.6.2"
},
"engines": {
@@ -10441,14 +10493,14 @@
}
},
"node_modules/@smithy/util-defaults-mode-browser": {
- "version": "4.0.8",
- "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-4.0.8.tgz",
- "integrity": "sha512-ZTypzBra+lI/LfTYZeop9UjoJhhGRTg3pxrNpfSTQLd3AJ37r2z4AXTKpq1rFXiiUIJsYyFgNJdjWRGP/cbBaQ==",
+ "version": "4.0.15",
+ "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-4.0.15.tgz",
+ "integrity": "sha512-bJJ/B8owQbHAflatSq92f9OcV8858DJBQF1Y3GRjB8psLyUjbISywszYPFw16beREHO/C3I3taW4VGH+tOuwrQ==",
"license": "Apache-2.0",
"dependencies": {
- "@smithy/property-provider": "^4.0.2",
- "@smithy/smithy-client": "^4.2.0",
- "@smithy/types": "^4.2.0",
+ "@smithy/property-provider": "^4.0.3",
+ "@smithy/smithy-client": "^4.3.0",
+ "@smithy/types": "^4.3.0",
"bowser": "^2.11.0",
"tslib": "^2.6.2"
},
@@ -10457,17 +10509,17 @@
}
},
"node_modules/@smithy/util-defaults-mode-node": {
- "version": "4.0.8",
- "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-4.0.8.tgz",
- "integrity": "sha512-Rgk0Jc/UDfRTzVthye/k2dDsz5Xxs9LZaKCNPgJTRyoyBoeiNCnHsYGOyu1PKN+sDyPnJzMOz22JbwxzBp9NNA==",
+ "version": "4.0.15",
+ "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-4.0.15.tgz",
+ "integrity": "sha512-8CUrEW2Ni5q+NmYkj8wsgkfqoP7l4ZquptFbq92yQE66xevc4SxqP2zH6tMtN158kgBqBDsZ+qlrRwXWOjCR8A==",
"license": "Apache-2.0",
"dependencies": {
- "@smithy/config-resolver": "^4.1.0",
- "@smithy/credential-provider-imds": "^4.0.2",
- "@smithy/node-config-provider": "^4.0.2",
- "@smithy/property-provider": "^4.0.2",
- "@smithy/smithy-client": "^4.2.0",
- "@smithy/types": "^4.2.0",
+ "@smithy/config-resolver": "^4.1.3",
+ "@smithy/credential-provider-imds": "^4.0.5",
+ "@smithy/node-config-provider": "^4.1.2",
+ "@smithy/property-provider": "^4.0.3",
+ "@smithy/smithy-client": "^4.3.0",
+ "@smithy/types": "^4.3.0",
"tslib": "^2.6.2"
},
"engines": {
@@ -10475,13 +10527,13 @@
}
},
"node_modules/@smithy/util-endpoints": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/@smithy/util-endpoints/-/util-endpoints-3.0.2.tgz",
- "integrity": "sha512-6QSutU5ZyrpNbnd51zRTL7goojlcnuOB55+F9VBD+j8JpRY50IGamsjlycrmpn8PQkmJucFW8A0LSfXj7jjtLQ==",
+ "version": "3.0.5",
+ "resolved": "https://registry.npmjs.org/@smithy/util-endpoints/-/util-endpoints-3.0.5.tgz",
+ "integrity": "sha512-PjDpqLk24/vAl340tmtCA++Q01GRRNH9cwL9qh46NspAX9S+IQVcK+GOzPt0GLJ6KYGyn8uOgo2kvJhiThclJw==",
"license": "Apache-2.0",
"dependencies": {
- "@smithy/node-config-provider": "^4.0.2",
- "@smithy/types": "^4.2.0",
+ "@smithy/node-config-provider": "^4.1.2",
+ "@smithy/types": "^4.3.0",
"tslib": "^2.6.2"
},
"engines": {
@@ -10501,12 +10553,12 @@
}
},
"node_modules/@smithy/util-middleware": {
- "version": "4.0.2",
- "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-4.0.2.tgz",
- "integrity": "sha512-6GDamTGLuBQVAEuQ4yDQ+ti/YINf/MEmIegrEeg7DdB/sld8BX1lqt9RRuIcABOhAGTA50bRbPzErez7SlDtDQ==",
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-4.0.3.tgz",
+ "integrity": "sha512-iIsC6qZXxkD7V3BzTw3b1uK8RVC1M8WvwNxK1PKrH9FnxntCd30CSunXjL/8iJBE8Z0J14r2P69njwIpRG4FBQ==",
"license": "Apache-2.0",
"dependencies": {
- "@smithy/types": "^4.2.0",
+ "@smithy/types": "^4.3.0",
"tslib": "^2.6.2"
},
"engines": {
@@ -10514,13 +10566,13 @@
}
},
"node_modules/@smithy/util-retry": {
- "version": "4.0.2",
- "resolved": "https://registry.npmjs.org/@smithy/util-retry/-/util-retry-4.0.2.tgz",
- "integrity": "sha512-Qryc+QG+7BCpvjloFLQrmlSd0RsVRHejRXd78jNO3+oREueCjwG1CCEH1vduw/ZkM1U9TztwIKVIi3+8MJScGg==",
+ "version": "4.0.4",
+ "resolved": "https://registry.npmjs.org/@smithy/util-retry/-/util-retry-4.0.4.tgz",
+ "integrity": "sha512-Aoqr9W2jDYGrI6OxljN8VmLDQIGO4VdMAUKMf9RGqLG8hn6or+K41NEy1Y5dtum9q8F7e0obYAuKl2mt/GnpZg==",
"license": "Apache-2.0",
"dependencies": {
- "@smithy/service-error-classification": "^4.0.2",
- "@smithy/types": "^4.2.0",
+ "@smithy/service-error-classification": "^4.0.4",
+ "@smithy/types": "^4.3.0",
"tslib": "^2.6.2"
},
"engines": {
@@ -10528,14 +10580,14 @@
}
},
"node_modules/@smithy/util-stream": {
- "version": "4.2.0",
- "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-4.2.0.tgz",
- "integrity": "sha512-Vj1TtwWnuWqdgQI6YTUF5hQ/0jmFiOYsc51CSMgj7QfyO+RF4EnT2HNjoviNlOOmgzgvf3f5yno+EiC4vrnaWQ==",
+ "version": "4.2.1",
+ "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-4.2.1.tgz",
+ "integrity": "sha512-W3IR0x5DY6iVtjj5p902oNhD+Bz7vs5S+p6tppbPa509rV9BdeXZjGuRSCtVEad9FA0Mba+tNUtUmtnSI1nwUw==",
"license": "Apache-2.0",
"dependencies": {
- "@smithy/fetch-http-handler": "^5.0.2",
- "@smithy/node-http-handler": "^4.0.4",
- "@smithy/types": "^4.2.0",
+ "@smithy/fetch-http-handler": "^5.0.3",
+ "@smithy/node-http-handler": "^4.0.5",
+ "@smithy/types": "^4.3.0",
"@smithy/util-base64": "^4.0.0",
"@smithy/util-buffer-from": "^4.0.0",
"@smithy/util-hex-encoding": "^4.0.0",
@@ -10572,13 +10624,13 @@
}
},
"node_modules/@smithy/util-waiter": {
- "version": "4.0.3",
- "resolved": "https://registry.npmjs.org/@smithy/util-waiter/-/util-waiter-4.0.3.tgz",
- "integrity": "sha512-JtaY3FxmD+te+KSI2FJuEcfNC9T/DGGVf551babM7fAaXhjJUt7oSYurH1Devxd2+BOSUACCgt3buinx4UnmEA==",
+ "version": "4.0.4",
+ "resolved": "https://registry.npmjs.org/@smithy/util-waiter/-/util-waiter-4.0.4.tgz",
+ "integrity": "sha512-73aeIvHjtSB6fd9I08iFaQIGTICKpLrI3EtlWAkStVENGo1ARMq9qdoD4QwkY0RUp6A409xlgbD9NCCfCF5ieg==",
"license": "Apache-2.0",
"dependencies": {
- "@smithy/abort-controller": "^4.0.2",
- "@smithy/types": "^4.2.0",
+ "@smithy/abort-controller": "^4.0.3",
+ "@smithy/types": "^4.3.0",
"tslib": "^2.6.2"
},
"engines": {
@@ -10592,13 +10644,13 @@
"license": "MIT"
},
"node_modules/@spectrum-icons/ui": {
- "version": "3.6.15",
- "resolved": "https://registry.npmjs.org/@spectrum-icons/ui/-/ui-3.6.15.tgz",
- "integrity": "sha512-Xozzn7/jwPHs6hy7OfJ5idAz5J00mBKDv7lfvIQ7glNIrbuOo7ekhn02vDXKnGpklKFPql+bVbtUWDQdBW3jaw==",
+ "version": "3.6.16",
+ "resolved": "https://registry.npmjs.org/@spectrum-icons/ui/-/ui-3.6.16.tgz",
+ "integrity": "sha512-5rWG5Tbd0WvBE+vls586n3iqzXkdLpd3g5bPJe9el9m/U9/Ag4epNsNoTL8IoDWFD6P7yjWyEL66UU0ojwKWOw==",
"license": "Apache-2.0",
"dependencies": {
"@adobe/react-spectrum-ui": "1.2.1",
- "@react-spectrum/icon": "^3.8.4",
+ "@react-spectrum/icon": "^3.8.5",
"@swc/helpers": "^0.5.0"
},
"peerDependencies": {
@@ -10608,13 +10660,13 @@
}
},
"node_modules/@spectrum-icons/workflow": {
- "version": "4.2.20",
- "resolved": "https://registry.npmjs.org/@spectrum-icons/workflow/-/workflow-4.2.20.tgz",
- "integrity": "sha512-asNZ7TouEteIj9n9CQXe9e6H/bYF3bKB5fPsarTesdpwqrU3WU+eMGWUWGmgyG59hmxMigo2vQwQCVOWXEdSew==",
+ "version": "4.2.21",
+ "resolved": "https://registry.npmjs.org/@spectrum-icons/workflow/-/workflow-4.2.21.tgz",
+ "integrity": "sha512-PojyoIKHnAwOVM84IkZnxI0WSM+r9qw6mppPmy5dnUCXNetuK9SAejG7QFRXP7ERi45wy19XLWvot9/uTM2BsQ==",
"license": "Apache-2.0",
"dependencies": {
"@adobe/react-spectrum-workflow": "2.3.5",
- "@react-spectrum/icon": "^3.8.4",
+ "@react-spectrum/icon": "^3.8.5",
"@swc/helpers": "^0.5.0"
},
"peerDependencies": {
@@ -10624,9 +10676,9 @@
}
},
"node_modules/@storybook/addon-actions": {
- "version": "8.6.12",
- "resolved": "https://registry.npmjs.org/@storybook/addon-actions/-/addon-actions-8.6.12.tgz",
- "integrity": "sha512-B5kfiRvi35oJ0NIo53CGH66H471A3XTzrfaa6SxXEJsgxxSeKScG5YeXcCvLiZfvANRQ7QDsmzPUgg0o3hdMXw==",
+ "version": "8.6.14",
+ "resolved": "https://registry.npmjs.org/@storybook/addon-actions/-/addon-actions-8.6.14.tgz",
+ "integrity": "sha512-mDQxylxGGCQSK7tJPkD144J8jWh9IU9ziJMHfB84PKpI/V5ZgqMDnpr2bssTrUaGDqU5e1/z8KcRF+Melhs9pQ==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -10641,7 +10693,7 @@
"url": "https://opencollective.com/storybook"
},
"peerDependencies": {
- "storybook": "^8.6.12"
+ "storybook": "^8.6.14"
}
},
"node_modules/@storybook/addon-actions/node_modules/@types/uuid": {
@@ -10666,9 +10718,9 @@
}
},
"node_modules/@storybook/addon-backgrounds": {
- "version": "8.6.12",
- "resolved": "https://registry.npmjs.org/@storybook/addon-backgrounds/-/addon-backgrounds-8.6.12.tgz",
- "integrity": "sha512-lmIAma9BiiCTbJ8YfdZkXjpnAIrOUcgboLkt1f6XJ78vNEMnLNzD9gnh7Tssz1qrqvm34v9daDjIb+ggdiKp3Q==",
+ "version": "8.6.14",
+ "resolved": "https://registry.npmjs.org/@storybook/addon-backgrounds/-/addon-backgrounds-8.6.14.tgz",
+ "integrity": "sha512-l9xS8qWe5n4tvMwth09QxH2PmJbCctEvBAc1tjjRasAfrd69f7/uFK4WhwJAstzBTNgTc8VXI4w8ZR97i1sFbg==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -10681,13 +10733,13 @@
"url": "https://opencollective.com/storybook"
},
"peerDependencies": {
- "storybook": "^8.6.12"
+ "storybook": "^8.6.14"
}
},
"node_modules/@storybook/addon-controls": {
- "version": "8.6.12",
- "resolved": "https://registry.npmjs.org/@storybook/addon-controls/-/addon-controls-8.6.12.tgz",
- "integrity": "sha512-9VSRPJWQVb9wLp21uvpxDGNctYptyUX0gbvxIWOHMH3R2DslSoq41lsC/oQ4l4zSHVdL+nq8sCTkhBxIsjKqdQ==",
+ "version": "8.6.14",
+ "resolved": "https://registry.npmjs.org/@storybook/addon-controls/-/addon-controls-8.6.14.tgz",
+ "integrity": "sha512-IiQpkNJdiRyA4Mq9mzjZlvQugL/aE7hNgVxBBGPiIZG6wb6Ht9hNnBYpap5ZXXFKV9p2qVI0FZK445ONmAa+Cw==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -10700,20 +10752,20 @@
"url": "https://opencollective.com/storybook"
},
"peerDependencies": {
- "storybook": "^8.6.12"
+ "storybook": "^8.6.14"
}
},
"node_modules/@storybook/addon-docs": {
- "version": "8.6.12",
- "resolved": "https://registry.npmjs.org/@storybook/addon-docs/-/addon-docs-8.6.12.tgz",
- "integrity": "sha512-kEezQjAf/p3SpDzLABgg4fbT48B6dkT2LiZCKTRmCrJVtuReaAr4R9MMM6Jsph6XjbIj/SvOWf3CMeOPXOs9sg==",
+ "version": "8.6.14",
+ "resolved": "https://registry.npmjs.org/@storybook/addon-docs/-/addon-docs-8.6.14.tgz",
+ "integrity": "sha512-Obpd0OhAF99JyU5pp5ci17YmpcQtMNgqW2pTXV8jAiiipWpwO++hNDeQmLmlSXB399XjtRDOcDVkoc7rc6JzdQ==",
"dev": true,
"license": "MIT",
"dependencies": {
"@mdx-js/react": "^3.0.0",
- "@storybook/blocks": "8.6.12",
- "@storybook/csf-plugin": "8.6.12",
- "@storybook/react-dom-shim": "8.6.12",
+ "@storybook/blocks": "8.6.14",
+ "@storybook/csf-plugin": "8.6.14",
+ "@storybook/react-dom-shim": "8.6.14",
"react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0",
"react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0",
"ts-dedent": "^2.0.0"
@@ -10723,25 +10775,25 @@
"url": "https://opencollective.com/storybook"
},
"peerDependencies": {
- "storybook": "^8.6.12"
+ "storybook": "^8.6.14"
}
},
"node_modules/@storybook/addon-essentials": {
- "version": "8.6.12",
- "resolved": "https://registry.npmjs.org/@storybook/addon-essentials/-/addon-essentials-8.6.12.tgz",
- "integrity": "sha512-Y/7e8KFlttaNfv7q2zoHMPdX6hPXHdsuQMAjYl5NG9HOAJREu4XBy4KZpbcozRe4ApZ78rYsN/MO1EuA+bNMIA==",
+ "version": "8.6.14",
+ "resolved": "https://registry.npmjs.org/@storybook/addon-essentials/-/addon-essentials-8.6.14.tgz",
+ "integrity": "sha512-5ZZSHNaW9mXMOFkoPyc3QkoNGdJHETZydI62/OASR0lmPlJ1065TNigEo5dJddmZNn0/3bkE8eKMAzLnO5eIdA==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@storybook/addon-actions": "8.6.12",
- "@storybook/addon-backgrounds": "8.6.12",
- "@storybook/addon-controls": "8.6.12",
- "@storybook/addon-docs": "8.6.12",
- "@storybook/addon-highlight": "8.6.12",
- "@storybook/addon-measure": "8.6.12",
- "@storybook/addon-outline": "8.6.12",
- "@storybook/addon-toolbars": "8.6.12",
- "@storybook/addon-viewport": "8.6.12",
+ "@storybook/addon-actions": "8.6.14",
+ "@storybook/addon-backgrounds": "8.6.14",
+ "@storybook/addon-controls": "8.6.14",
+ "@storybook/addon-docs": "8.6.14",
+ "@storybook/addon-highlight": "8.6.14",
+ "@storybook/addon-measure": "8.6.14",
+ "@storybook/addon-outline": "8.6.14",
+ "@storybook/addon-toolbars": "8.6.14",
+ "@storybook/addon-viewport": "8.6.14",
"ts-dedent": "^2.0.0"
},
"funding": {
@@ -10749,13 +10801,13 @@
"url": "https://opencollective.com/storybook"
},
"peerDependencies": {
- "storybook": "^8.6.12"
+ "storybook": "^8.6.14"
}
},
"node_modules/@storybook/addon-highlight": {
- "version": "8.6.12",
- "resolved": "https://registry.npmjs.org/@storybook/addon-highlight/-/addon-highlight-8.6.12.tgz",
- "integrity": "sha512-9FITVxdoycZ+eXuAZL9ElWyML/0fPPn9UgnnAkrU7zkMi+Segq/Tx7y+WWanC5zfWZrXAuG6WTOYEXeWQdm//w==",
+ "version": "8.6.14",
+ "resolved": "https://registry.npmjs.org/@storybook/addon-highlight/-/addon-highlight-8.6.14.tgz",
+ "integrity": "sha512-4H19OJlapkofiE9tM6K/vsepf4ir9jMm9T+zw5L85blJZxhKZIbJ6FO0TCG9PDc4iPt3L6+aq5B0X29s9zicNQ==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -10766,19 +10818,19 @@
"url": "https://opencollective.com/storybook"
},
"peerDependencies": {
- "storybook": "^8.6.12"
+ "storybook": "^8.6.14"
}
},
"node_modules/@storybook/addon-interactions": {
- "version": "8.6.12",
- "resolved": "https://registry.npmjs.org/@storybook/addon-interactions/-/addon-interactions-8.6.12.tgz",
- "integrity": "sha512-cTAJlTq6uVZBEbtwdXkXoPQ4jHOAGKQnYSezBT4pfNkdjn/FnEeaQhMBDzf14h2wr5OgBnJa6Lmd8LD9ficz4A==",
+ "version": "8.6.14",
+ "resolved": "https://registry.npmjs.org/@storybook/addon-interactions/-/addon-interactions-8.6.14.tgz",
+ "integrity": "sha512-8VmElhm2XOjh22l/dO4UmXxNOolGhNiSpBcls2pqWSraVh4a670EyYBZsHpkXqfNHo2YgKyZN3C91+9zfH79qQ==",
"dev": true,
"license": "MIT",
"dependencies": {
"@storybook/global": "^5.0.0",
- "@storybook/instrumenter": "8.6.12",
- "@storybook/test": "8.6.12",
+ "@storybook/instrumenter": "8.6.14",
+ "@storybook/test": "8.6.14",
"polished": "^4.2.2",
"ts-dedent": "^2.2.0"
},
@@ -10787,13 +10839,13 @@
"url": "https://opencollective.com/storybook"
},
"peerDependencies": {
- "storybook": "^8.6.12"
+ "storybook": "^8.6.14"
}
},
"node_modules/@storybook/addon-measure": {
- "version": "8.6.12",
- "resolved": "https://registry.npmjs.org/@storybook/addon-measure/-/addon-measure-8.6.12.tgz",
- "integrity": "sha512-tACmwqqOvutaQSduw8SMb62wICaT1rWaHtMN3vtWXuxgDPSdJQxLP+wdVyRYMAgpxhLyIO7YRf++Hfha9RHgFg==",
+ "version": "8.6.14",
+ "resolved": "https://registry.npmjs.org/@storybook/addon-measure/-/addon-measure-8.6.14.tgz",
+ "integrity": "sha512-1Tlyb72NX8aAqm6I6OICsUuGOP6hgnXcuFlXucyhKomPa6j3Eu2vKu561t/f0oGtAK2nO93Z70kVaEh5X+vaGw==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -10805,13 +10857,13 @@
"url": "https://opencollective.com/storybook"
},
"peerDependencies": {
- "storybook": "^8.6.12"
+ "storybook": "^8.6.14"
}
},
"node_modules/@storybook/addon-onboarding": {
- "version": "8.6.12",
- "resolved": "https://registry.npmjs.org/@storybook/addon-onboarding/-/addon-onboarding-8.6.12.tgz",
- "integrity": "sha512-/cgxaLy6tr6xO0+QO+qV5rPZS5/c15Daywvg/F03lifLGkMuyn/JDuhu0J5i1LbFsL1RYdf4sjrTOmLXbOT6+Q==",
+ "version": "8.6.14",
+ "resolved": "https://registry.npmjs.org/@storybook/addon-onboarding/-/addon-onboarding-8.6.14.tgz",
+ "integrity": "sha512-bHdHiGJFigVcSzMIsNLHY5IODZHr+nKwyz5/QOZLMkLcGH2IaUbOJfm4RyGOaTTPsUtAKbdsVXNEG3Otf+qO9A==",
"dev": true,
"license": "MIT",
"funding": {
@@ -10819,13 +10871,13 @@
"url": "https://opencollective.com/storybook"
},
"peerDependencies": {
- "storybook": "^8.6.12"
+ "storybook": "^8.6.14"
}
},
"node_modules/@storybook/addon-outline": {
- "version": "8.6.12",
- "resolved": "https://registry.npmjs.org/@storybook/addon-outline/-/addon-outline-8.6.12.tgz",
- "integrity": "sha512-1ylwm+n1s40S91No0v9T4tCjZORu3GbnjINlyjYTDLLhQHyBQd3nWR1Y1eewU4xH4cW9SnSLcMQFS/82xHqU6A==",
+ "version": "8.6.14",
+ "resolved": "https://registry.npmjs.org/@storybook/addon-outline/-/addon-outline-8.6.14.tgz",
+ "integrity": "sha512-CW857JvN6OxGWElqjlzJO2S69DHf+xO3WsEfT5mT3ZtIjmsvRDukdWfDU9bIYUFyA2lFvYjncBGjbK+I91XR7w==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -10837,7 +10889,7 @@
"url": "https://opencollective.com/storybook"
},
"peerDependencies": {
- "storybook": "^8.6.12"
+ "storybook": "^8.6.14"
}
},
"node_modules/@storybook/addon-styling-webpack": {
@@ -10854,9 +10906,9 @@
}
},
"node_modules/@storybook/addon-toolbars": {
- "version": "8.6.12",
- "resolved": "https://registry.npmjs.org/@storybook/addon-toolbars/-/addon-toolbars-8.6.12.tgz",
- "integrity": "sha512-HEcSzo1DyFtIu5/ikVOmh5h85C1IvK9iFKSzBR6ice33zBOaehVJK+Z5f487MOXxPsZ63uvWUytwPyViGInj+g==",
+ "version": "8.6.14",
+ "resolved": "https://registry.npmjs.org/@storybook/addon-toolbars/-/addon-toolbars-8.6.14.tgz",
+ "integrity": "sha512-W/wEXT8h3VyZTVfWK/84BAcjAxTdtRiAkT2KAN0nbSHxxB5KEM1MjKpKu2upyzzMa3EywITqbfy4dP6lpkVTwQ==",
"dev": true,
"license": "MIT",
"funding": {
@@ -10864,13 +10916,13 @@
"url": "https://opencollective.com/storybook"
},
"peerDependencies": {
- "storybook": "^8.6.12"
+ "storybook": "^8.6.14"
}
},
"node_modules/@storybook/addon-viewport": {
- "version": "8.6.12",
- "resolved": "https://registry.npmjs.org/@storybook/addon-viewport/-/addon-viewport-8.6.12.tgz",
- "integrity": "sha512-EXK2LArAnABsPP0leJKy78L/lbMWow+EIJfytEP5fHaW4EhMR6h7Hzaqzre6U0IMMr/jVFa1ci+m0PJ0eQc2bw==",
+ "version": "8.6.14",
+ "resolved": "https://registry.npmjs.org/@storybook/addon-viewport/-/addon-viewport-8.6.14.tgz",
+ "integrity": "sha512-gNzVQbMqRC+/4uQTPI2ZrWuRHGquTMZpdgB9DrD88VTEjNudP+J6r8myLfr2VvGksBbUMHkGHMXHuIhrBEnXYA==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -10881,7 +10933,7 @@
"url": "https://opencollective.com/storybook"
},
"peerDependencies": {
- "storybook": "^8.6.12"
+ "storybook": "^8.6.14"
}
},
"node_modules/@storybook/addon-webpack5-compiler-swc": {
@@ -10899,9 +10951,9 @@
}
},
"node_modules/@storybook/blocks": {
- "version": "8.6.12",
- "resolved": "https://registry.npmjs.org/@storybook/blocks/-/blocks-8.6.12.tgz",
- "integrity": "sha512-DohlTq6HM1jDbHYiXL4ZvZ00VkhpUp5uftzj/CZDLY1fYHRjqtaTwWm2/OpceivMA8zDitLcq5atEZN+f+siTg==",
+ "version": "8.6.14",
+ "resolved": "https://registry.npmjs.org/@storybook/blocks/-/blocks-8.6.14.tgz",
+ "integrity": "sha512-rBMHAfA39AGHgkrDze4RmsnQTMw1ND5fGWobr9pDcJdnDKWQWNRD7Nrlxj0gFlN3n4D9lEZhWGdFrCbku7FVAQ==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -10915,7 +10967,7 @@
"peerDependencies": {
"react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0",
"react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0",
- "storybook": "^8.6.12"
+ "storybook": "^8.6.14"
},
"peerDependenciesMeta": {
"react": {
@@ -10927,13 +10979,13 @@
}
},
"node_modules/@storybook/builder-webpack5": {
- "version": "8.6.12",
- "resolved": "https://registry.npmjs.org/@storybook/builder-webpack5/-/builder-webpack5-8.6.12.tgz",
- "integrity": "sha512-Z7RsQ/1+HbxdbM69JrEFcTL+pnVKUTMmeURMn5/eOvYTGjBtM18vbQTj0LjCUDIjC+v9U+uX8ZJEUVxFbGcxBw==",
+ "version": "8.6.14",
+ "resolved": "https://registry.npmjs.org/@storybook/builder-webpack5/-/builder-webpack5-8.6.14.tgz",
+ "integrity": "sha512-YZYAqc6NBKoMTKZpjxnkMch6zDtMkBZdS/yaji1+wJX2QPFBwTbSh7SpeBxDp1S11gXSAJ4f1btUWeqSqo8nJA==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@storybook/core-webpack": "8.6.12",
+ "@storybook/core-webpack": "8.6.14",
"@types/semver": "^7.3.4",
"browser-assert": "^1.2.1",
"case-sensitive-paths-webpack-plugin": "^2.4.0",
@@ -10963,7 +11015,7 @@
"url": "https://opencollective.com/storybook"
},
"peerDependencies": {
- "storybook": "^8.6.12"
+ "storybook": "^8.6.14"
},
"peerDependenciesMeta": {
"typescript": {
@@ -11128,9 +11180,9 @@
"license": "MIT"
},
"node_modules/@storybook/builder-webpack5/node_modules/semver": {
- "version": "7.7.1",
- "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz",
- "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==",
+ "version": "7.7.2",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz",
+ "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==",
"dev": true,
"license": "ISC",
"bin": {
@@ -11187,9 +11239,9 @@
}
},
"node_modules/@storybook/components": {
- "version": "8.6.12",
- "resolved": "https://registry.npmjs.org/@storybook/components/-/components-8.6.12.tgz",
- "integrity": "sha512-FiaE8xvCdvKC2arYusgtlDNZ77b8ysr8njAYQZwwaIHjy27TbR2tEpLDCmUwSbANNmivtc/xGEiDDwcNppMWlQ==",
+ "version": "8.6.14",
+ "resolved": "https://registry.npmjs.org/@storybook/components/-/components-8.6.14.tgz",
+ "integrity": "sha512-HNR2mC5I4Z5ek8kTrVZlIY/B8gJGs5b3XdZPBPBopTIN6U/YHXiDyOjY3JlaS4fSG1fVhp/Qp1TpMn1w/9m1pw==",
"dev": true,
"license": "MIT",
"funding": {
@@ -11201,13 +11253,13 @@
}
},
"node_modules/@storybook/core": {
- "version": "8.6.12",
- "resolved": "https://registry.npmjs.org/@storybook/core/-/core-8.6.12.tgz",
- "integrity": "sha512-t+ZuDzAlsXKa6tLxNZT81gEAt4GNwsKP/Id2wluhmUWD/lwYW0uum1JiPUuanw8xD6TdakCW/7ULZc7aQUBLCQ==",
+ "version": "8.6.14",
+ "resolved": "https://registry.npmjs.org/@storybook/core/-/core-8.6.14.tgz",
+ "integrity": "sha512-1P/w4FSNRqP8j3JQBOi3yGt8PVOgSRbP66Ok520T78eJBeqx9ukCfl912PQZ7SPbW3TIunBwLXMZOjZwBB/JmA==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@storybook/theming": "8.6.12",
+ "@storybook/theming": "8.6.14",
"better-opn": "^3.0.2",
"browser-assert": "^1.2.1",
"esbuild": "^0.18.0 || ^0.19.0 || ^0.20.0 || ^0.21.0 || ^0.22.0 || ^0.23.0 || ^0.24.0 || ^0.25.0",
@@ -11233,9 +11285,9 @@
}
},
"node_modules/@storybook/core-webpack": {
- "version": "8.6.12",
- "resolved": "https://registry.npmjs.org/@storybook/core-webpack/-/core-webpack-8.6.12.tgz",
- "integrity": "sha512-TiE+KOm0hxb/p0JxeGHKxqTNX+xnTOFsBh6uloCSuvodutJ5pR/XpxKVxwo1gtSc0Uq3qpgbMhW6qYlYQetnKA==",
+ "version": "8.6.14",
+ "resolved": "https://registry.npmjs.org/@storybook/core-webpack/-/core-webpack-8.6.14.tgz",
+ "integrity": "sha512-iG7r8osNKabSGBbuJuSeMWKbU+ilt5PvzTYkClcYaagla/DliXkXvfywA6jOugVk/Cpx+c6tVKlPfjLcaQHwmw==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -11246,13 +11298,13 @@
"url": "https://opencollective.com/storybook"
},
"peerDependencies": {
- "storybook": "^8.6.12"
+ "storybook": "^8.6.14"
}
},
"node_modules/@storybook/core/node_modules/semver": {
- "version": "7.7.1",
- "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz",
- "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==",
+ "version": "7.7.2",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz",
+ "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==",
"dev": true,
"license": "ISC",
"bin": {
@@ -11263,9 +11315,9 @@
}
},
"node_modules/@storybook/csf-plugin": {
- "version": "8.6.12",
- "resolved": "https://registry.npmjs.org/@storybook/csf-plugin/-/csf-plugin-8.6.12.tgz",
- "integrity": "sha512-6s8CnP1aoKPb3XtC0jRLUp8M5vTA8RhGAwQDKUsFpCC7g89JR9CaKs9FY2ZSzsNbjR15uASi7b3K8BzeYumYQg==",
+ "version": "8.6.14",
+ "resolved": "https://registry.npmjs.org/@storybook/csf-plugin/-/csf-plugin-8.6.14.tgz",
+ "integrity": "sha512-dErtc9teAuN+eelN8FojzFE635xlq9cNGGGEu0WEmMUQ4iJ8pingvBO1N8X3scz4Ry7KnxX++NNf3J3gpxS8qQ==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -11276,7 +11328,7 @@
"url": "https://opencollective.com/storybook"
},
"peerDependencies": {
- "storybook": "^8.6.12"
+ "storybook": "^8.6.14"
}
},
"node_modules/@storybook/global": {
@@ -11301,9 +11353,9 @@
}
},
"node_modules/@storybook/instrumenter": {
- "version": "8.6.12",
- "resolved": "https://registry.npmjs.org/@storybook/instrumenter/-/instrumenter-8.6.12.tgz",
- "integrity": "sha512-VK5fYAF8jMwWP/u3YsmSwKGh+FeSY8WZn78flzRUwirp2Eg1WWjsqPRubAk7yTpcqcC/km9YMF3KbqfzRv2s/A==",
+ "version": "8.6.14",
+ "resolved": "https://registry.npmjs.org/@storybook/instrumenter/-/instrumenter-8.6.14.tgz",
+ "integrity": "sha512-iG4MlWCcz1L7Yu8AwgsnfVAmMbvyRSk700Mfy2g4c8y5O+Cv1ejshE1LBBsCwHgkuqU0H4R0qu4g23+6UnUemQ==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -11315,13 +11367,13 @@
"url": "https://opencollective.com/storybook"
},
"peerDependencies": {
- "storybook": "^8.6.12"
+ "storybook": "^8.6.14"
}
},
"node_modules/@storybook/manager-api": {
- "version": "8.6.12",
- "resolved": "https://registry.npmjs.org/@storybook/manager-api/-/manager-api-8.6.12.tgz",
- "integrity": "sha512-O0SpISeJLNTQvhSBOsWzzkCgs8vCjOq1578rwqHlC6jWWm4QmtfdyXqnv7rR1Hk08kQ+Dzqh0uhwHx0nfwy4nQ==",
+ "version": "8.6.14",
+ "resolved": "https://registry.npmjs.org/@storybook/manager-api/-/manager-api-8.6.14.tgz",
+ "integrity": "sha512-ez0Zihuy17udLbfHZQXkGqwtep0mSGgHcNzGN7iZrMP1m+VmNo+7aGCJJdvXi7+iU3yq8weXSQFWg5DqWgLS7g==",
"dev": true,
"license": "MIT",
"funding": {
@@ -11333,9 +11385,9 @@
}
},
"node_modules/@storybook/node-logger": {
- "version": "8.6.12",
- "resolved": "https://registry.npmjs.org/@storybook/node-logger/-/node-logger-8.6.12.tgz",
- "integrity": "sha512-Jk7mQWsu60BptBwYJAd69kMmsEqBAbGDuA/fqban+8vfNiSKgR3PRkhis0DsGEk53bpAEfbkCcyvYRCrrq4M3Q==",
+ "version": "8.6.14",
+ "resolved": "https://registry.npmjs.org/@storybook/node-logger/-/node-logger-8.6.14.tgz",
+ "integrity": "sha512-/H67NMvc9hDOaNgVragsHaeXQ5JzwAQfyx1QeL4vlx2SPGoWXmxpoRXZTpOJRaNOhKlYh6sDj/3Lx2xOH5IxnQ==",
"dev": true,
"license": "MIT",
"funding": {
@@ -11347,14 +11399,14 @@
}
},
"node_modules/@storybook/preset-react-webpack": {
- "version": "8.6.12",
- "resolved": "https://registry.npmjs.org/@storybook/preset-react-webpack/-/preset-react-webpack-8.6.12.tgz",
- "integrity": "sha512-aCCHjR/jsVPVThRH7nK70wS0Od44M6hqkkakg3xr7LETZZGj99heen6t4VHvz8gcQYT9l6R/oZwCl7f/PQ3ZBQ==",
+ "version": "8.6.14",
+ "resolved": "https://registry.npmjs.org/@storybook/preset-react-webpack/-/preset-react-webpack-8.6.14.tgz",
+ "integrity": "sha512-M7Q6ErNx7N2hQorTz0OLa3YV8nc8OcvkDlCxqqnkHPGQNEIWEpeDvq3wn2OvZlrHDpchyuiquGXZ8aztVtBP2g==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@storybook/core-webpack": "8.6.12",
- "@storybook/react": "8.6.12",
+ "@storybook/core-webpack": "8.6.14",
+ "@storybook/react": "8.6.14",
"@storybook/react-docgen-typescript-plugin": "1.0.6--canary.9.0c3f3b7.0",
"@types/semver": "^7.3.4",
"find-up": "^5.0.0",
@@ -11375,7 +11427,7 @@
"peerDependencies": {
"react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta",
"react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta",
- "storybook": "^8.6.12"
+ "storybook": "^8.6.14"
},
"peerDependenciesMeta": {
"typescript": {
@@ -11384,9 +11436,9 @@
}
},
"node_modules/@storybook/preset-react-webpack/node_modules/semver": {
- "version": "7.7.1",
- "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz",
- "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==",
+ "version": "7.7.2",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz",
+ "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==",
"dev": true,
"license": "ISC",
"bin": {
@@ -11397,9 +11449,9 @@
}
},
"node_modules/@storybook/preview-api": {
- "version": "8.6.12",
- "resolved": "https://registry.npmjs.org/@storybook/preview-api/-/preview-api-8.6.12.tgz",
- "integrity": "sha512-84FE3Hrs0AYKHqpDZOwx1S/ffOfxBdL65lhCoeI8GoWwCkzwa9zEP3kvXBo/BnEDO7nAfxvMhjASTZXbKRJh5Q==",
+ "version": "8.6.14",
+ "resolved": "https://registry.npmjs.org/@storybook/preview-api/-/preview-api-8.6.14.tgz",
+ "integrity": "sha512-2GhcCd4dNMrnD7eooEfvbfL4I83qAqEyO0CO7JQAmIO6Rxb9BsOLLI/GD5HkvQB73ArTJ+PT50rfaO820IExOQ==",
"dev": true,
"license": "MIT",
"funding": {
@@ -11411,18 +11463,18 @@
}
},
"node_modules/@storybook/react": {
- "version": "8.6.12",
- "resolved": "https://registry.npmjs.org/@storybook/react/-/react-8.6.12.tgz",
- "integrity": "sha512-NzxlHLA5DkDgZM/dMwTYinuzRs6rsUPmlqP+NIv6YaciQ4NGnTYyOC7R/SqI6HHFm8ZZ5eMYvpfiFmhZ9rU+rQ==",
+ "version": "8.6.14",
+ "resolved": "https://registry.npmjs.org/@storybook/react/-/react-8.6.14.tgz",
+ "integrity": "sha512-BOepx5bBFwl/CPI+F+LnmMmsG1wQYmrX/UQXgUbHQUU9Tj7E2ndTnNbpIuSLc8IrM03ru+DfwSg1Co3cxWtT+g==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@storybook/components": "8.6.12",
+ "@storybook/components": "8.6.14",
"@storybook/global": "^5.0.0",
- "@storybook/manager-api": "8.6.12",
- "@storybook/preview-api": "8.6.12",
- "@storybook/react-dom-shim": "8.6.12",
- "@storybook/theming": "8.6.12"
+ "@storybook/manager-api": "8.6.14",
+ "@storybook/preview-api": "8.6.14",
+ "@storybook/react-dom-shim": "8.6.14",
+ "@storybook/theming": "8.6.14"
},
"engines": {
"node": ">=18.0.0"
@@ -11432,10 +11484,10 @@
"url": "https://opencollective.com/storybook"
},
"peerDependencies": {
- "@storybook/test": "8.6.12",
+ "@storybook/test": "8.6.14",
"react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta",
"react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta",
- "storybook": "^8.6.12",
+ "storybook": "^8.6.14",
"typescript": ">= 4.2.x"
},
"peerDependenciesMeta": {
@@ -11522,9 +11574,9 @@
}
},
"node_modules/@storybook/react-dom-shim": {
- "version": "8.6.12",
- "resolved": "https://registry.npmjs.org/@storybook/react-dom-shim/-/react-dom-shim-8.6.12.tgz",
- "integrity": "sha512-51QvoimkBzYs8s3rCYnY5h0cFqLz/Mh0vRcughwYaXckWzDBV8l67WBO5Xf5nBsukCbWyqBVPpEQLww8s7mrLA==",
+ "version": "8.6.14",
+ "resolved": "https://registry.npmjs.org/@storybook/react-dom-shim/-/react-dom-shim-8.6.14.tgz",
+ "integrity": "sha512-0hixr3dOy3f3M+HBofp3jtMQMS+sqzjKNgl7Arfuj3fvjmyXOks/yGjDImySR4imPtEllvPZfhiQNlejheaInw==",
"dev": true,
"license": "MIT",
"funding": {
@@ -11534,19 +11586,19 @@
"peerDependencies": {
"react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta",
"react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta",
- "storybook": "^8.6.12"
+ "storybook": "^8.6.14"
}
},
"node_modules/@storybook/react-webpack5": {
- "version": "8.6.12",
- "resolved": "https://registry.npmjs.org/@storybook/react-webpack5/-/react-webpack5-8.6.12.tgz",
- "integrity": "sha512-wZOjPQ00gu85iQoKgwz5uvM3+bhXrQDVR0ppVAj7vVy6cvLEsJXmqNLHbXPCZuKPmvwzYr1QkslMLCIkF8OGdA==",
+ "version": "8.6.14",
+ "resolved": "https://registry.npmjs.org/@storybook/react-webpack5/-/react-webpack5-8.6.14.tgz",
+ "integrity": "sha512-ka0q9tQBLruhO38sybP/MkZzejqAltce7HJTJ2KKbUYUlbvuG7m56tBX7DVC5JaImbsO3b8fqOrKH7gRt4KYrQ==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@storybook/builder-webpack5": "8.6.12",
- "@storybook/preset-react-webpack": "8.6.12",
- "@storybook/react": "8.6.12"
+ "@storybook/builder-webpack5": "8.6.14",
+ "@storybook/preset-react-webpack": "8.6.14",
+ "@storybook/react": "8.6.14"
},
"engines": {
"node": ">=18.0.0"
@@ -11558,7 +11610,7 @@
"peerDependencies": {
"react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta",
"react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta",
- "storybook": "^8.6.12",
+ "storybook": "^8.6.14",
"typescript": ">= 4.2.x"
},
"peerDependenciesMeta": {
@@ -11568,14 +11620,14 @@
}
},
"node_modules/@storybook/test": {
- "version": "8.6.12",
- "resolved": "https://registry.npmjs.org/@storybook/test/-/test-8.6.12.tgz",
- "integrity": "sha512-0BK1Eg+VD0lNMB1BtxqHE3tP9FdkUmohtvWG7cq6lWvMrbCmAmh3VWai3RMCCDOukPFpjabOr8BBRLVvhNpv2w==",
+ "version": "8.6.14",
+ "resolved": "https://registry.npmjs.org/@storybook/test/-/test-8.6.14.tgz",
+ "integrity": "sha512-GkPNBbbZmz+XRdrhMtkxPotCLOQ1BaGNp/gFZYdGDk2KmUWBKmvc5JxxOhtoXM2703IzNFlQHSSNnhrDZYuLlw==",
"dev": true,
"license": "MIT",
"dependencies": {
"@storybook/global": "^5.0.0",
- "@storybook/instrumenter": "8.6.12",
+ "@storybook/instrumenter": "8.6.14",
"@testing-library/dom": "10.4.0",
"@testing-library/jest-dom": "6.5.0",
"@testing-library/user-event": "14.5.2",
@@ -11587,13 +11639,13 @@
"url": "https://opencollective.com/storybook"
},
"peerDependencies": {
- "storybook": "^8.6.12"
+ "storybook": "^8.6.14"
}
},
"node_modules/@storybook/theming": {
- "version": "8.6.12",
- "resolved": "https://registry.npmjs.org/@storybook/theming/-/theming-8.6.12.tgz",
- "integrity": "sha512-6VjZg8HJ2Op7+KV7ihJpYrDnFtd9D1jrQnUS8LckcpuBXrIEbaut5+34ObY8ssQnSqkk2GwIZBBBQYQBCVvkOw==",
+ "version": "8.6.14",
+ "resolved": "https://registry.npmjs.org/@storybook/theming/-/theming-8.6.14.tgz",
+ "integrity": "sha512-r4y+LsiB37V5hzpQo+BM10PaCsp7YlZ0YcZzQP1OCkPlYXmUAFy2VvDKaFRpD8IeNPKug2u4iFm/laDEbs03dg==",
"dev": true,
"license": "MIT",
"funding": {
@@ -11605,9 +11657,9 @@
}
},
"node_modules/@swc/core": {
- "version": "1.11.21",
- "resolved": "https://registry.npmjs.org/@swc/core/-/core-1.11.21.tgz",
- "integrity": "sha512-/Y3BJLcwd40pExmdar8MH2UGGvCBrqNN7hauOMckrEX2Ivcbv3IMhrbGX4od1dnF880Ed8y/E9aStZCIQi0EGw==",
+ "version": "1.11.24",
+ "resolved": "https://registry.npmjs.org/@swc/core/-/core-1.11.24.tgz",
+ "integrity": "sha512-MaQEIpfcEMzx3VWWopbofKJvaraqmL6HbLlw2bFZ7qYqYw3rkhM0cQVEgyzbHtTWwCwPMFZSC2DUbhlZgrMfLg==",
"dev": true,
"hasInstallScript": true,
"license": "Apache-2.0",
@@ -11623,16 +11675,16 @@
"url": "https://opencollective.com/swc"
},
"optionalDependencies": {
- "@swc/core-darwin-arm64": "1.11.21",
- "@swc/core-darwin-x64": "1.11.21",
- "@swc/core-linux-arm-gnueabihf": "1.11.21",
- "@swc/core-linux-arm64-gnu": "1.11.21",
- "@swc/core-linux-arm64-musl": "1.11.21",
- "@swc/core-linux-x64-gnu": "1.11.21",
- "@swc/core-linux-x64-musl": "1.11.21",
- "@swc/core-win32-arm64-msvc": "1.11.21",
- "@swc/core-win32-ia32-msvc": "1.11.21",
- "@swc/core-win32-x64-msvc": "1.11.21"
+ "@swc/core-darwin-arm64": "1.11.24",
+ "@swc/core-darwin-x64": "1.11.24",
+ "@swc/core-linux-arm-gnueabihf": "1.11.24",
+ "@swc/core-linux-arm64-gnu": "1.11.24",
+ "@swc/core-linux-arm64-musl": "1.11.24",
+ "@swc/core-linux-x64-gnu": "1.11.24",
+ "@swc/core-linux-x64-musl": "1.11.24",
+ "@swc/core-win32-arm64-msvc": "1.11.24",
+ "@swc/core-win32-ia32-msvc": "1.11.24",
+ "@swc/core-win32-x64-msvc": "1.11.24"
},
"peerDependencies": {
"@swc/helpers": ">=0.5.17"
@@ -11644,9 +11696,9 @@
}
},
"node_modules/@swc/core-darwin-arm64": {
- "version": "1.11.21",
- "resolved": "https://registry.npmjs.org/@swc/core-darwin-arm64/-/core-darwin-arm64-1.11.21.tgz",
- "integrity": "sha512-v6gjw9YFWvKulCw3ZA1dY+LGMafYzJksm1mD4UZFZ9b36CyHFowYVYug1ajYRIRqEvvfIhHUNV660zTLoVFR8g==",
+ "version": "1.11.24",
+ "resolved": "https://registry.npmjs.org/@swc/core-darwin-arm64/-/core-darwin-arm64-1.11.24.tgz",
+ "integrity": "sha512-dhtVj0PC1APOF4fl5qT2neGjRLgHAAYfiVP8poJelhzhB/318bO+QCFWAiimcDoyMgpCXOhTp757gnoJJrheWA==",
"cpu": [
"arm64"
],
@@ -11662,9 +11714,9 @@
}
},
"node_modules/@swc/core-darwin-x64": {
- "version": "1.11.21",
- "resolved": "https://registry.npmjs.org/@swc/core-darwin-x64/-/core-darwin-x64-1.11.21.tgz",
- "integrity": "sha512-CUiTiqKlzskwswrx9Ve5NhNoab30L1/ScOfQwr1duvNlFvarC8fvQSgdtpw2Zh3MfnfNPpyLZnYg7ah4kbT9JQ==",
+ "version": "1.11.24",
+ "resolved": "https://registry.npmjs.org/@swc/core-darwin-x64/-/core-darwin-x64-1.11.24.tgz",
+ "integrity": "sha512-H/3cPs8uxcj2Fe3SoLlofN5JG6Ny5bl8DuZ6Yc2wr7gQFBmyBkbZEz+sPVgsID7IXuz7vTP95kMm1VL74SO5AQ==",
"cpu": [
"x64"
],
@@ -11680,9 +11732,9 @@
}
},
"node_modules/@swc/core-linux-arm-gnueabihf": {
- "version": "1.11.21",
- "resolved": "https://registry.npmjs.org/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.11.21.tgz",
- "integrity": "sha512-YyBTAFM/QPqt1PscD8hDmCLnqPGKmUZpqeE25HXY8OLjl2MUs8+O4KjwPZZ+OGxpdTbwuWFyMoxjcLy80JODvg==",
+ "version": "1.11.24",
+ "resolved": "https://registry.npmjs.org/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.11.24.tgz",
+ "integrity": "sha512-PHJgWEpCsLo/NGj+A2lXZ2mgGjsr96ULNW3+T3Bj2KTc8XtMUkE8tmY2Da20ItZOvPNC/69KroU7edyo1Flfbw==",
"cpu": [
"arm"
],
@@ -11698,9 +11750,9 @@
}
},
"node_modules/@swc/core-linux-arm64-gnu": {
- "version": "1.11.21",
- "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.11.21.tgz",
- "integrity": "sha512-DQD+ooJmwpNsh4acrftdkuwl5LNxxg8U4+C/RJNDd7m5FP9Wo4c0URi5U0a9Vk/6sQNh9aSGcYChDpqCDWEcBw==",
+ "version": "1.11.24",
+ "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.11.24.tgz",
+ "integrity": "sha512-C2FJb08+n5SD4CYWCTZx1uR88BN41ZieoHvI8A55hfVf2woT8+6ZiBzt74qW2g+ntZ535Jts5VwXAKdu41HpBg==",
"cpu": [
"arm64"
],
@@ -11716,9 +11768,9 @@
}
},
"node_modules/@swc/core-linux-arm64-musl": {
- "version": "1.11.21",
- "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.11.21.tgz",
- "integrity": "sha512-y1L49+snt1a1gLTYPY641slqy55QotPdtRK9Y6jMi4JBQyZwxC8swWYlQWb+MyILwxA614fi62SCNZNznB3XSA==",
+ "version": "1.11.24",
+ "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.11.24.tgz",
+ "integrity": "sha512-ypXLIdszRo0re7PNNaXN0+2lD454G8l9LPK/rbfRXnhLWDBPURxzKlLlU/YGd2zP98wPcVooMmegRSNOKfvErw==",
"cpu": [
"arm64"
],
@@ -11734,9 +11786,9 @@
}
},
"node_modules/@swc/core-linux-x64-gnu": {
- "version": "1.11.21",
- "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.11.21.tgz",
- "integrity": "sha512-NesdBXv4CvVEaFUlqKj+GA4jJMNUzK2NtKOrUNEtTbXaVyNiXjFCSaDajMTedEB0jTAd9ybB0aBvwhgkJUWkWA==",
+ "version": "1.11.24",
+ "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.11.24.tgz",
+ "integrity": "sha512-IM7d+STVZD48zxcgo69L0yYptfhaaE9cMZ+9OoMxirNafhKKXwoZuufol1+alEFKc+Wbwp+aUPe/DeWC/Lh3dg==",
"cpu": [
"x64"
],
@@ -11752,9 +11804,9 @@
}
},
"node_modules/@swc/core-linux-x64-musl": {
- "version": "1.11.21",
- "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.11.21.tgz",
- "integrity": "sha512-qFV60pwpKVOdmX67wqQzgtSrUGWX9Cibnp1CXyqZ9Mmt8UyYGvmGu7p6PMbTyX7vdpVUvWVRf8DzrW2//wmVHg==",
+ "version": "1.11.24",
+ "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.11.24.tgz",
+ "integrity": "sha512-DZByJaMVzSfjQKKQn3cqSeqwy6lpMaQDQQ4HPlch9FWtDx/dLcpdIhxssqZXcR2rhaQVIaRQsCqwV6orSDGAGw==",
"cpu": [
"x64"
],
@@ -11770,9 +11822,9 @@
}
},
"node_modules/@swc/core-win32-arm64-msvc": {
- "version": "1.11.21",
- "resolved": "https://registry.npmjs.org/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.11.21.tgz",
- "integrity": "sha512-DJJe9k6gXR/15ZZVLv1SKhXkFst8lYCeZRNHH99SlBodvu4slhh/MKQ6YCixINRhCwliHrpXPym8/5fOq8b7Ig==",
+ "version": "1.11.24",
+ "resolved": "https://registry.npmjs.org/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.11.24.tgz",
+ "integrity": "sha512-Q64Ytn23y9aVDKN5iryFi8mRgyHw3/kyjTjT4qFCa8AEb5sGUuSj//AUZ6c0J7hQKMHlg9do5Etvoe61V98/JQ==",
"cpu": [
"arm64"
],
@@ -11788,9 +11840,9 @@
}
},
"node_modules/@swc/core-win32-ia32-msvc": {
- "version": "1.11.21",
- "resolved": "https://registry.npmjs.org/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.11.21.tgz",
- "integrity": "sha512-TqEXuy6wedId7bMwLIr9byds+mKsaXVHctTN88R1UIBPwJA92Pdk0uxDgip0pEFzHB/ugU27g6d8cwUH3h2eIw==",
+ "version": "1.11.24",
+ "resolved": "https://registry.npmjs.org/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.11.24.tgz",
+ "integrity": "sha512-9pKLIisE/Hh2vJhGIPvSoTK4uBSPxNVyXHmOrtdDot4E1FUUI74Vi8tFdlwNbaj8/vusVnb8xPXsxF1uB0VgiQ==",
"cpu": [
"ia32"
],
@@ -11806,9 +11858,9 @@
}
},
"node_modules/@swc/core-win32-x64-msvc": {
- "version": "1.11.21",
- "resolved": "https://registry.npmjs.org/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.11.21.tgz",
- "integrity": "sha512-BT9BNNbMxdpUM1PPAkYtviaV0A8QcXttjs2MDtOeSqqvSJaPtyM+Fof2/+xSwQDmDEFzbGCcn75M5+xy3lGqpA==",
+ "version": "1.11.24",
+ "resolved": "https://registry.npmjs.org/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.11.24.tgz",
+ "integrity": "sha512-sybnXtOsdB+XvzVFlBVGgRHLqp3yRpHK7CrmpuDKszhj/QhmsaZzY/GHSeALlMtLup13M0gqbcQvsTNlAHTg3w==",
"cpu": [
"x64"
],
@@ -14197,9 +14249,9 @@
"license": "MIT"
},
"node_modules/@types/chai": {
- "version": "5.2.1",
- "resolved": "https://registry.npmjs.org/@types/chai/-/chai-5.2.1.tgz",
- "integrity": "sha512-iu1JLYmGmITRzUgNiLMZD3WCoFzpYtueuyAgHTXqgwSRAMIlFTnZqG6/xenkpUGRJEzSfklUTI4GNSzks/dc0w==",
+ "version": "5.2.2",
+ "resolved": "https://registry.npmjs.org/@types/chai/-/chai-5.2.2.tgz",
+ "integrity": "sha512-8kB30R7Hwqf40JPiKhVzodJs2Qc1ZJ5zuT3uzw5Hq/dhNCl3G3l83jfpdI1e20BP348+fV7VIL/+FxaXkqBmWg==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -14275,9 +14327,9 @@
}
},
"node_modules/@types/cors": {
- "version": "2.8.17",
- "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.17.tgz",
- "integrity": "sha512-8CGDvrBj1zgo2qE+oS3pOCyYNqCPryMWY2bGfwA0dcfopWGgxs+78df0Rs3rc9THP4JkOhLsAa+15VdpAqkcUA==",
+ "version": "2.8.18",
+ "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.18.tgz",
+ "integrity": "sha512-nX3d0sxJW41CqQvfOzVG1NCTXfFDrDWIghCZncpHeWlVFd81zxB/DLhg7avFg6eHLCRX7ckBmoIIcqa++upvJA==",
"license": "MIT",
"dependencies": {
"@types/node": "*"
@@ -14634,9 +14686,9 @@
}
},
"node_modules/@types/express": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/@types/express/-/express-5.0.1.tgz",
- "integrity": "sha512-UZUw8vjpWFXuDnjFTh7/5c2TWDlQqeXHi6hcN7F2XSVT5P+WmUnnbFS3KA6Jnc6IsEqI2qCVu2bK0R0J4A8ZQQ==",
+ "version": "5.0.2",
+ "resolved": "https://registry.npmjs.org/@types/express/-/express-5.0.2.tgz",
+ "integrity": "sha512-BtjL3ZwbCQriyb0DGw+Rt12qAXPiBTPs815lsUvtt1Grk0vLRMZNMUZ741d5rjk+UQOxfDiBZ3dxpX00vSkK3g==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -14951,9 +15003,9 @@
"license": "MIT"
},
"node_modules/@types/node": {
- "version": "22.15.17",
- "resolved": "https://registry.npmjs.org/@types/node/-/node-22.15.17.tgz",
- "integrity": "sha512-wIX2aSZL5FE+MR0JlvF87BNVrtFWf6AE6rxSE9X7OwnVvoyCQjpzSRJ+M87se/4QCkCiebQAqrJ0y6fwIyi7nw==",
+ "version": "22.15.19",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-22.15.19.tgz",
+ "integrity": "sha512-3vMNr4TzNQyjHcRZadojpRaD9Ofr6LsonZAoQ+HMUa/9ORTPoxVIw0e0mpqWpdjj8xybyCM+oKOUH2vwFu/oEw==",
"license": "MIT",
"dependencies": {
"undici-types": "~6.21.0"
@@ -15090,9 +15142,9 @@
"license": "MIT"
},
"node_modules/@types/qs": {
- "version": "6.9.18",
- "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.18.tgz",
- "integrity": "sha512-kK7dgTYDyGqS+e2Q4aK9X3D7q234CIZ1Bv0q/7Z5IwRDoADNU81xXJK/YVyLbLTZCoIwUoDoffFeF+p/eIklAA==",
+ "version": "6.14.0",
+ "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.14.0.tgz",
+ "integrity": "sha512-eOunJqu0K1923aExK6y8p6fsihYEn/BYuQ4g0CxAAgFc4b/ZLN4CrsRZ55srTdqoiLzU2B2evC+apEIxprEzkQ==",
"dev": true,
"license": "MIT"
},
@@ -15114,9 +15166,9 @@
}
},
"node_modules/@types/react": {
- "version": "18.3.20",
- "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.20.tgz",
- "integrity": "sha512-IPaCZN7PShZK/3t6Q87pfTkRm6oLTd4vztyoj+cbHUF1g3FfVb2tFIL79uCRKEfv16AhqDMBywP2VW3KIZUvcg==",
+ "version": "18.3.21",
+ "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.21.tgz",
+ "integrity": "sha512-gXLBtmlcRJeT09/sI4PxVwyrku6SaNUj/6cMubjE6T6XdY1fDmBL7r0nX0jbSZPU/Xr0KuwLLZh6aOYY5d91Xw==",
"license": "MIT",
"dependencies": {
"@types/prop-types": "*",
@@ -15147,9 +15199,9 @@
}
},
"node_modules/@types/react-dom": {
- "version": "18.3.6",
- "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.3.6.tgz",
- "integrity": "sha512-nf22//wEbKXusP6E9pfOCDwFdHAX4u172eaJI4YkDRQEZiorm6KfYnSC2SWLDMVWUOWPERmJnN0ujeAfTBLvrw==",
+ "version": "18.3.7",
+ "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.3.7.tgz",
+ "integrity": "sha512-MEe3UeoENYVFXzoXEWsvcpg6ZvlrFNlOQ7EOsvhI3CfAXwzPfO8Qwuxd40nepsYKqyyVQnTdEfv68q91yLcKrQ==",
"devOptional": true,
"license": "MIT",
"peerDependencies": {
@@ -15189,9 +15241,9 @@
}
},
"node_modules/@types/react-reconciler": {
- "version": "0.31.0",
- "resolved": "https://registry.npmjs.org/@types/react-reconciler/-/react-reconciler-0.31.0.tgz",
- "integrity": "sha512-wa1KtV3SHKnWeLHfZFg/7nrPSe/Ejdn+qbanNX4V6i9I7C3ECKPfBnC1KM3ef58KFWEohLmTvoTH5XuEIKGX2g==",
+ "version": "0.32.0",
+ "resolved": "https://registry.npmjs.org/@types/react-reconciler/-/react-reconciler-0.32.0.tgz",
+ "integrity": "sha512-+WHarFkJevhH1s655qeeSEf/yxFST0dVRsmSqUgxG8mMOKqycgYBv2wVpyubBY7MX8KiX5FQ03rNIwrxfm7Bmw==",
"dev": true,
"license": "MIT",
"peerDependencies": {
@@ -15335,9 +15387,9 @@
}
},
"node_modules/@types/shelljs": {
- "version": "0.8.15",
- "resolved": "https://registry.npmjs.org/@types/shelljs/-/shelljs-0.8.15.tgz",
- "integrity": "sha512-vzmnCHl6hViPu9GNLQJ+DZFd6BQI2DBTUeOvYHqkWQLMfKAAQYMb/xAmZkTogZI/vqXHCWkqDRymDI5p0QTi5Q==",
+ "version": "0.8.16",
+ "resolved": "https://registry.npmjs.org/@types/shelljs/-/shelljs-0.8.16.tgz",
+ "integrity": "sha512-40SUXiH0tZfAg/oKkkGF1kdHPAmE4slv2xAmbfa8VtE6ztHYwdpW2phlzHTVdJh5JOGqA3Cx1Hzp7kxFalKHYA==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -15392,9 +15444,9 @@
}
},
"node_modules/@types/textarea-caret": {
- "version": "3.0.3",
- "resolved": "https://registry.npmjs.org/@types/textarea-caret/-/textarea-caret-3.0.3.tgz",
- "integrity": "sha512-bsA9GdXV1wQsXyDjS5+A+czz8IAR3haH5DU+KctIoXbzobRL2NOiwF/+EbB7pofAyudMytLj4ihPtbmbJT8FWw==",
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/@types/textarea-caret/-/textarea-caret-3.0.4.tgz",
+ "integrity": "sha512-epJGYB37/sNrTDbhfyRjHkXsQSAcO6zby0JBDS0QMt6HQ1f1W2E4YpSc7TQkNmWaWmYXv92zOIfN5PHA8CmThg==",
"dev": true,
"license": "MIT"
},
@@ -15553,28 +15605,28 @@
}
},
"node_modules/@types/youtube": {
- "version": "0.1.0",
- "resolved": "https://registry.npmjs.org/@types/youtube/-/youtube-0.1.0.tgz",
- "integrity": "sha512-Pg33m3X2mFgdmhtvzOlAfUfgOa3341N3/2JCrVY/mXVxb4hagcqqEG6w4vGCfB64StQNWHSj/T8Eotb1Rko/FQ==",
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/@types/youtube/-/youtube-0.1.1.tgz",
+ "integrity": "sha512-xJSX8yOXLTSCH4ye62/TWEA8y3erYtSEvdd3h56u3Gk/8dpH8Guicv3XLLOg6wjZdsYeYgaZ/u7e9dqt+FL0+A==",
"dev": true,
"license": "MIT"
},
"node_modules/@typescript-eslint/eslint-plugin": {
- "version": "8.30.1",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.30.1.tgz",
- "integrity": "sha512-v+VWphxMjn+1t48/jO4t950D6KR8JaJuNXzi33Ve6P8sEmPr5k6CEXjdGwT6+LodVnEa91EQCtwjWNUCPweo+Q==",
+ "version": "8.32.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.32.1.tgz",
+ "integrity": "sha512-6u6Plg9nP/J1GRpe/vcjjabo6Uc5YQPAMxsgQyGC/I0RuukiG1wIe3+Vtg3IrSCVJDmqK3j8adrtzXSENRtFgg==",
"dev": true,
"license": "MIT",
"dependencies": {
"@eslint-community/regexpp": "^4.10.0",
- "@typescript-eslint/scope-manager": "8.30.1",
- "@typescript-eslint/type-utils": "8.30.1",
- "@typescript-eslint/utils": "8.30.1",
- "@typescript-eslint/visitor-keys": "8.30.1",
+ "@typescript-eslint/scope-manager": "8.32.1",
+ "@typescript-eslint/type-utils": "8.32.1",
+ "@typescript-eslint/utils": "8.32.1",
+ "@typescript-eslint/visitor-keys": "8.32.1",
"graphemer": "^1.4.0",
- "ignore": "^5.3.1",
+ "ignore": "^7.0.0",
"natural-compare": "^1.4.0",
- "ts-api-utils": "^2.0.1"
+ "ts-api-utils": "^2.1.0"
},
"engines": {
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
@@ -15589,17 +15641,27 @@
"typescript": ">=4.8.4 <5.9.0"
}
},
+ "node_modules/@typescript-eslint/eslint-plugin/node_modules/ignore": {
+ "version": "7.0.4",
+ "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.4.tgz",
+ "integrity": "sha512-gJzzk+PQNznz8ysRrC0aOkBNVRBDtE1n53IqyqEf3PXrYwomFs5q4pGMizBMJF+ykh03insJ27hB8gSrD2Hn8A==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 4"
+ }
+ },
"node_modules/@typescript-eslint/parser": {
- "version": "8.30.1",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.30.1.tgz",
- "integrity": "sha512-H+vqmWwT5xoNrXqWs/fesmssOW70gxFlgcMlYcBaWNPIEWDgLa4W9nkSPmhuOgLnXq9QYgkZ31fhDyLhleCsAg==",
+ "version": "8.32.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.32.1.tgz",
+ "integrity": "sha512-LKMrmwCPoLhM45Z00O1ulb6jwyVr2kr3XJp+G+tSEZcbauNnScewcQwtJqXDhXeYPDEjZ8C1SjXm015CirEmGg==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@typescript-eslint/scope-manager": "8.30.1",
- "@typescript-eslint/types": "8.30.1",
- "@typescript-eslint/typescript-estree": "8.30.1",
- "@typescript-eslint/visitor-keys": "8.30.1",
+ "@typescript-eslint/scope-manager": "8.32.1",
+ "@typescript-eslint/types": "8.32.1",
+ "@typescript-eslint/typescript-estree": "8.32.1",
+ "@typescript-eslint/visitor-keys": "8.32.1",
"debug": "^4.3.4"
},
"engines": {
@@ -15615,14 +15677,14 @@
}
},
"node_modules/@typescript-eslint/scope-manager": {
- "version": "8.30.1",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.30.1.tgz",
- "integrity": "sha512-+C0B6ChFXZkuaNDl73FJxRYT0G7ufVPOSQkqkpM/U198wUwUFOtgo1k/QzFh1KjpBitaK7R1tgjVz6o9HmsRPg==",
+ "version": "8.32.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.32.1.tgz",
+ "integrity": "sha512-7IsIaIDeZn7kffk7qXC3o6Z4UblZJKV3UBpkvRNpr5NSyLji7tvTcvmnMNYuYLyh26mN8W723xpo3i4MlD33vA==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@typescript-eslint/types": "8.30.1",
- "@typescript-eslint/visitor-keys": "8.30.1"
+ "@typescript-eslint/types": "8.32.1",
+ "@typescript-eslint/visitor-keys": "8.32.1"
},
"engines": {
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
@@ -15633,16 +15695,16 @@
}
},
"node_modules/@typescript-eslint/type-utils": {
- "version": "8.30.1",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.30.1.tgz",
- "integrity": "sha512-64uBF76bfQiJyHgZISC7vcNz3adqQKIccVoKubyQcOnNcdJBvYOILV1v22Qhsw3tw3VQu5ll8ND6hycgAR5fEA==",
+ "version": "8.32.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.32.1.tgz",
+ "integrity": "sha512-mv9YpQGA8iIsl5KyUPi+FGLm7+bA4fgXaeRcFKRDRwDMu4iwrSHeDPipwueNXhdIIZltwCJv+NkxftECbIZWfA==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@typescript-eslint/typescript-estree": "8.30.1",
- "@typescript-eslint/utils": "8.30.1",
+ "@typescript-eslint/typescript-estree": "8.32.1",
+ "@typescript-eslint/utils": "8.32.1",
"debug": "^4.3.4",
- "ts-api-utils": "^2.0.1"
+ "ts-api-utils": "^2.1.0"
},
"engines": {
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
@@ -15657,9 +15719,9 @@
}
},
"node_modules/@typescript-eslint/types": {
- "version": "8.30.1",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.30.1.tgz",
- "integrity": "sha512-81KawPfkuulyWo5QdyG/LOKbspyyiW+p4vpn4bYO7DM/hZImlVnFwrpCTnmNMOt8CvLRr5ojI9nU1Ekpw4RcEw==",
+ "version": "8.32.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.32.1.tgz",
+ "integrity": "sha512-YmybwXUJcgGqgAp6bEsgpPXEg6dcCyPyCSr0CAAueacR/CCBi25G3V8gGQ2kRzQRBNol7VQknxMs9HvVa9Rvfg==",
"dev": true,
"license": "MIT",
"engines": {
@@ -15671,20 +15733,20 @@
}
},
"node_modules/@typescript-eslint/typescript-estree": {
- "version": "8.30.1",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.30.1.tgz",
- "integrity": "sha512-kQQnxymiUy9tTb1F2uep9W6aBiYODgq5EMSk6Nxh4Z+BDUoYUSa029ISs5zTzKBFnexQEh71KqwjKnRz58lusQ==",
+ "version": "8.32.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.32.1.tgz",
+ "integrity": "sha512-Y3AP9EIfYwBb4kWGb+simvPaqQoT5oJuzzj9m0i6FCY6SPvlomY2Ei4UEMm7+FXtlNJbor80ximyslzaQF6xhg==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@typescript-eslint/types": "8.30.1",
- "@typescript-eslint/visitor-keys": "8.30.1",
+ "@typescript-eslint/types": "8.32.1",
+ "@typescript-eslint/visitor-keys": "8.32.1",
"debug": "^4.3.4",
"fast-glob": "^3.3.2",
"is-glob": "^4.0.3",
"minimatch": "^9.0.4",
"semver": "^7.6.0",
- "ts-api-utils": "^2.0.1"
+ "ts-api-utils": "^2.1.0"
},
"engines": {
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
@@ -15724,9 +15786,9 @@
}
},
"node_modules/@typescript-eslint/typescript-estree/node_modules/semver": {
- "version": "7.7.1",
- "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz",
- "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==",
+ "version": "7.7.2",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz",
+ "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==",
"dev": true,
"license": "ISC",
"bin": {
@@ -15737,16 +15799,16 @@
}
},
"node_modules/@typescript-eslint/utils": {
- "version": "8.30.1",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.30.1.tgz",
- "integrity": "sha512-T/8q4R9En2tcEsWPQgB5BQ0XJVOtfARcUvOa8yJP3fh9M/mXraLxZrkCfGb6ChrO/V3W+Xbd04RacUEqk1CFEQ==",
+ "version": "8.32.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.32.1.tgz",
+ "integrity": "sha512-DsSFNIgLSrc89gpq1LJB7Hm1YpuhK086DRDJSNrewcGvYloWW1vZLHBTIvarKZDcAORIy/uWNx8Gad+4oMpkSA==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@eslint-community/eslint-utils": "^4.4.0",
- "@typescript-eslint/scope-manager": "8.30.1",
- "@typescript-eslint/types": "8.30.1",
- "@typescript-eslint/typescript-estree": "8.30.1"
+ "@eslint-community/eslint-utils": "^4.7.0",
+ "@typescript-eslint/scope-manager": "8.32.1",
+ "@typescript-eslint/types": "8.32.1",
+ "@typescript-eslint/typescript-estree": "8.32.1"
},
"engines": {
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
@@ -15761,13 +15823,13 @@
}
},
"node_modules/@typescript-eslint/visitor-keys": {
- "version": "8.30.1",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.30.1.tgz",
- "integrity": "sha512-aEhgas7aJ6vZnNFC7K4/vMGDGyOiqWcYZPpIWrTKuTAlsvDNKy2GFDqh9smL+iq069ZvR0YzEeq0B8NJlLzjFA==",
+ "version": "8.32.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.32.1.tgz",
+ "integrity": "sha512-ar0tjQfObzhSaW3C3QNmTc5ofj0hDoNQ5XWrCy6zDyabdr0TWhCkClp+rywGNj/odAFBVzzJrK4tEq5M4Hmu4w==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@typescript-eslint/types": "8.30.1",
+ "@typescript-eslint/types": "8.32.1",
"eslint-visitor-keys": "^4.2.0"
},
"engines": {
@@ -15778,6 +15840,20 @@
"url": "https://opencollective.com/typescript-eslint"
}
},
+ "node_modules/@typespec/ts-http-runtime": {
+ "version": "0.2.2",
+ "resolved": "https://registry.npmjs.org/@typespec/ts-http-runtime/-/ts-http-runtime-0.2.2.tgz",
+ "integrity": "sha512-Gz/Sm64+Sq/vklJu1tt9t+4R2lvnud8NbTD/ZfpZtMiUX7YeVpCA8j6NSW8ptwcoLL+NmYANwqP8DV0q/bwl2w==",
+ "license": "MIT",
+ "dependencies": {
+ "http-proxy-agent": "^7.0.0",
+ "https-proxy-agent": "^7.0.0",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=18.0.0"
+ }
+ },
"node_modules/@ungap/structured-clone": {
"version": "1.3.0",
"resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.0.tgz",
@@ -15916,59 +15992,59 @@
}
},
"node_modules/@vue/compiler-core": {
- "version": "3.5.13",
- "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.13.tgz",
- "integrity": "sha512-oOdAkwqUfW1WqpwSYJce06wvt6HljgY3fGeM9NcVA1HaYOij3mZG9Rkysn0OHuyUAGMbEbARIpsG+LPVlBJ5/Q==",
+ "version": "3.5.14",
+ "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.14.tgz",
+ "integrity": "sha512-k7qMHMbKvoCXIxPhquKQVw3Twid3Kg4s7+oYURxLGRd56LiuHJVrvFKI4fm2AM3c8apqODPfVJGoh8nePbXMRA==",
"license": "MIT",
"dependencies": {
- "@babel/parser": "^7.25.3",
- "@vue/shared": "3.5.13",
+ "@babel/parser": "^7.27.2",
+ "@vue/shared": "3.5.14",
"entities": "^4.5.0",
"estree-walker": "^2.0.2",
- "source-map-js": "^1.2.0"
+ "source-map-js": "^1.2.1"
}
},
"node_modules/@vue/compiler-dom": {
- "version": "3.5.13",
- "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.5.13.tgz",
- "integrity": "sha512-ZOJ46sMOKUjO3e94wPdCzQ6P1Lx/vhp2RSvfaab88Ajexs0AHeV0uasYhi99WPaogmBlRHNRuly8xV75cNTMDA==",
+ "version": "3.5.14",
+ "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.5.14.tgz",
+ "integrity": "sha512-1aOCSqxGOea5I80U2hQJvXYpPm/aXo95xL/m/mMhgyPUsKe9jhjwWpziNAw7tYRnbz1I61rd9Mld4W9KmmRoug==",
"license": "MIT",
"dependencies": {
- "@vue/compiler-core": "3.5.13",
- "@vue/shared": "3.5.13"
+ "@vue/compiler-core": "3.5.14",
+ "@vue/shared": "3.5.14"
}
},
"node_modules/@vue/compiler-sfc": {
- "version": "3.5.13",
- "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.5.13.tgz",
- "integrity": "sha512-6VdaljMpD82w6c2749Zhf5T9u5uLBWKnVue6XWxprDobftnletJ8+oel7sexFfM3qIxNmVE7LSFGTpv6obNyaQ==",
+ "version": "3.5.14",
+ "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.5.14.tgz",
+ "integrity": "sha512-9T6m/9mMr81Lj58JpzsiSIjBgv2LiVoWjIVa7kuXHICUi8LiDSIotMpPRXYJsXKqyARrzjT24NAwttrMnMaCXA==",
"license": "MIT",
"dependencies": {
- "@babel/parser": "^7.25.3",
- "@vue/compiler-core": "3.5.13",
- "@vue/compiler-dom": "3.5.13",
- "@vue/compiler-ssr": "3.5.13",
- "@vue/shared": "3.5.13",
+ "@babel/parser": "^7.27.2",
+ "@vue/compiler-core": "3.5.14",
+ "@vue/compiler-dom": "3.5.14",
+ "@vue/compiler-ssr": "3.5.14",
+ "@vue/shared": "3.5.14",
"estree-walker": "^2.0.2",
- "magic-string": "^0.30.11",
- "postcss": "^8.4.48",
- "source-map-js": "^1.2.0"
+ "magic-string": "^0.30.17",
+ "postcss": "^8.5.3",
+ "source-map-js": "^1.2.1"
}
},
"node_modules/@vue/compiler-ssr": {
- "version": "3.5.13",
- "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.5.13.tgz",
- "integrity": "sha512-wMH6vrYHxQl/IybKJagqbquvxpWCuVYpoUJfCqFZwa/JY1GdATAQ+TgVtgrwwMZ0D07QhA99rs/EAAWfvG6KpA==",
+ "version": "3.5.14",
+ "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.5.14.tgz",
+ "integrity": "sha512-Y0G7PcBxr1yllnHuS/NxNCSPWnRGH4Ogrp0tsLA5QemDZuJLs99YjAKQ7KqkHE0vCg4QTKlQzXLKCMF7WPSl7Q==",
"license": "MIT",
"dependencies": {
- "@vue/compiler-dom": "3.5.13",
- "@vue/shared": "3.5.13"
+ "@vue/compiler-dom": "3.5.14",
+ "@vue/shared": "3.5.14"
}
},
"node_modules/@vue/shared": {
- "version": "3.5.13",
- "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.13.tgz",
- "integrity": "sha512-/hnE/qP5ZoGpol0a5mDi45bOd7t3tjYJBjsgCsivow7D48cJeV5l05RD82lPqi7gRiphZM37rnhW1l6ZoCNNnQ==",
+ "version": "3.5.14",
+ "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.14.tgz",
+ "integrity": "sha512-oXTwNxVfc9EtP1zzXAlSlgARLXNC84frFYkS0HHz0h3E4WZSP9sywqjqzGCP9Y34M8ipNmd380pVgmMuwELDyQ==",
"license": "MIT"
},
"node_modules/@webassemblyjs/ast": {
@@ -16337,16 +16413,6 @@
"ajv": "^8.8.2"
}
},
- "node_modules/ansi-colors": {
- "version": "4.1.3",
- "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz",
- "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=6"
- }
- },
"node_modules/ansi-escape-sequences": {
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/ansi-escape-sequences/-/ansi-escape-sequences-4.1.0.tgz",
@@ -16758,9 +16824,10 @@
}
},
"node_modules/ast-types": {
- "version": "0.13.4",
- "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.13.4.tgz",
- "integrity": "sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w==",
+ "version": "0.16.1",
+ "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.16.1.tgz",
+ "integrity": "sha512-6t10qk83GOG8p0vKmaCr8eiilZwO171AvbROMtvvNiwrTly62t+7XkA8RdIIVbpMhCASAsxgAzdRSwh6nw/5Dg==",
+ "dev": true,
"license": "MIT",
"dependencies": {
"tslib": "^2.0.1"
@@ -16935,12 +17002,6 @@
"hasInstallScript": true,
"license": "MIT"
},
- "node_modules/babel-runtime/node_modules/regenerator-runtime": {
- "version": "0.11.1",
- "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz",
- "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==",
- "license": "MIT"
- },
"node_modules/babel-walk": {
"version": "3.0.0-canary-5",
"resolved": "https://registry.npmjs.org/babel-walk/-/babel-walk-3.0.0-canary-5.tgz",
@@ -16977,9 +17038,9 @@
"optional": true
},
"node_modules/bare-fs": {
- "version": "4.1.2",
- "resolved": "https://registry.npmjs.org/bare-fs/-/bare-fs-4.1.2.tgz",
- "integrity": "sha512-8wSeOia5B7LwD4+h465y73KOdj5QHsbbuoUfPBi+pXgFJIPuG7SsiOdJuijWMyfid49eD+WivpfY7KT8gbAzBA==",
+ "version": "4.1.5",
+ "resolved": "https://registry.npmjs.org/bare-fs/-/bare-fs-4.1.5.tgz",
+ "integrity": "sha512-1zccWBMypln0jEE05LzZt+V/8y8AQsQQqxtklqaIyg5nu6OAYFhZxPXinJTSG+kU5qyNmeLgcn9AW7eHiCHVLA==",
"license": "Apache-2.0",
"optional": true,
"dependencies": {
@@ -17238,9 +17299,9 @@
}
},
"node_modules/bignumber.js": {
- "version": "9.2.1",
- "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.2.1.tgz",
- "integrity": "sha512-+NzaKgOUvInq9TIUZ1+DRspzf/HApkCwD4btfuasFTdrfnOxqx853TgDpMolp+uv4RpRp7bPcEU2zKr9+fRmyw==",
+ "version": "9.3.0",
+ "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.3.0.tgz",
+ "integrity": "sha512-EM7aMFTXbptt/wZdMlBv2t8IViwQL+h6SLHosp8Yf0dqJMTnY6iL32opnAB6kAdL0SZPuvcAzFr31o0c/R3/RA==",
"license": "MIT",
"engines": {
"node": "*"
@@ -17329,9 +17390,9 @@
"license": "MIT"
},
"node_modules/bn.js": {
- "version": "4.12.1",
- "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.1.tgz",
- "integrity": "sha512-k8TVBiPkPJT9uHLdOKfFpqcfprwBFOAAXXozRubr7R7PfIuKvQlzcI4M0pALeqXN09vdaMbUdUj+pass+uULAg==",
+ "version": "4.12.2",
+ "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.2.tgz",
+ "integrity": "sha512-n4DSx829VRTRByMRGdjQ9iqsN0Bh4OolPsFnaZBLcbi8iXcB+kJ9s7EnRt4wILZNV3kPLHkRVfOc/HvhC3ovDw==",
"license": "MIT"
},
"node_modules/body-parser": {
@@ -17391,9 +17452,9 @@
"license": "ISC"
},
"node_modules/bootstrap": {
- "version": "5.3.5",
- "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-5.3.5.tgz",
- "integrity": "sha512-ct1CHKtiobRimyGzmsSldEtM03E8fcEX4Tb3dGXz1V8faRwM50+vfHwTzOxB3IlKO7m+9vTH3s/3C6T2EAPeTA==",
+ "version": "5.3.6",
+ "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-5.3.6.tgz",
+ "integrity": "sha512-jX0GAcRzvdwISuvArXn3m7KZscWWFAf1MKBcnzaN02qWMb3jpMoUX4/qgeiGzqyIb4ojulRzs89UCUmGcFSzTA==",
"funding": [
{
"type": "github",
@@ -17459,9 +17520,9 @@
"license": "ISC"
},
"node_modules/browserslist": {
- "version": "4.24.4",
- "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.4.tgz",
- "integrity": "sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A==",
+ "version": "4.24.5",
+ "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.5.tgz",
+ "integrity": "sha512-FDToo4Wo82hIdgc1CQ+NQD0hEhmpPjrZ3hiUgwgOG6IuTdlpr8jdjyG24P6cNP1yJpTLzS5OcGgSw0xmDU1/Tw==",
"funding": [
{
"type": "opencollective",
@@ -17478,10 +17539,10 @@
],
"license": "MIT",
"dependencies": {
- "caniuse-lite": "^1.0.30001688",
- "electron-to-chromium": "^1.5.73",
+ "caniuse-lite": "^1.0.30001716",
+ "electron-to-chromium": "^1.5.149",
"node-releases": "^2.0.19",
- "update-browserslist-db": "^1.1.1"
+ "update-browserslist-db": "^1.1.3"
},
"bin": {
"browserslist": "cli.js"
@@ -17729,9 +17790,9 @@
}
},
"node_modules/caniuse-lite": {
- "version": "1.0.30001714",
- "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001714.tgz",
- "integrity": "sha512-mtgapdwDLSSBnCI3JokHM7oEQBLxiJKVRtg10AxM1AyeiKcM96f0Mkbqeq+1AbiCtvMcHRulAAEMu693JrSWqg==",
+ "version": "1.0.30001718",
+ "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001718.tgz",
+ "integrity": "sha512-AflseV1ahcSunK53NfEs9gFWgOEmzr0f+kaMFA4xiLZlr9Hzt7HxcSpIFcnNCUkz6R6dWKa54rUz3HUmI3nVcw==",
"funding": [
{
"type": "opencollective",
@@ -17898,6 +17959,27 @@
"node": ">= 16"
}
},
+ "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",
@@ -17915,6 +17997,22 @@
"url": "https://github.com/sponsors/fb55"
}
},
+ "node_modules/cheerio-select/node_modules/css-select": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz",
+ "integrity": "sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==",
+ "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/chevrotain": {
"version": "11.0.3",
"resolved": "https://registry.npmjs.org/chevrotain/-/chevrotain-11.0.3.tgz",
@@ -18015,18 +18113,27 @@
}
},
"node_modules/chromium-bidi": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/chromium-bidi/-/chromium-bidi-3.0.0.tgz",
- "integrity": "sha512-ZOGRDAhBMX1uxL2Cm2TDuhImbrsEz5A/tTcVU6RpXEWaTNUNwsHW6njUXizh51Ir6iqHbKAfhA2XK33uBcLo5A==",
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/chromium-bidi/-/chromium-bidi-1.1.0.tgz",
+ "integrity": "sha512-HislCEczCuamWm3+55Lig9XKmMF13K+BGKum9rwtDAzgUAHT4h5jNwhDmD4U20VoVUG8ujnv9UZ89qiIf5uF8w==",
"license": "Apache-2.0",
"dependencies": {
- "mitt": "^3.0.1",
- "zod": "^3.24.1"
+ "mitt": "3.0.1",
+ "zod": "3.24.1"
},
"peerDependencies": {
"devtools-protocol": "*"
}
},
+ "node_modules/chromium-bidi/node_modules/zod": {
+ "version": "3.24.1",
+ "resolved": "https://registry.npmjs.org/zod/-/zod-3.24.1.tgz",
+ "integrity": "sha512-muH7gBL9sI1nciMZV67X5fTKKBLtwpZ5VBp1vsOQzj1MhrBZ4wlVCm3gedKZWLp0Oyel8sIGfeiz54Su+OVT+A==",
+ "license": "MIT",
+ "funding": {
+ "url": "https://github.com/sponsors/colinhacks"
+ }
+ },
"node_modules/ci-info": {
"version": "3.9.0",
"resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz",
@@ -18309,9 +18416,9 @@
}
},
"node_modules/color-convert": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-3.0.1.tgz",
- "integrity": "sha512-5kQah2eolfQV7HCrxtsBBArPfT5dwaKYMCXeMQsdRO7ihTO/cuNLGjd50ITCDn+ZU/YbS0Go64SjP9154eopxg==",
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-3.1.0.tgz",
+ "integrity": "sha512-TVoqAq8ZDIpK5lsQY874DDnu65CSsc9vzq0wLpNQ6UMBq81GSZocVazPiBbYGzngzBOIRahpkTzCLVe2at4MfA==",
"license": "MIT",
"dependencies": {
"color-name": "^2.0.0"
@@ -18758,9 +18865,9 @@
}
},
"node_modules/core-js": {
- "version": "3.41.0",
- "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.41.0.tgz",
- "integrity": "sha512-SJ4/EHwS36QMJd6h/Rg+GyR4A5xE0FSI3eZ+iBVpfqf1x0eTSg1smWLHrA+2jQThZSh97fmSgFSU8B61nxosxA==",
+ "version": "3.42.0",
+ "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.42.0.tgz",
+ "integrity": "sha512-Sz4PP4ZA+Rq4II21qkNqOEDTDrCvcANId3xpIgB34NDkWc3UduWj2dqEtN9yZIq8Dk3HyPI33x9sqqU5C8sr0g==",
"hasInstallScript": true,
"license": "MIT",
"funding": {
@@ -18769,9 +18876,9 @@
}
},
"node_modules/core-js-compat": {
- "version": "3.41.0",
- "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.41.0.tgz",
- "integrity": "sha512-RFsU9LySVue9RTwdDVX/T0e2Y6jRYWXERKElIjpuEOEnxaXffI0X7RUwVzfYLfzuLXSNJDYoRYUAmRUcyln20A==",
+ "version": "3.42.0",
+ "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.42.0.tgz",
+ "integrity": "sha512-bQasjMfyDGyaeWKBIu33lHh9qlSR0MFE/Nmc6nMjf/iU9b3rSMdAYz1Baxrv4lPdGUsTqZudHA4jIGSJy0SWZQ==",
"license": "MIT",
"dependencies": {
"browserslist": "^4.24.4"
@@ -18782,9 +18889,9 @@
}
},
"node_modules/core-js-pure": {
- "version": "3.41.0",
- "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.41.0.tgz",
- "integrity": "sha512-71Gzp96T9YPk63aUvE5Q5qP+DryB4ZloUZPSOebGM88VNw8VNfvdA7z6kGA8iGOTEzAomsRidp4jXSmUIJsL+Q==",
+ "version": "3.42.0",
+ "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.42.0.tgz",
+ "integrity": "sha512-007bM04u91fF4kMgwom2I5cQxAFIy8jVulgr9eozILl/SZE53QOqnW/+vviC+wQWLv+AunBG+8Q0TLoeSsSxRQ==",
"hasInstallScript": true,
"license": "MIT",
"funding": {
@@ -18964,9 +19071,9 @@
}
},
"node_modules/css-loader/node_modules/semver": {
- "version": "7.7.1",
- "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz",
- "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==",
+ "version": "7.7.2",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz",
+ "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==",
"license": "ISC",
"bin": {
"semver": "bin/semver.js"
@@ -18976,21 +19083,73 @@
}
},
"node_modules/css-select": {
- "version": "5.1.0",
- "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz",
- "integrity": "sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==",
+ "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.1.0",
- "domhandler": "^5.0.2",
- "domutils": "^3.0.1",
+ "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/css-select/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/css-select/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/css-select/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/css-select/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/css-to-react-native": {
"version": "3.2.0",
"resolved": "https://registry.npmjs.org/css-to-react-native/-/css-to-react-native-3.2.0.tgz",
@@ -19040,12 +19199,12 @@
}
},
"node_modules/cssstyle": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-4.3.0.tgz",
- "integrity": "sha512-6r0NiY0xizYqfBvWp1G7WXJ06/bZyrk7Dc6PHql82C/pKGUTKu4yAX4Y8JPamb1ob9nBKuxWzCGTRuGwU3yxJQ==",
+ "version": "4.3.1",
+ "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-4.3.1.tgz",
+ "integrity": "sha512-ZgW+Jgdd7i52AaLYCriF8Mxqft0gD/R9i9wi6RWBhs1pqdPEzPjym7rvRKi397WmQFf3SlyUsszhw+VVCbx79Q==",
"license": "MIT",
"dependencies": {
- "@asamuzakjp/css-color": "^3.1.1",
+ "@asamuzakjp/css-color": "^3.1.2",
"rrweb-cssom": "^0.8.0"
},
"engines": {
@@ -19100,9 +19259,9 @@
"license": "MIT"
},
"node_modules/cytoscape": {
- "version": "3.31.2",
- "resolved": "https://registry.npmjs.org/cytoscape/-/cytoscape-3.31.2.tgz",
- "integrity": "sha512-/eOXg2uGdMdpGlEes5Sf6zE+jUG+05f3htFNQIxLxduOH/SsaUZiPBfAwP1btVIVzsnhiNOdi+hvDRLYfMZjGw==",
+ "version": "3.32.0",
+ "resolved": "https://registry.npmjs.org/cytoscape/-/cytoscape-3.32.0.tgz",
+ "integrity": "sha512-5JHBC9n75kz5851jeklCPmZWcg3hUe6sjqJvyk3+hVqFaKcHwHgxsjeN1yLmggoUc6STbtm9/NQyabQehfjvWQ==",
"license": "MIT",
"engines": {
"node": ">=0.10"
@@ -19655,12 +19814,12 @@
}
},
"node_modules/data-uri-to-buffer": {
- "version": "6.0.2",
- "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-6.0.2.tgz",
- "integrity": "sha512-7hvf7/GW8e86rW0ptuwS3OcBGDjIi6SZva7hCyWC0yYry2cOPmLIjXAUHI6DK2HsnwJd9ifmt57i8eV2n4YNpw==",
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-3.0.1.tgz",
+ "integrity": "sha512-WboRycPNsVw3B3TL559F7kuBUM4d8CgMEvk6xEJlOp7OBPjt6G7z8WMWlD2rOFZLk6OYfFIUGsCOWzcQH9K2og==",
"license": "MIT",
"engines": {
- "node": ">= 14"
+ "node": ">= 6"
}
},
"node_modules/data-urls": {
@@ -19747,9 +19906,9 @@
"license": "MIT"
},
"node_modules/debug": {
- "version": "4.4.0",
- "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz",
- "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==",
+ "version": "4.4.1",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz",
+ "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==",
"license": "MIT",
"dependencies": {
"ms": "^2.1.3"
@@ -19983,6 +20142,18 @@
"node": ">= 14"
}
},
+ "node_modules/degenerator/node_modules/ast-types": {
+ "version": "0.13.4",
+ "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.13.4.tgz",
+ "integrity": "sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w==",
+ "license": "MIT",
+ "dependencies": {
+ "tslib": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
"node_modules/delaunator": {
"version": "5.0.1",
"resolved": "https://registry.npmjs.org/delaunator/-/delaunator-5.0.1.tgz",
@@ -20069,9 +20240,9 @@
}
},
"node_modules/depcheck/node_modules/semver": {
- "version": "7.7.1",
- "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz",
- "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==",
+ "version": "7.7.2",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz",
+ "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==",
"license": "ISC",
"bin": {
"semver": "bin/semver.js"
@@ -20124,9 +20295,9 @@
}
},
"node_modules/detect-libc": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.3.tgz",
- "integrity": "sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==",
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.4.tgz",
+ "integrity": "sha512-3UDv+G9CsCKO1WKMGw9fwq/SWJYbI0c5Y7LU1AXYoDdbhE2AHQ6N6Nb34sG8Fj7T5APy8qXDCKuuIHd1BR0tVA==",
"license": "Apache-2.0",
"engines": {
"node": ">=8"
@@ -20153,9 +20324,9 @@
}
},
"node_modules/devtools-protocol": {
- "version": "0.0.1425554",
- "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1425554.tgz",
- "integrity": "sha512-uRfxR6Nlzdzt0ihVIkV+sLztKgs7rgquY/Mhcv1YNCWDh5IZgl5mnn2aeEnW5stYTE0wwiF4RYVz8eMEpV1SEw==",
+ "version": "0.0.1380148",
+ "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1380148.tgz",
+ "integrity": "sha512-1CJABgqLxbYxVI+uJY/UDUHJtJ0KZTSjNYJYKqd9FRoXT33WDakDHNxRapMEgzeJ/C3rcs01+avshMnPmKQbvA==",
"license": "BSD-3-Clause"
},
"node_modules/dezalgo": {
@@ -20169,9 +20340,9 @@
}
},
"node_modules/diff": {
- "version": "5.2.0",
- "resolved": "https://registry.npmjs.org/diff/-/diff-5.2.0.tgz",
- "integrity": "sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==",
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/diff/-/diff-7.0.0.tgz",
+ "integrity": "sha512-PJWHUb1RFevKCwaFA9RlG5tCd+FO5iRh9A8HEtkmBH2Li03iJriB6m6JIN4rGz3K3JLawI7/veA1xzRKP6ISBw==",
"dev": true,
"license": "BSD-3-Clause",
"engines": {
@@ -20278,9 +20449,9 @@
}
},
"node_modules/dompurify": {
- "version": "3.2.5",
- "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.2.5.tgz",
- "integrity": "sha512-mLPd29uoRe9HpvwP2TxClGQBzGXeEC/we/q+bFlmPPmj2p2Ugl3r6ATu/UU1v77DXNcehiBg9zsr1dREyA/dJQ==",
+ "version": "3.2.6",
+ "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.2.6.tgz",
+ "integrity": "sha512-/2GogDQlohXPZe6D6NOgQvXLPSYBqIWMnZ8zzOhn09REE4eyAzb+Hed3jhoM9OkuaJ8P6ZGTTVWQKAi8ieIzfQ==",
"license": "(MPL-2.0 OR Apache-2.0)",
"optionalDependencies": {
"@types/trusted-types": "^2.0.7"
@@ -20389,12 +20560,6 @@
"safer-buffer": "^2.1.0"
}
},
- "node_modules/ecc-jsbn/node_modules/jsbn": {
- "version": "0.1.1",
- "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz",
- "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==",
- "license": "MIT"
- },
"node_modules/ecdsa-sig-formatter": {
"version": "1.0.11",
"resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz",
@@ -20411,9 +20576,9 @@
"license": "MIT"
},
"node_modules/electron-to-chromium": {
- "version": "1.5.137",
- "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.137.tgz",
- "integrity": "sha512-/QSJaU2JyIuTbbABAo/crOs+SuAZLS+fVVS10PVrIT9hrRkmZl8Hb0xPSkKRUUWHQtYzXHpQUW3Dy5hwMzGZkA==",
+ "version": "1.5.155",
+ "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.155.tgz",
+ "integrity": "sha512-ps5KcGGmwL8VaeJlvlDlu4fORQpv3+GIcF5I3f9tUKUlJ/wsysh6HU8P5L1XWRYeXfA0oJd4PyM8ds8zTFf6Ng==",
"license": "ISC"
},
"node_modules/emoji-regex": {
@@ -20768,9 +20933,9 @@
}
},
"node_modules/es-module-lexer": {
- "version": "1.6.0",
- "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.6.0.tgz",
- "integrity": "sha512-qqnD1yMU6tk/jnaMosogGySTZP8YtUgAffA9nMN+E/rjxcfRQ6IEk7IiozUjgxKoFHBGjTLnrHB/YC45r/59EQ==",
+ "version": "1.7.0",
+ "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.7.0.tgz",
+ "integrity": "sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==",
"license": "MIT"
},
"node_modules/es-object-atoms": {
@@ -20838,9 +21003,9 @@
"license": "MIT"
},
"node_modules/esbuild": {
- "version": "0.25.2",
- "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.2.tgz",
- "integrity": "sha512-16854zccKPnC+toMywC+uKNeYSv+/eXkevRAfwRD/G9Cleq66m8XFIrigkbvauLLlCfDL45Q2cWegSg53gGBnQ==",
+ "version": "0.25.4",
+ "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.4.tgz",
+ "integrity": "sha512-8pgjLUcUjcgDg+2Q4NYXnPbo/vncAY4UmyaCm0jZevERqCHZIaWwdJHkf8XQtu4AxSKCdvrUbT0XUr1IdZzI8Q==",
"dev": true,
"hasInstallScript": true,
"license": "MIT",
@@ -20851,31 +21016,31 @@
"node": ">=18"
},
"optionalDependencies": {
- "@esbuild/aix-ppc64": "0.25.2",
- "@esbuild/android-arm": "0.25.2",
- "@esbuild/android-arm64": "0.25.2",
- "@esbuild/android-x64": "0.25.2",
- "@esbuild/darwin-arm64": "0.25.2",
- "@esbuild/darwin-x64": "0.25.2",
- "@esbuild/freebsd-arm64": "0.25.2",
- "@esbuild/freebsd-x64": "0.25.2",
- "@esbuild/linux-arm": "0.25.2",
- "@esbuild/linux-arm64": "0.25.2",
- "@esbuild/linux-ia32": "0.25.2",
- "@esbuild/linux-loong64": "0.25.2",
- "@esbuild/linux-mips64el": "0.25.2",
- "@esbuild/linux-ppc64": "0.25.2",
- "@esbuild/linux-riscv64": "0.25.2",
- "@esbuild/linux-s390x": "0.25.2",
- "@esbuild/linux-x64": "0.25.2",
- "@esbuild/netbsd-arm64": "0.25.2",
- "@esbuild/netbsd-x64": "0.25.2",
- "@esbuild/openbsd-arm64": "0.25.2",
- "@esbuild/openbsd-x64": "0.25.2",
- "@esbuild/sunos-x64": "0.25.2",
- "@esbuild/win32-arm64": "0.25.2",
- "@esbuild/win32-ia32": "0.25.2",
- "@esbuild/win32-x64": "0.25.2"
+ "@esbuild/aix-ppc64": "0.25.4",
+ "@esbuild/android-arm": "0.25.4",
+ "@esbuild/android-arm64": "0.25.4",
+ "@esbuild/android-x64": "0.25.4",
+ "@esbuild/darwin-arm64": "0.25.4",
+ "@esbuild/darwin-x64": "0.25.4",
+ "@esbuild/freebsd-arm64": "0.25.4",
+ "@esbuild/freebsd-x64": "0.25.4",
+ "@esbuild/linux-arm": "0.25.4",
+ "@esbuild/linux-arm64": "0.25.4",
+ "@esbuild/linux-ia32": "0.25.4",
+ "@esbuild/linux-loong64": "0.25.4",
+ "@esbuild/linux-mips64el": "0.25.4",
+ "@esbuild/linux-ppc64": "0.25.4",
+ "@esbuild/linux-riscv64": "0.25.4",
+ "@esbuild/linux-s390x": "0.25.4",
+ "@esbuild/linux-x64": "0.25.4",
+ "@esbuild/netbsd-arm64": "0.25.4",
+ "@esbuild/netbsd-x64": "0.25.4",
+ "@esbuild/openbsd-arm64": "0.25.4",
+ "@esbuild/openbsd-x64": "0.25.4",
+ "@esbuild/sunos-x64": "0.25.4",
+ "@esbuild/win32-arm64": "0.25.4",
+ "@esbuild/win32-ia32": "0.25.4",
+ "@esbuild/win32-x64": "0.25.4"
}
},
"node_modules/esbuild-register": {
@@ -20950,19 +21115,19 @@
}
},
"node_modules/eslint": {
- "version": "9.24.0",
- "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.24.0.tgz",
- "integrity": "sha512-eh/jxIEJyZrvbWRe4XuVclLPDYSYYYgLy5zXGGxD6j8zjSAxFEzI2fL/8xNq6O2yKqVt+eF2YhV+hxjV6UKXwQ==",
+ "version": "9.27.0",
+ "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.27.0.tgz",
+ "integrity": "sha512-ixRawFQuMB9DZ7fjU3iGGganFDp3+45bPOdaRurcFHSXO1e/sYwUX/FtQZpLZJR6SjMoJH8hR2pPEAfDyCoU2Q==",
"license": "MIT",
"dependencies": {
"@eslint-community/eslint-utils": "^4.2.0",
"@eslint-community/regexpp": "^4.12.1",
"@eslint/config-array": "^0.20.0",
- "@eslint/config-helpers": "^0.2.0",
- "@eslint/core": "^0.12.0",
+ "@eslint/config-helpers": "^0.2.1",
+ "@eslint/core": "^0.14.0",
"@eslint/eslintrc": "^3.3.1",
- "@eslint/js": "9.24.0",
- "@eslint/plugin-kit": "^0.2.7",
+ "@eslint/js": "9.27.0",
+ "@eslint/plugin-kit": "^0.3.1",
"@humanfs/node": "^0.16.6",
"@humanwhocodes/module-importer": "^1.0.1",
"@humanwhocodes/retry": "^0.4.2",
@@ -21009,6 +21174,22 @@
}
}
},
+ "node_modules/eslint-plugin-css-modules": {
+ "version": "2.12.0",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-css-modules/-/eslint-plugin-css-modules-2.12.0.tgz",
+ "integrity": "sha512-ruFBdad69ABrbCDCh5mXj7UzNmrvytfzPACjyvZWIAjFZAG8BXpYSbqmE8gU5wF+pIzV3jU2CWhLvfekXT/IgQ==",
+ "license": "MIT",
+ "dependencies": {
+ "gonzales-pe": "^4.3.0",
+ "lodash": "^4.17.2"
+ },
+ "engines": {
+ "node": ">=4.0.0"
+ },
+ "peerDependencies": {
+ "eslint": ">=2.0.0"
+ }
+ },
"node_modules/eslint-plugin-react": {
"version": "7.37.5",
"resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.37.5.tgz",
@@ -21265,97 +21446,38 @@
}
},
"node_modules/execa": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz",
- "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==",
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz",
+ "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==",
"license": "MIT",
"dependencies": {
- "cross-spawn": "^6.0.0",
- "get-stream": "^4.0.0",
- "is-stream": "^1.1.0",
- "npm-run-path": "^2.0.0",
- "p-finally": "^1.0.0",
- "signal-exit": "^3.0.0",
- "strip-eof": "^1.0.0"
+ "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": ">=6"
- }
- },
- "node_modules/execa/node_modules/cross-spawn": {
- "version": "6.0.6",
- "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.6.tgz",
- "integrity": "sha512-VqCUuhcd1iB+dsv8gxPttb5iZh/D0iubSP21g36KXdEuf6I5JiioesUVjpCdHV9MZRUfVFlvwtIUyPfxo5trtw==",
- "license": "MIT",
- "dependencies": {
- "nice-try": "^1.0.4",
- "path-key": "^2.0.1",
- "semver": "^5.5.0",
- "shebang-command": "^1.2.0",
- "which": "^1.2.9"
+ "node": ">=10"
},
- "engines": {
- "node": ">=4.8"
+ "funding": {
+ "url": "https://github.com/sindresorhus/execa?sponsor=1"
}
},
"node_modules/execa/node_modules/get-stream": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz",
- "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==",
- "license": "MIT",
- "dependencies": {
- "pump": "^3.0.0"
- },
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/execa/node_modules/is-stream": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz",
- "integrity": "sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==",
- "license": "MIT",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/execa/node_modules/path-key": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz",
- "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==",
+ "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": ">=4"
- }
- },
- "node_modules/execa/node_modules/semver": {
- "version": "5.7.2",
- "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz",
- "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==",
- "license": "ISC",
- "bin": {
- "semver": "bin/semver"
- }
- },
- "node_modules/execa/node_modules/shebang-command": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz",
- "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==",
- "license": "MIT",
- "dependencies": {
- "shebang-regex": "^1.0.0"
+ "node": ">=10"
},
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/execa/node_modules/shebang-regex": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz",
- "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==",
- "license": "MIT",
- "engines": {
- "node": ">=0.10.0"
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/execa/node_modules/signal-exit": {
@@ -21364,18 +21486,6 @@
"integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==",
"license": "ISC"
},
- "node_modules/execa/node_modules/which": {
- "version": "1.3.1",
- "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz",
- "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==",
- "license": "ISC",
- "dependencies": {
- "isexe": "^2.0.0"
- },
- "bin": {
- "which": "bin/which"
- }
- },
"node_modules/exif": {
"version": "0.6.0",
"resolved": "https://registry.npmjs.org/exif/-/exif-0.6.0.tgz",
@@ -21566,9 +21676,9 @@
"license": "MIT"
},
"node_modules/exsolve": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/exsolve/-/exsolve-1.0.4.tgz",
- "integrity": "sha512-xsZH6PXaER4XoV+NiT7JHp1bJodJVT+cxeSH1G0f0tlT0lJqYuHUP3bUx2HtfTDvOagMINYp8rsqusxud3RXhw==",
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/exsolve/-/exsolve-1.0.5.tgz",
+ "integrity": "sha512-pz5dvkYYKQ1AHVrgOzBKWeP4u4FRb3a6DNK2ucr0OoNwYIU4QWsJ+NM36LLzORT+z845MzKHHhpXiUF5nvQoJg==",
"license": "MIT"
},
"node_modules/extend": {
@@ -21753,9 +21863,9 @@
"license": "BSD-3-Clause"
},
"node_modules/fast-xml-parser": {
- "version": "5.2.0",
- "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-5.2.0.tgz",
- "integrity": "sha512-Uw9+Mjt4SBRud1IcaYuW/O0lW8SKKdMl5g7g24HiIuyH5fQSD+AVLybSlJtqLYEbytVFjWQa5DMGcNgeksdRBg==",
+ "version": "5.2.3",
+ "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-5.2.3.tgz",
+ "integrity": "sha512-OdCYfRqfpuLUFonTNjvd30rCBZUneHpSQkCqfaeWQ9qrKcl6XlWeDBNVwGb+INAIxRshuN2jF+BE0L6gbBO2mw==",
"funding": [
{
"type": "github",
@@ -21764,7 +21874,7 @@
],
"license": "MIT",
"dependencies": {
- "strnum": "^2.0.5"
+ "strnum": "^2.1.0"
},
"bin": {
"fxparser": "src/cli/cli.js"
@@ -22105,9 +22215,9 @@
"license": "ISC"
},
"node_modules/flexlayout-react": {
- "version": "0.8.12",
- "resolved": "https://registry.npmjs.org/flexlayout-react/-/flexlayout-react-0.8.12.tgz",
- "integrity": "sha512-9/6ZSIdT2vdq72d6OhdvbED6amv1ExNV20CCTe+JRunQxeYHz78CoKBb/t2ZHmRMj0xjv/ua7Gztoux8JsPlWw==",
+ "version": "0.8.17",
+ "resolved": "https://registry.npmjs.org/flexlayout-react/-/flexlayout-react-0.8.17.tgz",
+ "integrity": "sha512-F0utJcrIGBpF4btqRYLFOoITQcyFxUp19X4dvFvEceD/CJkRoefV96iN1lDU63t9ystgltmWw7AscgNbKJMlcA==",
"license": "ISC",
"peerDependencies": {
"react": "^18.0.0 || ^19.0.0",
@@ -22343,9 +22453,9 @@
}
},
"node_modules/fork-ts-checker-webpack-plugin/node_modules/semver": {
- "version": "7.7.1",
- "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz",
- "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==",
+ "version": "7.7.2",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz",
+ "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==",
"license": "ISC",
"bin": {
"semver": "bin/semver.js"
@@ -22388,15 +22498,18 @@
}
},
"node_modules/formidable": {
- "version": "3.5.2",
- "resolved": "https://registry.npmjs.org/formidable/-/formidable-3.5.2.tgz",
- "integrity": "sha512-Jqc1btCy3QzRbJaICGwKcBfGWuLADRerLzDqi2NwSt/UkXLsHJw2TVResiaoBufHVHy9aSgClOHCeJsSsFLTbg==",
+ "version": "3.5.4",
+ "resolved": "https://registry.npmjs.org/formidable/-/formidable-3.5.4.tgz",
+ "integrity": "sha512-YikH+7CUTOtP44ZTnUhR7Ic2UASBPOqmaRkRKxRbywPTe5VxF7RRCck4af9wutiZ/QKM5nME9Bie2fFaPz5Gug==",
"license": "MIT",
"dependencies": {
+ "@paralleldrive/cuid2": "^2.2.2",
"dezalgo": "^1.0.4",
- "hexoid": "^2.0.0",
"once": "^1.4.0"
},
+ "engines": {
+ "node": ">=14.0.0"
+ },
"funding": {
"url": "https://ko-fi.com/tunnckoCore/commissions"
}
@@ -22827,6 +22940,15 @@
"node": ">= 14"
}
},
+ "node_modules/get-uri/node_modules/data-uri-to-buffer": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-6.0.2.tgz",
+ "integrity": "sha512-7hvf7/GW8e86rW0ptuwS3OcBGDjIi6SZva7hCyWC0yYry2cOPmLIjXAUHI6DK2HsnwJd9ifmt57i8eV2n4YNpw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 14"
+ }
+ },
"node_modules/get-value": {
"version": "2.0.6",
"resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz",
@@ -22972,9 +23094,9 @@
}
},
"node_modules/globals": {
- "version": "16.0.0",
- "resolved": "https://registry.npmjs.org/globals/-/globals-16.0.0.tgz",
- "integrity": "sha512-iInW14XItCXET01CQFqudPOWP2jYMl7T+QRQT+UNcR/iQncN/F0UNpgd76iFkBPgNQb4+X3LV9tLJYzwh+Gl3A==",
+ "version": "16.1.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-16.1.0.tgz",
+ "integrity": "sha512-aibexHNbb/jiUSObBgpHLj+sIuUmJnYcgXBlrfsiDZ9rt4aF2TFRbyLgZ2iFQuVZ1K5Mx3FVkbKRSgKrbK3K2g==",
"dev": true,
"license": "MIT",
"engines": {
@@ -23007,6 +23129,21 @@
"integrity": "sha512-sIVQCiRWOymHbVD1Aw/T9/ijbPYAVGBlgGYd1N9MRKfcyBNSpjr87Vg9nSHm+RCT8ELrvK8IJYJV0QRJuVUkCQ==",
"license": "MIT"
},
+ "node_modules/gonzales-pe": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/gonzales-pe/-/gonzales-pe-4.3.0.tgz",
+ "integrity": "sha512-otgSPpUmdWJ43VXyiNgEYE4luzHCL2pz4wQ0OnDluC6Eg4Ko3Vexy/SrSynglw/eR+OhkzmqFCZa/OFa/RgAOQ==",
+ "license": "MIT",
+ "dependencies": {
+ "minimist": "^1.2.5"
+ },
+ "bin": {
+ "gonzales": "bin/gonzales.js"
+ },
+ "engines": {
+ "node": ">=0.6.0"
+ }
+ },
"node_modules/google-auth-library": {
"version": "9.15.1",
"resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-9.15.1.tgz",
@@ -23551,15 +23688,6 @@
"he": "bin/he"
}
},
- "node_modules/hexoid": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/hexoid/-/hexoid-2.0.0.tgz",
- "integrity": "sha512-qlspKUK7IlSQv2o+5I7yhUd7TxlOG2Vr5LTa3ve2XSNVKAL/n/u/7KLvKmFNimomDIKvZFXWHv0T12mv7rT8Aw==",
- "license": "MIT",
- "engines": {
- "node": ">=8"
- }
- },
"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",
@@ -23726,25 +23854,6 @@
"node": ">=14"
}
},
- "node_modules/html-to-text/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/html-url-attributes": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/html-url-attributes/-/html-url-attributes-3.0.1.tgz",
@@ -23810,6 +23919,25 @@
"node": ">=8.0.0"
}
},
+ "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-browserify": {
"version": "1.7.0",
"resolved": "https://registry.npmjs.org/http-browserify/-/http-browserify-1.7.0.tgz",
@@ -23821,9 +23949,9 @@
}
},
"node_modules/http-cache-semantics": {
- "version": "4.1.1",
- "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz",
- "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==",
+ "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": {
@@ -23937,6 +24065,15 @@
"node": ">= 14"
}
},
+ "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/humanize-ms": {
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz",
@@ -24192,9 +24329,9 @@
"license": "MIT"
},
"node_modules/immutable": {
- "version": "5.1.1",
- "resolved": "https://registry.npmjs.org/immutable/-/immutable-5.1.1.tgz",
- "integrity": "sha512-3jatXi9ObIsPGr3N5hGw/vWWcTkq6hUYhpQz4k0wLC+owqWi/LiugIw9x0EdNZ2yGedKN/HzePiBvaJRXa0Ujg==",
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/immutable/-/immutable-5.1.2.tgz",
+ "integrity": "sha512-qHKXW1q6liAk1Oys6umoaZbDRqjcjgSrbnrifHsfsttza7zcvRAsL7mMV6xWcyhwQy7Xj5v4hhbr6b+iDYwlmQ==",
"license": "MIT"
},
"node_modules/import-fresh": {
@@ -24475,15 +24612,6 @@
"node": ">=12"
}
},
- "node_modules/interpret": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz",
- "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==",
- "license": "MIT",
- "engines": {
- "node": ">= 0.10"
- }
- },
"node_modules/interval-arithmetic": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/interval-arithmetic/-/interval-arithmetic-1.1.2.tgz",
@@ -24547,6 +24675,12 @@
"node": ">= 12"
}
},
+ "node_modules/ip-address/node_modules/jsbn": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-1.1.0.tgz",
+ "integrity": "sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==",
+ "license": "MIT"
+ },
"node_modules/ip-address/node_modules/sprintf-js": {
"version": "1.1.3",
"resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz",
@@ -25447,9 +25581,9 @@
}
},
"node_modules/jsbn": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-1.1.0.tgz",
- "integrity": "sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==",
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz",
+ "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==",
"license": "MIT"
},
"node_modules/jsdoc-type-pratt-parser": {
@@ -25702,12 +25836,12 @@
}
},
"node_modules/jwa": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/jwa/-/jwa-2.0.0.tgz",
- "integrity": "sha512-jrZ2Qx916EA+fq9cEAeCROWPTfCwi1IVHqT2tapuqLEVVDKFDENFw1oL+MwrTvH6msKxsd1YTDVw6uKEcsrLEA==",
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/jwa/-/jwa-2.0.1.tgz",
+ "integrity": "sha512-hRF04fqJIP8Abbkq5NKGN0Bbr3JxlQ+qhZufXVr0DvujKy93ZCbXZMHDL4EOtodSbCWxOqR8MS1tXA5hwqCXDg==",
"license": "MIT",
"dependencies": {
- "buffer-equal-constant-time": "1.0.1",
+ "buffer-equal-constant-time": "^1.0.1",
"ecdsa-sig-formatter": "1.0.11",
"safe-buffer": "^5.0.1"
}
@@ -25864,15 +25998,6 @@
}
}
},
- "node_modules/ky-universal/node_modules/data-uri-to-buffer": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-3.0.1.tgz",
- "integrity": "sha512-WboRycPNsVw3B3TL559F7kuBUM4d8CgMEvk6xEJlOp7OBPjt6G7z8WMWlD2rOFZLk6OYfFIUGsCOWzcQH9K2og==",
- "license": "MIT",
- "engines": {
- "node": ">= 6"
- }
- },
"node_modules/ky-universal/node_modules/node-fetch": {
"version": "3.0.0-beta.9",
"resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.0.0-beta.9.tgz",
@@ -25972,9 +26097,9 @@
}
},
"node_modules/ldrs": {
- "version": "1.1.6",
- "resolved": "https://registry.npmjs.org/ldrs/-/ldrs-1.1.6.tgz",
- "integrity": "sha512-cyFUYjmhjHaEnFXcZFeNg/jfDYUuzdf7sj71uqQeUoniFzcifSe3zxCf3qWqGD4R49wtAFTrHOpqPyCuzMik9g==",
+ "version": "1.1.7",
+ "resolved": "https://registry.npmjs.org/ldrs/-/ldrs-1.1.7.tgz",
+ "integrity": "sha512-rZnfveeY1SeS3F3ifUVd9AVGTFHmQ0qzp5fuszAirnrVkjqJBLrm99vtr/Mxbby4XgadUYv+DsFqyk2p4FV40Q==",
"license": "MIT"
},
"node_modules/leac": {
@@ -26323,9 +26448,9 @@
"license": "MIT"
},
"node_modules/mapbox-gl": {
- "version": "3.11.0",
- "resolved": "https://registry.npmjs.org/mapbox-gl/-/mapbox-gl-3.11.0.tgz",
- "integrity": "sha512-0bJoYMgwn/z0RSJH7j/kYq3xlTX8Vt4dBkWAKJFneB49PAiq+rAAZRAeUhMxCr8PoGLRaDBagF3fTsA/WK6Q4A==",
+ "version": "3.12.0",
+ "resolved": "https://registry.npmjs.org/mapbox-gl/-/mapbox-gl-3.12.0.tgz",
+ "integrity": "sha512-DV6TRr+xoPrLSKuGiUcbyLVkoLdNaNNpn6O7+ZC27yQH7BOOIF7l6JKbTCMhfMJuZBVJfL8YRJjlMJ6MZCTggA==",
"license": "SEE LICENSE IN LICENSE.txt",
"workspaces": [
"src/style-spec",
@@ -26347,11 +26472,12 @@
"@types/supercluster": "^7.1.3",
"cheap-ruler": "^4.0.0",
"csscolorparser": "~1.0.3",
- "earcut": "^3.0.0",
+ "earcut": "^3.0.1",
"geojson-vt": "^4.0.2",
"gl-matrix": "^3.4.3",
"grid-index": "^1.1.0",
"kdbush": "^4.0.2",
+ "martinez-polygon-clipping": "^0.7.4",
"murmurhash-js": "^1.0.0",
"pbf": "^3.2.1",
"potpack": "^2.0.0",
@@ -26414,9 +26540,9 @@
}
},
"node_modules/markdown-to-jsx": {
- "version": "7.7.4",
- "resolved": "https://registry.npmjs.org/markdown-to-jsx/-/markdown-to-jsx-7.7.4.tgz",
- "integrity": "sha512-1bSfXyBKi+EYS3YY+e0Csuxf8oZ3decdfhOav/Z7Wrk89tjudyL5FOmwZQUoy0/qVXGUl+6Q3s2SWtpDEWITfQ==",
+ "version": "7.7.6",
+ "resolved": "https://registry.npmjs.org/markdown-to-jsx/-/markdown-to-jsx-7.7.6.tgz",
+ "integrity": "sha512-/PWFFoKKMidk4Ut06F5hs5sluq1aJ0CGvUJWsnCK6hx/LPM8vlhvKAxtGHJ+U+V2Il2wmnfO6r81ICD3xZRVaw==",
"license": "MIT",
"engines": {
"node": ">= 10"
@@ -26426,9 +26552,9 @@
}
},
"node_modules/marked": {
- "version": "15.0.8",
- "resolved": "https://registry.npmjs.org/marked/-/marked-15.0.8.tgz",
- "integrity": "sha512-rli4l2LyZqpQuRve5C0rkn6pj3hT8EWPC+zkAxFTAJLxRbENfTAhEQq9itrmf1Y81QtAX5D/MYlGlIomNgj9lA==",
+ "version": "15.0.12",
+ "resolved": "https://registry.npmjs.org/marked/-/marked-15.0.12.tgz",
+ "integrity": "sha512-8dD6FusOQSrpv9Z1rdNMdlSgQOIP880DHqnohobOmYLElGEqAL/JvxvuxZO16r4HtjTlfPRDC1hbvxC9dPN2nA==",
"license": "MIT",
"bin": {
"marked": "bin/marked.js"
@@ -26437,6 +26563,23 @@
"node": ">= 18"
}
},
+ "node_modules/martinez-polygon-clipping": {
+ "version": "0.7.4",
+ "resolved": "https://registry.npmjs.org/martinez-polygon-clipping/-/martinez-polygon-clipping-0.7.4.tgz",
+ "integrity": "sha512-jBEwrKtA0jTagUZj2bnmb4Yg2s4KnJGRePStgI7bAVjtcipKiF39R4LZ2V/UT61jMYWrTcBhPazexeqd6JAVtw==",
+ "license": "MIT",
+ "dependencies": {
+ "robust-predicates": "^2.0.4",
+ "splaytree": "^0.1.4",
+ "tinyqueue": "^1.2.0"
+ }
+ },
+ "node_modules/martinez-polygon-clipping/node_modules/tinyqueue": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/tinyqueue/-/tinyqueue-1.2.3.tgz",
+ "integrity": "sha512-Qz9RgWuO9l8lT+Y9xvbzhPT2efIUIFd69N7eF7tJ9lnQl0iLj1M7peK7IoUGZL9DJHw9XftqLreccfxcQgYLxA==",
+ "license": "ISC"
+ },
"node_modules/material-colors": {
"version": "1.2.6",
"resolved": "https://registry.npmjs.org/material-colors/-/material-colors-1.2.6.tgz",
@@ -26803,6 +26946,12 @@
"url": "https://opencollective.com/unified"
}
},
+ "node_modules/mdn-data": {
+ "version": "2.21.0",
+ "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.21.0.tgz",
+ "integrity": "sha512-+ZKPQezM5vYJIkCxaC+4DTnRrVZR1CgsKLu5zsQERQx6Tea8Y+wMx5A24rq8A8NepCeatIQufVAekKNgiBMsGQ==",
+ "license": "CC0-1.0"
+ },
"node_modules/mdurl": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/mdurl/-/mdurl-2.0.0.tgz",
@@ -27561,6 +27710,15 @@
"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",
@@ -27754,17 +27912,16 @@
}
},
"node_modules/mocha": {
- "version": "11.1.0",
- "resolved": "https://registry.npmjs.org/mocha/-/mocha-11.1.0.tgz",
- "integrity": "sha512-8uJR5RTC2NgpY3GrYcgpZrsEd9zKbPDpob1RezyR2upGHRQtHWofmzTMzTMSV6dru3tj5Ukt0+Vnq1qhFEEwAg==",
+ "version": "11.4.0",
+ "resolved": "https://registry.npmjs.org/mocha/-/mocha-11.4.0.tgz",
+ "integrity": "sha512-O6oi5Y9G6uu8f9iqXR6iKNLWHLRex3PKbmHynfpmUnMJJGrdgXh8ZmS85Ei5KR2Gnl+/gQ9s+Ktv5CqKybNw4A==",
"dev": true,
"license": "MIT",
"dependencies": {
- "ansi-colors": "^4.1.3",
"browser-stdout": "^1.3.1",
- "chokidar": "^3.5.3",
+ "chokidar": "^4.0.1",
"debug": "^4.3.5",
- "diff": "^5.2.0",
+ "diff": "^7.0.0",
"escape-string-regexp": "^4.0.0",
"find-up": "^5.0.0",
"glob": "^10.4.5",
@@ -27773,6 +27930,7 @@
"log-symbols": "^4.1.0",
"minimatch": "^5.1.6",
"ms": "^2.1.3",
+ "picocolors": "^1.1.1",
"serialize-javascript": "^6.0.2",
"strip-json-comments": "^3.1.1",
"supports-color": "^8.1.1",
@@ -27816,31 +27974,6 @@
"balanced-match": "^1.0.0"
}
},
- "node_modules/mocha/node_modules/chokidar": {
- "version": "3.6.0",
- "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz",
- "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==",
- "dev": true,
- "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/mocha/node_modules/cliui": {
"version": "8.0.1",
"resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz",
@@ -27863,19 +27996,6 @@
"dev": true,
"license": "MIT"
},
- "node_modules/mocha/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==",
- "dev": true,
- "license": "ISC",
- "dependencies": {
- "is-glob": "^4.0.1"
- },
- "engines": {
- "node": ">= 6"
- }
- },
"node_modules/mocha/node_modules/js-yaml": {
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz",
@@ -27994,9 +28114,9 @@
}
},
"node_modules/mongodb": {
- "version": "6.15.0",
- "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-6.15.0.tgz",
- "integrity": "sha512-ifBhQ0rRzHDzqp9jAQP6OwHSH7dbYIQjD3SbJs9YYk9AikKEettW/9s/tbSFDTpXcRbF+u1aLrhHxDFaYtZpFQ==",
+ "version": "6.16.0",
+ "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-6.16.0.tgz",
+ "integrity": "sha512-D1PNcdT0y4Grhou5Zi/qgipZOYeWrhLEpk33n3nm6LGtz61jvO88WlrWCK/bigMjpnOdAUKKQwsGIl0NtWMyYw==",
"license": "Apache-2.0",
"dependencies": {
"@mongodb-js/saslprep": "^1.1.9",
@@ -28050,14 +28170,14 @@
}
},
"node_modules/mongoose": {
- "version": "8.13.2",
- "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-8.13.2.tgz",
- "integrity": "sha512-riCBqZmNkYBWjXpM3qWLDQw7QmTKsVZDPhLXFJqC87+OjocEVpvS3dA2BPPUiLAu+m0/QmEj5pSXKhH+/DgerQ==",
+ "version": "8.15.0",
+ "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-8.15.0.tgz",
+ "integrity": "sha512-WFKsY1q12ScGabnZWUB9c/QzZmz/ESorrV27OembB7Gz6rrh9m3GA4Srsv1uvW1s9AHO5DeZ6DdUTyF9zyNERQ==",
"license": "MIT",
"dependencies": {
"bson": "^6.10.3",
"kareem": "2.6.3",
- "mongodb": "~6.15.0",
+ "mongodb": "~6.16.0",
"mpath": "0.9.0",
"mquery": "5.0.0",
"ms": "2.1.3",
@@ -28238,12 +28358,6 @@
"double-bits": "^1.1.0"
}
},
- "node_modules/nice-try": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz",
- "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==",
- "license": "MIT"
- },
"node_modules/no-case": {
"version": "3.0.4",
"resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz",
@@ -28255,9 +28369,9 @@
}
},
"node_modules/node-abi": {
- "version": "3.74.0",
- "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.74.0.tgz",
- "integrity": "sha512-c5XK0MjkGBrQPGYG24GBADZud0NCbznxNx0ZkS+ebUTrmV1qTDxPxSL8zEAPURXSbLRWVexxmP4986BziahL5w==",
+ "version": "3.75.0",
+ "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.75.0.tgz",
+ "integrity": "sha512-OhYaY5sDsIka7H7AtijtI9jwGYLyl29eQn/W623DiN/MIv5sUqc4g7BIDThX+gb7di9f6xK02nkp8sdfFWZLTg==",
"license": "MIT",
"dependencies": {
"semver": "^7.3.5"
@@ -28267,9 +28381,9 @@
}
},
"node_modules/node-abi/node_modules/semver": {
- "version": "7.7.1",
- "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz",
- "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==",
+ "version": "7.7.2",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz",
+ "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==",
"license": "ISC",
"bin": {
"semver": "bin/semver.js"
@@ -28294,6 +28408,7 @@
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz",
"integrity": "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==",
+ "deprecated": "Use your platform's native DOMException instead",
"funding": [
{
"type": "github",
@@ -28396,9 +28511,9 @@
}
},
"node_modules/nodemon": {
- "version": "3.1.9",
- "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-3.1.9.tgz",
- "integrity": "sha512-hdr1oIb2p6ZSxu3PB2JWWYS7ZQ0qvaZsc3hK8DR8f02kRzc8rjYmxAIvdz+aYC+8F2IjNaB7HMcSDg8nQpJxyg==",
+ "version": "3.1.10",
+ "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-3.1.10.tgz",
+ "integrity": "sha512-WDjw3pJ0/0jMFmyNDp3gvY2YizjLmmOUQo6DEBY+JgdvW/yQ9mEeSw6H5ythl5Ny2ytb7f9C2nIbjSxMNzbJXw==",
"license": "MIT",
"dependencies": {
"chokidar": "^3.5.2",
@@ -28469,9 +28584,9 @@
}
},
"node_modules/nodemon/node_modules/semver": {
- "version": "7.7.1",
- "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz",
- "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==",
+ "version": "7.7.2",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz",
+ "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==",
"license": "ISC",
"bin": {
"semver": "bin/semver.js"
@@ -28548,9 +28663,9 @@
}
},
"node_modules/npm": {
- "version": "11.3.0",
- "resolved": "https://registry.npmjs.org/npm/-/npm-11.3.0.tgz",
- "integrity": "sha512-luthFIP0nFX3+nTfYbWI3p4hP4CiVnKOZ5jdxnF2x7B+Shz8feiSJCLLzgJUNxQ2cDdTaVUiH6RRsMT++vIMZg==",
+ "version": "11.4.0",
+ "resolved": "https://registry.npmjs.org/npm/-/npm-11.4.0.tgz",
+ "integrity": "sha512-dZCRoh7oBdnIQrz+KHjWYmxIoWpcpzweEzj6g3mVGr/C0nPsStEu3mS9KUI3xnGbO8xRgRjRr/6KOJhf5dKXcw==",
"bundleDependencies": [
"@isaacs/string-locale-compare",
"@npmcli/arborist",
@@ -28629,16 +28744,16 @@
],
"dependencies": {
"@isaacs/string-locale-compare": "^1.1.0",
- "@npmcli/arborist": "^9.0.2",
- "@npmcli/config": "^10.2.0",
+ "@npmcli/arborist": "^9.1.0",
+ "@npmcli/config": "^10.3.0",
"@npmcli/fs": "^4.0.0",
"@npmcli/map-workspaces": "^4.0.2",
"@npmcli/package-json": "^6.1.1",
"@npmcli/promise-spawn": "^8.0.2",
"@npmcli/redact": "^3.1.1",
"@npmcli/run-script": "^9.1.0",
- "@sigstore/tuf": "^3.0.0",
- "abbrev": "^3.0.0",
+ "@sigstore/tuf": "^3.1.1",
+ "abbrev": "^3.0.1",
"archy": "~1.0.0",
"cacache": "^19.0.1",
"chalk": "^5.4.1",
@@ -28648,21 +28763,21 @@
"fs-minipass": "^3.0.3",
"glob": "^10.4.5",
"graceful-fs": "^4.2.11",
- "hosted-git-info": "^8.0.2",
+ "hosted-git-info": "^8.1.0",
"ini": "^5.0.0",
- "init-package-json": "^8.0.0",
+ "init-package-json": "^8.2.1",
"is-cidr": "^5.1.1",
"json-parse-even-better-errors": "^4.0.0",
- "libnpmaccess": "^10.0.0",
- "libnpmdiff": "^8.0.2",
- "libnpmexec": "^10.1.1",
- "libnpmfund": "^7.0.2",
+ "libnpmaccess": "^10.0.1",
+ "libnpmdiff": "^8.0.3",
+ "libnpmexec": "^10.1.2",
+ "libnpmfund": "^7.0.3",
"libnpmorg": "^8.0.0",
- "libnpmpack": "^9.0.2",
+ "libnpmpack": "^9.0.3",
"libnpmpublish": "^11.0.0",
"libnpmsearch": "^9.0.0",
- "libnpmteam": "^8.0.0",
- "libnpmversion": "^8.0.0",
+ "libnpmteam": "^8.0.1",
+ "libnpmversion": "^8.0.1",
"make-fetch-happen": "^14.0.3",
"minimatch": "^9.0.5",
"minipass": "^7.1.1",
@@ -28684,7 +28799,7 @@
"proc-log": "^5.0.0",
"qrcode-terminal": "^0.12.0",
"read": "^4.1.0",
- "semver": "^7.7.1",
+ "semver": "^7.7.2",
"spdx-expression-parse": "^4.0.0",
"ssri": "^12.0.0",
"supports-color": "^10.0.0",
@@ -28704,24 +28819,15 @@
}
},
"node_modules/npm-run-path": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz",
- "integrity": "sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw==",
+ "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": "^2.0.0"
+ "path-key": "^3.0.0"
},
"engines": {
- "node": ">=4"
- }
- },
- "node_modules/npm-run-path/node_modules/path-key": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz",
- "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==",
- "license": "MIT",
- "engines": {
- "node": ">=4"
+ "node": ">=8"
}
},
"node_modules/npm/node_modules/@isaacs/cliui": {
@@ -28818,7 +28924,7 @@
}
},
"node_modules/npm/node_modules/@npmcli/arborist": {
- "version": "9.0.2",
+ "version": "9.1.0",
"inBundle": true,
"license": "ISC",
"dependencies": {
@@ -28865,7 +28971,7 @@
}
},
"node_modules/npm/node_modules/@npmcli/config": {
- "version": "10.2.0",
+ "version": "10.3.0",
"inBundle": true,
"license": "ISC",
"dependencies": {
@@ -29000,11 +29106,11 @@
}
},
"node_modules/npm/node_modules/@npmcli/query": {
- "version": "4.0.0",
+ "version": "4.0.1",
"inBundle": true,
"license": "ISC",
"dependencies": {
- "postcss-selector-parser": "^6.1.2"
+ "postcss-selector-parser": "^7.0.0"
},
"engines": {
"node": "^18.17.0 || >=20.5.0"
@@ -29063,7 +29169,7 @@
}
},
"node_modules/npm/node_modules/@sigstore/protobuf-specs": {
- "version": "0.4.0",
+ "version": "0.4.1",
"inBundle": true,
"license": "Apache-2.0",
"engines": {
@@ -29087,11 +29193,11 @@
}
},
"node_modules/npm/node_modules/@sigstore/tuf": {
- "version": "3.1.0",
+ "version": "3.1.1",
"inBundle": true,
"license": "Apache-2.0",
"dependencies": {
- "@sigstore/protobuf-specs": "^0.4.0",
+ "@sigstore/protobuf-specs": "^0.4.1",
"tuf-js": "^3.0.1"
},
"engines": {
@@ -29099,13 +29205,13 @@
}
},
"node_modules/npm/node_modules/@sigstore/verify": {
- "version": "2.1.0",
+ "version": "2.1.1",
"inBundle": true,
"license": "Apache-2.0",
"dependencies": {
"@sigstore/bundle": "^3.1.0",
"@sigstore/core": "^2.0.0",
- "@sigstore/protobuf-specs": "^0.4.0"
+ "@sigstore/protobuf-specs": "^0.4.1"
},
"engines": {
"node": "^18.17.0 || >=20.5.0"
@@ -29132,7 +29238,7 @@
}
},
"node_modules/npm/node_modules/abbrev": {
- "version": "3.0.0",
+ "version": "3.0.1",
"inBundle": true,
"license": "ISC",
"engines": {
@@ -29197,7 +29303,7 @@
}
},
"node_modules/npm/node_modules/binary-extensions": {
- "version": "3.0.0",
+ "version": "3.1.0",
"inBundle": true,
"license": "MIT",
"engines": {
@@ -29537,7 +29643,7 @@
"license": "ISC"
},
"node_modules/npm/node_modules/hosted-git-info": {
- "version": "8.0.2",
+ "version": "8.1.0",
"inBundle": true,
"license": "ISC",
"dependencies": {
@@ -29548,7 +29654,7 @@
}
},
"node_modules/npm/node_modules/http-cache-semantics": {
- "version": "4.1.1",
+ "version": "4.2.0",
"inBundle": true,
"license": "BSD-2-Clause"
},
@@ -29616,7 +29722,7 @@
}
},
"node_modules/npm/node_modules/init-package-json": {
- "version": "8.0.0",
+ "version": "8.2.1",
"inBundle": true,
"license": "ISC",
"dependencies": {
@@ -29733,7 +29839,7 @@
"license": "MIT"
},
"node_modules/npm/node_modules/libnpmaccess": {
- "version": "10.0.0",
+ "version": "10.0.1",
"inBundle": true,
"license": "ISC",
"dependencies": {
@@ -29745,11 +29851,11 @@
}
},
"node_modules/npm/node_modules/libnpmdiff": {
- "version": "8.0.2",
+ "version": "8.0.3",
"inBundle": true,
"license": "ISC",
"dependencies": {
- "@npmcli/arborist": "^9.0.2",
+ "@npmcli/arborist": "^9.1.0",
"@npmcli/installed-package-contents": "^3.0.0",
"binary-extensions": "^3.0.0",
"diff": "^7.0.0",
@@ -29763,11 +29869,11 @@
}
},
"node_modules/npm/node_modules/libnpmexec": {
- "version": "10.1.1",
+ "version": "10.1.2",
"inBundle": true,
"license": "ISC",
"dependencies": {
- "@npmcli/arborist": "^9.0.2",
+ "@npmcli/arborist": "^9.1.0",
"@npmcli/package-json": "^6.1.1",
"@npmcli/run-script": "^9.0.1",
"ci-info": "^4.0.0",
@@ -29784,11 +29890,11 @@
}
},
"node_modules/npm/node_modules/libnpmfund": {
- "version": "7.0.2",
+ "version": "7.0.3",
"inBundle": true,
"license": "ISC",
"dependencies": {
- "@npmcli/arborist": "^9.0.2"
+ "@npmcli/arborist": "^9.1.0"
},
"engines": {
"node": "^20.17.0 || >=22.9.0"
@@ -29807,11 +29913,11 @@
}
},
"node_modules/npm/node_modules/libnpmpack": {
- "version": "9.0.2",
+ "version": "9.0.3",
"inBundle": true,
"license": "ISC",
"dependencies": {
- "@npmcli/arborist": "^9.0.2",
+ "@npmcli/arborist": "^9.1.0",
"@npmcli/run-script": "^9.0.1",
"npm-package-arg": "^12.0.0",
"pacote": "^21.0.0"
@@ -29850,7 +29956,7 @@
}
},
"node_modules/npm/node_modules/libnpmteam": {
- "version": "8.0.0",
+ "version": "8.0.1",
"inBundle": true,
"license": "ISC",
"dependencies": {
@@ -29862,7 +29968,7 @@
}
},
"node_modules/npm/node_modules/libnpmversion": {
- "version": "8.0.0",
+ "version": "8.0.1",
"inBundle": true,
"license": "ISC",
"dependencies": {
@@ -30399,7 +30505,7 @@
}
},
"node_modules/npm/node_modules/postcss-selector-parser": {
- "version": "6.1.2",
+ "version": "7.1.0",
"inBundle": true,
"license": "MIT",
"dependencies": {
@@ -30518,7 +30624,7 @@
"optional": true
},
"node_modules/npm/node_modules/semver": {
- "version": "7.7.1",
+ "version": "7.7.2",
"inBundle": true,
"license": "ISC",
"bin": {
@@ -30780,11 +30886,11 @@
"license": "MIT"
},
"node_modules/npm/node_modules/tinyglobby": {
- "version": "0.2.12",
+ "version": "0.2.13",
"inBundle": true,
"license": "MIT",
"dependencies": {
- "fdir": "^6.4.3",
+ "fdir": "^6.4.4",
"picomatch": "^4.0.2"
},
"engines": {
@@ -30795,7 +30901,7 @@
}
},
"node_modules/npm/node_modules/tinyglobby/node_modules/fdir": {
- "version": "6.4.3",
+ "version": "6.4.4",
"inBundle": true,
"license": "MIT",
"peerDependencies": {
@@ -31286,10 +31392,25 @@
"wrappy": "1"
}
},
+ "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": "10.1.1",
- "resolved": "https://registry.npmjs.org/open/-/open-10.1.1.tgz",
- "integrity": "sha512-zy1wx4+P3PfhXSEPJNtZmJXfhkkIaxU1VauWIrDZw1O7uJRDRJtKr9n3Ic4NgbA16KyOxOXO2ng9gYwCdXuSXA==",
+ "version": "10.1.2",
+ "resolved": "https://registry.npmjs.org/open/-/open-10.1.2.tgz",
+ "integrity": "sha512-cxN6aIDPz6rm8hbebcP7vrQNhvRcveZoJU72Y7vskh4oIm+BZwBECnx5nTmrlres1Qapvx27Qo1Auukpf8PKXw==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -31306,9 +31427,9 @@
}
},
"node_modules/openai": {
- "version": "4.95.0",
- "resolved": "https://registry.npmjs.org/openai/-/openai-4.95.0.tgz",
- "integrity": "sha512-tWHLTA+/HHyWlP8qg0mQLDSpI2NQLhk6zHLJL8yb59qn2pEI8rbEiAGSDPViLvi3BRDoQZIX5scaJ3xYGr2nhw==",
+ "version": "4.100.0",
+ "resolved": "https://registry.npmjs.org/openai/-/openai-4.100.0.tgz",
+ "integrity": "sha512-9soq/wukv3utxcuD7TWFqKdKp0INWdeyhUCvxwrne5KwnxaCp4eHL4GdT/tMFhYolxgNhxFzg5GFwM331Z5CZg==",
"license": "Apache-2.0",
"dependencies": {
"@types/node": "^18.11.18",
@@ -31336,9 +31457,9 @@
}
},
"node_modules/openai/node_modules/@types/node": {
- "version": "18.19.86",
- "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.86.tgz",
- "integrity": "sha512-fifKayi175wLyKyc5qUfyENhQ1dCNI1UNjp653d8kuYcPQN5JhX3dGuP/XmvPTg/xRBn1VTLpbmi+H/Mr7tLfQ==",
+ "version": "18.19.101",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.101.tgz",
+ "integrity": "sha512-Ykg7fcE3+cOQlLUv2Ds3zil6DVjriGQaSN/kEpl5HQ3DIGM6W0F2n9+GkWV4bRt7KjLymgzNdTnSKCbFUUJ7Kw==",
"license": "MIT",
"dependencies": {
"undici-types": "~5.26.4"
@@ -31444,15 +31565,6 @@
"node": ">=14.16"
}
},
- "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": "6.2.0",
"resolved": "https://registry.npmjs.org/p-limit/-/p-limit-6.2.0.tgz",
@@ -31576,13 +31688,10 @@
"license": "BlueOak-1.0.0"
},
"node_modules/package-manager-detector": {
- "version": "0.2.11",
- "resolved": "https://registry.npmjs.org/package-manager-detector/-/package-manager-detector-0.2.11.tgz",
- "integrity": "sha512-BEnLolu+yuz22S56CU1SUKq3XC3PkwD5wv4ikR4MfGvnRVcmzXR9DwSlW2fEamyTPyXHomBJRzgapeuBvRNzJQ==",
- "license": "MIT",
- "dependencies": {
- "quansync": "^0.2.7"
- }
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/package-manager-detector/-/package-manager-detector-1.3.0.tgz",
+ "integrity": "sha512-ZsEbbZORsyHuO00lY1kV3/t72yp6Ysay6Pd17ZAlNGuGwmWDLCJxFpRs0IzfXfj1o4icJOkUEioexFHzyPurSQ==",
+ "license": "MIT"
},
"node_modules/pako": {
"version": "1.0.11",
@@ -31693,12 +31802,12 @@
}
},
"node_modules/parse5": {
- "version": "7.2.1",
- "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.2.1.tgz",
- "integrity": "sha512-BuBYQYlv1ckiPdQi/ohiivi9Sagc9JG+Ozs0r7b/0iK3sKmrb0b9FdWdBbOdx6hBCM/F9Ir82ofnBhtZOjCRPQ==",
+ "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": "^4.5.0"
+ "entities": "^6.0.0"
},
"funding": {
"url": "https://github.com/inikulin/parse5?sponsor=1"
@@ -31717,6 +31826,18 @@
"url": "https://github.com/inikulin/parse5?sponsor=1"
}
},
+ "node_modules/parse5/node_modules/entities": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.0.tgz",
+ "integrity": "sha512-aKstq2TDOndCn4diEyp9Uq/Flu2i1GlLkc6XIDQSDMuaFE3OPW5OphLCyQ5SpSJZTb4reN+kTcYru5yIfXoRPw==",
+ "license": "BSD-2-Clause",
+ "engines": {
+ "node": ">=0.12"
+ },
+ "funding": {
+ "url": "https://github.com/fb55/entities?sponsor=1"
+ }
+ },
"node_modules/parseley": {
"version": "0.12.1",
"resolved": "https://registry.npmjs.org/parseley/-/parseley-0.12.1.tgz",
@@ -31992,12 +32113,12 @@
}
},
"node_modules/pdfjs-dist": {
- "version": "5.1.91",
- "resolved": "https://registry.npmjs.org/pdfjs-dist/-/pdfjs-dist-5.1.91.tgz",
- "integrity": "sha512-qSIADdagooJB4wWCBnrBJjRvASevmxL0BwafvOuKJG5uTQdYoFBrhrRYnucKNiSc9qS6JIk0hC5y1yktFljXkA==",
+ "version": "5.2.133",
+ "resolved": "https://registry.npmjs.org/pdfjs-dist/-/pdfjs-dist-5.2.133.tgz",
+ "integrity": "sha512-abE6ZWDxztt+gGFzfm4bX2ggfxUk9wsDEoFzIJm9LozaY3JdXR7jyLK4Bjs+XLXplCduuWS1wGhPC4tgTn/kzg==",
"license": "Apache-2.0",
"engines": {
- "node": ">=20"
+ "node": ">=20.16.0 || >=22.3.0"
},
"optionalDependencies": {
"@napi-rs/canvas": "^0.1.67"
@@ -32612,9 +32733,9 @@
"license": "MIT"
},
"node_modules/property-information": {
- "version": "7.0.0",
- "resolved": "https://registry.npmjs.org/property-information/-/property-information-7.0.0.tgz",
- "integrity": "sha512-7D/qOz/+Y4X/rzSB6jKxKUsQnphO046ei8qxG59mtM3RG3DHgTK81HrxrmoDVINJb8NKT5ZsRbwHvQ6B68Iyhg==",
+ "version": "7.1.0",
+ "resolved": "https://registry.npmjs.org/property-information/-/property-information-7.1.0.tgz",
+ "integrity": "sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ==",
"license": "MIT",
"funding": {
"type": "github",
@@ -32672,9 +32793,9 @@
}
},
"node_modules/prosemirror-keymap": {
- "version": "1.2.2",
- "resolved": "https://registry.npmjs.org/prosemirror-keymap/-/prosemirror-keymap-1.2.2.tgz",
- "integrity": "sha512-EAlXoksqC6Vbocqc0GtzCruZEzYgrn+iiGnNjsJsH4mrnIGex4qbLdWWNza3AW5W36ZRrlBID0eM6bdKH4OStQ==",
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/prosemirror-keymap/-/prosemirror-keymap-1.2.3.tgz",
+ "integrity": "sha512-4HucRlpiLd1IPQQXNqeo81BGtkY8Ai5smHhKW9jjPKRc2wQIxksg7Hl1tTI2IfT2B/LgX6bfYvXxEpJl7aKYKw==",
"license": "MIT",
"dependencies": {
"prosemirror-state": "^1.0.0",
@@ -32682,9 +32803,9 @@
}
},
"node_modules/prosemirror-model": {
- "version": "1.25.0",
- "resolved": "https://registry.npmjs.org/prosemirror-model/-/prosemirror-model-1.25.0.tgz",
- "integrity": "sha512-/8XUmxWf0pkj2BmtqZHYJipTBMHIdVjuvFzMvEoxrtyGNmfvdhBiRwYt/eFwy2wA9DtBW3RLqvZnjurEkHaFCw==",
+ "version": "1.25.1",
+ "resolved": "https://registry.npmjs.org/prosemirror-model/-/prosemirror-model-1.25.1.tgz",
+ "integrity": "sha512-AUvbm7qqmpZa5d9fPKMvH1Q5bqYQvAZWOGRvxsB6iFLyycvC9MwNemNVjHVrWgjaoxAfY8XVg7DbvQ/qxvI9Eg==",
"license": "MIT",
"dependencies": {
"orderedmap": "^2.0.0"
@@ -32713,18 +32834,18 @@
}
},
"node_modules/prosemirror-transform": {
- "version": "1.10.3",
- "resolved": "https://registry.npmjs.org/prosemirror-transform/-/prosemirror-transform-1.10.3.tgz",
- "integrity": "sha512-Nhh/+1kZGRINbEHmVu39oynhcap4hWTs/BlU7NnxWj3+l0qi8I1mu67v6mMdEe/ltD8hHvU4FV6PHiCw2VSpMw==",
+ "version": "1.10.4",
+ "resolved": "https://registry.npmjs.org/prosemirror-transform/-/prosemirror-transform-1.10.4.tgz",
+ "integrity": "sha512-pwDy22nAnGqNR1feOQKHxoFkkUtepoFAd3r2hbEDsnf4wp57kKA36hXsB3njA9FtONBEwSDnDeCiJe+ItD+ykw==",
"license": "MIT",
"dependencies": {
"prosemirror-model": "^1.21.0"
}
},
"node_modules/prosemirror-view": {
- "version": "1.39.1",
- "resolved": "https://registry.npmjs.org/prosemirror-view/-/prosemirror-view-1.39.1.tgz",
- "integrity": "sha512-GhLxH1xwnqa5VjhJ29LfcQITNDp+f1jzmMPXQfGW9oNrF0lfjPzKvV5y/bjIQkyKpwCX3Fp+GA4dBpMMk8g+ZQ==",
+ "version": "1.39.3",
+ "resolved": "https://registry.npmjs.org/prosemirror-view/-/prosemirror-view-1.39.3.tgz",
+ "integrity": "sha512-bY/7kg0LzRE7ytR0zRdSMWX3sknEjw68l836ffLPMh0OG3OYnNuBDUSF3v0vjvnzgYjgY9ZH/RypbARURlcMFA==",
"license": "MIT",
"dependencies": {
"prosemirror-model": "^1.20.0",
@@ -32962,17 +33083,17 @@
}
},
"node_modules/puppeteer": {
- "version": "24.6.1",
- "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-24.6.1.tgz",
- "integrity": "sha512-/4ocGfu8LNvDbWUqJZV2VmwEWpbOdJa69y2Jivd213tV0ekAtUh/bgT1hhW63SDN/CtrEucOPwoomZ+9M+eBEg==",
+ "version": "24.1.1",
+ "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-24.1.1.tgz",
+ "integrity": "sha512-fuhceZ5HZuDXVuaMIRxUuDHfCJLmK0pXh8FlzVQ0/+OApStevxZhU5kAVeYFOEqeCF5OoAyZjcWbdQK27xW/9A==",
"hasInstallScript": true,
"license": "Apache-2.0",
"dependencies": {
- "@puppeteer/browsers": "2.10.0",
- "chromium-bidi": "3.0.0",
+ "@puppeteer/browsers": "2.7.0",
+ "chromium-bidi": "1.1.0",
"cosmiconfig": "^9.0.0",
- "devtools-protocol": "0.0.1425554",
- "puppeteer-core": "24.6.1",
+ "devtools-protocol": "0.0.1380148",
+ "puppeteer-core": "24.1.1",
"typed-query-selector": "^2.12.0"
},
"bin": {
@@ -32983,17 +33104,17 @@
}
},
"node_modules/puppeteer-core": {
- "version": "24.6.1",
- "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-24.6.1.tgz",
- "integrity": "sha512-sMCxsY+OPWO2fecBrhIeCeJbWWXJ6UaN997sTid6whY0YT9XM0RnxEwLeUibluIS5/fRmuxe1efjb5RMBsky7g==",
+ "version": "24.1.1",
+ "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-24.1.1.tgz",
+ "integrity": "sha512-7FF3gq6bpIsbq3I8mfbodXh3DCzXagoz3l2eGv1cXooYU4g0P4mcHQVHuBD4iSZPXNg8WjzlP5kmRwK9UvwF0A==",
"license": "Apache-2.0",
"dependencies": {
- "@puppeteer/browsers": "2.10.0",
- "chromium-bidi": "3.0.0",
+ "@puppeteer/browsers": "2.7.0",
+ "chromium-bidi": "1.1.0",
"debug": "^4.4.0",
- "devtools-protocol": "0.0.1425554",
+ "devtools-protocol": "0.0.1380148",
"typed-query-selector": "^2.12.0",
- "ws": "^8.18.1"
+ "ws": "^8.18.0"
},
"engines": {
"node": ">=18"
@@ -33329,53 +33450,53 @@
}
},
"node_modules/react-aria": {
- "version": "3.39.0",
- "resolved": "https://registry.npmjs.org/react-aria/-/react-aria-3.39.0.tgz",
- "integrity": "sha512-zXCjR01WnfW4uW0f294uWrvdfwEMHgDFSwMwMBwRafAvmsQea87X5VTAfDmQOAbPa+iQFcngIyH0Pn5CfXNrjw==",
+ "version": "3.40.0",
+ "resolved": "https://registry.npmjs.org/react-aria/-/react-aria-3.40.0.tgz",
+ "integrity": "sha512-pxZusRI1jCBIvJkORJnhAXey/5U/VJa1whCeP6ETzRKepJiXLRPjJerHHJw+3Q6kAJXADL9qds5xdq4nvmyLRA==",
"license": "Apache-2.0",
"dependencies": {
"@internationalized/string": "^3.2.6",
- "@react-aria/breadcrumbs": "^3.5.23",
- "@react-aria/button": "^3.13.0",
- "@react-aria/calendar": "^3.8.0",
- "@react-aria/checkbox": "^3.15.4",
- "@react-aria/color": "^3.0.6",
- "@react-aria/combobox": "^3.12.2",
- "@react-aria/datepicker": "^3.14.2",
- "@react-aria/dialog": "^3.5.24",
- "@react-aria/disclosure": "^3.0.4",
- "@react-aria/dnd": "^3.9.2",
- "@react-aria/focus": "^3.20.2",
- "@react-aria/gridlist": "^3.12.0",
- "@react-aria/i18n": "^3.12.8",
- "@react-aria/interactions": "^3.25.0",
- "@react-aria/label": "^3.7.17",
- "@react-aria/landmark": "^3.0.2",
- "@react-aria/link": "^3.8.0",
- "@react-aria/listbox": "^3.14.3",
- "@react-aria/menu": "^3.18.2",
- "@react-aria/meter": "^3.4.22",
- "@react-aria/numberfield": "^3.11.13",
- "@react-aria/overlays": "^3.27.0",
- "@react-aria/progress": "^3.4.22",
- "@react-aria/radio": "^3.11.2",
- "@react-aria/searchfield": "^3.8.3",
- "@react-aria/select": "^3.15.4",
- "@react-aria/selection": "^3.24.0",
- "@react-aria/separator": "^3.4.8",
- "@react-aria/slider": "^3.7.18",
+ "@react-aria/breadcrumbs": "^3.5.24",
+ "@react-aria/button": "^3.13.1",
+ "@react-aria/calendar": "^3.8.1",
+ "@react-aria/checkbox": "^3.15.5",
+ "@react-aria/color": "^3.0.7",
+ "@react-aria/combobox": "^3.12.3",
+ "@react-aria/datepicker": "^3.14.3",
+ "@react-aria/dialog": "^3.5.25",
+ "@react-aria/disclosure": "^3.0.5",
+ "@react-aria/dnd": "^3.9.3",
+ "@react-aria/focus": "^3.20.3",
+ "@react-aria/gridlist": "^3.13.0",
+ "@react-aria/i18n": "^3.12.9",
+ "@react-aria/interactions": "^3.25.1",
+ "@react-aria/label": "^3.7.18",
+ "@react-aria/landmark": "^3.0.3",
+ "@react-aria/link": "^3.8.1",
+ "@react-aria/listbox": "^3.14.4",
+ "@react-aria/menu": "^3.18.3",
+ "@react-aria/meter": "^3.4.23",
+ "@react-aria/numberfield": "^3.11.14",
+ "@react-aria/overlays": "^3.27.1",
+ "@react-aria/progress": "^3.4.23",
+ "@react-aria/radio": "^3.11.3",
+ "@react-aria/searchfield": "^3.8.4",
+ "@react-aria/select": "^3.15.5",
+ "@react-aria/selection": "^3.24.1",
+ "@react-aria/separator": "^3.4.9",
+ "@react-aria/slider": "^3.7.19",
"@react-aria/ssr": "^3.9.8",
- "@react-aria/switch": "^3.7.2",
- "@react-aria/table": "^3.17.2",
- "@react-aria/tabs": "^3.10.2",
- "@react-aria/tag": "^3.5.2",
- "@react-aria/textfield": "^3.17.2",
- "@react-aria/toast": "^3.0.2",
- "@react-aria/tooltip": "^3.8.2",
- "@react-aria/tree": "^3.0.2",
- "@react-aria/utils": "^3.28.2",
- "@react-aria/visually-hidden": "^3.8.22",
- "@react-types/shared": "^3.29.0"
+ "@react-aria/switch": "^3.7.3",
+ "@react-aria/table": "^3.17.3",
+ "@react-aria/tabs": "^3.10.3",
+ "@react-aria/tag": "^3.6.0",
+ "@react-aria/textfield": "^3.17.3",
+ "@react-aria/toast": "^3.0.3",
+ "@react-aria/tooltip": "^3.8.3",
+ "@react-aria/tree": "^3.0.3",
+ "@react-aria/utils": "^3.29.0",
+ "@react-aria/visually-hidden": "^3.8.23",
+ "@react-types/shared": "^3.29.1"
},
"peerDependencies": {
"react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1",
@@ -33383,38 +33504,38 @@
}
},
"node_modules/react-aria-components": {
- "version": "1.8.0",
- "resolved": "https://registry.npmjs.org/react-aria-components/-/react-aria-components-1.8.0.tgz",
- "integrity": "sha512-qNJ/Z4opj1/NKFf1ch/V8rNYar5MXu4J8YVAt2pFgnBRLjVlIlfnENN8Oa5OFiYFCzMPRFdq5mI8RuYIEnvZfg==",
+ "version": "1.9.0",
+ "resolved": "https://registry.npmjs.org/react-aria-components/-/react-aria-components-1.9.0.tgz",
+ "integrity": "sha512-7cOYxvODDPn8PlWh7eM6/hcydM9sem9PJfL9XD90hIUGfX/f5wMu4lplpjFVzkoCPe4UcOrqC77k3vpRN+1eaw==",
"license": "Apache-2.0",
"dependencies": {
- "@internationalized/date": "^3.8.0",
+ "@internationalized/date": "^3.8.1",
"@internationalized/string": "^3.2.6",
- "@react-aria/autocomplete": "3.0.0-beta.2",
- "@react-aria/collections": "3.0.0-rc.0",
- "@react-aria/dnd": "^3.9.2",
- "@react-aria/focus": "^3.20.2",
- "@react-aria/interactions": "^3.25.0",
+ "@react-aria/autocomplete": "3.0.0-beta.3",
+ "@react-aria/collections": "3.0.0-rc.1",
+ "@react-aria/dnd": "^3.9.3",
+ "@react-aria/focus": "^3.20.3",
+ "@react-aria/interactions": "^3.25.1",
"@react-aria/live-announcer": "^3.4.2",
- "@react-aria/overlays": "^3.27.0",
+ "@react-aria/overlays": "^3.27.1",
"@react-aria/ssr": "^3.9.8",
- "@react-aria/toolbar": "3.0.0-beta.15",
- "@react-aria/utils": "^3.28.2",
- "@react-aria/virtualizer": "^4.1.4",
+ "@react-aria/toolbar": "3.0.0-beta.16",
+ "@react-aria/utils": "^3.29.0",
+ "@react-aria/virtualizer": "^4.1.5",
"@react-stately/autocomplete": "3.0.0-beta.1",
- "@react-stately/layout": "^4.2.2",
- "@react-stately/selection": "^3.20.1",
- "@react-stately/table": "^3.14.1",
+ "@react-stately/layout": "^4.3.0",
+ "@react-stately/selection": "^3.20.2",
+ "@react-stately/table": "^3.14.2",
"@react-stately/utils": "^3.10.6",
- "@react-stately/virtualizer": "^4.3.2",
- "@react-types/form": "^3.7.11",
- "@react-types/grid": "^3.3.1",
- "@react-types/shared": "^3.29.0",
- "@react-types/table": "^3.12.0",
+ "@react-stately/virtualizer": "^4.4.0",
+ "@react-types/form": "^3.7.12",
+ "@react-types/grid": "^3.3.2",
+ "@react-types/shared": "^3.29.1",
+ "@react-types/table": "^3.13.0",
"@swc/helpers": "^0.5.0",
"client-only": "^0.0.1",
- "react-aria": "^3.39.0",
- "react-stately": "^3.37.0",
+ "react-aria": "^3.40.0",
+ "react-stately": "^3.38.0",
"use-sync-external-store": "^1.4.0"
},
"peerDependencies": {
@@ -33849,37 +33970,37 @@
}
},
"node_modules/react-stately": {
- "version": "3.37.0",
- "resolved": "https://registry.npmjs.org/react-stately/-/react-stately-3.37.0.tgz",
- "integrity": "sha512-fm2LRM3XN5lJD48+WQKWvESx54kAIHw0JztCRHMsFmTDgYWX/VASuXKON7LECv227stSEadrxGa8LhPkcelljw==",
- "license": "Apache-2.0",
- "dependencies": {
- "@react-stately/calendar": "^3.8.0",
- "@react-stately/checkbox": "^3.6.13",
- "@react-stately/collections": "^3.12.3",
- "@react-stately/color": "^3.8.4",
- "@react-stately/combobox": "^3.10.4",
- "@react-stately/data": "^3.12.3",
- "@react-stately/datepicker": "^3.14.0",
- "@react-stately/disclosure": "^3.0.3",
- "@react-stately/dnd": "^3.5.3",
- "@react-stately/form": "^3.1.3",
- "@react-stately/list": "^3.12.1",
- "@react-stately/menu": "^3.9.3",
- "@react-stately/numberfield": "^3.9.11",
- "@react-stately/overlays": "^3.6.15",
- "@react-stately/radio": "^3.10.12",
- "@react-stately/searchfield": "^3.5.11",
- "@react-stately/select": "^3.6.12",
- "@react-stately/selection": "^3.20.1",
- "@react-stately/slider": "^3.6.3",
- "@react-stately/table": "^3.14.1",
- "@react-stately/tabs": "^3.8.1",
+ "version": "3.38.0",
+ "resolved": "https://registry.npmjs.org/react-stately/-/react-stately-3.38.0.tgz",
+ "integrity": "sha512-zS06DsDhH44z7bsOkMHJ0gnjuLO3UWZ33l7JOgFscrv1qa33IG9fn707sI7GAJdLgDiWXJbeFvXdix2jR1fU1w==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@react-stately/calendar": "^3.8.1",
+ "@react-stately/checkbox": "^3.6.14",
+ "@react-stately/collections": "^3.12.4",
+ "@react-stately/color": "^3.8.5",
+ "@react-stately/combobox": "^3.10.5",
+ "@react-stately/data": "^3.13.0",
+ "@react-stately/datepicker": "^3.14.1",
+ "@react-stately/disclosure": "^3.0.4",
+ "@react-stately/dnd": "^3.5.4",
+ "@react-stately/form": "^3.1.4",
+ "@react-stately/list": "^3.12.2",
+ "@react-stately/menu": "^3.9.4",
+ "@react-stately/numberfield": "^3.9.12",
+ "@react-stately/overlays": "^3.6.16",
+ "@react-stately/radio": "^3.10.13",
+ "@react-stately/searchfield": "^3.5.12",
+ "@react-stately/select": "^3.6.13",
+ "@react-stately/selection": "^3.20.2",
+ "@react-stately/slider": "^3.6.4",
+ "@react-stately/table": "^3.14.2",
+ "@react-stately/tabs": "^3.8.2",
"@react-stately/toast": "^3.1.0",
- "@react-stately/toggle": "^3.8.3",
- "@react-stately/tooltip": "^3.5.3",
- "@react-stately/tree": "^3.8.9",
- "@react-types/shared": "^3.29.0"
+ "@react-stately/toggle": "^3.8.4",
+ "@react-stately/tooltip": "^3.5.4",
+ "@react-stately/tree": "^3.8.10",
+ "@react-types/shared": "^3.29.1"
},
"peerDependencies": {
"react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
@@ -34071,19 +34192,6 @@
"node": ">= 4"
}
},
- "node_modules/recast/node_modules/ast-types": {
- "version": "0.16.1",
- "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.16.1.tgz",
- "integrity": "sha512-6t10qk83GOG8p0vKmaCr8eiilZwO171AvbROMtvvNiwrTly62t+7XkA8RdIIVbpMhCASAsxgAzdRSwh6nw/5Dg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "tslib": "^2.0.1"
- },
- "engines": {
- "node": ">=4"
- }
- },
"node_modules/recast/node_modules/source-map": {
"version": "0.6.1",
"resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
@@ -34095,9 +34203,9 @@
}
},
"node_modules/recharts": {
- "version": "2.15.2",
- "resolved": "https://registry.npmjs.org/recharts/-/recharts-2.15.2.tgz",
- "integrity": "sha512-xv9lVztv3ingk7V3Jf05wfAZbM9Q2umJzu5t/cfnAK7LUslNrGT7LPBr74G+ok8kSCeFMaePmWMg0rcYOnczTw==",
+ "version": "2.15.3",
+ "resolved": "https://registry.npmjs.org/recharts/-/recharts-2.15.3.tgz",
+ "integrity": "sha512-EdOPzTwcFSuqtvkDoaM5ws/Km1+WTAO2eizL7rqiG0V2UVhTnz0m7J2i0CjVPUCdEkZImaWvXLbZDS2H5t6GFQ==",
"license": "MIT",
"dependencies": {
"clsx": "^2.0.0",
@@ -34132,17 +34240,6 @@
"integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==",
"license": "MIT"
},
- "node_modules/rechoir": {
- "version": "0.6.2",
- "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz",
- "integrity": "sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==",
- "dependencies": {
- "resolve": "^1.1.6"
- },
- "engines": {
- "node": ">= 0.10"
- }
- },
"node_modules/redent": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz",
@@ -34221,20 +34318,11 @@
}
},
"node_modules/regenerator-runtime": {
- "version": "0.14.1",
- "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz",
- "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==",
+ "version": "0.11.1",
+ "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz",
+ "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==",
"license": "MIT"
},
- "node_modules/regenerator-transform": {
- "version": "0.15.2",
- "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.2.tgz",
- "integrity": "sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==",
- "license": "MIT",
- "dependencies": {
- "@babel/runtime": "^7.8.4"
- }
- },
"node_modules/regexp.prototype.flags": {
"version": "1.5.4",
"resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.4.tgz",
@@ -34459,22 +34547,6 @@
"node": ">=8"
}
},
- "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",
@@ -34880,9 +34952,9 @@
}
},
"node_modules/rimraf/node_modules/glob": {
- "version": "11.0.1",
- "resolved": "https://registry.npmjs.org/glob/-/glob-11.0.1.tgz",
- "integrity": "sha512-zrQDm8XPnYEKawJScsnM0QzobJxlT/kHOOlRTio8IH/GrmxRE5fjllkzdaHclIuNjUQTJYH2xHNIGfdpJkDJUw==",
+ "version": "11.0.2",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-11.0.2.tgz",
+ "integrity": "sha512-YT7U7Vye+t5fZ/QMkBFrTJ7ZQxInIUjwyAjVj84CYXqgBdv30MFUPGnBR6sQaVq6Is15wYJUsnzTuWaGRBhBAQ==",
"license": "ISC",
"dependencies": {
"foreground-child": "^3.1.0",
@@ -35110,9 +35182,9 @@
"license": "MIT"
},
"node_modules/sass": {
- "version": "1.86.3",
- "resolved": "https://registry.npmjs.org/sass/-/sass-1.86.3.tgz",
- "integrity": "sha512-iGtg8kus4GrsGLRDLRBRHY9dNVA78ZaS7xr01cWnS7PEMQyFtTqBiyCrfpTYTZXRWM94akzckYjh8oADfFNTzw==",
+ "version": "1.89.0",
+ "resolved": "https://registry.npmjs.org/sass/-/sass-1.89.0.tgz",
+ "integrity": "sha512-ld+kQU8YTdGNjOLfRWBzewJpU5cwEv/h5yyqlSeJcj6Yh8U4TDA9UA5FPicqDz/xgRPWRSYIQNiFks21TbA9KQ==",
"license": "MIT",
"dependencies": {
"chokidar": "^4.0.0",
@@ -35197,9 +35269,9 @@
}
},
"node_modules/schema-utils": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.0.tgz",
- "integrity": "sha512-Gf9qqc58SpCA/xdziiHz35F4GNIWYWZrEshUc/G/r5BnLph6xpKuLeoJoQuj5WfBIx/eQLf+hmVPYHaxJu7V2g==",
+ "version": "4.3.2",
+ "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.2.tgz",
+ "integrity": "sha512-Gn/JaSk/Mt9gYubxTtSn/QCV4em9mpAPiR1rqy/Ocu19u/G9J5WWdNoUT4SiV6mFC3y6cxyFcFwdzPM3FgxGAQ==",
"license": "MIT",
"dependencies": {
"@types/json-schema": "^7.0.9",
@@ -35225,46 +35297,6 @@
"cheerio": "1.0.0-rc.12"
}
},
- "node_modules/scrapfly-sdk/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/scrapfly-sdk/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/scss-loader": {
"version": "0.0.1",
"resolved": "https://registry.npmjs.org/scss-loader/-/scss-loader-0.0.1.tgz",
@@ -35411,9 +35443,9 @@
}
},
"node_modules/serializr": {
- "version": "3.0.4",
- "resolved": "https://registry.npmjs.org/serializr/-/serializr-3.0.4.tgz",
- "integrity": "sha512-c7eDG9G4GM1lU48zud3n7adtlRXGNBnIee/E+cNVVMO42eIWJAjBFhXXx8IjD4yd5GYdXMMrPlDcMBBA2+hY9w==",
+ "version": "3.0.5",
+ "resolved": "https://registry.npmjs.org/serializr/-/serializr-3.0.5.tgz",
+ "integrity": "sha512-LURwbNKR/IlqMuYudH43dFVry8fGHoV73UNvegTWlRv92X4OxODPdzMpSdnkTK55fmbUmlxC0vXu7OrZN/x2bw==",
"license": "MIT"
},
"node_modules/serve-index": {
@@ -35660,18 +35692,13 @@
}
},
"node_modules/shelljs": {
- "version": "0.9.2",
- "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.9.2.tgz",
- "integrity": "sha512-S3I64fEiKgTZzKCC46zT/Ib9meqofLrQVbpSswtjFfAVDW+AZ54WTnAM/3/yENoxz/V1Cy6u3kiiEbQ4DNphvw==",
+ "version": "0.10.0",
+ "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.10.0.tgz",
+ "integrity": "sha512-Jex+xw5Mg2qMZL3qnzXIfaxEtBaC4n7xifqaqtrZDdlheR70OGkydrPJWT0V1cA1k3nanC86x9FwAmQl6w3Klw==",
"license": "BSD-3-Clause",
"dependencies": {
- "execa": "^1.0.0",
- "fast-glob": "^3.3.2",
- "interpret": "^1.0.0",
- "rechoir": "^0.6.2"
- },
- "bin": {
- "shjs": "bin/shjs"
+ "execa": "^5.1.1",
+ "fast-glob": "^3.3.2"
},
"engines": {
"node": ">=18"
@@ -35825,9 +35852,9 @@
}
},
"node_modules/simple-update-notifier/node_modules/semver": {
- "version": "7.7.1",
- "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz",
- "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==",
+ "version": "7.7.2",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz",
+ "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==",
"license": "ISC",
"bin": {
"semver": "bin/semver.js"
@@ -36195,9 +36222,9 @@
}
},
"node_modules/speech-rule-engine": {
- "version": "4.1.1",
- "resolved": "https://registry.npmjs.org/speech-rule-engine/-/speech-rule-engine-4.1.1.tgz",
- "integrity": "sha512-r30kdFJZa/hvmy13eldwjrnMeW74zQGP1++t7xyKQxbsdVVNbhKzfrvY0u2ecIXy0riBSLsl2KbzWevPPJogvw==",
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/speech-rule-engine/-/speech-rule-engine-4.1.2.tgz",
+ "integrity": "sha512-S6ji+flMEga+1QU79NDbwZ8Ivf0S/MpupQQiIC0rTpU/ZTKgcajijJJb1OcByBQDjrXCN1/DJtGz4ZJeBMPGJw==",
"license": "Apache-2.0",
"dependencies": {
"@xmldom/xmldom": "0.9.8",
@@ -36217,6 +36244,12 @@
"node": ">=18"
}
},
+ "node_modules/splaytree": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/splaytree/-/splaytree-0.1.4.tgz",
+ "integrity": "sha512-D50hKrjZgBzqD3FT2Ek53f2dcDLAQT8SSGrzj3vidNH5ISRgceeGVJ2dQIthKOuayqFXfFjXheHNo4bbt9LhRQ==",
+ "license": "MIT"
+ },
"node_modules/splaytree-ts": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/splaytree-ts/-/splaytree-ts-1.0.2.tgz",
@@ -36297,12 +36330,6 @@
"node": ">=0.10.0"
}
},
- "node_modules/sshpk/node_modules/jsbn": {
- "version": "0.1.1",
- "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz",
- "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==",
- "license": "MIT"
- },
"node_modules/standard-error": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/standard-error/-/standard-error-1.1.0.tgz",
@@ -36335,13 +36362,13 @@
}
},
"node_modules/storybook": {
- "version": "8.6.12",
- "resolved": "https://registry.npmjs.org/storybook/-/storybook-8.6.12.tgz",
- "integrity": "sha512-Z/nWYEHBTLK1ZBtAWdhxC0l5zf7ioJ7G4+zYqtTdYeb67gTnxNj80gehf8o8QY9L2zA2+eyMRGLC2V5fI7Z3Tw==",
+ "version": "8.6.14",
+ "resolved": "https://registry.npmjs.org/storybook/-/storybook-8.6.14.tgz",
+ "integrity": "sha512-sVKbCj/OTx67jhmauhxc2dcr1P+yOgz/x3h0krwjyMgdc5Oubvxyg4NYDZmzAw+ym36g/lzH8N0Ccp4dwtdfxw==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@storybook/core": "8.6.12"
+ "@storybook/core": "8.6.14"
},
"bin": {
"getstorybook": "bin/index.cjs",
@@ -36720,13 +36747,13 @@
"node": ">=0.10.0"
}
},
- "node_modules/strip-eof": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz",
- "integrity": "sha512-7FCwGGmx8mD5xQd3RPUvnSpUXHM3BWuzjtpD4TXsfcZ9EL4azvVVUscFYwD9nx8Kh+uCBC00XBtAykoMHwTh8Q==",
+ "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": ">=0.10.0"
+ "node": ">=6"
}
},
"node_modules/strip-indent": {
@@ -36758,9 +36785,9 @@
}
},
"node_modules/strnum": {
- "version": "2.0.5",
- "resolved": "https://registry.npmjs.org/strnum/-/strnum-2.0.5.tgz",
- "integrity": "sha512-YAT3K/sgpCUxhxNMrrdhtod3jckkpYwH6JAuwmUdXZsmzH1wUyzTMrrK2wYCEEqlKwrWDd35NeuUkbBy/1iK+Q==",
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/strnum/-/strnum-2.1.1.tgz",
+ "integrity": "sha512-7ZvoFTiCnGxBtDqJ//Cu6fWtZtc7Y3x+QOirG15wztbdngGSkht27o2pyGWrVy0b4WAy3jbKmnoK6g5VlVNUUw==",
"funding": [
{
"type": "github",
@@ -36821,9 +36848,9 @@
}
},
"node_modules/styled-components": {
- "version": "6.1.17",
- "resolved": "https://registry.npmjs.org/styled-components/-/styled-components-6.1.17.tgz",
- "integrity": "sha512-97D7DwWanI7nN24v0D4SvbfjLE9656umNSJZkBkDIWL37aZqG/wRQ+Y9pWtXyBIM/NSfcBzHLErEsqHmJNSVUg==",
+ "version": "6.1.18",
+ "resolved": "https://registry.npmjs.org/styled-components/-/styled-components-6.1.18.tgz",
+ "integrity": "sha512-Mvf3gJFzZCkhjY2Y/Fx9z1m3dxbza0uI9H1CbNZm/jSHCojzJhQ0R7bByrlFJINnMzz/gPulpoFFGymNwrsMcw==",
"license": "MIT",
"dependencies": {
"@emotion/is-prop-valid": "1.2.2",
@@ -37010,9 +37037,9 @@
}
},
"node_modules/tapable": {
- "version": "2.2.1",
- "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz",
- "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==",
+ "version": "2.2.2",
+ "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.2.tgz",
+ "integrity": "sha512-Re10+NauLTMCudc7T5WLFLAwDhQ0JWdrMK+9B2M8zR5hRExKmsRDCBA7/aV/pNJFltmBFO5BAMlQFi/vq3nKOg==",
"license": "MIT",
"engines": {
"node": ">=6"
@@ -37072,13 +37099,13 @@
}
},
"node_modules/terser": {
- "version": "5.39.0",
- "resolved": "https://registry.npmjs.org/terser/-/terser-5.39.0.tgz",
- "integrity": "sha512-LBAhFyLho16harJoWMg/nZsQYgTrg5jXOn2nCYjRUcZZEdE3qa2zb8QEDRUGVZBW4rlazf2fxkg8tztybTaqWw==",
+ "version": "5.39.2",
+ "resolved": "https://registry.npmjs.org/terser/-/terser-5.39.2.tgz",
+ "integrity": "sha512-yEPUmWve+VA78bI71BW70Dh0TuV4HHd+I5SHOAfS1+QBOmvmCiiffgjR8ryyEd3KIfvPGFqoADt8LdQ6XpXIvg==",
"license": "BSD-2-Clause",
"dependencies": {
"@jridgewell/source-map": "^0.3.3",
- "acorn": "^8.8.2",
+ "acorn": "^8.14.0",
"commander": "^2.20.0",
"source-map-support": "~0.5.20"
},
@@ -37200,6 +37227,12 @@
"tslib": "^2"
}
},
+ "node_modules/through": {
+ "version": "2.3.8",
+ "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz",
+ "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==",
+ "license": "MIT"
+ },
"node_modules/through2": {
"version": "2.0.5",
"resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz",
@@ -37272,18 +37305,18 @@
"license": "MIT"
},
"node_modules/tinyexec": {
- "version": "0.3.2",
- "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-0.3.2.tgz",
- "integrity": "sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==",
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.0.1.tgz",
+ "integrity": "sha512-5uC6DDlmeqiOwCPmK9jMSdOuZTh8bU39Ys6yidB+UTt5hfZUPGAypSgFRiEp+jbi9qH40BLDvy85jIU88wKSqw==",
"license": "MIT"
},
"node_modules/tinyglobby": {
- "version": "0.2.12",
- "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.12.tgz",
- "integrity": "sha512-qkf4trmKSIiMTs/E63cxH+ojC2unam7rJ0WrauAzpT3ECNTxGRMlaXxVbfxMUC/w0LaYk6jQ4y/nGR9uBO3tww==",
+ "version": "0.2.13",
+ "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.13.tgz",
+ "integrity": "sha512-mEwzpUgrLySlveBwEVDMKk5B57bhLPYovRfPAXD5gA/98Opn0rCDj3GtLwFvCvH5RK9uPCExUROW5NjDwvqkxw==",
"license": "MIT",
"dependencies": {
- "fdir": "^6.4.3",
+ "fdir": "^6.4.4",
"picomatch": "^4.0.2"
},
"engines": {
@@ -37294,9 +37327,9 @@
}
},
"node_modules/tinyglobby/node_modules/fdir": {
- "version": "6.4.3",
- "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.3.tgz",
- "integrity": "sha512-PMXmW2y1hDDfTSRc9gaXIuCCRpuoz3Kaz8cUelp3smouvfT632ozg2vrT6lJsHKKOF59YLbOGfAWGUcKEfRMQw==",
+ "version": "6.4.4",
+ "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.4.tgz",
+ "integrity": "sha512-1NZP+GK4GfuAv3PqKvxQRDMjdSRZjnkq7KfhlNrCNNlZ0ygQFpebfrnfnq/W7fpUnAv9aGWmY1zKx7FYL3gwhg==",
"license": "MIT",
"peerDependencies": {
"picomatch": "^3 || ^4"
@@ -37494,9 +37527,9 @@
"license": "MIT"
},
"node_modules/tree-dump": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/tree-dump/-/tree-dump-1.0.2.tgz",
- "integrity": "sha512-dpev9ABuLWdEubk+cIaI9cHwRNNDjkBBLXTwI4UCUFdQ5xXKqNXoK4FEciw/vxf+NQ7Cb7sGUyeUtORvHIdRXQ==",
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/tree-dump/-/tree-dump-1.0.3.tgz",
+ "integrity": "sha512-il+Cv80yVHFBwokQSfd4bldvr1Md951DpgAGfmhydt04L+YzHgubm2tQ7zueWDcGENKHq0ZvGFR/hjvNXilHEg==",
"license": "Apache-2.0",
"engines": {
"node": ">=10.0"
@@ -37589,9 +37622,9 @@
}
},
"node_modules/ts-loader/node_modules/semver": {
- "version": "7.7.1",
- "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz",
- "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==",
+ "version": "7.7.2",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz",
+ "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==",
"dev": true,
"license": "ISC",
"bin": {
@@ -38164,9 +38197,9 @@
}
},
"node_modules/type-fest": {
- "version": "4.40.0",
- "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.40.0.tgz",
- "integrity": "sha512-ABHZ2/tS2JkvH1PEjxFDTUWC8dB5OsIGZP4IFLhR293GqT5Y5qB1WwL2kMPYhQW9DVgVD8Hd7I8gjwPIf5GFkw==",
+ "version": "4.41.0",
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.41.0.tgz",
+ "integrity": "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==",
"license": "(MIT OR CC0-1.0)",
"engines": {
"node": ">=16"
@@ -38292,15 +38325,15 @@
"license": "MIT"
},
"node_modules/typescript-eslint": {
- "version": "8.30.1",
- "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.30.1.tgz",
- "integrity": "sha512-D7lC0kcehVH7Mb26MRQi64LMyRJsj3dToJxM1+JVTl53DQSV5/7oUGWQLcKl1C1KnoVHxMMU2FNQMffr7F3Row==",
+ "version": "8.32.1",
+ "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.32.1.tgz",
+ "integrity": "sha512-D7el+eaDHAmXvrZBy1zpzSNIRqnCOrkwTgZxTu3MUqRWk8k0q9m9Ho4+vPf7iHtgUfrK/o8IZaEApsxPlHTFCg==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@typescript-eslint/eslint-plugin": "8.30.1",
- "@typescript-eslint/parser": "8.30.1",
- "@typescript-eslint/utils": "8.30.1"
+ "@typescript-eslint/eslint-plugin": "8.32.1",
+ "@typescript-eslint/parser": "8.32.1",
+ "@typescript-eslint/utils": "8.32.1"
},
"engines": {
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
@@ -38396,6 +38429,40 @@
"url": "https://github.com/sponsors/ljharb"
}
},
+ "node_modules/unbzip2-stream": {
+ "version": "1.4.3",
+ "resolved": "https://registry.npmjs.org/unbzip2-stream/-/unbzip2-stream-1.4.3.tgz",
+ "integrity": "sha512-mlExGW4w71ebDJviH16lQLtZS32VKqsSfk80GCfUlwT/4/hNRFsoscrF/c++9xinkMzECL1uL9DDwXqFWkruPg==",
+ "license": "MIT",
+ "dependencies": {
+ "buffer": "^5.2.1",
+ "through": "^2.3.8"
+ }
+ },
+ "node_modules/unbzip2-stream/node_modules/buffer": {
+ "version": "5.7.1",
+ "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz",
+ "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==",
+ "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": {
+ "base64-js": "^1.3.1",
+ "ieee754": "^1.1.13"
+ }
+ },
"node_modules/undefsafe": {
"version": "2.0.5",
"resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.5.tgz",
@@ -38601,9 +38668,9 @@
}
},
"node_modules/universal-user-agent": {
- "version": "7.0.2",
- "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-7.0.2.tgz",
- "integrity": "sha512-0JCqzSKnStlRRQfCdowvqy3cy0Dvtlb8xecj/H8JFZuCze4rwjPZQOgvFvn0Ws/usCHQFGpyr+pB9adaGwXn4Q==",
+ "version": "7.0.3",
+ "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-7.0.3.tgz",
+ "integrity": "sha512-TmnEAEAsBJVZM/AADELsK76llnwcf9vMKuPz8JflO1frO8Lchitr0fNaN9d+Ap0BjKtqWqd/J17qeDnXh8CL2A==",
"license": "ISC"
},
"node_modules/universalify": {
@@ -38654,9 +38721,9 @@
}
},
"node_modules/unstructured-client": {
- "version": "0.22.0",
- "resolved": "https://registry.npmjs.org/unstructured-client/-/unstructured-client-0.22.0.tgz",
- "integrity": "sha512-3TzkJ2jFA8iJsdxIWptd7Rbu5uqmJ2UhzrvZFqgOEYujHZB4pU/8u69G3tOFV9e7oVO3rnF5QXGvVsX/xU3IIg==",
+ "version": "0.24.3",
+ "resolved": "https://registry.npmjs.org/unstructured-client/-/unstructured-client-0.24.3.tgz",
+ "integrity": "sha512-GTBV9BvmuX+KdwFAG1iRaL4q6t1yH5VKiwSRldntVpAYsB96NVG1I6+2NmUHs7HQIuiJt8iHMtwsfoEH64cdTA==",
"dependencies": {
"async": "^3.2.5",
"pdf-lib": "^1.17.1"
@@ -38665,7 +38732,7 @@
"mcp": "bin/mcp-server.js"
},
"peerDependencies": {
- "@modelcontextprotocol/sdk": "^1.5.0",
+ "@modelcontextprotocol/sdk": ">=1.5.0 <1.10.0",
"zod": ">= 3"
},
"peerDependenciesMeta": {
@@ -38847,9 +38914,9 @@
}
},
"node_modules/use-isomorphic-layout-effect": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/use-isomorphic-layout-effect/-/use-isomorphic-layout-effect-1.2.0.tgz",
- "integrity": "sha512-q6ayo8DWoPZT0VdG4u3D3uxcgONP3Mevx2i2b0434cwWBoL+aelL1DzkXI6w3PhTZzUeR2kaVlZn70iCiseP6w==",
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/use-isomorphic-layout-effect/-/use-isomorphic-layout-effect-1.2.1.tgz",
+ "integrity": "sha512-tpZZ+EX0gaghDAiFR37hj5MgY6ZN55kLiPkJsKxBMZ6GZdOSPJXiOzPM984oPYZ5AnehYx5WQp1+ME8I/P/pRA==",
"license": "MIT",
"peerDependencies": {
"react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0"
@@ -39167,9 +39234,9 @@
}
},
"node_modules/watchpack": {
- "version": "2.4.2",
- "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.2.tgz",
- "integrity": "sha512-TnbFSbcOCcDgjZ4piURLCbJ3nJhznVh9kw6F6iokjiFPl8ONxe9A6nMDVXDiNbrSfLILs6vB07F7wLBrwPYzJw==",
+ "version": "2.4.3",
+ "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.3.tgz",
+ "integrity": "sha512-adBYQLivcg1jbdKEJeqScJJFvgm4qY9+3tXw+jdG6lkVeqRJEtiQmSWjmth8GKmDZuX7sYM4YFxQsf0AzMfGGw==",
"license": "MIT",
"dependencies": {
"glob-to-regexp": "^0.4.1",
@@ -39229,13 +39296,14 @@
}
},
"node_modules/webpack": {
- "version": "5.99.5",
- "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.99.5.tgz",
- "integrity": "sha512-q+vHBa6H9qwBLUlHL4Y7L0L1/LlyBKZtS9FHNCQmtayxjI5RKC9yD8gpvLeqGv5lCQp1Re04yi0MF40pf30Pvg==",
+ "version": "5.99.9",
+ "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.99.9.tgz",
+ "integrity": "sha512-brOPwM3JnmOa+7kd3NsmOUOwbDAj8FT9xDsG3IW0MgbN9yZV7Oi/s/+MNQ/EcSMqw7qfoRyXPoeEWT8zLVdVGg==",
"license": "MIT",
"dependencies": {
"@types/eslint-scope": "^3.7.7",
"@types/estree": "^1.0.6",
+ "@types/json-schema": "^7.0.15",
"@webassemblyjs/ast": "^1.14.1",
"@webassemblyjs/wasm-edit": "^1.14.1",
"@webassemblyjs/wasm-parser": "^1.14.1",
@@ -39252,7 +39320,7 @@
"loader-runner": "^4.2.0",
"mime-types": "^2.1.27",
"neo-async": "^2.6.2",
- "schema-utils": "^4.3.0",
+ "schema-utils": "^4.3.2",
"tapable": "^2.1.1",
"terser-webpack-plugin": "^5.3.11",
"watchpack": "^2.4.1",
@@ -39376,9 +39444,9 @@
}
},
"node_modules/webpack-dev-middleware/node_modules/memfs": {
- "version": "4.17.0",
- "resolved": "https://registry.npmjs.org/memfs/-/memfs-4.17.0.tgz",
- "integrity": "sha512-4eirfZ7thblFmqFjywlTmuWVSvccHAJbn1r8qQLzmTO11qcqpohOjmY2mFce6x7x7WtskzRqApPD0hv+Oa74jg==",
+ "version": "4.17.2",
+ "resolved": "https://registry.npmjs.org/memfs/-/memfs-4.17.2.tgz",
+ "integrity": "sha512-NgYhCOWgovOXSzvYgUW0LQ7Qy72rWQMGGFJDoWg4G30RHd3z77VbYdtJ4fembJXBy8pMIUA31XNAupobOQlwdg==",
"license": "Apache-2.0",
"dependencies": {
"@jsonjoy.com/json-pack": "^1.0.3",
@@ -39453,9 +39521,9 @@
}
},
"node_modules/webpack-dev-server/node_modules/@types/express": {
- "version": "4.17.21",
- "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.21.tgz",
- "integrity": "sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==",
+ "version": "4.17.22",
+ "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.22.tgz",
+ "integrity": "sha512-eZUmSnhRX9YRSkplpz0N+k6NljUUn5l3EWZIKZvYzhvMphEuNiyyy1viH/ejgt66JWgALwC/gtSUAeQKtSwW/w==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -40008,9 +40076,9 @@
"license": "ISC"
},
"node_modules/ws": {
- "version": "8.18.1",
- "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.1.tgz",
- "integrity": "sha512-RKW2aJZMXeMxVpnZ6bck+RswznaxmzdULiBr6KY7XkTnW8uvt0iT9H5DkHUChXrc+uurzwa0rVI16n/Xzjdz1w==",
+ "version": "8.18.2",
+ "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.2.tgz",
+ "integrity": "sha512-DMricUmwGZUVr++AEAe2uiVM7UoO9MAVZMDu05UQOaUII0lp+zOzLLU4Xqh/JvTqklB1T4uELaaPBKyjE1r4fQ==",
"license": "MIT",
"engines": {
"node": ">=10.0.0"
@@ -40317,9 +40385,9 @@
}
},
"node_modules/zod": {
- "version": "3.24.3",
- "resolved": "https://registry.npmjs.org/zod/-/zod-3.24.3.tgz",
- "integrity": "sha512-HhY1oqzWCQWuUqvBFnsyrtZRhyPeR7SUGv+C4+MsisMuVfSPx8HpwWqH8tRahSlt6M3PiFAcoeFhZAqIXTxoSg==",
+ "version": "3.25.7",
+ "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.7.tgz",
+ "integrity": "sha512-YGdT1cVRmKkOg6Sq7vY7IkxdphySKnXhaUmFI4r4FcuFVNgpCb9tZfNwXbT6BPjD5oz0nubFsoo9pIqKrDcCvg==",
"license": "MIT",
"funding": {
"url": "https://github.com/sponsors/colinhacks"
diff --git a/package.json b/package.json
index 6a579efd2..e9f9dc4df 100644
--- a/package.json
+++ b/package.json
@@ -27,7 +27,8 @@
"test": "mocha -r ts-node/register test/**/*.ts",
"tsc": "tsc -t es5",
"storybook": "npm -w @dash/components run storybook",
- "build-storybook": "npm -w @dash/components run build-storybook"
+ "build-storybook": "npm -w @dash/components run build-storybook",
+ "lint:css": "stylelint '**/*.{css,scss}'"
},
"devDependencies": {
"@eslint/js": "^9.10.0",
@@ -69,7 +70,7 @@
"@types/react-dom": "^18.2.17",
"@types/react-grid-layout": "^1.3.5",
"@types/react-measure": "^2.0.12",
- "@types/react-reconciler": "^0.31.0",
+ "@types/react-reconciler": "^0.32.0",
"@types/request": "^2.48.12",
"@types/request-promise": "^4.1.51",
"@types/shelljs": "^0.8.15",
@@ -104,6 +105,7 @@
"@dash/components": "file:packages/components",
"@emotion/react": "^11.11.1",
"@emotion/styled": "^11.11.0",
+ "@eslint/css": "^0.8.1",
"@ffmpeg-installer/ffmpeg": "^1.1.0",
"@ffmpeg/core": "^0.12.5",
"@ffmpeg/ffmpeg": "^0.12.10",
@@ -112,9 +114,10 @@
"@fortawesome/free-regular-svg-icons": "^6.5.1",
"@fortawesome/free-solid-svg-icons": "^6.5.1",
"@fortawesome/react-fontawesome": "^0.2.2",
- "@fullcalendar/core": "^6.1.15",
- "@fullcalendar/daygrid": "^6.1.10",
- "@fullcalendar/multimonth": "^6.1.10",
+ "@fullcalendar/core": "^6.1.17",
+ "@fullcalendar/daygrid": "^6.1.17",
+ "@fullcalendar/multimonth": "^6.1.17",
+ "@fullcalendar/react": "^6.1.17",
"@fullcalendar/timegrid": "^6.1.15",
"@internationalized/date": "^3.5.0",
"@mozilla/readability": "^0.6.0",
@@ -192,6 +195,7 @@
"dompurify": "^3.1.7",
"dotenv": "^16.4.7",
"dropbox": "^10.34.0",
+ "eslint-plugin-css-modules": "^2.12.0",
"eslint-webpack-plugin": "^5.0.0",
"exif": "^0.6.0",
"exifr": "^7.1.3",
@@ -327,7 +331,7 @@
"sass-loader": "^16.0.4",
"scrapfly-sdk": "^0.6.4",
"serializr": "^3.0.2",
- "shelljs": "^0.9.1",
+ "shelljs": "^0.10.0",
"socket.io": "^4.7.2",
"socket.io-client": "^4.7.2",
"standard-http-error": "^2.0.1",
@@ -346,7 +350,7 @@
"typescript-collections": "^1.3.3",
"typescript-language-server": "^4.1.3",
"uninstall": "^0.0.0",
- "unstructured-client": "^0.22.0",
+ "unstructured-client": "^0.24.3",
"url": "^0.11.3",
"url-loader": "^4.1.1",
"util": "^0.12.5",
diff --git a/packages/components/src/components/Button/Button.scss b/packages/components/src/components/Button/Button.scss
index c86db9fad..c87198ddf 100644
--- a/packages/components/src/components/Button/Button.scss
+++ b/packages/components/src/components/Button/Button.scss
@@ -20,8 +20,8 @@
pointer-events: all;
&.icon {
- padding: 0;
- gap: 0;
+ padding: 0px;
+ gap: 0px;
}
.button-content {
@@ -44,8 +44,8 @@
width: 100%;
height: 100%;
z-index: 0;
- left: 0;
- top: 0;
+ left: 0px;
+ top: 0px;
position: absolute;
transition: 0.4s;
}
@@ -111,7 +111,7 @@
.label {
position: absolute;
- bottom: 0;
+ bottom: 0px;
width: 100%;
display: flex;
justify-content: center;
diff --git a/packages/components/src/components/Button/Button.stories.tsx b/packages/components/src/components/Button/Button.stories.tsx
index 3893d9ded..9e7e8cb05 100644
--- a/packages/components/src/components/Button/Button.stories.tsx
+++ b/packages/components/src/components/Button/Button.stories.tsx
@@ -1,94 +1,97 @@
-import { Meta, Story } from '@storybook/react'
-import React from 'react'
-import * as bi from 'react-icons/bi'
-import { Button, IButtonProps } from '..'
-import { Colors, Size } from '../../global/globalEnums'
-import { Type , getFormLabelSize } from '../../global'
+import { Meta, Story } from '@storybook/react';
+import React from 'react';
+import * as bi from 'react-icons/bi';
+import { Button, IButtonProps } from '..';
+import { Type } from '../../global';
+import { Size } from '../../global/globalEnums';
export default {
- title: 'Dash/Button',
- component: Button,
- argTypes: {},
-} as Meta<typeof Button>
+ title: 'Dash/Button',
+ component: Button,
+ argTypes: {},
+} as Meta<typeof Button>;
-const Template: Story<IButtonProps> = (args) => <Button {...args} />
+const Template: Story<IButtonProps> = args => <Button {...args} />;
-export const Primary = Template.bind({})
+export const Primary = Template.bind({});
Primary.args = {
- onClick: () => {},
- text: 'Primary',
- type: Type.PRIM,
- style: {
- fontWeight: 600
- },
- tooltip: 'Primary button'
-}
+ onClick: () => {},
+ text: 'Primary',
+ type: Type.PRIM,
+ style: {
+ fontWeight: 600,
+ },
+ tooltip: 'Primary button',
+};
-export const Secondary = Template.bind({})
+export const Secondary = Template.bind({});
Secondary.args = {
- onClick: () => {},
- text: 'Secondary',
- type: Type.SEC,
- tooltip: 'Secondary button'
-}
+ onClick: () => {},
+ text: 'Secondary',
+ type: Type.SEC,
+ tooltip: 'Secondary button',
+ color: 'green',
+ background: 'yellow',
+};
-export const Tertiary = Template.bind({})
+export const Tertiary = Template.bind({});
Tertiary.args = {
- onClick: () => {},
- text: 'Tertiary',
- type: Type.TERT,
- size: Size.SMALL,
-}
+ onClick: () => {},
+ text: 'Tertiary',
+ type: Type.TERT,
+ size: Size.SMALL,
+ background: 'yellow',
+};
-export const Small = Template.bind({})
+export const Small = Template.bind({});
Small.args = {
- onClick: () => {},
- text: 'Small',
- type: Type.PRIM,
- size: Size.SMALL,
-}
+ onClick: () => {},
+ text: 'Small',
+ type: Type.PRIM,
+ size: Size.SMALL,
+};
-export const Medium = Template.bind({})
+export const Medium = Template.bind({});
Medium.args = {
- onClick: () => {},
- text: 'Medium',
- type: Type.PRIM,
- size: Size.MEDIUM,
-}
+ onClick: () => {},
+ text: 'Medium',
+ type: Type.PRIM,
+ size: Size.MEDIUM,
+};
-export const Large = Template.bind({})
+export const Large = Template.bind({});
Large.args = {
- onClick: () => {},
- text: 'Large',
- type: Type.PRIM,
- size: Size.LARGE,
-}
+ onClick: () => {},
+ text: 'Large',
+ type: Type.PRIM,
+ size: Size.LARGE,
+};
-export const ButtonWithLeftIcon = Template.bind({})
+export const ButtonWithLeftIcon = Template.bind({});
ButtonWithLeftIcon.args = {
- onClick: () => {},
- text: 'New',
- icon: <bi.BiPlus />,
- iconPosition: 'left',
- type: Type.PRIM,
-}
+ onClick: () => {},
+ text: 'New',
+ icon: <bi.BiPlus />,
+ iconPosition: 'left',
+ type: Type.PRIM,
+};
-export const ButtonWithRightIcon = Template.bind({})
+export const ButtonWithRightIcon = Template.bind({});
ButtonWithRightIcon.args = {
- onClick: () => {},
- text: 'More',
- iconPosition: 'right',
- icon: <bi.BiMobile />,
- type: Type.PRIM,
-}
+ onClick: () => {},
+ text: 'More',
+ iconPosition: 'right',
+ icon: <bi.BiMobile />,
+ type: Type.PRIM,
+};
-export const Label = Template.bind({})
+export const Label = Template.bind({});
Label.args = {
- onClick: () => {},
- text: 'Label',
- type: Type.PRIM,
- style: {
- fontWeight: 600
- },
- tooltip: 'Label button'
-} \ No newline at end of file
+ onClick: () => {},
+ text: 'Label',
+ type: Type.PRIM,
+ style: {
+ fontWeight: 600,
+ },
+ tooltip: 'Label button',
+};
diff --git a/packages/components/src/components/Dropdown/Dropdown.scss b/packages/components/src/components/Dropdown/Dropdown.scss
index f9ea2711a..516c229a5 100644
--- a/packages/components/src/components/Dropdown/Dropdown.scss
+++ b/packages/components/src/components/Dropdown/Dropdown.scss
@@ -129,8 +129,8 @@
.dropdown-toggle-mini {
.toggle-caret {
position: absolute;
- top: 0;
- left: 0;
+ top: 0px;
+ left: 0px;
}
}
}
diff --git a/packages/components/src/components/EditableText/EditableText.scss b/packages/components/src/components/EditableText/EditableText.scss
index 15965e97e..10f8328ae 100644
--- a/packages/components/src/components/EditableText/EditableText.scss
+++ b/packages/components/src/components/EditableText/EditableText.scss
@@ -16,8 +16,8 @@
justify-content: center;
align-items: center;
height: 100%;
- right: 0;
- top: 0;
+ right: 0px;
+ top: 0px;
}
.editableText-background {
@@ -26,8 +26,8 @@
z-index: -1;
position: absolute;
transition: 0.4s;
- top: 0;
- left: 0;
+ top: 0px;
+ left: 0px;
}
&.primary {
diff --git a/packages/components/src/components/FormInput/FormInput.scss b/packages/components/src/components/FormInput/FormInput.scss
index 2554cbd01..187827724 100644
--- a/packages/components/src/components/FormInput/FormInput.scss
+++ b/packages/components/src/components/FormInput/FormInput.scss
@@ -58,7 +58,7 @@
.formInput-label {
position: absolute;
- top: 0;
+ top: 0px;
transform: translate(0px, 8px);
display: block;
transition: 0.2s;
diff --git a/packages/components/src/components/Overlay/Overlay.scss b/packages/components/src/components/Overlay/Overlay.scss
index 5ba4f802c..2c3d9530d 100644
--- a/packages/components/src/components/Overlay/Overlay.scss
+++ b/packages/components/src/components/Overlay/Overlay.scss
@@ -1,9 +1,9 @@
.overlay-container {
width: 100vw;
height: 100vh;
- top: 0;
- left: 0;
+ top: 0px;
+ left: 0px;
background: pink;
position: absolute;
pointer-events: none;
-} \ No newline at end of file
+}
diff --git a/packages/components/src/components/Template/Template.tsx b/packages/components/src/components/Template/Template.tsx
index 6c6b26516..50b0dec0e 100644
--- a/packages/components/src/components/Template/Template.tsx
+++ b/packages/components/src/components/Template/Template.tsx
@@ -1,12 +1,8 @@
-import * as React from 'react'
-import { IGlobalProps , getFormLabelSize } from '../../global'
+import * as React from 'react';
+import { IGlobalProps } from '../../global';
-export interface ITemplateProps extends IGlobalProps {
-
-}
+export interface ITemplateProps extends IGlobalProps {}
export const Template = (props: ITemplateProps) => {
- return <div className={`template-container`}>
- Template Component
- </div>
-} \ No newline at end of file
+ return <div className={`template-container`}>Template Component</div>;
+};
diff --git a/packages/components/src/components/Toggle/Toggle.stories.tsx b/packages/components/src/components/Toggle/Toggle.stories.tsx
index 28ab2e712..6adf63424 100644
--- a/packages/components/src/components/Toggle/Toggle.stories.tsx
+++ b/packages/components/src/components/Toggle/Toggle.stories.tsx
@@ -1,35 +1,37 @@
-import { Meta, Story } from '@storybook/react'
-import React from 'react'
-import * as bi from 'react-icons/bi'
-import { IToggleProps, Toggle, ToggleType } from './Toggle'
-import { Type , getFormLabelSize } from '../../global'
+import { Meta, Story } from '@storybook/react';
+import React from 'react';
+import * as bi from 'react-icons/bi';
+import { Type } from '../../global';
+import { IToggleProps, Toggle, ToggleType } from './Toggle';
export default {
- title: 'Dash/Toggle',
- component: Toggle,
- argTypes: {},
-} as Meta<typeof Toggle>
+ title: 'Dash/Toggle',
+ component: Toggle,
+ argTypes: {},
+} as Meta<typeof Toggle>;
-const Template: Story<IToggleProps> = (args) => <Toggle {...args} />
+const Template: Story<IToggleProps> = args => <Toggle {...args} />;
-export const Button = Template.bind({})
+export const Button = Template.bind({});
Button.args = {
- // text: 'Button',
- type: Type.TERT,
- icon: <bi.BiAbacus/>,
- toggleType: ToggleType.BUTTON,
- tooltip: 'Test tooltip'
-}
+ // text: 'Button',
+ type: Type.PRIM,
+ icon: <bi.BiAbacus />,
+ toggleType: ToggleType.BUTTON,
+ tooltip: 'Test tooltip',
+ color: 'green',
+ background: 'yellow',
+};
-export const Checkbox = Template.bind({})
+export const Checkbox = Template.bind({});
Checkbox.args = {
- type: Type.SEC,
- toggleType: ToggleType.CHECKBOX
-}
+ type: Type.SEC,
+ toggleType: ToggleType.CHECKBOX,
+};
-export const Switch = Template.bind({})
+export const Switch = Template.bind({});
Switch.args = {
- text: 'Button',
- type: Type.SEC,
- toggleType: ToggleType.SWITCH
-} \ No newline at end of file
+ text: 'Button',
+ type: Type.SEC,
+ toggleType: ToggleType.SWITCH,
+};
diff --git a/packages/components/src/global/globalCssVariables.scss b/packages/components/src/global/globalCssVariables.scss
index ebc44106d..99fe7fb11 100644
--- a/packages/components/src/global/globalCssVariables.scss
+++ b/packages/components/src/global/globalCssVariables.scss
@@ -59,7 +59,7 @@ $small-text: 9px;
// $sans-serif: "Roboto Slab", sans-serif;
// misc values
-$search-thumnail-size: 130;
+$search-thumnail-size: 130px;
$topbar-height: 50px;
$antimodemenu-height: 36px;
diff --git a/src/ClientUtils.ts b/src/ClientUtils.ts
index cc8b715b4..8eb1a39ec 100644
--- a/src/ClientUtils.ts
+++ b/src/ClientUtils.ts
@@ -670,7 +670,8 @@ export function setupMoveUpEvents(
}
export function DivHeight(ele: HTMLElement | null): number {
- return ele ? Number(getComputedStyle(ele).height.replace('px', '')) : 0;
+ const hgt = ele ? Number(getComputedStyle(ele).height.replace('px', '')) : 0;
+ return Number.isNaN(hgt) ? 0 : hgt;
}
export function DivWidth(ele: HTMLElement | null): number {
return ele ? Number(getComputedStyle(ele).width.replace('px', '')) : 0;
diff --git a/src/client/apis/GoogleAuthenticationManager.tsx b/src/client/apis/GoogleAuthenticationManager.tsx
index 94ce42d8d..67a6e01e9 100644
--- a/src/client/apis/GoogleAuthenticationManager.tsx
+++ b/src/client/apis/GoogleAuthenticationManager.tsx
@@ -1,4 +1,4 @@
-import { action, IReactionDisposer, observable, reaction, runInAction } from 'mobx';
+import { action, IReactionDisposer, makeObservable, observable, runInAction } from 'mobx';
import { observer } from 'mobx-react';
import * as React from 'react';
import { Opt } from '../../fields/Doc';
@@ -6,12 +6,12 @@ import { Networking } from '../Network';
import { ScriptingGlobals } from '../util/ScriptingGlobals';
import { MainViewModal } from '../views/MainViewModal';
import './GoogleAuthenticationManager.scss';
+import { ObservableReactComponent } from '../views/ObservableReactComponent';
-const AuthenticationUrl = 'https://accounts.google.com/o/oauth2/v2/auth';
const prompt = 'Paste authorization code here...';
@observer
-export class GoogleAuthenticationManager extends React.Component<object> {
+export class GoogleAuthenticationManager extends ObservableReactComponent<object> {
// eslint-disable-next-line no-use-before-define
public static Instance: GoogleAuthenticationManager;
private authenticationLink: Opt<string> = undefined;
@@ -23,6 +23,12 @@ export class GoogleAuthenticationManager extends React.Component<object> {
@observable private credentials: { user_info: { name: string; picture: string }; access_token: string } | undefined = undefined;
private disposer: Opt<IReactionDisposer>;
+ constructor(props: object) {
+ super(props);
+ makeObservable(this);
+ GoogleAuthenticationManager.Instance = this;
+ }
+
private set isOpen(value: boolean) {
runInAction(() => (this.openState = value));
}
@@ -35,44 +41,51 @@ export class GoogleAuthenticationManager extends React.Component<object> {
this.openState && this.resetState(0, 0);
}
- public fetchOrGenerateAccessToken = async (displayIfFound = false) => {
+ public fetchOrGenerateAccessToken = async (): Promise<string | undefined> => {
const response = await Networking.FetchFromServer('/readGoogleAccessToken');
- // if this is an authentication url, activate the UI to register the new access token
- if (new RegExp(AuthenticationUrl).test(response)) {
- this.isOpen = true;
- this.authenticationLink = response;
- return new Promise<string>(resolve => {
- this.disposer?.();
- this.disposer = reaction(
- () => this.authenticationCode,
- async authenticationCode => {
- if (authenticationCode && /\d{1}\/[\w-]{55}/.test(authenticationCode)) {
- this.disposer?.();
- const response2 = await Networking.PostToServer('/writeGoogleAccessToken', { authenticationCode });
- runInAction(() => {
- this.success = true;
- this.credentials = response2 as { user_info: { name: string; picture: string }; access_token: string };
- });
- this.resetState();
- resolve((response2 as { access_token: string }).access_token);
- }
- }
- );
+
+ // This will return a JSON object with { access_token, user_info } if already linked
+ try {
+ const parsed = JSON.parse(response) as { access_token: string; user_info: { name: string; picture: string } };
+
+ runInAction(() => {
+ this.success = true;
+ this.credentials = parsed;
});
+
+ return parsed.access_token;
+ } catch {
+ console.warn('Not linked yet or invalid JSON. open auth...');
+ // This is an auth URL — redirect the user to /refreshGoogle
+ if (typeof response === 'string' && response.startsWith('http')) {
+ if (window.confirm('Authorize Dash to access your Google account?')) {
+ window.open(response)?.focus();
+ return undefined;
+ }
+ }
+
+ throw new Error('Unable to fetch Google access token.');
}
+ };
- // otherwise, we already have a valid, stored access token and user info
- const response2 = JSON.parse(response) as { user_info: { name: string; picture: string }; access_token: string };
- if (displayIfFound) {
+ public fetchAccessTokenSilently = async (): Promise<string | undefined> => {
+ const response = await Networking.FetchFromServer('/readGoogleAccessToken');
+
+ try {
+ const parsed = JSON.parse(response) as { access_token: string; user_info: { name: string; picture: string } };
+
runInAction(() => {
this.success = true;
- this.credentials = response2;
+ this.credentials = parsed;
});
- this.resetState(-1, -1);
- this.isOpen = true;
+
+ return parsed.access_token;
+ } catch {
+ // Do nothing — just return undefined silently
+ return undefined;
}
- return (response2 as { access_token: string }).access_token;
};
+
resetState = action((visibleForMS: number = 3000, fadesOutInMS: number = 500) => {
if (!visibleForMS && !fadesOutInMS) {
@@ -107,11 +120,6 @@ export class GoogleAuthenticationManager extends React.Component<object> {
}
});
- constructor(props: object) {
- super(props);
- GoogleAuthenticationManager.Instance = this;
- }
-
private get renderPrompt() {
return (
<div className={'authorize-container'}>
@@ -127,7 +135,7 @@ export class GoogleAuthenticationManager extends React.Component<object> {
</button>
) : null}
{this.showPasteTargetState ? <input className={'paste-target'} onChange={action(e => (this.authenticationCode = e.currentTarget.value))} placeholder={prompt} /> : null}
- {this.credentials ? (
+ {this.credentials?.user_info?.picture ? (
<>
<img className={'avatar'} src={this.credentials.user_info.picture} />
<span className={'welcome'}>Welcome to Dash, {this.credentials.user_info.name}</span>
diff --git a/src/client/apis/gpt/GPT.ts b/src/client/apis/gpt/GPT.ts
index 9cb47995c..7878e9bfe 100644
--- a/src/client/apis/gpt/GPT.ts
+++ b/src/client/apis/gpt/GPT.ts
@@ -11,6 +11,10 @@ export enum GPTDocCommand {
export const DescriptionSeperator = '======';
export const DocSeperator = '------';
+export enum TextClassifications {
+ Title = 'word', //a few words
+ Caption = 'sentence', //few sentences
+ LengthyDescription = 'paragraphs' }
enum GPTCallType {
SUMMARY = 'summary',
@@ -36,6 +40,9 @@ enum GPTCallType {
SUBSETDOCS = 'subset_docs', // select a subset of documents based on their descriptions
DOCINFO = 'doc_info', // provide information about a document
SORTDOCS = 'sort_docs',
+ CLASSIFYTEXTMINIMAL = 'classify_text_minimal', // classify text into one of the three categories: title, caption, lengthy description
+ CLASSIFYTEXTFULL = 'classify_text_full', //tags pdf content
+ GENERATESCRAPBOOK = 'generate_scrapbook'
}
type GPTCallOpts = {
@@ -48,6 +55,23 @@ type GPTCallOpts = {
const callTypeMap: { [type in GPTCallType]: GPTCallOpts } = {
// newest model: gpt-4
summary: { model: 'gpt-4-turbo', maxTokens: 256, temp: 0.5, prompt: 'Summarize the text given in simpler terms.' },
+
+
+ sort_docs: {
+ model: 'gpt-4o',
+ maxTokens: 2048,
+ temp: 0.25,
+ prompt:
+ `The user is going to give you a list of descriptions.
+ Each one is separated by '${DescriptionSeperator}' on either side.
+ Descriptions will vary in length, so make sure to only separate when you see '${DescriptionSeperator}'.
+ Sort them by the user's specifications.
+ Make sure each description is only in the list once. Each item should be separated by '${DescriptionSeperator}'.
+ Immediately afterward, surrounded by '${DocSeperator}' on BOTH SIDES, provide some insight into your reasoning for the way you sorted (and mention nothing about the formatting details given in this description).
+ It is VERY important that you format it exactly as described, ensuring the proper number of '${DescriptionSeperator[0]}' and '${DocSeperator[0]}' (${DescriptionSeperator.length} of each) and NO commas`,
+ },
+
+
edit: { model: 'gpt-4-turbo', maxTokens: 256, temp: 0.5, prompt: 'Reword the text.' },
stack: {
model: 'gpt-4o',
@@ -69,17 +93,23 @@ const callTypeMap: { [type in GPTCallType]: GPTCallOpts } = {
temp: 0.5,
prompt: "You are a helpful resarch assistant. Analyze the user's data to find meaningful patterns and/or correlation. Please only return a JSON with a correlation column 1 propert, a correlation column 2 property, and an analysis property. ",
},
- sort_docs: {
+ //new
+ classify_text_minimal: {
model: 'gpt-4o',
maxTokens: 2048,
temp: 0.25,
- prompt: `The user is going to give you a list of descriptions.
- Each one is separated by '${DescriptionSeperator}' on either side.
- Descriptions will vary in length, so make sure to only separate when you see '${DescriptionSeperator}'.
- Sort them by the user's specifications.
- Make sure each description is only in the list once. Each item should be separated by '${DescriptionSeperator}'.
- Immediately afterward, surrounded by '${DocSeperator}' on BOTH SIDES, provide some insight into your reasoning for the way you sorted (and mention nothing about the formatting details given in this description).
- It is VERY important that you format it exactly as described, ensuring the proper number of '${DescriptionSeperator[0]}' and '${DocSeperator[0]}' (${DescriptionSeperator.length} of each) and NO commas`,
+ prompt: `Based on the content of the the text, classify it into the
+ most appropriate category: '${TextClassifications.Title}' if it is a few words, '${TextClassifications.Caption}' if it is a couple sentences or less, or '${TextClassifications.LengthyDescription}' if it is a lengthy description. Output exclusively the classification in your response.
+ `
+ },
+ classify_text_full: {
+ model: 'gpt-4o',
+ maxTokens: 2048,
+ temp: 0.25,
+ prompt: `Based on the content of the the text, classify it into the
+ most appropriate category: '${TextClassifications.Title}', '${TextClassifications.Caption}', or '${TextClassifications.LengthyDescription}'.
+ Then provide five more descriptive tags (single words) separated by spaces.
+ Finally, include a more detailed summary phrase tag using underscores, for a total of seven tags.`
},
describe: { model: 'gpt-4-vision-preview', maxTokens: 2048, temp: 0, prompt: 'Describe these images in 3-5 words' },
flashcard: {
@@ -102,19 +132,20 @@ const callTypeMap: { [type in GPTCallType]: GPTCallOpts } = {
prompt: "BRIEFLY (<50 words) describe any differences between the rubric and the user's answer answer in second person. If there are no differences, say correct",
},
template: {
- model: 'gpt-4-turbo',
+ model: 'gpt-4.1',
maxTokens: 512,
temp: 0.5,
prompt: 'You will be given a list of field descriptions for one or more templates in the format {field #0: “description”}{field #1: “description”}{...}, and a list of column descriptions in the format {“title”: “description”}{...}. Your job is to match columns with fields based on their descriptions. Your output should be in the following JSON format: {“template_title”:{“#”: “title”, “#”: “title”, “#”: “title” …}, “template_title”:{“#”: “title”, “#”: “title”, “#”: “title” …}} where “template_title” is the templates title as specified in the description provided, # represents the field # and “title” the title of the column assigned to it. A filled out example might look like {“fivefield2”:{“0”:”Name”, “1”:”Image”, “2”:”Caption”, “3”:”Position”, “4”:”Stats”}, “fivefield3”:{0:”Image”, 1:”Name”, 2:”Caption”, 3:”Stats”, 4:”Position”}. Include one object for each template. IT IS VERY IMPORTANT THAT YOU ONLY INCLUDE TEXT IN THE FORMAT ABOVE, WITH NO ADDITIONS WHATSOEVER. Do not include extraneous ‘#’ characters, ‘column’ for columns, or ‘template’ for templates: ONLY THE TITLES AND NUMBERS. There should never be one column assigned to more than one field (ie. if the “name” column is assigned to field 1, it can’t be assigned to any other fields) . Do this for each template whose fields are described. The descriptions are as follows:',
},
+
vizsum: {
- model: 'gpt-4-turbo',
+ model: 'gpt-4.1',
maxTokens: 512,
temp: 0.5,
prompt: 'Your job is to provide brief descriptions for columns in a dataset based on example rows. Your descriptions should be geared towards how each column’s data might fit together into a visual template. Would they make good titles, main focuses, captions, descriptions, etc. Pay special attention to connections between columns, i.e. is there one column that specifically seems to describe/be related to another more than the rest? You should provide your analysis in JSON format like so: {“col1”:”description”, “col2”:”description”, …}. DO NOT INCLUDE ANY OTHER TEXT, ONLY THE JSON.',
},
vizsum2: {
- model: 'gpt-4-turbo',
+ model: 'gpt-4.1',
maxTokens: 512,
temp: 0.5,
prompt: 'Your job is to provide structured information on columns in a dataset based on example rows. You will categorize each column in two ways: by type and size. The size categories are as follows: tiny (one or two words), small (a sentence/multiple words), medium (a few sentences), large (a longer paragraph), and huge (a very long or multiple paragraphs). The type categories are as follows: visual (links/file paths to images, pdfs, maps, or any other visual media type), and text (plain text that isn’t a link/file path). Visual media should be assumed to have size “medium” “large” or “huge”. You will give your responses in JSON format, like so: {“title (of column)”:{“type”:”text”, “size”:”small”}, “title (of column)”:{“type”:”visual”, “size”:”medium”}, …}. DO NOT INCLUDE ANY OTHER TEXT, ONLY THE JSON.',
@@ -138,6 +169,32 @@ const callTypeMap: { [type in GPTCallType]: GPTCallOpts } = {
temp: 0.5,
prompt: 'You will be coloring drawings. You will be given what the drawing is, then a list of descriptions for parts of the drawing. Based on each description, respond with the stroke and fill color that it should be. Follow the rules: 1. Avoid using black for stroke color 2. Make the stroke color 1-3 shades darker than the fill color 3. Use the same colors when possible. Format as {#abcdef #abcdef}, making sure theres a color for each description, and do not include any additional text.',
},
+
+ generate_scrapbook: {
+ model: 'gpt-4o',
+ maxTokens: 2048,
+ temp: 0.5,
+ prompt: `Generate an aesthetically pleasing scrapbook layout preset based on these items.
+ Return your response as JSON in the format:
+ [{
+ "type": rich text or image or pdf or video or collection
+ "tag": a singular tag summarizing the document
+ "acceptTags": [a list of all relevant tags that this document accepts, like ['PERSON', 'LANDSCAPE']]
+ "x": number,
+ "y": number,
+ "width": number, **note: if it is in an image, please respect existing aspect ratio if it is provided
+ "height": number
+ }, ...]
+ If there are mutliple documents and you wish to nest documents into a collection for aesthetic purposes, you may include
+ "children": [
+ { type:
+ tag:
+ x: , y: , width: , height:
+ }
+ ] `
+
+ },
+
command_type: {
model: 'gpt-4-turbo',
maxTokens: 1024,
@@ -222,6 +279,7 @@ const gptAPICall = async (inputTextIn: string, callType: GPTCallType, prompt?: s
const gptImageCall = async (prompt: string, n?: number) => {
try {
const response = await openai.images.generate({
+ model: 'dall-e-3',
prompt: prompt,
n: n ?? 1,
size: '1024x1024',
diff --git a/src/client/documents/DocUtils.ts b/src/client/documents/DocUtils.ts
index 36e03daed..9704867d5 100644
--- a/src/client/documents/DocUtils.ts
+++ b/src/client/documents/DocUtils.ts
@@ -587,6 +587,15 @@ export namespace DocUtils {
doc.onClick = FollowLinkScript();
}
+ /**
+ * iterate through all items and their children and return a flat list of leaf placeholder content Docs
+ * @param items
+ * @returns list of placeholder content Docs
+ */
+ export function unwrapPlaceholders(items: Doc[]): Doc[] {
+ return items.flatMap(d => (d.$type === DocumentType.COL ? unwrapPlaceholders(DocListCast(d[Doc.LayoutDataKey(d)])) : [d]));
+ }
+
export function LeavePushpin(doc: Doc, annotationField: string) {
if (doc.followLinkToggle) return undefined;
const context = Cast(doc.embedContainer, Doc, null) ?? Cast(doc.annotationOn, Doc, null);
@@ -642,27 +651,27 @@ export namespace DocUtils {
return dd;
}
- export function assignUploadInfo(result: Upload.FileInformation, protoIn: Doc) {
+ export function assignUploadInfo(result: Upload.FileInformation, protoIn: Doc, fieldKey: string = 'data') {
const proto = protoIn;
if (Upload.isTextInformation(result)) {
proto.text = result.rawText;
}
if (Upload.isVideoInformation(result)) {
- proto.data_duration = result.duration;
+ proto[`${fieldKey}_duration`] = result.duration;
}
if (Upload.isImageInformation(result)) {
const maxNativeDim = Math.max(result.nativeHeight, result.nativeWidth);
const exifRotation = StrCast(result.exifData?.data?.Orientation).toLowerCase();
- proto.data_nativeOrientation = result.exifData?.data?.image?.Orientation ?? (exifRotation.includes('rotate 90') || exifRotation.includes('rotate 270') ? 5 : undefined);
- proto.data_nativeWidth = result.nativeWidth < result.nativeHeight ? (maxNativeDim * result.nativeWidth) / result.nativeHeight : maxNativeDim;
- proto.data_nativeHeight = result.nativeWidth < result.nativeHeight ? maxNativeDim : maxNativeDim / (result.nativeWidth / result.nativeHeight);
- if (NumCast(proto.data_nativeOrientation) >= 5) {
- proto.data_nativeHeight = result.nativeWidth < result.nativeHeight ? (maxNativeDim * result.nativeWidth) / result.nativeHeight : maxNativeDim;
- proto.data_nativeWidth = result.nativeWidth < result.nativeHeight ? maxNativeDim : maxNativeDim / (result.nativeWidth / result.nativeHeight);
+ proto[`${fieldKey}_nativeOrientation`] = result.exifData?.data?.image?.Orientation ?? (exifRotation.includes('rotate 90') || exifRotation.includes('rotate 270') ? 5 : undefined);
+ proto[`${fieldKey}_nativeWidth`] = result.nativeWidth < result.nativeHeight ? (maxNativeDim * result.nativeWidth) / result.nativeHeight : maxNativeDim;
+ proto[`${fieldKey}_nativeHeight`] = result.nativeWidth < result.nativeHeight ? maxNativeDim : maxNativeDim / (result.nativeWidth / result.nativeHeight);
+ if (NumCast(proto[`${fieldKey}_nativeOrientation`]) >= 5) {
+ proto[`${fieldKey}_nativeHeight`] = result.nativeWidth < result.nativeHeight ? (maxNativeDim * result.nativeWidth) / result.nativeHeight : maxNativeDim;
+ proto[`${fieldKey}_nativeWidth`] = result.nativeWidth < result.nativeHeight ? maxNativeDim : maxNativeDim / (result.nativeWidth / result.nativeHeight);
}
- proto.data_exif = JSON.stringify(result.exifData?.data);
- proto.data_contentSize = result.contentSize;
+ proto[`${fieldKey}_exif`] = JSON.stringify(result.exifData?.data);
+ proto[`${fieldKey}_contentSize`] = result.contentSize;
// exif gps data coordinates are stored in DMS (Degrees Minutes Seconds), the following operation converts that to decimal coordinates
const latitude = result.exifData?.data?.GPSLatitude;
const latitudeDirection = result.exifData?.data?.GPSLatitudeRef;
@@ -724,7 +733,7 @@ export namespace DocUtils {
_width: width || BoolCast(Doc.UserDoc().fitBox) ? Number(StrCast(Doc.UserDoc().fontSize).replace('px', '')) * 1.5 * 6 : 200,
_height: BoolCast(Doc.UserDoc().fitBox) ? Number(StrCast(Doc.UserDoc().fontSize).replace('px', '')) * 1.5 : 35,
_layout_autoHeight: true,
- backgroundColor: StrCast(Doc.UserDoc().textBackgroundColor),
+ backgroundColor: backgroundColor ?? StrCast(Doc.UserDoc().textBackgroundColor),
borderColor: Doc.UserDoc().borderColor as string,
borderWidth: Doc.UserDoc().borderWidth as number,
text_centered: BoolCast(Doc.UserDoc().textCentered),
@@ -842,7 +851,7 @@ export namespace DocUtils {
const {
source: { newFilename, mimetype },
result,
- } = upfiles.lastElement() ?? { source: { newFilename: '', mimetype: '' }, result: new Error('upload failed') };
+ } = upfiles.lastElement() ?? { source: { newFilename: '', mimetype: '' }, result: upfiles[0]?.result ?? new Error('unknown error') };
if (result instanceof Error) {
if (overwriteDoc) {
overwriteDoc.loadingError = result.message;
diff --git a/src/client/documents/DocumentTypes.ts b/src/client/documents/DocumentTypes.ts
index cef44e999..a73d8ba59 100644
--- a/src/client/documents/DocumentTypes.ts
+++ b/src/client/documents/DocumentTypes.ts
@@ -44,8 +44,9 @@ export enum DocumentType {
SCRIPTDB = 'scriptdb', // database of scripts
GROUPDB = 'groupdb', // database of groups
+ JOURNAL = 'journal', // AARAV ADD JOURNAL
+ TASK = 'task', // AARAV ADD TASK
SCRAPBOOK = 'scrapbook',
- JOURNAL = 'journal', // AARAV ADD
}
export enum CollectionViewType {
// general collections
diff --git a/src/client/documents/Documents.ts b/src/client/documents/Documents.ts
index e1cd62602..6fd6534a4 100644
--- a/src/client/documents/Documents.ts
+++ b/src/client/documents/Documents.ts
@@ -182,8 +182,6 @@ export class DocumentOptions {
identifier?: STRt = new StrInfo('documentIcon displayed for each doc as "d[x]"', false);
_rotation?: NUMt = new NumInfo('Amount of rotation on a document in degrees', false);
- date_range?: STRt = new StrInfo('date range for calendar', false);
-
chat?: STRt = new StrInfo('fields related to chatBox', false);
chat_history?: STRt = new StrInfo('chat history for chatbox', false);
chat_thread_id?: STRt = new StrInfo('thread id for chatbox', false);
@@ -291,6 +289,7 @@ export class DocumentOptions {
_layout_showSidebar?: BOOLt = new BoolInfo('whether an annotationsidebar should be displayed for text docuemnts');
_layout_showCaption?: string; // which field to display in the caption area. leave empty to have no caption
_layout_showTags?: BOOLt = new BoolInfo('whether to show the list of document tags at the bottom of a DocView');
+ _layout_hideScroll?: BOOLt = new BoolInfo('whether to hide scroll bars on the document');
_chromeHidden?: BOOLt = new BoolInfo('whether the editing chrome for a document is hidden');
hideClickBehaviors?: BOOLt = new BoolInfo('whether to hide click behaviors in context menu');
@@ -334,6 +333,9 @@ export class DocumentOptions {
toolType?: string; // type of pen tool
expertMode?: BOOLt = new BoolInfo('something available only in expert (not novice) mode');
+ placeholder_docType?: STRt = new StrInfo('type of document that this document accepts as a child', false, false, Array.from(Object.keys(DocumentType)));
+ placeholder_acceptTags?: List<string>;
+
contextMenuFilters?: List<ScriptField>;
contextMenuScripts?: List<ScriptField>;
contextMenuLabels?: List<string>;
@@ -363,7 +365,6 @@ export class DocumentOptions {
isBaseProto?: BOOLt = new BoolInfo('is doc a base level prototype for data documents as opposed to data documents which are prototypes for layout documents. base protos are not cloned during a deep');
isTemplateForField?: string; // the field key for which the containing document is a rendering template
isTemplateDoc?: BOOLt = new BoolInfo('is the document a template for creating other documents');
- isGroup?: BOOLt = new BoolInfo('should collection use a grouping UI behavior');
isFolder?: BOOLt = new BoolInfo('is document a tree view folder');
_isTimelineLabel?: BOOLt = new BoolInfo('is document a timeline label');
isLightbox?: BOOLt = new BoolInfo('whether a collection acts as a lightbox by opening lightbox links by hiding all other documents in collection besides link target');
@@ -403,6 +404,7 @@ export class DocumentOptions {
// freeform properties
freeform?: STRt = new StrInfo('');
+ freeform_isGroup?: BOOLt = new BoolInfo('should collection use a grouping UI behavior');
_freeform_backgroundGrid?: BOOLt = new BoolInfo('whether background grid is shown on freeform collections');
_freeform_scale_min?: NUMt = new NumInfo('how far out a view can zoom (used by image/videoBoxes that are clipped');
_freeform_scale_max?: NUMt = new NumInfo('how far in a view can zoom (used by sidebar freeform views');
@@ -525,6 +527,19 @@ export class DocumentOptions {
ai_prompt?: STRt = new StrInfo('input prompt to GAI engine');
ai_generatedDocs?: List<Doc>; // list of documents generated by GAI engine
+ // TASK MANAGER
+ $task_dateRange?: STRt = new StrInfo('date range for calendar', false);
+ $task_startTime?: DateInfo | DateField = new DateInfo('start date and time', /*filterable*/ false);
+ $task_endTime?: DateInfo | DateField = new DateInfo('end date and time', /*filterable*/ false);
+ $task_allDay?: BoolInfo | boolean = new BoolInfo('whether task is all-day or not', /*filterable*/ false);
+ $task_completed?: BoolInfo | boolean = new BoolInfo('whether the task is completed', /*filterable*/ false);
+ $googleTaskId?: STRt = new StrInfo('Google Task ID for syncing');
+ $task_lastSyncedAt?: STRt = new StrInfo('last update time for task node');
+ $task_deleted?: BoolInfo | boolean = new BoolInfo('whether task is deleted or not', /*filterable*/ false);
+
+ _calendar_date?: DateInfo | DateField = new DateInfo('current selected date of a calendar', /*filterable*/ false);
+ _calendar_dateRange?: STRt = new StrInfo('date range shown on a calendar', false);
+
/**
* JSON‐stringified slot configuration for ScrapbookBox
*/
@@ -937,31 +952,6 @@ export namespace Docs {
// AARAV ADD //
export function DailyJournalDocument(text: string | RichTextField, options: DocumentOptions = {}, fieldKey: string = 'text') {
- // const getFormattedDate = () => {
- // const date = new Date().toLocaleDateString(undefined, {
- // weekday: 'long',
- // year: 'numeric',
- // month: 'long',
- // day: 'numeric',
- // });
- // return date;
- // };
-
- // const getDailyText = () => {
- // const placeholderText = 'Start writing here...';
- // const dateText = `${getFormattedDate()}`;
-
- // return RichTextField.textToRtfFormat(
- // [
- // { text: 'Journal Entry:', styles: { bold: true, color: 'black', fontSize: 20 } },
- // { text: dateText, styles: { italic: true, color: 'gray', fontSize: 15 } },
- // { text: placeholderText, styles: { fontSize: 14, color: 'gray' } },
- // ],
- // undefined,
- // placeholderText.length
- // );
- // };
-
return InstanceFromProto(
Prototypes.get(DocumentType.JOURNAL),
'',
@@ -974,7 +964,19 @@ export namespace Docs {
);
}
- // AARAV ADD //
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
+ export function TaskDocument(text = '', options: DocumentOptions = {}, fieldKey = 'text') {
+ return InstanceFromProto(
+ Prototypes.get(DocumentType.TASK),
+ '',
+ {
+ title: '',
+ ...options,
+ },
+ undefined,
+ fieldKey
+ );
+ }
export function LinkDocument(source: Doc, target: Doc, options: DocumentOptions = {}, id?: string) {
const linkDoc = InstanceFromProto(
@@ -1055,6 +1057,7 @@ export namespace Docs {
_layout_nativeDimEditable: true,
_layout_reflowHorizontal: true,
_layout_reflowVertical: true,
+ calendar: '',
...options,
_type_collection: CollectionViewType.Calendar,
});
diff --git a/src/client/util/BranchingTrailManager.tsx b/src/client/util/BranchingTrailManager.tsx
index 65336812d..a0871514c 100644
--- a/src/client/util/BranchingTrailManager.tsx
+++ b/src/client/util/BranchingTrailManager.tsx
@@ -1,5 +1,3 @@
-/* eslint-disable react/no-unused-class-component-methods */
-/* eslint-disable react/no-array-index-key */
import { action, computed, makeObservable, observable } from 'mobx';
import { observer } from 'mobx-react';
import * as React from 'react';
@@ -52,7 +50,6 @@ export class BranchingTrailManager extends React.Component {
this.slideHistoryStack = newArr;
});
- // eslint-disable-next-line react/sort-comp
observeDocumentChange = (targetDoc: Doc, pres: PresBox) => {
const presId = pres.Document[Id];
if (this.prevPresId === presId) {
diff --git a/src/client/util/CalendarManager.tsx b/src/client/util/CalendarManager.tsx
index b50e39c02..a8460ed4b 100644
--- a/src/client/util/CalendarManager.tsx
+++ b/src/client/util/CalendarManager.tsx
@@ -156,7 +156,7 @@ export class CalendarManager extends ObservableReactComponent<object> {
const subDocEmbedding = Doc.MakeEmbedding(targetDoc); // embedding
console.log('subdoc embedding', subDocEmbedding);
subDocEmbedding.embedContainer = calendar; // set embed container
- subDocEmbedding.date_range = `${startDateStr}|${endDateStr}`; // set subDoc date range
+ subDocEmbedding.task_dateRange = `${startDateStr}|${endDateStr}`; // set subDoc date range
Doc.AddDocToList(calendar, 'data', subDocEmbedding); // add embedded subDoc to calendar
diff --git a/src/client/util/CaptureManager.scss b/src/client/util/CaptureManager.scss
index e7cbb4287..9e81f2669 100644
--- a/src/client/util/CaptureManager.scss
+++ b/src/client/util/CaptureManager.scss
@@ -67,7 +67,7 @@
font-weight: bold;
text-align: left;
color: black;
- width: 80;
+ width: 80px;
margin-right: 50px;
margin-bottom: 5px;
}
@@ -114,8 +114,8 @@
.buttons {
display: flex;
position: absolute;
- bottom: 0;
- right: 15;
+ bottom: 0px;
+ right: 15px;
justify-content: flex-end;
align-items: center;
height: 60px;
diff --git a/src/client/util/CurrentUserUtils.ts b/src/client/util/CurrentUserUtils.ts
index 3896ac6fc..130a4d013 100644
--- a/src/client/util/CurrentUserUtils.ts
+++ b/src/client/util/CurrentUserUtils.ts
@@ -409,7 +409,8 @@ pie title Minerals in my tap water
{key: "DataViz", creator: opts => Docs.Create.DataVizDocument("", opts), opts: { _width: 300, _height: 300, }},
// AARAV ADD //
{key: "DailyJournal",creator:opts => Docs.Create.DailyJournalDocument("", opts),opts: { _width: 300, _height: 300, }},
- {key: "Scrapbook",creator:opts => Docs.Create.ScrapbookDocument([], opts),opts:{ _width: 300, _height: 300}},
+ {key: "Task", creator: opts => Docs.Create.TaskDocument("", opts), opts: { _width: 300, _height: 300, _layout_autoHeight: true, title: "Task", }},
+ {key: "Scrapbook", creator: opts => Docs.Create.ScrapbookDocument([], opts), opts: { _width: 300, _height: 300}},
//{key: "Scrapbook",creator:opts => Docs.Create.ScrapbookDocument([], opts),opts:{ _width: 300, _height: 300}},
{key: "Chat", creator: Docs.Create.ChatDocument, opts: { _width: 500, _height: 500, _layout_fitWidth: true, }},
{key: "MetaNote", creator: metaNoteTemplate, opts: { _width: 300, _height: 120, _header_pointerEvents: "all", _header_height: 50, _header_fontSize: 9,_layout_autoHeightMargins: 50, _layout_autoHeight: true, treeView_HideUnrendered: true}},
@@ -455,6 +456,7 @@ pie title Minerals in my tap water
{ toolTip: "Tap or drag to create a data viz node", title: "DataViz", icon: "chart-bar", dragFactory: doc.emptyDataViz as Doc, clickFactory: DocCast(doc.emptyDataViz)},
{ toolTip: "Tap or drag to create a scrapbook template", title: "Scrapbook", icon: "palette", dragFactory: doc.emptyScrapbook as Doc,clickFactory:DocCast(doc.emptyScrapbook), },
{ toolTip: "Tap or drag to create a journal entry", title: "Journal", icon: "book", dragFactory:doc.emptyDailyJournal as Doc,clickFactory: DocCast(doc.emptyDataJournal), },
+ { toolTip: "Tap or drag to create a task", title: "Task", icon: "check-square", dragFactory: doc.emptyTask as Doc, clickFactory: DocCast(doc.emptyTask), },
{ toolTip: "Tap or drag to create a bullet slide", title: "PPT Slide", icon:"person-chalkboard",dragFactory: doc.emptySlide as Doc, clickFactory: DocCast(doc.emptySlide), openFactoryLocation: OpenWhere.overlay, funcs: { hidden: "IsNoviceMode()"}},
{ toolTip: "Tap or drag to create a view slide", title: "View Slide", icon: "address-card", dragFactory: doc.emptyViewSlide as Doc, clickFactory: DocCast(doc.emptyViewSlide), openFactoryLocation: OpenWhere.overlay, funcs: { hidden: "IsNoviceMode()"}},
{ toolTip: "Tap or drag to create a data note", title: "MetaNote", icon: "window-maximize", dragFactory: doc.emptyMetaNote as Doc, clickFactory: DocCast(doc.emptyMetaNote), openFactoryAsDelegate: true, funcs: { hidden: "IsNoviceMode()"} },
@@ -562,7 +564,7 @@ pie title Minerals in my tap water
const reqdToolOps:DocumentOptions = {
title: "My Tools", isSystem: true, ignoreClick: true, layout_boxShadow: "0 0",
layout_explainer: "This is a palette of documents that can be created.", _layout_dontCenter: "y",
- _layout_showTitle: "title", _width: 500, _yMargin: 20, _lockedPosition: true, _forceActive: true, _dragOnlyWithinContainer: true, layout_hideContextMenu: true, _chromeHidden: true,
+ _layout_showTitle: "title", _width: 500, _lockedPosition: true, _forceActive: true, _dragOnlyWithinContainer: true, layout_hideContextMenu: true, _chromeHidden: true,
};
return DocUtils.AssignDocField(doc, field, (opts, items) => Docs.Create.StackingDocument(items??[], opts), reqdToolOps, [creatorBtns, userBtns]);
}
@@ -994,7 +996,7 @@ pie title Minerals in my tap water
const reqdOpts:DocumentOptions = {
title: "My Imports", _forceActive: true, _layout_showTitle: "title", childLayoutString: ImportElementBox.LayoutString('data'),
_dragOnlyWithinContainer: true, layout_hideContextMenu: true, childLimitHeight: 0, onClickScriptDisable:"never",
- childDragAction: dropActionType.copy, _layout_autoHeight: true, _yMargin: 50, _gridGap: 15, layout_boxShadow: "0 0", _lockedPosition: true, isSystem: true, _chromeHidden: true,
+ childDragAction: dropActionType.copy, _layout_autoHeight: true, _gridGap: 15, layout_boxShadow: "0 0", _lockedPosition: true, isSystem: true,
dontRegisterView: true, layout_explainer: "This is where documents that are Imported into Dash will go."
};
const myImports = DocUtils.AssignDocField(doc, field, (opts) => Docs.Create.MasonryDocument([], opts), reqdOpts, undefined, {onClick: "deselectAll()"});
diff --git a/src/client/util/DocumentManager.ts b/src/client/util/DocumentManager.ts
index fc8f22cf3..1c2ffab1b 100644
--- a/src/client/util/DocumentManager.ts
+++ b/src/client/util/DocumentManager.ts
@@ -250,7 +250,7 @@ export class DocumentManager {
const options = optionsIn;
Doc.MyRecentlyClosed && Doc.RemoveDocFromList(Doc.MyRecentlyClosed, undefined, targetDoc);
const docContextPath = DocumentManager.GetContextPath(targetDoc, true);
- if (docContextPath.some(doc => doc.hidden)) options.toggleTarget = false;
+ if (docContextPath.some(doc => doc !== targetDoc && doc.hidden)) options.toggleTarget = false;
let activatedTab = false;
if (DocumentView.activateTabView(docContextPath[0])) {
options.toggleTarget = false;
@@ -274,6 +274,7 @@ export class DocumentManager {
// even if we found the document view, if the target is a lightbox, we try to open it in the lightbox to preserve lightbox semantics (eg, there's only one active doc in the lightbox)
const target = DocCast(targetDoc.annotationOn, targetDoc)!;
const compView = this.getDocumentView(DocCast(target.embedContainer))?.ComponentView;
+ options.didMove = target.hidden || options.didMove ? true : false;
if ((compView?.addDocTab ?? compView?._props.addDocTab)?.(target, options.openLocation)) {
await new Promise<void>(waitres => {
setTimeout(() => waitres());
diff --git a/src/client/util/GroupManager.scss b/src/client/util/GroupManager.scss
index 673af16ee..66f11c529 100644
--- a/src/client/util/GroupManager.scss
+++ b/src/client/util/GroupManager.scss
@@ -21,7 +21,6 @@
}
.group-input {
-
input {
padding: 8px;
width: 100%;
@@ -33,13 +32,13 @@
border-color: inherit;
background: white;
color: black;
- height: 30;
+ height: 30px;
}
}
.select-users {
- margin-right: 3;
- max-height: 30;
+ margin-right: 3px;
+ max-height: 30px;
width: 100%;
display: inline-flex;
flex-direction: row;
@@ -51,7 +50,6 @@
}
}
-
button {
align-self: center;
outline: none;
@@ -108,7 +106,7 @@
.sort-groups {
text-align: left;
- margin-left: 5;
+ margin-left: 5px;
width: 50px;
cursor: pointer;
display: flex;
@@ -122,7 +120,7 @@
.group-body {
justify-content: space-between;
- height: 225;
+ height: 225px;
padding-right: 1em;
justify-content: space-around;
@@ -149,8 +147,8 @@
button {
position: absolute;
width: 30%;
- right: 2;
- margin-top: 0;
+ right: 2px;
+ margin-top: 0px;
}
}
@@ -161,7 +159,6 @@
min-width: 100%;
margin: 2px 0;
}
-
}
}
-} \ No newline at end of file
+}
diff --git a/src/client/util/GroupMemberView.scss b/src/client/util/GroupMemberView.scss
index d50569b26..cb1a4e098 100644
--- a/src/client/util/GroupMemberView.scss
+++ b/src/client/util/GroupMemberView.scss
@@ -6,7 +6,7 @@
overflow: visible;
hr {
- margin-top: 20;
+ margin-top: 20px;
}
button {
@@ -31,7 +31,7 @@
}
.editing-header {
- margin-bottom: 5;
+ margin-bottom: 5px;
.group-title {
font-weight: bold;
@@ -39,7 +39,7 @@
text-align: center;
border: none;
outline: none;
- height: 20;
+ height: 20px;
text-overflow: ellipsis;
background: none;
@@ -57,12 +57,12 @@
.group-buttons {
display: flex;
- margin-top: 5;
- margin-bottom: 25;
+ margin-top: 5px;
+ margin-bottom: 25px;
.add-member-dropdown {
- margin-right: 3;
- max-height: 30;
+ margin-right: 3px;
+ max-height: 30px;
width: 250px;
display: inline-flex;
flex-direction: row;
@@ -108,11 +108,9 @@
.remove-button {
position: absolute;
- right: 10;
+ right: 10px;
cursor: pointer;
}
}
}
-
-
-} \ No newline at end of file
+}
diff --git a/src/client/util/LinkFollower.ts b/src/client/util/LinkFollower.ts
index 6081c3fae..a4f54f1cf 100644
--- a/src/client/util/LinkFollower.ts
+++ b/src/client/util/LinkFollower.ts
@@ -134,6 +134,6 @@ export class LinkFollower {
// eslint-disable-next-line prefer-arrow-callback
ScriptingGlobals.add(function followLink(doc: Doc, altKey: boolean) {
- DocumentView.DeselectAll();
+ // DocumentView.DeselectAll();
return LinkFollower.FollowLink(undefined, doc, altKey) ? undefined : { select: true };
});
diff --git a/src/client/util/PingManager.ts b/src/client/util/PingManager.ts
index 0e4f8cab0..593978b4a 100644
--- a/src/client/util/PingManager.ts
+++ b/src/client/util/PingManager.ts
@@ -27,7 +27,7 @@ export class PingManager {
this.IsBeating = status;
setTimeout(this.showAlert, 100);
});
- Networking.PostToServer('/ping', { date: new Date() })
+ Networking.PostToServer('/DashPing', { date: new Date() })
.then(res => {
SnappingManager.SetServerVersion((res as { message: string }).message);
!this.IsBeating && setIsBeating(true);
diff --git a/src/client/util/SearchUtil.ts b/src/client/util/SearchUtil.ts
index fc3bb99ab..2f23d07dc 100644
--- a/src/client/util/SearchUtil.ts
+++ b/src/client/util/SearchUtil.ts
@@ -8,6 +8,13 @@ import { DocOptions, FInfo } from '../documents/Documents';
export namespace SearchUtil {
export type HighlightingResult = { [id: string]: { [key: string]: string[] } };
+ /**
+ * Recursively search all Docs within the collection for the query string.
+ * @param {Doc} collectionDoc - The collection document to search within.
+ * @param {string} queryIn - The query string to search for.
+ * @param {boolean} matchKeyNames - Whether to match metadata field names in addition to field values
+ * @param {string[]} onlyKeys - Optional: restrict search to only look in the specified array of field names.
+ */
export function SearchCollection(collectionDoc: Opt<Doc>, queryIn: string, matchKeyNames: boolean, onlyKeys?: string[]) {
const blockedTypes = [DocumentType.PRESSLIDE, DocumentType.CONFIG, DocumentType.KVP, DocumentType.FONTICON, DocumentType.BUTTON, DocumentType.SCRIPTING];
const blockedKeys = matchKeyNames
@@ -27,11 +34,13 @@ export namespace SearchUtil {
const dtype = StrCast(doc.type) as DocumentType;
if (dtype && !blockedTypes.includes(dtype) && !docIDs.includes(doc[Id]) && depth >= 0) {
const hlights = new Set<string>();
- (onlyKeys ?? SearchUtil.documentKeys(doc)).forEach(
- key =>
- (val => (exact ? val === query.toLowerCase() : val.includes(query.toLowerCase())))(
- matchKeyNames ? key : Field.toString(doc[key] as FieldType))
- && hlights.add(key)
+ const fieldsToSearch = onlyKeys ?? SearchUtil.documentKeys(doc);
+ fieldsToSearch.forEach(
+ key => {
+ const val = (matchKeyNames ? key : Field.toString(doc[key] as FieldType)).toLowerCase();
+ const accept = (exact ? val === query.toLowerCase() : val.includes(query.toLowerCase()));
+ accept && hlights.add(key);
+ }
); // prettier-ignore
blockedKeys.forEach(key => hlights.delete(key));
@@ -45,18 +54,17 @@ export namespace SearchUtil {
return results;
}
/**
- * @param {Doc} doc - doc for which keys are returned
+ * @param {Doc} doc - Doc to search for used field names
*
- * This method returns a list of a document doc's keys.
+ * An array of all field names used by the Doc or its prototypes.
*/
export function documentKeys(doc: Doc) {
- const keys: { [key: string]: boolean } = {};
- Doc.GetAllPrototypes(doc).map(proto =>
- Object.keys(proto).forEach(key => {
- keys[key] = false;
- })
- );
- return Array.from(Object.keys(keys));
+ return Object.keys(Doc.GetAllPrototypes(doc).filter(proto => proto).reduce(
+ (keys, proto) => {
+ Object.keys(proto).forEach(keys.add.bind(keys));
+ return keys;
+ },
+ new Set<string>())); // prettier-ignore
}
/**
diff --git a/src/client/util/SettingsManager.scss b/src/client/util/SettingsManager.scss
index f81f17589..51b719200 100644
--- a/src/client/util/SettingsManager.scss
+++ b/src/client/util/SettingsManager.scss
@@ -26,7 +26,7 @@
font-size: 16;
font-weight: bold;
text-align: left;
- width: 80;
+ width: 80px;
margin-right: 50px;
}
@@ -81,7 +81,7 @@
.acl-text {
color: black;
- margin-top: 2;
+ margin-top: 2px;
text-align: left;
}
}
@@ -119,7 +119,7 @@
.preferences-color-text {
margin-top: 3px;
- margin-right: 4;
+ margin-right: 4px;
flex: 1 1 auto;
text-align: left;
}
@@ -134,8 +134,8 @@
margin-top: 2px;
.preferences-font-text {
- margin-top: 4;
- margin-right: 4;
+ margin-top: 4px;
+ margin-right: 4px;
margin-bottom: 2px;
text-align: left;
}
@@ -149,7 +149,7 @@
.font-select {
height: 35px;
font-size: 9;
- margin-right: 6;
+ margin-right: 6px;
border-radius: 5px;
width: 65%;
@@ -171,9 +171,9 @@
}
.preferences-check {
- margin-right: 4;
+ margin-right: 4px;
margin-bottom: -3;
- margin-left: 5;
+ margin-left: 5px;
margin-top: -1px;
display: inline-block;
padding-left: 5px;
@@ -205,14 +205,14 @@
.error-text {
color: #c40233;
font-size: 10;
- margin-bottom: 4;
+ margin-bottom: 4px;
}
.success-text {
- width: 300;
+ width: 300px;
margin-left: -20;
font-size: 10;
- margin-bottom: 4;
+ margin-bottom: 4px;
margin-top: -3;
color: #009f6b;
}
@@ -225,7 +225,7 @@
text-transform: uppercase;
letter-spacing: 2px;
font-size: 19;
- margin-top: 0;
+ margin-top: 0px;
font-weight: bold;
}
@@ -246,7 +246,7 @@
font-style: normal;
font-size: 15;
font-weight: normal;
- padding: 0;
+ padding: 0px;
.padding {
padding: 0 0 0 20px;
@@ -273,8 +273,8 @@
align-items: center;
flex-direction: column;
bottom: 10px;
- left: 0;
- right: 0;
+ left: 0px;
+ right: 0px;
.settings-username {
padding-right: 0px;
diff --git a/src/client/util/SettingsManager.tsx b/src/client/util/SettingsManager.tsx
index 9e79fd870..f54dea90c 100644
--- a/src/client/util/SettingsManager.tsx
+++ b/src/client/util/SettingsManager.tsx
@@ -40,7 +40,7 @@ export class SettingsManager extends React.Component<object> {
@observable private _activeTab = 'Accounts';
@observable private _isOpen = false;
- private googleAuthorize = action(() => GoogleAuthenticationManager.Instance.fetchOrGenerateAccessToken(true));
+ private googleAuthorize = action(() => GoogleAuthenticationManager.Instance.fetchOrGenerateAccessToken());
public closeMgr = action(() => {
this._isOpen = false;
diff --git a/src/client/util/SharingManager.scss b/src/client/util/SharingManager.scss
index c9f86f0e1..553f3a184 100644
--- a/src/client/util/SharingManager.scss
+++ b/src/client/util/SharingManager.scss
@@ -4,7 +4,7 @@
.select {
text-align: justify;
- text-align-last: end
+ text-align-last: end;
}
.sharing-contents {
@@ -36,15 +36,14 @@
}
.share-container {
-
.share-setup {
display: flex;
margin-bottom: 20px;
align-items: center;
- max-height: 28;
+ max-height: 28px;
.user-search {
- max-height: 30;
+ max-height: 30px;
width: 90%;
display: inline-flex;
flex-direction: row;
@@ -68,7 +67,7 @@
text-align-last: end;
font-size: 13px;
min-width: 90px;
- height: 28;
+ height: 28px;
margin-left: 2px;
}
@@ -99,8 +98,8 @@
display: flex;
float: right;
align-items: baseline;
- margin-top: -12;
- margin-bottom: 10;
+ margin-top: -12px;
+ margin-bottom: 10px;
.layoutDoc-acls,
.myDocs-acls {
@@ -109,7 +108,7 @@
label {
font-weight: normal;
font-style: italic;
- padding-right: 12;
+ padding-right: 12px;
}
input {
@@ -127,13 +126,13 @@
.group-container {
width: 50%;
display: flex;
- top:0;
+ top: 0px;
flex-direction: column;
border-radius: 4px;
.user-sort {
text-align: left;
- margin-left: 10;
+ margin-left: 10px;
width: 100%;
cursor: pointer;
}
@@ -180,7 +179,7 @@
padding: 0 10;
margin: 0 5;
transition: transform 0.2s;
- height: 25;
+ height: 25px;
}
}
@@ -205,7 +204,7 @@
.people-with {
font-size: 14px;
- margin: 0;
+ margin: 0px;
padding-top: 3px;
font-style: normal;
}
@@ -216,30 +215,30 @@
}
}
- .title-individual{
+ .title-individual {
height: 25px;
- padding-left: 2;
+ padding-left: 2px;
width: 97%;
border-radius: 4px;
margin-top: 10px;
margin-left: -8px;
font-size: 14;
- margin-bottom: -4;
+ margin-bottom: -4px;
border: 2px solid;
border-bottom: none;
align-items: center;
display: flex;
}
- .title-group{
+ .title-group {
height: 25px;
- padding-left: 2;
+ padding-left: 2px;
width: 97%;
border-radius: 4px;
margin-top: 10px;
margin-left: -8px;
font-size: 14;
- margin-bottom: -4;
+ margin-bottom: -4px;
border: 2px solid;
border-bottom: none;
align-items: center;
@@ -289,18 +288,17 @@
text-align: right;
margin-left: auto;
margin-right: -12px;
-
}
.edit-actions {
display: flex;
position: absolute;
align-items: flex-end;
- right: -10;
+ right: -10px;
}
}
- .permissions-dropdown-None{
+ .permissions-dropdown-None {
height: 100%;
min-width: 85px;
text-align: right;
@@ -325,7 +323,7 @@
border-radius: 6px;
border: 1px solid rgb(75, 75, 5);
}
- .permissions-dropdown-Augment{
+ .permissions-dropdown-Augment {
height: 100%;
min-width: 85px;
text-align: right;
@@ -333,12 +331,11 @@
padding: 0px;
padding-left: 3px;
background: rgb(208, 255, 208);
- color:rgb(19, 80, 19);
+ color: rgb(19, 80, 19);
border-radius: 6px;
border: 1px solid rgb(19, 80, 19);
-
}
- .permissions-dropdown-View{
+ .permissions-dropdown-View {
height: 100%;
min-width: 85px;
text-align: right;
@@ -350,7 +347,7 @@
border-radius: 6px;
border: 1px solid rgb(25, 25, 101);
}
- .permissions-dropdown-Not-Shared{
+ .permissions-dropdown-Not-Shared {
height: 100%;
min-width: 85px;
text-align: right;
@@ -398,4 +395,4 @@
// padding-top: 12px;
// }
// }
-} \ No newline at end of file
+}
diff --git a/src/client/util/TrackMovements.ts b/src/client/util/TrackMovements.ts
index 7da0281c0..74a3be83d 100644
--- a/src/client/util/TrackMovements.ts
+++ b/src/client/util/TrackMovements.ts
@@ -98,7 +98,6 @@ export class TrackMovements {
// new tab was added - need to add it
if (tabbedFFViews.size > this.recordingFFViews.size) {
- // eslint-disable-next-line no-restricted-syntax
for (const DashDoc of tabbedDocs) {
if (!this.recordingFFViews.has(DashDoc)) {
if (isFFView(DashDoc)) {
@@ -112,7 +111,6 @@ export class TrackMovements {
}
// tab was removed - need to remove it from recordingFFViews
else if (tabbedFFViews.size < this.recordingFFViews.size) {
- // eslint-disable-next-line no-restricted-syntax
for (const [doc] of this.recordingFFViews) {
if (!tabbedFFViews.has(doc)) {
this.removeRecordingFFView(doc);
diff --git a/src/client/util/clamp.js b/src/client/util/clamp.js
index 9c7fd78a4..8d74b5636 100644
--- a/src/client/util/clamp.js
+++ b/src/client/util/clamp.js
@@ -1,15 +1,15 @@
-"use strict";
+'use strict';
-Object.defineProperty(exports, "__esModule", {
- value: true
+Object.defineProperty(exports, '__esModule', {
+ value: true,
});
-exports.default = clamp;
function clamp(min, val, max) {
- if (val < min) {
- return min;
- }
- if (val > max) {
- return max;
- }
- return val;
-} \ No newline at end of file
+ if (val < min) {
+ return min;
+ }
+ if (val > max) {
+ return max;
+ }
+ return val;
+}
+exports.default = clamp;
diff --git a/src/client/util/convertToCSSPTValue.js b/src/client/util/convertToCSSPTValue.js
index 66f8db5a1..032385d81 100644
--- a/src/client/util/convertToCSSPTValue.js
+++ b/src/client/util/convertToCSSPTValue.js
@@ -3,11 +3,8 @@
Object.defineProperty(exports, '__esModule', {
value: true,
});
-exports.PT_TO_PX_RATIO = exports.PX_TO_PT_RATIO = undefined;
-exports.default = convertToCSSPTValue;
-exports.toClosestFontPtSize = toClosestFontPtSize;
-var SIZE_PATTERN = /([\d\.]+)(px|pt)/i;
+var SIZE_PATTERN = /([\d.]+)(px|pt)/i;
var PX_TO_PT_RATIO = (exports.PX_TO_PT_RATIO = 0.7518796992481203); // 1 / 1.33.
var PT_TO_PX_RATIO = (exports.PT_TO_PX_RATIO = 1.33);
@@ -39,3 +36,7 @@ function toClosestFontPtSize(styleValue) {
return Math.abs(curr - originalPTValue) < Math.abs(prev - originalPTValue) ? curr : prev;
}, Number.NEGATIVE_INFINITY);
}
+
+exports.PT_TO_PX_RATIO = exports.PX_TO_PT_RATIO = undefined;
+exports.default = convertToCSSPTValue;
+exports.toClosestFontPtSize = toClosestFontPtSize;
diff --git a/src/client/util/reportManager/ReportManager.scss b/src/client/util/reportManager/ReportManager.scss
index 806741c22..65894fbd6 100644
--- a/src/client/util/reportManager/ReportManager.scss
+++ b/src/client/util/reportManager/ReportManager.scss
@@ -14,8 +14,8 @@
}
h2 {
- margin: 0;
- padding: 0;
+ margin: 0px;
+ padding: 0px;
font-size: 24px;
}
}
@@ -27,8 +27,8 @@
gap: 4px;
h2 {
- margin: 0;
- padding: 0;
+ margin: 0px;
+ padding: 0px;
padding-bottom: 8px;
font-size: 24px;
}
@@ -92,7 +92,7 @@
outline: none;
border-bottom: 1px solid;
padding: 8px;
- padding-left: 0;
+ padding-left: 0px;
transition: all 0.2s ease;
background: transparent;
@@ -178,15 +178,15 @@
cursor: pointer;
font-size: 14px;
font-weight: 400;
- padding: 0;
- margin: 0;
+ padding: 0px;
+ margin: 0px;
}
.issue-title {
font-size: 16px;
font-weight: 500;
- padding: 0;
- margin: 0;
+ padding: 0px;
+ margin: 0px;
}
}
@@ -211,8 +211,8 @@
.file-list {
box-sizing: border-box;
- margin: 0;
- padding: 0;
+ margin: 0px;
+ padding: 0px;
font-size: 14px;
width: 100%;
overflow-x: auto;
@@ -251,8 +251,8 @@
.issue-title {
font-size: 24px;
- margin: 0;
- padding: 0;
+ margin: 0px;
+ padding: 0px;
}
.issue-date {
@@ -314,8 +314,8 @@
.report-media-content::after {
content: '';
position: absolute;
- top: 0;
- left: 0;
+ top: 0px;
+ left: 0px;
width: 100%;
height: 100%;
background-color: rgba(0, 0, 0, 0.5); /* Adjust the opacity as desired */
diff --git a/src/client/util/reportManager/ReportManager.tsx b/src/client/util/reportManager/ReportManager.tsx
index a6b5911f7..87e8a8bf1 100644
--- a/src/client/util/reportManager/ReportManager.tsx
+++ b/src/client/util/reportManager/ReportManager.tsx
@@ -1,4 +1,3 @@
-/* eslint-disable react/no-unused-class-component-methods */
import { Octokit } from '@octokit/core';
import { Button, Dropdown, DropdownType, IconButton, Type } from '@dash/components';
import { action, makeObservable, observable } from 'mobx';
@@ -31,7 +30,6 @@ export class ReportManager extends React.Component<object> {
@observable private isOpen = false;
@observable private query = '';
- // eslint-disable-next-line react/sort-comp
@action private setQuery = (q: string) => {
this.query = q;
};
diff --git a/src/client/views/ContextMenu.scss b/src/client/views/ContextMenu.scss
index d22c4d096..337c976cb 100644
--- a/src/client/views/ContextMenu.scss
+++ b/src/client/views/ContextMenu.scss
@@ -68,8 +68,8 @@
width: 100%;
height: 100%;
position: absolute;
- top: 0;
- left: 0;
+ top: 0px;
+ left: 0px;
z-index: 0;
filter: opacity(0);
}
@@ -187,10 +187,10 @@
display: flex;
.close-menu {
- margin-top: 0;
- margin-bottom: 0;
- margin-right: 0;
- padding: 0;
+ margin-top: 0px;
+ margin-bottom: 0px;
+ margin-right: 0px;
+ padding: 0px;
margin-left: auto;
z-index: 999999999;
width: 20px;
diff --git a/src/client/views/DashboardView.scss b/src/client/views/DashboardView.scss
index daa711bc4..d74441b9c 100644
--- a/src/client/views/DashboardView.scss
+++ b/src/client/views/DashboardView.scss
@@ -79,8 +79,8 @@ $dashboard-container-width: 250px;
position: absolute;
width: 100%;
height: 100%;
- left: 0;
- top: 0;
+ left: 0px;
+ top: 0px;
z-index: -1;
}
}
@@ -137,8 +137,8 @@ $dashboard-container-width: 250px;
position: absolute;
width: 100%;
height: 100%;
- left: 0;
- top: 0;
+ left: 0px;
+ top: 0px;
z-index: -1;
}
}
diff --git a/src/client/views/DocumentButtonBar.tsx b/src/client/views/DocumentButtonBar.tsx
index bc669fc4e..a845e4936 100644
--- a/src/client/views/DocumentButtonBar.tsx
+++ b/src/client/views/DocumentButtonBar.tsx
@@ -294,7 +294,7 @@ export class DocumentButtonBar extends ObservableReactComponent<{ views: () => (
{metaBtn('keywords', 'id-card')}
</div> */}
- <Tooltip title={<div className="dash-keyword-button">Open keyword menu</div>}>
+ <Tooltip title={<div className="dash-keyword-button">Open tags menu</div>}>
<div
className="documentButtonBar-icon"
style={{ color: 'white' }}
@@ -511,7 +511,7 @@ export class DocumentButtonBar extends ObservableReactComponent<{ views: () => (
{!DocumentView.Selected().some(v => v.allLinks.length) ? null : <div className="documentButtonBar-button">{this.followLinkButton}</div>}
<div className="documentButtonBar-button">{this.pinButton}</div>
<div className="documentButtonBar-button">{this.recordButton}</div>
- <div className="documentButtonBar-button">{this.calendarButton}</div>
+ {Doc.noviceMode ? null : <div className="documentButtonBar-button">{this.calendarButton}</div>}
{this.view0?.HasAIEditor ? <div className="documentButtonBar-button">{this.aiEditorButton}</div> : null}
<div className="documentButtonBar-button">{this.keywordButton}</div>
{!Doc.UserDoc().documentLinksButton_fullMenu ? null : <div className="documentButtonBar-button">{this.shareButton}</div>}
diff --git a/src/client/views/DocumentDecorations.scss b/src/client/views/DocumentDecorations.scss
index 09a13634f..25a806abd 100644
--- a/src/client/views/DocumentDecorations.scss
+++ b/src/client/views/DocumentDecorations.scss
@@ -11,8 +11,8 @@ $resizeHandler: 8px;
// Rotation handler
.documentDecorations-rotation {
border-radius: 100%;
- height: 30;
- width: 30;
+ height: 30px;
+ width: 30px;
right: -40;
bottom: -20;
//top: calc(50% - 15px);
@@ -32,8 +32,10 @@ $resizeHandler: 8px;
}
.documentDecorations-rotationCenter {
position: absolute;
- width: 6px;
- height: 6px;
+ width: 9px;
+ height: 9px;
+ left: -4.5px;
+ top: -4.5px;
pointer-events: all;
background: green;
border-radius: 50%;
@@ -43,15 +45,15 @@ $resizeHandler: 8px;
width: 100%;
pointer-events: all;
border-radius: 50%;
- top: 30; // offset by height of documentButtonBar so that items can be clicked without overlap interference
+ top: 30px; // offset by height of documentButtonBar so that items can be clicked without overlap interference
color: black;
}
}
.documentDecorations-container {
position: absolute;
- top: 0;
- left: 0;
+ top: 0px;
+ left: 0px;
transform-origin: 50% calc(50% + 10px);
display: grid;
grid-template-rows: $headerHeight $resizeHandler 1fr $resizeHandler;
@@ -119,7 +121,7 @@ $resizeHandler: 8px;
}
> svg {
- margin: 0;
+ margin: 0px;
}
}
@@ -148,7 +150,7 @@ $resizeHandler: 8px;
}
> svg {
- margin: 0;
+ margin: 0px;
}
}
&:hover {
@@ -183,7 +185,7 @@ $resizeHandler: 8px;
}
> svg {
- margin: 0;
+ margin: 0px;
}
}
@@ -244,7 +246,7 @@ $resizeHandler: 8px;
display: inline;
position: relative;
top: -2.5;
- left: 35;
+ left: 35px;
zoom: 0.7;
}
@@ -358,8 +360,8 @@ $resizeHandler: 8px;
left: 7px;
top: 7px;
background: global.$medium-gray;
- height: 10;
- width: 10;
+ height: 10px;
+ width: 10px;
opacity: 0.5;
pointer-events: all;
cursor: nwse-resize;
@@ -369,8 +371,8 @@ $resizeHandler: 8px;
position: relative;
background: black;
color: rgb(145, 144, 144);
- height: 20;
- width: 20;
+ height: 20px;
+ width: 20px;
pointer-events: all;
margin: auto;
display: flex;
@@ -378,8 +380,8 @@ $resizeHandler: 8px;
border-radius: 100%;
cursor: default;
svg {
- width: 10;
- height: 10;
+ width: 10px;
+ height: 10px;
margin: auto;
}
}
@@ -387,7 +389,7 @@ $resizeHandler: 8px;
.documentDecorations-rotationPath {
position: absolute;
width: 100%;
- height: 0;
+ height: 0px;
transform: translate(0px, -25%);
padding-bottom: 100%;
border-radius: 100%;
diff --git a/src/client/views/DocumentDecorations.tsx b/src/client/views/DocumentDecorations.tsx
index ab665e984..7a9f6c514 100644
--- a/src/client/views/DocumentDecorations.tsx
+++ b/src/client/views/DocumentDecorations.tsx
@@ -1,7 +1,7 @@
+import { IconButton } from '@dash/components';
import { IconProp } from '@fortawesome/fontawesome-svg-core';
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
import { Tooltip } from '@mui/material';
-import { IconButton } from '@dash/components';
import { action, computed, makeObservable, observable, runInAction } from 'mobx';
import { observer } from 'mobx-react';
import * as React from 'react';
@@ -27,15 +27,13 @@ import './DocumentDecorations.scss';
import { InkStrokeProperties } from './InkStrokeProperties';
import { InkingStroke } from './InkingStroke';
import { ObservableReactComponent } from './ObservableReactComponent';
+import { TagsView } from './TagsView';
import { CollectionDockingView } from './collections/CollectionDockingView';
import { CollectionFreeFormView } from './collections/collectionFreeForm';
import { Colors } from './global/globalEnums';
import { CollectionFreeFormDocumentView } from './nodes/CollectionFreeFormDocumentView';
import { DocumentView } from './nodes/DocumentView';
-import { ImageBox } from './nodes/ImageBox';
import { OpenWhere, OpenWhereMod } from './nodes/OpenWhere';
-import { FormattedTextBox } from './nodes/formattedText/FormattedTextBox';
-import { TagsView } from './TagsView';
interface DocumentDecorationsProps {
PanelWidth: number;
@@ -58,7 +56,7 @@ export class DocumentDecorations extends ObservableReactComponent<DocumentDecora
private _inkDragDocs: { doc: Doc; x: number; y: number; width: number; height: number }[] = [];
private _interactionLock?: boolean;
- @observable _showNothing = true;
+ @observable private _showNothing = true;
@observable private _forceRender = 0;
@observable private _accumulatedTitle = '';
@observable private _titleControlString: string = '$title';
@@ -349,13 +347,14 @@ export class DocumentDecorations extends ObservableReactComponent<DocumentDecora
e.stopPropagation();
};
- setRotateCenter = (seldocview: DocumentView, rotCenter: number[]) => {
+ setDocRotateCenter = (seldocview: DocumentView, rotCenter: number[]) => {
const selDoc = seldocview.Document;
const newloccentern = seldocview.screenToViewTransform().transformPoint(rotCenter[0], rotCenter[1]);
const newlocenter = [newloccentern[0] - NumCast(seldocview.layoutDoc._width) / 2, newloccentern[1] - NumCast(seldocview.layoutDoc._height) / 2];
const final = Utils.rotPt(newlocenter[0], newlocenter[1], -(NumCast(seldocview.Document._rotation) / 180) * Math.PI);
selDoc._rotation_centerX = final.x / NumCast(seldocview.layoutDoc._width);
selDoc._rotation_centerY = final.y / NumCast(seldocview.layoutDoc._height);
+ return false;
};
@action
@@ -365,10 +364,7 @@ export class DocumentDecorations extends ObservableReactComponent<DocumentDecora
setupMoveUpEvents(
this,
e,
- (moveEv: PointerEvent, down: number[], delta: number[]) => {
- this.setRotateCenter(seldocview, [this.rotCenter[0] + delta[0], this.rotCenter[1] + delta[1]]);
- return false;
- },
+ (moveEv) => this.setDocRotateCenter(seldocview, [moveEv.clientX, moveEv.clientY]),
action(() => { this._isRotating = false; }), // upEvent
action(() => { seldocview.Document._rotation_centerX = seldocview.Document._rotation_centerY = 0; }),
true
@@ -377,7 +373,7 @@ export class DocumentDecorations extends ObservableReactComponent<DocumentDecora
};
@action
- onRotateDown = (e: React.PointerEvent): void => {
+ onRotateHdlDown = (e: React.PointerEvent): void => {
this._isRotating = true;
const rcScreen = { X: this.rotCenter[0], Y: this.rotCenter[1] };
const rotateUndo = UndoManager.StartBatch('drag rotation');
@@ -393,17 +389,20 @@ export class DocumentDecorations extends ObservableReactComponent<DocumentDecora
const unrotatedDocPos = { x: NumCast(dv.Document.x) + localRotCtrOffset[0] - startRotCtr.x, y: NumCast(dv.Document.y) + localRotCtrOffset[1] - startRotCtr.y };
infos.set(dv.Document, { unrotatedDocPos, startRotCtr, accumRot });
});
- const infoRot = (angle: number, isAbs = false) => {
- DocumentView.Selected().forEach(
- action(dv => {
- const { unrotatedDocPos, startRotCtr, accumRot } = infos.get(dv.Document)!;
- const endRotCtr = Utils.rotPt(startRotCtr.x, startRotCtr.y, isAbs ? angle : accumRot + angle);
- infos.set(dv.Document, { unrotatedDocPos, startRotCtr, accumRot: isAbs ? angle : accumRot + angle });
- dv.Document.x = infos.get(dv.Document)!.unrotatedDocPos.x - (endRotCtr.x - startRotCtr.x);
- dv.Document.y = infos.get(dv.Document)!.unrotatedDocPos.y - (endRotCtr.y - startRotCtr.y);
- dv.Document._rotation = ((isAbs ? 0 : NumCast(dv.Document._rotation)) + (angle * 180) / Math.PI) % 360; // Rotation between -360 and 360
- })
- );
+ const rotateDocs = (angle: number, isAbs = false) => {
+ if (selectedInk.length) {
+ InkStrokeProperties.Instance.rotateInk(selectedInk, angle, rcScreen); // rotate ink
+ return this.setDocRotateCenter(seldocview, centerPoint);
+ }
+ DocumentView.Selected().forEach(action(dv => {
+ const { unrotatedDocPos, startRotCtr, accumRot } = infos.get(dv.Document)!;
+ const endRotCtr = Utils.rotPt(startRotCtr.x, startRotCtr.y, isAbs ? angle : accumRot + angle);
+ infos.set(dv.Document, { unrotatedDocPos, startRotCtr, accumRot: isAbs ? angle : accumRot + angle });
+ dv.Document.x = infos.get(dv.Document)!.unrotatedDocPos.x - (endRotCtr.x - startRotCtr.x);
+ dv.Document.y = infos.get(dv.Document)!.unrotatedDocPos.y - (endRotCtr.y - startRotCtr.y);
+ dv.Document._rotation = ((isAbs ? 0 : NumCast(dv.Document._rotation)) + (angle * 180) / Math.PI) % 360; // Rotation between -360 and 360
+ })); // prettier-ignore
+ return false;
};
setupMoveUpEvents(
this,
@@ -411,34 +410,17 @@ export class DocumentDecorations extends ObservableReactComponent<DocumentDecora
(moveEv: PointerEvent, down: number[], delta: number[]) => {
const previousPoint = { X: moveEv.clientX, Y: moveEv.clientY };
const movedPoint = { X: moveEv.clientX - delta[0], Y: moveEv.clientY - delta[1] };
- const deltaAng = InkStrokeProperties.angleChange(movedPoint, previousPoint, rcScreen);
- if (selectedInk.length) {
- deltaAng && InkStrokeProperties.Instance.rotateInk(selectedInk, deltaAng, rcScreen);
- this.setRotateCenter(seldocview, centerPoint);
- } else {
- infoRot(deltaAng);
- }
- return false;
+ return rotateDocs(InkStrokeProperties.angleChange(movedPoint, previousPoint, rcScreen));
}, // moveEvent
action(() => {
const oldRotation = NumCast(seldocview.Document._rotation);
- const diff = oldRotation - Math.round(oldRotation / 45) * 45;
- if (Math.abs(diff) < 5) {
- if (selectedInk.length) {
- InkStrokeProperties.Instance.rotateInk(selectedInk, ((Math.round(oldRotation / 45) * 45 - oldRotation) / 180) * Math.PI, rcScreen);
- } else {
- infoRot(((Math.round(oldRotation / 45) * 45) / 180) * Math.PI, true);
- }
- }
- if (selectedInk.length) {
- this.setRotateCenter(seldocview, centerPoint);
- }
+ if (Math.abs(oldRotation - Math.round(oldRotation / 45) * 45) < 5) { // rptation witihin 5deg of a 45deg angle multiple
+ rotateDocs(((Math.round(oldRotation / 45) * 45) / 180) * Math.PI, true);
+ } // prettier-ignore
this._isRotating = false;
rotateUndo?.end();
}), // upEvent
- action(() => {
- this._showRotCenter = !this._showRotCenter;
- }) // clickEvent
+ action(() => (this._showRotCenter = !this._showRotCenter)) // clickEvent
);
};
@@ -446,7 +428,7 @@ export class DocumentDecorations extends ObservableReactComponent<DocumentDecora
onPointerDown = (e: React.PointerEvent): void => {
SnappingManager.SetIsResizing(DocumentView.Selected().lastElement()?.Document[Id]); // turns off pointer events on things like youtube videos and web pages so that dragging doesn't get "stuck" when cursor moves over them
DocumentView.Selected()
- .filter(dv => e.shiftKey && dv.ComponentView instanceof ImageBox)
+ .filter(dv => e.shiftKey && dv.ComponentView?.isOutpaintable?.())
.forEach(dv => {
dv.Document[dv.ComponentView!.fieldKey + '_outpaintOriginalWidth'] = NumCast(dv.Document._width);
dv.Document[dv.ComponentView!.fieldKey + '_outpaintOriginalHeight'] = NumCast(dv.Document._height);
@@ -502,7 +484,7 @@ export class DocumentDecorations extends ObservableReactComponent<DocumentDecora
this._interactionLock = true;
this._snapPt = thisPt;
- const outpainted = e.shiftKey ? DocumentView.Selected().filter(dv => dv.ComponentView instanceof ImageBox) : [];
+ const outpainted = e.shiftKey ? DocumentView.Selected().filter(dv => dv.ComponentView?.isOutpaintable?.()) : [];
const notOutpainted = e.shiftKey ? DocumentView.Selected().filter(dv => !outpainted.includes(dv)) : DocumentView.Selected();
// Special handling for shift-drag resize (outpainting of Images by resizing without scaling content - fill in with firefly GAI)
@@ -524,7 +506,7 @@ export class DocumentDecorations extends ObservableReactComponent<DocumentDecora
resizeViewForOutpainting = (docView: DocumentView, refPt: number[], scale: { x: number; y: number }, opts: { dragHdl: string; shiftKey: boolean }) => {
const doc = docView.Document;
- if (doc.isGroup) {
+ if (Doc.IsFreeformGroup(doc)) {
DocListCast(doc.data)
.map(member => DocumentView.getDocumentView(member, docView)!)
.forEach(member => this.resizeViewForOutpainting(member, refPt, scale, opts));
@@ -598,14 +580,14 @@ export class DocumentDecorations extends ObservableReactComponent<DocumentDecora
//
// determines if anything being dragged directly or via a group has a fixed aspect ratio (in which case we resize uniformly)
//
- hasFixedAspect = (doc: Doc): boolean => (doc.isGroup ? DocListCast(doc.data).some(this.hasFixedAspect) : !BoolCast(doc._layout_nativeDimEditable));
+ hasFixedAspect = (doc: Doc): boolean => (Doc.IsFreeformGroup(doc) ? DocListCast(doc.data).some(this.hasFixedAspect) : !BoolCast(doc._layout_nativeDimEditable));
//
// resize a single DocumentView about the specified reference point, possibly setting/updating the native dimensions of the Doc
//
resizeView = (docView: DocumentView, refPt: number[], scale: { x: number; y: number }, opts: { dragHdl: string; freezeNativeDims: boolean }) => {
const doc = docView.Document;
- if (doc.isGroup) {
+ if (Doc.IsFreeformGroup(doc)) {
DocListCast(doc.data)
.map(member => DocumentView.getDocumentView(member, docView)!)
.forEach(member => this.resizeView(member, refPt, scale, opts));
@@ -623,8 +605,10 @@ export class DocumentDecorations extends ObservableReactComponent<DocumentDecora
if (nwidth && nheight && !cornerReflow && !horizontalReflow && !verticalReflow) {
scale.x === 1 ? (scale.x = scale.y) : (scale.y = scale.x);
}
+ if (NumCast(doc._height) * scale.y < NumCast(doc._height_min, 10)) scale.y = NumCast(doc._height_min, 10) / NumCast(doc._height);
+ if (NumCast(doc._width) * scale.x < NumCast(doc._width_min, 25)) scale.x = NumCast(doc._width_min, 25) / NumCast(doc._width);
- if ((horizontalReflow || cornerReflow) && Doc.NativeWidth(doc)) {
+ if ((horizontalReflow || cornerReflow) && Doc.NativeWidth(doc) && scale.x > 0) {
const setData = Doc.NativeWidth(doc[DocData]) === doc.nativeWidth;
doc._nativeWidth = scale.x * Doc.NativeWidth(doc);
if (setData) Doc.SetNativeWidth(doc[DocData], NumCast(doc.nativeWidth));
@@ -632,25 +616,23 @@ export class DocumentDecorations extends ObservableReactComponent<DocumentDecora
doc._nativeHeight = (initHeight / initWidth) * nwidth; // initializes the nativeHeight for a PDF
}
}
- if ((verticalReflow || cornerReflow) && Doc.NativeHeight(doc)) {
+ if ((verticalReflow || cornerReflow) && Doc.NativeHeight(doc) && scale.y > 0) {
const setData = Doc.NativeHeight(doc[DocData]) === doc.nativeHeight && !doc.layout_reflowVertical;
doc._nativeHeight = scale.y * Doc.NativeHeight(doc);
if (setData) Doc.SetNativeHeight(doc[DocData], NumCast(doc._nativeHeight));
}
- doc._width = Math.max(NumCast(doc._width_min, 25), NumCast(doc._width) * scale.x);
- doc._height = Math.max(NumCast(doc._height_min, 10), NumCast(doc._height) * scale.y);
+ doc._width = NumCast(doc._width) * scale.x;
+ doc._height = NumCast(doc._height) * scale.y;
const { deltaX, deltaY } = this.realignRefPt(doc, refCent, initWidth || 1, initHeight || 1);
doc.x = NumCast(doc.x) + deltaX;
doc.y = NumCast(doc.y) + deltaY;
doc._layout_modificationDate = new DateField();
- if (scale.y !== 1) {
- const docLayout = docView.layoutDoc;
- docLayout._layout_autoHeight = undefined;
- if (docView.layoutDoc._layout_autoHeight) {
- // if autoHeight is still on because of a prototype
- docLayout._layout_autoHeight = false; // then don't inherit, but explicitly set it to false
+ if (scale.y !== 1 && !opts.freezeNativeDims) {
+ doc._layout_autoHeight = undefined;
+ if (doc._layout_autoHeight) {
+ doc._layout_autoHeight = false; // set explicitly to false if inherited from parent of layout
}
}
}
@@ -695,7 +677,8 @@ export class DocumentDecorations extends ObservableReactComponent<DocumentDecora
if (lastView) {
const invXf = lastView.screenToViewTransform().inverse();
const seldoc = lastView.layoutDoc;
- const loccenter = Utils.rotPt(NumCast(seldoc._rotation_centerX) * NumCast(seldoc._width), NumCast(seldoc._rotation_centerY) * NumCast(seldoc._height), invXf.Rotate);
+ const rcent = this._showRotCenter ? [NumCast(seldoc._rotation_centerX), NumCast(seldoc._rotation_centerY)] : [0, 0];
+ const loccenter = Utils.rotPt(rcent[0] * NumCast(seldoc._width), rcent[1] * NumCast(seldoc._height), invXf.Rotate);
return invXf.transformPoint(loccenter.x + NumCast(seldoc._width) / 2, loccenter.y + NumCast(seldoc._height) / 2);
}
return this._rotCenter;
@@ -737,7 +720,7 @@ export class DocumentDecorations extends ObservableReactComponent<DocumentDecora
hideDecorations ||
seldocview._props.hideOpenButton ||
seldocview.Document.layout_hideOpenButton ||
- DocumentView.Selected().some(docView => docView.Document._dragOnlyWithinContainer || docView.Document.isGroup || docView.Document.layout_hideOpenButton) ||
+ DocumentView.Selected().some(docView => docView.Document._dragOnlyWithinContainer || docView.Document.layout_hideOpenButton) ||
this._isRounding ||
this._isRotating;
const hideDeleteButton =
@@ -765,7 +748,7 @@ export class DocumentDecorations extends ObservableReactComponent<DocumentDecora
const rotation = DocumentView.Selected().length === 1 ? seldocview.screenToContentsTransform().inverse().RotateDeg : 0;
// Radius constants
- const useRounding = seldocview.ComponentView instanceof ImageBox || seldocview.ComponentView instanceof FormattedTextBox || seldocview.ComponentView instanceof CollectionFreeFormView;
+ const useRounding = seldocview.ComponentView?.showBorderRounding?.();
const borderRadius = numberValue(Cast(seldocview.Document.layout_borderRounding, 'string', null));
const docMax = Math.min(NumCast(seldocview.Document._width) / 2, NumCast(seldocview.Document._height) / 2);
const maxDist = Math.min((this.Bounds.r - this.Bounds.x) / 2, (this.Bounds.b - this.Bounds.y) / 2);
@@ -926,13 +909,13 @@ export class DocumentDecorations extends ObservableReactComponent<DocumentDecora
transform: `rotate(${rotation}deg)`,
width: this.Bounds.r - this.Bounds.x + 'px',
height: this.Bounds.b - this.Bounds.y + 'px',
- left: this.Bounds.x,
- top: this.Bounds.y,
+ left: this.Bounds.r,
+ top: this.Bounds.b,
pointerEvents: 'none',
}}>
{this._isRotating ? null : (
<Tooltip enterDelay={750} title={<div className="dash-tooltip">tap to set rotate center, drag to rotate</div>}>
- <div className="documentDecorations-rotation" onPointerDown={this.onRotateDown} onContextMenu={e => e.preventDefault()}>
+ <div className="documentDecorations-rotation" onPointerDown={this.onRotateHdlDown} onContextMenu={e => e.preventDefault()}>
<IconButton icon={<FaUndo />} color={SettingsManager.userColor} />
</div>
</Tooltip>
@@ -941,7 +924,7 @@ export class DocumentDecorations extends ObservableReactComponent<DocumentDecora
{!this._showRotCenter ? null : (
<div
className="documentDecorations-rotationCenter"
- style={{ transform: `translate(${this.rotCenter[0] - 3}px, ${this.rotCenter[1] - 3}px)` }}
+ style={{ transform: `translate(${this.rotCenter[0]}px, ${this.rotCenter[1]}px)` }}
onPointerDown={this.onRotateCenterDown}
onContextMenu={e => e.preventDefault()}
/>
diff --git a/src/client/views/EditableView.scss b/src/client/views/EditableView.scss
index fa4542ac4..333939d03 100644
--- a/src/client/views/EditableView.scss
+++ b/src/client/views/EditableView.scss
@@ -6,14 +6,14 @@
overflow-y: auto;
height: 100%;
width: 100%;
- min-width: 20;
+ min-width: 20px;
text-overflow: ellipsis;
- -ms-overflow-style: none;
- scrollbar-width: none;
+ -ms-overflow-style: none;
+ scrollbar-width: none;
}
.editableView-container-editing::-webkit-scrollbar {
- display: none;
+ display: none;
}
.editableView-container-editing-oneLine {
@@ -44,4 +44,3 @@
border: none;
outline: none;
}
-
diff --git a/src/client/views/FieldsDropdown.tsx b/src/client/views/FieldsDropdown.tsx
index e7ab6a180..0bdf92bbc 100644
--- a/src/client/views/FieldsDropdown.tsx
+++ b/src/client/views/FieldsDropdown.tsx
@@ -6,7 +6,7 @@
* this list is then pruned down to only include fields that are not marked in Documents.ts to be non-filterable
*/
-import { computed, makeObservable, observable, runInAction } from 'mobx';
+import { action, computed, makeObservable, observable } from 'mobx';
import { observer } from 'mobx-react';
import * as React from 'react';
import Select from 'react-select';
@@ -24,6 +24,7 @@ interface fieldsDropdownProps {
placeholder?: string | (() => string);
showPlaceholder?: true; // if true, then input field always shows the placeholder value; otherwise, it shows the current selection
addedFields?: string[];
+ isInactive?: boolean;
}
@observer
@@ -57,8 +58,8 @@ export class FieldsDropdown extends ObservableReactComponent<fieldsDropdownProps
const filteredOptions = ['author', ...(this._newField ? [this._newField] : []), ...(this._props.addedFields ?? []), ...this.fieldsOfDocuments.filter(facet => facet[0] === facet.charAt(0).toUpperCase())];
Object.entries(DocOptions)
- .filter(opts => opts[1].filterable)
- .forEach((pair: [string, FInfo]) => filteredOptions.push(pair[0]));
+ .filter(opts => opts[1] instanceof FInfo && opts[1].filterable)
+ .forEach((pair: [string, unknown]) => filteredOptions.push(pair[0]));
const options = filteredOptions.sort().map(facet => ({ value: facet, label: facet }));
return (
@@ -77,11 +78,13 @@ export class FieldsDropdown extends ObservableReactComponent<fieldsDropdownProps
...baseStyles,
color: SnappingManager.userColor,
background: SnappingManager.userBackgroundColor,
+ display: this._props.isInactive ? 'none' : undefined,
}),
placeholder: (baseStyles /* , state */) => ({
...baseStyles,
color: SnappingManager.userColor,
background: SnappingManager.userBackgroundColor,
+ display: this._props.isInactive ? 'none' : undefined,
}),
input: (baseStyles /* , state */) => ({
...baseStyles,
@@ -104,14 +107,12 @@ export class FieldsDropdown extends ObservableReactComponent<fieldsDropdownProps
options={options}
isMulti={false}
onChange={val => this._props.selectFunc((val as { value: string; label: string }).value)}
- onKeyDown={e => {
+ onKeyDown={action(e => {
if (e.key === 'Enter') {
- runInAction(() => {
- this._props.selectFunc((this._newField = (e.nativeEvent.target as HTMLSelectElement)?.value));
- });
+ this._props.selectFunc((this._newField = (e.nativeEvent.target as HTMLSelectElement)?.value));
}
e.stopPropagation();
- }}
+ })}
onMenuClose={this._props.menuClose}
closeMenuOnSelect
value={this._props.showPlaceholder ? null : undefined}
diff --git a/src/client/views/FilterPanel.scss b/src/client/views/FilterPanel.scss
index 508b1ee1f..e32db000f 100644
--- a/src/client/views/FilterPanel.scss
+++ b/src/client/views/FilterPanel.scss
@@ -1,4 +1,3 @@
-
.filterBox-flyout {
display: block;
text-align: left;
@@ -29,7 +28,7 @@
// .filterBox-bottom {
// // position: fixed;
-// // bottom: 0;
+// // bottom: 0px;
// // width: 100%;
// }
@@ -88,7 +87,7 @@
// padding-bottom: 20px;
// border-bottom: 2px solid black;
// position: fixed;
-// top: 0;
+// top: 0px;
// width: 100%;
// }
@@ -154,8 +153,8 @@
flex-direction: column;
width: 100%;
position: relative;
- right: 0;
- top: 0;
+ right: 0px;
+ top: 0px;
z-index: 1;
// background-color: #9f9f9f;
@@ -240,60 +239,52 @@
transition: all 0.3s ease-out;
display: flex;
flex-direction: row;
- padding: 5px;
-
+ padding: 5px;
- &:hover{
+ &:hover {
border-color: #e9e9e9;
- background-color: #6d6c6c
+ background-color: #6d6c6c;
}
- .hotKey-icon, .hotKey-close{
+ .hotKey-icon,
+ .hotKey-close {
background-color: transparent;
border-radius: 10%;
padding: 5px;
-
- &:hover{
+ &:hover {
background-color: #616060;
}
}
- .hotKey-close{
+ .hotKey-close {
right: 30px;
- position: fixed;
+ position: fixed;
padding-top: 10px;
-
-}
+ }
- .hotkey-title{
+ .hotkey-title {
top: 6px;
position: relative;
cursor: text;
-
}
- .hotkey-title-input{
+ .hotkey-title-input {
background-color: transparent;
border: none;
border-color: transparent;
outline: none;
cursor: text;
-
}
}
.hotKeyButtons {
position: relative;
width: 100%;
-
}
.hotKey-icon-button {
-
- background-color: transparent;
-
-
+ background-color: transparent;
}
.icon-panel {
@@ -305,24 +296,19 @@
border-radius: 10%;
background-color: #323232;
- .icon-panel-button{
+ .icon-panel-button {
background-color: #323232;
border-radius: 10%;
-
- &:hover{
- background-color:#7a7878
+ &:hover {
+ background-color: #7a7878;
}
}
-
-
-
}
-
// .sliderBox-outerDiv {
// width: 30%;// width: calc(100% - 14px); // 14px accounts for handles that are at the max value of the slider that would extend outside the box
-// height: 40; // height: 100%;
+// height: 40px; // height: 100%;
// border-radius: inherit;
// display: flex;
// flex-direction: column;
diff --git a/src/client/views/GestureOverlay.scss b/src/client/views/GestureOverlay.scss
index bfe2d5c64..0fa3fd973 100644
--- a/src/client/views/GestureOverlay.scss
+++ b/src/client/views/GestureOverlay.scss
@@ -3,7 +3,7 @@
height: 100%;
position: absolute;
touch-action: none;
- top: 0;
+ top: 0px;
.pointerBubbles {
width: 100%;
diff --git a/src/client/views/InkStroke.scss b/src/client/views/InkStroke.scss
index c672824bf..0595283fc 100644
--- a/src/client/views/InkStroke.scss
+++ b/src/client/views/InkStroke.scss
@@ -8,8 +8,8 @@
svg:not(:root) {
overflow: visible !important;
position: absolute;
- left: 0;
- top: 0;
+ left: 0px;
+ top: 0px;
}
}
diff --git a/src/client/views/InkStrokeProperties.ts b/src/client/views/InkStrokeProperties.ts
index 41f38c008..9f2c1fc4e 100644
--- a/src/client/views/InkStrokeProperties.ts
+++ b/src/client/views/InkStrokeProperties.ts
@@ -209,17 +209,18 @@ export class InkStrokeProperties {
* @param scrpt The center point of the rotation in screen coordinates
*/
rotateInk = undoable((inkStrokes: DocumentView[], angle: number, scrpt: PointData) => {
- this.applyFunction(inkStrokes, (view: DocumentView, ink: InkData, xScale: number, yScale: number /* , inkStrokeWidth: number */) => {
- const inkCenterPt = view.ComponentView?.ptFromScreen?.(scrpt);
- return !inkCenterPt
- ? ink
- : ink.map(i => {
- const pt = { X: i.X - inkCenterPt.X, Y: i.Y - inkCenterPt.Y };
- const newX = Math.cos(angle) * pt.X - (Math.sin(angle) * pt.Y * yScale) / xScale;
- const newY = (Math.sin(angle) * pt.X * xScale) / yScale + Math.cos(angle) * pt.Y;
- return { X: newX + inkCenterPt.X, Y: newY + inkCenterPt.Y };
- });
- });
+ angle &&
+ this.applyFunction(inkStrokes, (view: DocumentView, ink: InkData, xScale: number, yScale: number /* , inkStrokeWidth: number */) => {
+ const inkCenterPt = view.ComponentView?.ptFromScreen?.(scrpt);
+ return !inkCenterPt
+ ? ink
+ : ink.map(i => {
+ const pt = { X: i.X - inkCenterPt.X, Y: i.Y - inkCenterPt.Y };
+ const newX = Math.cos(angle) * pt.X - (Math.sin(angle) * pt.Y * yScale) / xScale;
+ const newY = (Math.sin(angle) * pt.X * xScale) / yScale + Math.cos(angle) * pt.Y;
+ return { X: newX + inkCenterPt.X, Y: newY + inkCenterPt.Y };
+ });
+ });
}, 'rotate ink');
/**
diff --git a/src/client/views/InkTangentHandles.tsx b/src/client/views/InkTangentHandles.tsx
index 577acc4d1..0af46df5d 100644
--- a/src/client/views/InkTangentHandles.tsx
+++ b/src/client/views/InkTangentHandles.tsx
@@ -105,7 +105,6 @@ export class InkTangentHandles extends React.Component<InkHandlesProps> {
return (
<>
{tangentHandles.map((pts, i) => (
- // eslint-disable-next-line react/no-array-index-key
<svg height="10" width="10" key={`hdl${i}`}>
<circle
cx={pts.X}
@@ -135,7 +134,6 @@ export class InkTangentHandles extends React.Component<InkHandlesProps> {
/>
);
return (
- // eslint-disable-next-line react/no-array-index-key
<svg height="100" width="100" key={`line${i}`}>
{tangentLine(pts.X1, pts.Y1, pts.X2, pts.Y2)}
{tangentLine(pts.X2, pts.Y2, pts.X3, pts.Y3)}
diff --git a/src/client/views/InkTranscription.tsx b/src/client/views/InkTranscription.tsx
index 2e6b477e9..6220033d4 100644
--- a/src/client/views/InkTranscription.tsx
+++ b/src/client/views/InkTranscription.tsx
@@ -4,8 +4,8 @@ import * as React from 'react';
import { imageUrlToBase64 } from '../../ClientUtils';
import { aggregateBounds } from '../../Utils';
import { Doc, DocListCast } from '../../fields/Doc';
-import { InkData, InkField, InkInkTool, InkTool } from '../../fields/InkField';
-import { Cast, DateCast, ImageCast, NumCast } from '../../fields/Types';
+import { InkData, InkInkTool, InkTool } from '../../fields/InkField';
+import { Cast, DateCast, ImageCast, InkCast, NumCast } from '../../fields/Types';
import { ImageField, URLField } from '../../fields/URLField';
import { gptHandwriting } from '../apis/gpt/GPT';
import { DocumentType } from '../documents/DocumentTypes';
@@ -30,7 +30,7 @@ export class InkTranscription extends React.Component {
// eslint-disable-next-line @typescript-eslint/no-explicit-any
@observable _textRef: any = undefined;
// eslint-disable-next-line @typescript-eslint/no-explicit-any
- @observable iinkEditor: any = undefined;
+ @observable _iinkEditor: any = undefined;
// eslint-disable-next-line @typescript-eslint/no-explicit-any
private lastJiix: any;
private currGroup?: Doc;
@@ -94,7 +94,7 @@ export class InkTranscription extends React.Component {
},
},
};
- this.iinkEditor = await iink.Editor.load(r, 'INKV2', options);
+ this._iinkEditor = await iink.Editor.load(r, 'INKV2', options);
this._textRegister = r;
// eslint-disable-next-line @typescript-eslint/no-explicit-any
r?.addEventListener('exported', (e: any) => this.exportInk(e, this._textRef));
@@ -118,19 +118,20 @@ export class InkTranscription extends React.Component {
const times: number[] = [];
validInks
- .filter(i => Cast(i[Doc.LayoutDataKey(i)], InkField))
+ .filter(i => InkCast(i[Doc.LayoutDataKey(i)]))
.forEach(i => {
- const d = Cast(i[Doc.LayoutDataKey(i)], InkField, null);
+ const d = InkCast(i[Doc.LayoutDataKey(i)])!;
+ const authorTime = DateCast(i.author_date)?.getDate().getTime() ?? 0;
const inkStroke = DocumentView.getDocumentView(i)?.ComponentView as InkingStroke;
strokes.push(d.inkData.map(pd => inkStroke.ptToScreen({ X: pd.X, Y: pd.Y })));
- times.push(DateCast(i.author_date).getDate().getTime());
+ times.push(authorTime);
});
this.currGroup = groupDoc;
const pointerData = strokes.map((stroke, i) => this.inkJSON(stroke, times[i]));
if (math) {
- this.iinkEditor.importPointEvents(pointerData);
+ this._iinkEditor.importPointEvents(pointerData);
} else {
- this.iinkEditor.importPointEvents(pointerData);
+ this._iinkEditor.importPointEvents(pointerData);
}
};
convertPointsToString(points: InkData[]): string {
@@ -234,7 +235,7 @@ export class InkTranscription extends React.Component {
const docList = DocListCast(this.currGroup.data);
docList.forEach((inkDoc: Doc) => {
// just having the times match up and be a unique value (actual timestamp doesn't matter)
- const ms = DateCast(inkDoc.author_date).getDate().getTime() + 14400000;
+ const ms = (DateCast(inkDoc.author_date)?.getDate().getTime() ?? 0) + 14400000;
const word = timestampWord.get(ms);
if (!word) {
return;
diff --git a/src/client/views/LightboxView.scss b/src/client/views/LightboxView.scss
index 3e65843df..7a481d887 100644
--- a/src/client/views/LightboxView.scss
+++ b/src/client/views/LightboxView.scss
@@ -1,12 +1,12 @@
.lightboxView-navBtn {
margin: auto;
position: absolute;
- right: 19;
- top: 10;
+ right: 19px;
+ top: 10px;
background: transparent;
- border-radius: 8;
+ border-radius: 8px;
opacity: 0.7;
- width: 25;
+ width: 25px;
flex-direction: column;
display: flex;
&:hover {
@@ -16,12 +16,12 @@
.lightboxView-tabBtn {
margin: auto;
position: absolute;
- right: 54;
- top: 10;
+ right: 54px;
+ top: 10px;
background: transparent;
- border-radius: 8;
+ border-radius: 8px;
opacity: 0.7;
- width: 25;
+ width: 25px;
flex-direction: column;
display: flex;
&:hover {
@@ -31,12 +31,12 @@
.lightboxView-paletteBtn {
margin: auto;
position: absolute;
- right: 89;
- top: 10;
+ right: 89px;
+ top: 10px;
background: transparent;
- border-radius: 8;
+ border-radius: 8px;
opacity: 0.7;
- width: 25;
+ width: 25px;
flex-direction: column;
display: flex;
&:hover {
@@ -47,12 +47,12 @@
.lightboxView-penBtn {
margin: auto;
position: absolute;
- right: 124;
- top: 10;
+ right: 124px;
+ top: 10px;
background: transparent;
- border-radius: 8;
+ border-radius: 8px;
opacity: 0.7;
- width: 25;
+ width: 25px;
flex-direction: column;
display: flex;
&:hover {
@@ -62,12 +62,12 @@
.lightboxView-exploreBtn {
margin: auto;
position: absolute;
- right: 159;
- top: 10;
+ right: 159px;
+ top: 10px;
background: transparent;
- border-radius: 8;
+ border-radius: 8px;
opacity: 0.7;
- width: 25;
+ width: 25px;
flex-direction: column;
display: flex;
&:hover {
@@ -76,8 +76,8 @@
}
.lightboxView-frame {
position: absolute;
- top: 0;
- left: 0;
+ top: 0px;
+ left: 0px;
width: 100%;
height: 100%;
z-index: 1000;
@@ -91,9 +91,9 @@
margin: auto;
position: relative;
background: transparent;
- border-radius: 8;
+ border-radius: 8px;
opacity: 0.7;
- width: 35;
+ width: 35px;
&:hover {
opacity: 1;
}
diff --git a/src/client/views/Main.scss b/src/client/views/Main.scss
index bea1de435..df4160fc1 100644
--- a/src/client/views/Main.scss
+++ b/src/client/views/Main.scss
@@ -12,10 +12,10 @@ body {
overflow: hidden;
font-family: global.$sans-serif;
font-size: global.$body-text;
- margin: 0;
+ margin: 0px;
position: absolute;
- top: 0;
- left: 0;
+ top: 0px;
+ left: 0px;
}
// div {
diff --git a/src/client/views/Main.tsx b/src/client/views/Main.tsx
index b884eb8c8..33e930abf 100644
--- a/src/client/views/Main.tsx
+++ b/src/client/views/Main.tsx
@@ -31,6 +31,8 @@ import './global/globalScripts';
import { AudioBox } from './nodes/AudioBox';
import { ComparisonBox } from './nodes/ComparisonBox';
import { DataVizBox } from './nodes/DataVizBox/DataVizBox';
+import { TemplateField } from './nodes/DataVizBox/DocCreatorMenu/TemplateFieldTypes/TemplateField';
+import { TemplateFieldUtils } from './nodes/DataVizBox/DocCreatorMenu/TemplateFieldTypes/TemplateFieldUtils';
import { DiagramBox } from './nodes/DiagramBox';
import { DocumentContentsView, HTMLtag } from './nodes/DocumentContentsView';
import { EquationBox } from './nodes/EquationBox';
@@ -48,6 +50,7 @@ import { PDFBox } from './nodes/PDFBox';
import { RecordingBox } from './nodes/RecordingBox';
import { ScreenshotBox } from './nodes/ScreenshotBox';
import { ScriptingBox } from './nodes/ScriptingBox';
+import { TaskBox } from './nodes/TaskBox';
import { VideoBox } from './nodes/VideoBox';
import { WebBox } from './nodes/WebBox';
import { CalendarBox } from './nodes/calendarBox/CalendarBox';
@@ -61,11 +64,11 @@ import { FootnoteView } from './nodes/formattedText/FootnoteView';
import { FormattedTextBox } from './nodes/formattedText/FormattedTextBox';
import { SummaryView } from './nodes/formattedText/SummaryView';
import { ImportElementBox } from './nodes/importBox/ImportElementBox';
+import { ScrapbookBox } from './nodes/scrapbook/ScrapbookBox';
import { PresBox, PresSlideBox } from './nodes/trails';
import { FaceRecognitionHandler } from './search/FaceRecognitionHandler';
import { SearchBox } from './search/SearchBox';
import { StickerPalette } from './smartdraw/StickerPalette';
-import { ScrapbookBox } from './nodes/scrapbook/ScrapbookBox';
dotenv.config();
@@ -101,6 +104,7 @@ FieldLoader.ServerLoadStatus = { requested: 0, retrieved: 0, message: 'cache' };
new PingManager();
new KeyManager();
new FaceRecognitionHandler();
+ TemplateField.CreateField = TemplateFieldUtils.CreateField; // set the init function for fields
// initialize plugins and classes that require plugins
CollectionDockingView.Init(TabDocView);
@@ -120,6 +124,7 @@ FieldLoader.ServerLoadStatus = { requested: 0, retrieved: 0, message: 'cache' };
StickerPalette: StickerPalette,
FormattedTextBox,
DailyJournal, // AARAV
+ TaskBox, // AARAV
ImageBox,
FontIconBox,
LabelBox,
diff --git a/src/client/views/MainView.scss b/src/client/views/MainView.scss
index db949285b..d5e6b8998 100644
--- a/src/client/views/MainView.scss
+++ b/src/client/views/MainView.scss
@@ -10,7 +10,7 @@ body {
.dash-tooltip {
font-size: 11px;
padding: 2px;
- max-width: 150;
+ max-width: 150px;
line-height: 150%;
}
@@ -49,8 +49,8 @@ body {
.mainView-snapLines {
position: absolute;
- top: 0;
- left: 0;
+ top: 0px;
+ left: 0px;
width: 100%;
height: 100%;
pointer-events: none;
@@ -61,8 +61,8 @@ body {
height: 100%;
position: absolute;
pointer-events: all;
- top: 0;
- left: 0;
+ top: 0px;
+ left: 0px;
z-index: 1;
touch-action: none;
}
@@ -86,8 +86,8 @@ body {
.properties-container {
height: 100%;
position: absolute;
- right: 0;
- top: 0;
+ right: 0px;
+ top: 0px;
}
.mainView-propertiesDragger-minified,
@@ -98,7 +98,7 @@ body {
width: 17px;
position: absolute;
top: 50%;
- border-radius: 0;
+ border-radius: 0px;
border-top-left-radius: 10px;
border-bottom-left-radius: 10px;
border-right: unset;
@@ -141,7 +141,7 @@ body {
}
.propertiesView {
- left: 0;
+ left: 0px;
position: absolute;
z-index: 2;
// background-color: linen; //$light-gray;
@@ -165,7 +165,7 @@ body {
}
::-webkit-scrollbar {
- width: 0;
+ width: 0px;
}
}
@@ -173,19 +173,19 @@ body {
width: 100%;
height: 100%;
position: absolute;
- top: 0;
- left: 0;
+ top: 0px;
+ left: 0px;
overflow: hidden;
}
.buttonContainer {
position: absolute;
- bottom: 0;
+ bottom: 0px;
.mainView-settings {
// position: absolute;
- // left: 0;
- // bottom: 0;
+ // left: 0px;
+ // bottom: 0px;
border-radius: 25%;
margin-left: -5px;
background: darkblue;
@@ -198,8 +198,8 @@ body {
.mainView-logout {
position: absolute;
- right: 0;
- bottom: 0;
+ right: 0px;
+ bottom: 0px;
font-size: 8px;
}
@@ -223,12 +223,12 @@ body {
}
.mainView-libraryFlyout-close {
- right: 6;
- top: 5;
+ right: 6px;
+ top: 5px;
position: absolute;
margin-right: 6px;
z-index: 10;
- margin-bottom: 10;
+ margin-bottom: 10px;
}
}
diff --git a/src/client/views/MainView.tsx b/src/client/views/MainView.tsx
index c49b7e6de..13b14617c 100644
--- a/src/client/views/MainView.tsx
+++ b/src/client/views/MainView.tsx
@@ -730,7 +730,8 @@ export class MainView extends ObservableReactComponent<object> {
style={{
width: `calc(100% - ${this._leftMenuFlyoutWidth + this.leftMenuWidth() + this.propertiesWidth()}px)`,
minWidth: `calc(100% - ${this._leftMenuFlyoutWidth + this.leftMenuWidth() + this.propertiesWidth()}px)`,
- transform: DocumentView.LightboxDoc() ? 'scale(0.0001)' : undefined,
+ opacity: DocumentView.LightboxDoc() ? 0 : undefined,
+ pointerEvents: DocumentView.LightboxDoc() ? 'none' : undefined,
}}>
{!this.mainContainer ? null : this.mainDocView}
</div>
@@ -1038,7 +1039,7 @@ export class MainView extends ObservableReactComponent<object> {
@computed get inkResources() {
return (
- <svg width={0} height={0}>
+ <svg width={0} height={0} style={{ display: 'block' }}>
<defs>
<filter id="inkSelectionHalo">
<feColorMatrix
diff --git a/src/client/views/MainViewModal.tsx b/src/client/views/MainViewModal.tsx
index b05292c47..d7640dc72 100644
--- a/src/client/views/MainViewModal.tsx
+++ b/src/client/views/MainViewModal.tsx
@@ -41,7 +41,7 @@ export class MainViewModal extends React.Component<MainViewOverlayProps> {
className="overlay"
onClick={this.props?.closeOnExternalClick}
style={{
- backgroundColor: isDark(SnappingManager.userColor) ? '#DFDFDF30' : '#32323230',
+ backgroundColor: isDark(SnappingManager.userColor ?? '') ? '#DFDFDF30' : '#32323230',
...(p.overlayStyle || {}),
}}
/>
diff --git a/src/client/views/MarqueeAnnotator.tsx b/src/client/views/MarqueeAnnotator.tsx
index b2e42652d..d354dd2c0 100644
--- a/src/client/views/MarqueeAnnotator.tsx
+++ b/src/client/views/MarqueeAnnotator.tsx
@@ -194,14 +194,13 @@ export class MarqueeAnnotator extends ObservableReactComponent<MarqueeAnnotatorP
AnchorMenu.Instance.StartDrag = action((e: PointerEvent, ele: HTMLElement) => {
e.preventDefault();
e.stopPropagation();
- const sourceAnchorCreator = () => this.highlight(this.props.highlightDragSrcColor ?? 'rgba(173, 216, 230, 0.75)', true, undefined, true); // hyperlink color
-
const targetCreator = (annotationOn: Doc | undefined) => {
const target = DocUtils.GetNewTextDoc('Note linked to ' + this.props.Document.title, 0, 0, 100, 100, annotationOn, 'yellow');
target.layout_fitWidth = true;
DocumentView.SetSelectOnLoad(target);
return target;
};
+ const sourceAnchorCreator = () => this.highlight(this.props.highlightDragSrcColor ?? 'rgba(173, 216, 230, 0.75)', true, undefined, true); // hyperlink color
DragManager.StartAnchorAnnoDrag([ele], new DragManager.AnchorAnnoDragData(this.props.docView(), sourceAnchorCreator, targetCreator), e.pageX, e.pageY, {
dragComplete: dragEv => {
if (!dragEv.aborted && dragEv.annoDragData && dragEv.annoDragData.linkSourceDoc && dragEv.annoDragData.dropDocument && dragEv.linkDocument) {
diff --git a/src/client/views/MetadataEntryMenu.scss b/src/client/views/MetadataEntryMenu.scss
index 28de0b7a5..924476a30 100644
--- a/src/client/views/MetadataEntryMenu.scss
+++ b/src/client/views/MetadataEntryMenu.scss
@@ -3,7 +3,7 @@
width: 310px;
flex-direction: column;
- input[type=checkbox] {
+ input[type='checkbox'] {
margin-left: 5px;
}
}
@@ -11,7 +11,7 @@
.metadataEntry-autoSuggester {
width: 80%;
height: 100%;
- margin: 0;
+ margin: 0px;
display: inline-block;
}
@@ -20,13 +20,13 @@
}
.metadataEntry-keys {
- max-height: 80;
- overflow-y: auto;
+ max-height: 80px;
+ overflow-y: auto;
display: flex;
flex-direction: column;
}
.metadataEntry-inputArea {
- display:inline-block;
+ display: inline-block;
flex-direction: row;
}
@@ -53,8 +53,8 @@
}
.react-autosuggest__input--open {
- border-bottom-left-radius: 0;
- border-bottom-right-radius: 0;
+ border-bottom-left-radius: 0px;
+ border-bottom-right-radius: 0px;
}
.react-autosuggest__suggestions-container {
@@ -78,8 +78,8 @@
}
.react-autosuggest__suggestions-list {
- margin: 0;
- padding: 0;
+ margin: 0px;
+ padding: 0px;
list-style-type: none;
}
@@ -90,4 +90,4 @@
.react-autosuggest__suggestion--highlighted {
background-color: #ddd;
-} \ No newline at end of file
+}
diff --git a/src/client/views/OverlayView.scss b/src/client/views/OverlayView.scss
index 2e8621b5b..44203e38f 100644
--- a/src/client/views/OverlayView.scss
+++ b/src/client/views/OverlayView.scss
@@ -1,7 +1,7 @@
.overlayView {
position: absolute;
pointer-events: none;
- top: 0;
+ top: 0px;
width: 100vw;
height: 100vh;
z-index: 2002; // shouold be greater than LightboxView's z-index so that link lines and the presentation mini player appear
@@ -14,8 +14,8 @@
overflow: hidden;
display: flex;
flex-direction: column;
- top: 0;
- left: 0;
+ top: 0px;
+ left: 0px;
pointer-events: all;
box-shadow: black 5px 5px 5px;
}
@@ -46,7 +46,7 @@
float: right;
height: 20px;
width: 20px;
- padding: 0;
+ padding: 0px;
background-color: inherit;
}
@@ -62,6 +62,6 @@
.overlayView-doc {
z-index: 9002; //so that it appears above chroma
position: absolute;
- top: 0;
- left: 0;
+ top: 0px;
+ left: 0px;
}
diff --git a/src/client/views/PreviewCursor.scss b/src/client/views/PreviewCursor.scss
index 82488c750..eef120c58 100644
--- a/src/client/views/PreviewCursor.scss
+++ b/src/client/views/PreviewCursor.scss
@@ -2,8 +2,8 @@
color: black;
position: absolute;
transform-origin: left top;
- top: 0;
- left: 0;
+ top: 0px;
+ left: 0px;
pointer-events: none;
opacity: 1;
z-index: 1001;
diff --git a/src/client/views/PropertiesButtons.tsx b/src/client/views/PropertiesButtons.tsx
index ded342df0..2c84d7fe7 100644
--- a/src/client/views/PropertiesButtons.tsx
+++ b/src/client/views/PropertiesButtons.tsx
@@ -238,8 +238,8 @@ export class PropertiesButtons extends React.Component {
// on => `Display collection as a Group`,
// on => 'object-group',
// (dv, doc) => {
- // doc.isGroup = !doc.isGroup;
- // doc.forceActive = doc.isGroup;
+ // docfreeform_isGroup = !docfreeform_isGroup;
+ // doc.forceActive = docfreeform_isGroup;
// }
// );
// }
diff --git a/src/client/views/PropertiesSection.tsx b/src/client/views/PropertiesSection.tsx
index 12a46c7a4..9ea9c3a3d 100644
--- a/src/client/views/PropertiesSection.tsx
+++ b/src/client/views/PropertiesSection.tsx
@@ -1,4 +1,3 @@
-/* eslint-disable react/require-default-props */
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
import { action, computed } from 'mobx';
import { observer } from 'mobx-react';
diff --git a/src/client/views/PropertiesView.scss b/src/client/views/PropertiesView.scss
index 280de4893..de3012948 100644
--- a/src/client/views/PropertiesView.scss
+++ b/src/client/views/PropertiesView.scss
@@ -5,7 +5,7 @@
}
.propertiesView-presentationTrails-title-icon {
position: absolute;
- right: 4;
+ right: 4px;
}
.propertiesView-palette {
cursor: pointer;
@@ -24,7 +24,7 @@
}
.propertiesView {
height: 100%;
- width: 250;
+ width: 250px;
font-family: 'Roboto';
font-size: 12px;
cursor: auto;
@@ -61,7 +61,7 @@
}
.propertiesView-info {
- margin-top: -5;
+ margin-top: -5px;
float: right;
font-size: 20;
path {
@@ -78,10 +78,10 @@
display: flex;
button {
- width: 15;
- height: 15;
- padding: 0;
- margin-top: -5;
+ width: 15px;
+ height: 15px;
+ padding: 0px;
+ margin-top: -5px;
}
}
@@ -89,8 +89,8 @@
display: flex;
button {
- width: 5;
- height: 5;
+ width: 5px;
+ height: 5px;
}
input {
@@ -171,16 +171,16 @@
display: flex;
button {
- width: 15;
- height: 15;
- padding: 0;
- margin-top: -5;
+ width: 15px;
+ height: 15px;
+ padding: 0px;
+ margin-top: -5px;
}
}
button {
- width: 5;
- height: 5;
+ width: 5px;
+ height: 5px;
}
input {
@@ -301,8 +301,8 @@
padding: 7px;
border-radius: 7px;
margin-right: 32px;
- width: 32;
- height: 32;
+ width: 32px;
+ height: 32px;
padding-top: 9px;
margin-left: 18px;
@@ -318,8 +318,8 @@
padding: 7px;
border-radius: 7px;
margin-right: 32px;
- width: 32;
- height: 32;
+ width: 32px;
+ height: 32px;
padding-top: 9px;
padding-left: 10px;
@@ -334,8 +334,8 @@
background-color: #333333;
padding: 7px;
border-radius: 7px;
- width: 32;
- height: 32;
+ width: 32px;
+ height: 32px;
padding-top: 9px;
padding-left: 10px;
@@ -410,7 +410,7 @@
.color-palette {
width: 160px;
- height: 360;
+ height: 360px;
}
.strokeAndFill {
@@ -465,7 +465,7 @@
.propertiesView-selectedList {
min-width: max-content;
width: 100%;
- max-height: 180;
+ max-height: 180px;
overflow: hidden;
overflow-y: scroll;
border-left: solid 1px darkgrey;
@@ -475,7 +475,7 @@
.selectedList-items {
font-size: 12;
font-weight: 300;
- margin-top: 1;
+ margin-top: 1px;
}
}
}
@@ -500,7 +500,7 @@
.width-range {
margin-right: 1px;
- margin-bottom: 6;
+ margin-bottom: 6px;
}
}
diff --git a/src/client/views/PropertiesView.tsx b/src/client/views/PropertiesView.tsx
index acf6f928a..06463b2a2 100644
--- a/src/client/views/PropertiesView.tsx
+++ b/src/client/views/PropertiesView.tsx
@@ -81,7 +81,7 @@ export class PropertiesView extends ObservableReactComponent<PropertiesViewProps
}
@computed get selectedDoc() {
- return DocumentView.SelectedSchemaDoc() || this.selectedDocumentView?.Document || Doc.ActiveDashboard;
+ return DocumentView.SelectedSchemaDoc() ?? this.selectedDocumentView?.Document ?? Doc.ActiveDashboard;
}
@computed get selectedLink() {
@@ -89,7 +89,7 @@ export class PropertiesView extends ObservableReactComponent<PropertiesViewProps
}
@computed get selectedLayoutDoc() {
- return DocumentView.SelectedSchemaDoc() || this.selectedDocumentView?.layoutDoc || Doc.ActiveDashboard;
+ return DocumentView.SelectedSchemaDoc() ?? this.selectedDocumentView?.layoutDoc ?? Doc.ActiveDashboard;
}
@computed get selectedDocumentView() {
return DocumentView.Selected().lastElement();
@@ -149,7 +149,7 @@ export class PropertiesView extends ObservableReactComponent<PropertiesViewProps
return this.selectedDoc?.type === DocumentType.INK;
}
@computed get isGroup() {
- return this.selectedDoc?.isGroup;
+ return Doc.IsFreeformGroup(this.selectedDoc);
}
@computed get isStack() {
return [
diff --git a/src/client/views/SidebarAnnos.scss b/src/client/views/SidebarAnnos.scss
index abfd04f11..c2b9dcce5 100644
--- a/src/client/views/SidebarAnnos.scss
+++ b/src/client/views/SidebarAnnos.scss
@@ -2,7 +2,7 @@
position: absolute;
width: 100%;
height: 100%;
- right: 0;
+ right: 0px;
.sidebarAnnos-stacking {
width: 100%;
position: relative;
@@ -20,12 +20,12 @@
.sidebarAnnos-filterUser-active {
font-weight: bold;
font-size: 10px;
- padding-left: 5;
- padding-right: 5;
+ padding-left: 5px;
+ padding-right: 5px;
box-shadow: black 1px 1px 3px;
- border-radius: 5;
- margin: 2;
- height: 15;
+ border-radius: 5px;
+ margin: 2px;
+ height: 15px;
background-color: lightgrey;
}
.sidebarAnnos-filterUser,
diff --git a/src/client/views/SidebarAnnos.tsx b/src/client/views/SidebarAnnos.tsx
index 573c28ccf..71b479a22 100644
--- a/src/client/views/SidebarAnnos.tsx
+++ b/src/client/views/SidebarAnnos.tsx
@@ -3,7 +3,7 @@ import { observer } from 'mobx-react';
import * as React from 'react';
import { ClientUtils, returnFalse, returnOne, returnZero } from '../../ClientUtils';
import { emptyFunction } from '../../Utils';
-import { Doc, DocListCast, Field, FieldResult, FieldType, StrListCast } from '../../fields/Doc';
+import { Doc, DocListCast, Field, FieldResult, FieldType, Opt, StrListCast } from '../../fields/Doc';
import { Id } from '../../fields/FieldSymbols';
import { List } from '../../fields/List';
import { RichTextField } from '../../fields/RichTextField';
@@ -19,6 +19,7 @@ import { StyleProp } from './StyleProp';
import { CollectionStackingView } from './collections/CollectionStackingView';
import { DocumentView } from './nodes/DocumentView';
import { FieldViewProps } from './nodes/FieldView';
+import { FocusViewOptions } from './nodes/FocusViewOptions';
interface ExtraProps {
fieldKey: string;
@@ -149,15 +150,33 @@ export class SidebarAnnos extends ObservableReactComponent<FieldViewProps & Extr
};
makeDocUnfiltered = (doc: Doc) => {
if (DocListCast(this._props.Doc[this.sidebarKey]).find(anno => Doc.AreProtosEqual(doc.layout_unrendered ? DocCast(doc.annotationOn) : doc, anno))) {
- if (this.childFilters()) {
+ if (this.childFilters().length) {
// if any child filters exist, get rid of them
this._props.layoutDoc._childFilters = new List<string>();
+ return true;
}
- return true;
}
return false;
};
+ public static getView(sidebar: SidebarAnnos | null, sidebarShown: boolean, toggleSidebar: () => void, doc: Doc, options: FocusViewOptions) {
+ if (!sidebarShown) {
+ options.didMove = true;
+ toggleSidebar();
+ }
+ options.didMove = sidebar?.makeDocUnfiltered(doc) || options.didMove;
+
+ if (!doc.hidden) {
+ if (!options.didMove && options.toggleTarget) {
+ options.toggleTarget = false;
+ options.didMove = doc.hidden = true;
+ }
+ } else {
+ options.didMove = !(doc.hidden = false);
+ }
+ return new Promise<Opt<DocumentView>>(res => DocumentView.addViewRenderedCb(doc, res));
+ }
+
get sidebarKey() {
return this._props.fieldKey + '_sidebar';
}
@@ -181,8 +200,8 @@ export class SidebarAnnos extends ObservableReactComponent<FieldViewProps & Extr
layout_showTitle = () => 'title';
setHeightCallback = (height: number) => this._props.setHeight?.(height + this.filtersHeight());
sortByLinkAnchorY = (a: Doc, b: Doc) => {
- const ay = Doc.Links(a).length && DocCast(Doc.Links(a)[0].link_anchor_1).y;
- const by = Doc.Links(b).length && DocCast(Doc.Links(b)[0].link_anchor_1).y;
+ const ay = Doc.Links(a).length && DocCast(Doc.Links(a)[0].link_anchor_1)?.y;
+ const by = Doc.Links(b).length && DocCast(Doc.Links(b)[0].link_anchor_1)?.y;
return NumCast(ay) - NumCast(by);
};
render() {
diff --git a/src/client/views/StyleProvider.scss b/src/client/views/StyleProvider.scss
index 99796f1fb..cbb1fd5d5 100644
--- a/src/client/views/StyleProvider.scss
+++ b/src/client/views/StyleProvider.scss
@@ -4,11 +4,11 @@
.styleProvider-lock {
z-index: 2; // has to be above title which is z-index 1
font-size: 10;
- width: 20;
- height: 20;
+ width: 20px;
+ height: 20px;
position: absolute;
- right: -20;
- top: 0;
+ right: -20px;
+ top: 0px;
background: black;
pointer-events: all;
opacity: 0.3;
@@ -20,10 +20,10 @@
cursor: default;
}
.styleProvider-filter {
- right: 20;
+ right: 20px;
.styleProvider-filterShift {
- left: 0;
- top: 0;
+ left: 0px;
+ top: 0px;
position: absolute;
}
.dropdown-container {
@@ -33,10 +33,10 @@
}
.styleProvider-paint-selected,
.styleProvider-paint {
- top: 15;
+ top: 15px;
}
.styleProvider-paint-selected {
- right: -40;
+ right: -40px;
}
.styleProvider-lock:hover,
.styleProvider-filter:hover {
@@ -45,8 +45,8 @@
.styleProvider-treeView-icon,
.styleProvider-treeView-icon-active {
- margin-left: 0;
- margin-right: 0;
+ margin-left: 0px;
+ margin-right: 0px;
}
.styleProvider-treeView-icon {
diff --git a/src/client/views/StyleProvider.tsx b/src/client/views/StyleProvider.tsx
index 9110e198f..b52f17102 100644
--- a/src/client/views/StyleProvider.tsx
+++ b/src/client/views/StyleProvider.tsx
@@ -154,7 +154,7 @@ export function DefaultStyleProvider(doc: Opt<Doc>, props: Opt<FieldViewProps &
const highlightStyle = ['solid', 'dashed', 'solid', 'solid', 'solid'][highlightIndex];
if (highlightIndex) {
return {
- highlightStyle: doc.isGroup ? "dotted": highlightStyle,
+ highlightStyle: Doc.IsFreeformGroup(doc) ? "dotted": highlightStyle,
highlightColor,
highlightIndex,
highlightStroke: BoolCast(layoutDoc?.layout_isSvg),
@@ -284,7 +284,7 @@ export function DefaultStyleProvider(doc: Opt<Doc>, props: Opt<FieldViewProps &
? SnappingManager.userBackgroundColor
: doc?.annotationOn
? '#00000010' // faint interior for collections on PDFs, images, etc
- : doc?.isGroup
+ : doc && Doc.IsFreeformGroup(doc)
? undefined
: doc?._type_collection === CollectionViewType.Stacking ?
(Colors.DARK_GRAY)
@@ -308,7 +308,7 @@ export function DefaultStyleProvider(doc: Opt<Doc>, props: Opt<FieldViewProps &
doc?.layout_boxShadow,
doc?._type_collection === CollectionViewType.Pile
? '4px 4px 10px 2px'
- : lockedPosition() || doc?.isGroup || LayoutTemplateString
+ : lockedPosition() || (doc && Doc.IsFreeformGroup(doc)) || LayoutTemplateString
? undefined // groups have no drop shadow -- they're supposed to be "invisible". LayoutString's imply collection is being rendered as something else (e.g., title of a Slide)
: `${Colors.DARK_GRAY} ${StrCast(doc.layout_boxShadow, '0.2vw 0.2vw 0.8vw')}`
);
@@ -338,7 +338,7 @@ export function DefaultStyleProvider(doc: Opt<Doc>, props: Opt<FieldViewProps &
if (SnappingManager.ExploreMode || doc?.layout_unrendered) return isInk() ? 'visiblePainted' : 'all';
if (pointerEvents?.() === 'none') return 'none';
if (opacity() === 0) return 'none';
- if (isGroupActive?.() ) return isInk() ? 'visiblePainted': (doc?.isGroup ) ? undefined: 'all';
+ if (isGroupActive?.()) return isInk() ? 'visiblePainted': doc && Doc.IsFreeformGroup(doc) ? undefined: 'all';
if (isDocumentActive?.()) return isInk() ? 'visiblePainted' : 'all';
return undefined; // fixes problem with tree view elements getting pointer events when the tree view is not active
case StyleProp.Decorations: {
diff --git a/src/client/views/StyleProviderQuiz.scss b/src/client/views/StyleProviderQuiz.scss
index 84b3f1fef..53ca34c1b 100644
--- a/src/client/views/StyleProviderQuiz.scss
+++ b/src/client/views/StyleProviderQuiz.scss
@@ -13,8 +13,8 @@
.check-icon {
position: absolute;
- right: 40;
- bottom: 10;
+ right: 40px;
+ bottom: 10px;
color: green;
display: inline-block;
font-size: 20px;
@@ -23,8 +23,8 @@
.redo-icon {
position: absolute;
- right: 10;
- bottom: 10;
+ right: 10px;
+ bottom: 10px;
color: black;
display: inline-block;
font-size: 20px;
diff --git a/src/client/views/ViewBoxInterface.ts b/src/client/views/ViewBoxInterface.ts
index d8dab8e89..514dc4ae8 100644
--- a/src/client/views/ViewBoxInterface.ts
+++ b/src/client/views/ViewBoxInterface.ts
@@ -24,6 +24,9 @@ export abstract class ViewBoxInterface<P> extends ObservableReactComponent<React
promoteCollection?: () => void; // moves contents of collection to parent
hasChildDocs?: () => Doc[];
docEditorView?: () => void;
+ autoTag?: () => void; // auto tag the document
+ isOutpaintable?: () => boolean; // can document be resized and outpainted
+ showBorderRounding?: () => boolean; // can document borders be rounded
showSmartDraw?: (x: number, y: number, regenerate?: boolean) => void;
updateIcon?: (usePanelDimensions?: boolean) => Promise<void>; // updates the icon representation of the document
getAnchor?: (addAsAnnotation: boolean, pinData?: PinProps) => Doc; // returns an Anchor Doc that represents the current state of the doc's componentview (e.g., the current playhead location of a an audio/video box)
diff --git a/src/client/views/animationtimeline/Timeline.scss b/src/client/views/animationtimeline/Timeline.scss
index e1d3b190c..3a50183d2 100644
--- a/src/client/views/animationtimeline/Timeline.scss
+++ b/src/client/views/animationtimeline/Timeline.scss
@@ -112,8 +112,8 @@ $timelineDark: #77a1aa;
input {
position: absolute;
opacity: 0;
- height: 0;
- width: 0;
+ height: 0px;
+ width: 0px;
}
.round-toggle-slider {
diff --git a/src/client/views/animationtimeline/TimelineMenu.tsx b/src/client/views/animationtimeline/TimelineMenu.tsx
index 0d7873931..79283479c 100644
--- a/src/client/views/animationtimeline/TimelineMenu.tsx
+++ b/src/client/views/animationtimeline/TimelineMenu.tsx
@@ -1,5 +1,3 @@
-/* eslint-disable jsx-a11y/no-noninteractive-element-interactions */
-/* eslint-disable jsx-a11y/click-events-have-key-events */
import { IconLookup } from '@fortawesome/fontawesome-svg-core';
import { faChartLine, faClipboard } from '@fortawesome/free-solid-svg-icons';
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
@@ -19,7 +17,7 @@ export class TimelineMenu extends React.Component {
@observable private _y = 0;
@observable private _currentMenu: JSX.Element[] = [];
- constructor(props: any) {
+ constructor(props: object) {
super(props);
makeObservable(this);
TimelineMenu.Instance = this;
diff --git a/src/client/views/animationtimeline/TimelineOverview.tsx b/src/client/views/animationtimeline/TimelineOverview.tsx
index 7bf685c9e..fff756980 100644
--- a/src/client/views/animationtimeline/TimelineOverview.tsx
+++ b/src/client/views/animationtimeline/TimelineOverview.tsx
@@ -1,4 +1,3 @@
-/* eslint-disable react/no-unused-prop-types */
import { action, IReactionDisposer, observable, reaction, runInAction } from 'mobx';
import { observer } from 'mobx-react';
import * as React from 'react';
@@ -14,7 +13,7 @@ interface TimelineOverviewProps {
isAuthoring: boolean;
parent: Timeline;
changeCurrentBarX: (pixel: number) => void;
- movePanX: (pixel: number) => any;
+ movePanX: (pixel: number) => void;
time: number;
tickSpacing: number;
tickIncrement: number;
@@ -139,7 +138,7 @@ export class TimelineOverview extends React.Component<TimelineOverviewProps> {
const percentVisible = this.visibleTime / this.props.time;
const visibleBarWidth = percentVisible * this.activeOverviewWidth;
- const percentScrubberStart = this.currentX / this.props.time;
+ // const percentScrubberStart = this.currentX / this.props.time;
let scrubberStart = (this.props.currentBarX / this.props.totalLength) * this.activeOverviewWidth;
if (scrubberStart > this.activeOverviewWidth) scrubberStart = this.activeOverviewWidth;
diff --git a/src/client/views/collections/CollectionCardDeckView.scss b/src/client/views/collections/CollectionCardDeckView.scss
index e6cc398af..981e528cc 100644
--- a/src/client/views/collections/CollectionCardDeckView.scss
+++ b/src/client/views/collections/CollectionCardDeckView.scss
@@ -18,7 +18,7 @@
}
.collectionCardView-flashcardUI {
- top: 0;
+ top: 0px;
position: absolute;
width: 100%;
height: 100%;
@@ -33,7 +33,7 @@
}
.collectionCardView-cardSizeDragger {
position: absolute;
- top: 0;
+ top: 0px;
width: 28px;
height: 28px;
> svg {
diff --git a/src/client/views/collections/CollectionCarousel3DView.scss b/src/client/views/collections/CollectionCarousel3DView.scss
index 13e6b54c2..361d88cb6 100644
--- a/src/client/views/collections/CollectionCarousel3DView.scss
+++ b/src/client/views/collections/CollectionCarousel3DView.scss
@@ -12,7 +12,7 @@
position: absolute;
top: global.$CAROUSEL3D_TOP * 1%;
height: (global.$CAROUSEL3D_SIDE_SCALE * 100) * 1%;
- align-items: center;
+ //align-items: center;
transition: transform 0.3s cubic-bezier(0.455, 0.03, 0.515, 0.955);
.collectionCarousel3DView-item,
@@ -67,8 +67,8 @@
.carousel3DView-fwd-scroll-hidden {
position: absolute;
display: flex;
- width: 30;
- height: 30;
+ width: 30px;
+ height: 30px;
align-items: center;
border-radius: 5px;
justify-content: center;
@@ -78,7 +78,7 @@
.carousel3DView-fwd,
.carousel3DView-back {
- top: 0;
+ top: 0px;
background: transparent;
width: calc((1 - #{global.$CAROUSEL3D_CENTER_SCALE} * 0.33) / 2 * 100%);
height: 100%;
@@ -94,13 +94,13 @@
.carousel3DView-fwd,
.carousel3DView-fwd-scroll,
.carousel3DView-fwd-scroll-hidden {
- right: 0;
+ right: 0px;
}
.carousel3DView-back,
.carousel3DView-back-scroll,
.carousel3DView-back-scroll-hidden {
- left: 0;
+ left: 0px;
}
.carousel3DView-fwd-scroll-hidden,
diff --git a/src/client/views/collections/CollectionCarouselView.scss b/src/client/views/collections/CollectionCarouselView.scss
index 962b590c8..4c999b6dd 100644
--- a/src/client/views/collections/CollectionCarouselView.scss
+++ b/src/client/views/collections/CollectionCarouselView.scss
@@ -6,10 +6,10 @@
transform-origin: top left;
.collectionCarouselView-caption {
- height: 50;
+ height: 50px;
display: inline-block;
width: 100%;
- bottom: 0;
+ bottom: 0px;
position: absolute;
}
.collectionCarouselView-image {
@@ -18,8 +18,8 @@
width: 100%;
user-select: none;
position: absolute;
- top: 0;
- left: 0;
+ top: 0px;
+ left: 0px;
}
}
.collectionCarouselView-recentlyMissed {
@@ -34,8 +34,8 @@
.carouselView-fwd {
position: absolute;
display: flex;
- width: 30;
- height: 30;
+ width: 30px;
+ height: 30px;
align-items: center;
border-radius: 5px;
justify-content: center;
@@ -47,12 +47,12 @@
}
.carouselView-fwd {
top: calc(50% - 15px);
- right: 0;
+ right: 0px;
transform-origin: right top;
}
.carouselView-back {
top: calc(50% - 15px);
- left: 0;
+ left: 0px;
transform-origin: top left;
}
.carouselView-back:hover,
diff --git a/src/client/views/collections/CollectionDockingView.scss b/src/client/views/collections/CollectionDockingView.scss
index 7c19d39da..de214e2ef 100644
--- a/src/client/views/collections/CollectionDockingView.scss
+++ b/src/client/views/collections/CollectionDockingView.scss
@@ -17,8 +17,8 @@
}
.lm_maximised {
position: absolute;
- top: 0;
- left: 0;
+ top: 0px;
+ left: 0px;
z-index: 40;
}
.lm_maximise_placeholder {
@@ -62,8 +62,8 @@
text-align: center;
}
.lm_header ul {
- margin: 0;
- padding: 0;
+ margin: 0px;
+ padding: 0px;
list-style-type: none;
}
.lm_header .lm_tab {
@@ -81,11 +81,11 @@
position: absolute;
}
.lm_header .lm_tab i.lm_left {
- top: 0;
+ top: 0px;
left: -2px;
}
.lm_header .lm_tab i.lm_right {
- top: 0;
+ top: 0px;
right: -2px;
}
.lm_header .lm_tab .lm_title {
@@ -97,8 +97,8 @@
width: 14px;
height: 14px;
position: absolute;
- top: 0;
- right: 0;
+ top: 0px;
+ right: 0px;
text-align: center;
}
.lm_stack.lm_left .lm_header,
@@ -118,14 +118,14 @@
.lm_stack.lm_left .lm_header .lm_tabs,
.lm_stack.lm_right .lm_header .lm_tabs {
transform-origin: left top;
- top: 0;
+ top: 0px;
width: 1000px;
}
.lm_dragProxy.lm_left .lm_header .lm_controls,
.lm_dragProxy.lm_right .lm_header .lm_controls,
.lm_stack.lm_left .lm_header .lm_controls,
.lm_stack.lm_right .lm_header .lm_controls {
- bottom: 0;
+ bottom: 0px;
}
.lm_dragProxy.lm_left .lm_items,
.lm_dragProxy.lm_right .lm_items,
@@ -136,7 +136,7 @@
.lm_dragProxy.lm_left .lm_header .lm_tabs,
.lm_stack.lm_left .lm_header .lm_tabs {
transform: rotate(-90deg) scaleX(-1);
- left: 0;
+ left: 0px;
}
.lm_dragProxy.lm_left .lm_header .lm_tabs .lm_tab,
.lm_stack.lm_left .lm_header .lm_tabs .lm_tab {
@@ -156,7 +156,7 @@
.lm_stack.lm_right .lm_header .lm_tabs {
transform: rotate(90deg) scaleX(1);
left: 100%;
- margin-left: 0;
+ margin-left: 0px;
}
.lm_dragProxy.lm_right .lm_header .lm_controls,
.lm_stack.lm_right .lm_header .lm_controls {
@@ -169,7 +169,7 @@
}
.lm_dragProxy.lm_bottom .lm_header .lm_tab,
.lm_stack.lm_bottom .lm_header .lm_tab {
- margin-top: 0;
+ margin-top: 0px;
border-top: none;
}
.lm_dragProxy.lm_bottom .lm_header .lm_controls,
@@ -189,8 +189,8 @@
}
.lm_header .lm_controls .lm_tabdropdown:before {
content: '';
- width: 0;
- height: 0;
+ width: 0px;
+ height: 0px;
vertical-align: middle;
display: inline-block;
border-top: 5px dashed;
@@ -201,14 +201,14 @@
.lm_header .lm_tabdropdown_list {
position: absolute;
top: 20px;
- right: 0;
+ right: 0px;
z-index: 5;
overflow: hidden;
}
.lm_header .lm_tabdropdown_list .lm_tab {
clear: both;
padding-right: 10px;
- margin: 0;
+ margin: 0px;
}
.lm_header .lm_tabdropdown_list .lm_tab .lm_title {
width: 100px;
@@ -218,8 +218,8 @@
}
.lm_dragProxy {
position: absolute;
- top: 0;
- left: 0;
+ top: 0px;
+ left: 0px;
z-index: 30;
}
.lm_dragProxy .lm_header {
@@ -238,32 +238,32 @@
width: 100%;
height: 100%;
position: relative;
- top: 0;
- left: 0;
+ top: 0px;
+ left: 0px;
}
.lm_transition_indicator {
display: none;
width: 20px;
height: 20px;
position: absolute;
- top: 0;
- left: 0;
+ top: 0px;
+ left: 0px;
z-index: 20;
}
.lm_popin {
width: 20px;
height: 20px;
position: absolute;
- bottom: 0;
- right: 0;
+ bottom: 0px;
+ right: 0px;
z-index: 9999;
}
.lm_popin > * {
width: 100%;
height: 100%;
position: absolute;
- top: 0;
- left: 0;
+ top: 0px;
+ left: 0px;
}
.lm_popin > .lm_bg {
z-index: 10;
@@ -307,7 +307,7 @@
width: max-content;
height: 100%;
display: flex;
- max-width: 100;
+ max-width: 100px;
text-overflow: ellipsis;
}
@@ -328,7 +328,7 @@
ul.lm_tabs::before {
content: ' ';
position: absolute;
- bottom: 0;
+ bottom: 0px;
width: 100%;
z-index: 1;
pointer-events: none;
@@ -349,9 +349,9 @@ ul.lm_tabs::before {
}
}
.lm_header .lm_tab.lm_active {
- padding: 0;
+ padding: 0px;
opacity: 1;
- margin: 0;
+ margin: 0px;
box-shadow: none;
height: 27px;
margin-right: 2px;
@@ -405,7 +405,7 @@ ul.lm_tabs::before {
}
.lm_drag_tab {
- padding: 0;
+ padding: 0px;
width: 15px !important;
height: 15px !important;
position: relative !important;
@@ -418,7 +418,7 @@ ul.lm_tabs::before {
.lm_close_tab {
display: inline-flex !important;
- padding: 0;
+ padding: 0px;
opacity: 1 !important;
align-self: center;
margin-right: 5px;
@@ -455,7 +455,7 @@ ul.lm_tabs::before {
content: 'x';
margin: auto;
position: relative;
- top: -2;
+ top: -2px;
font-size: medium;
font-family: sans-serif;
}
@@ -478,8 +478,8 @@ ul.lm_tabs::before {
width: 100%;
height: 100%;
position: absolute;
- top: 0;
- left: 0;
+ top: 0px;
+ left: 0px;
.collectionDockingView-drag {
touch-action: none;
@@ -514,7 +514,7 @@ ul.lm_tabs::before {
border-bottom-left-radius: 10px;
background: #93939347;
z-index: 100;
- //left: -3;
+ //left: -3px;
&:hover {
background: gray;
color: white !important;
@@ -524,7 +524,7 @@ ul.lm_tabs::before {
content: '+';
margin: auto;
font-size: x-large;
- top: -4;
+ top: -4px;
position: relative;
}
.lm_maximise {
@@ -548,10 +548,10 @@ ul.lm_tabs::before {
}
.flexlayout__layout {
- left: 0;
- top: 0;
- right: 0;
- bottom: 0;
+ left: 0px;
+ top: 0px;
+ right: 0px;
+ bottom: 0px;
position: absolute;
overflow: hidden;
}
@@ -691,8 +691,8 @@ ul.lm_tabs::before {
.flexlayout__tabset_header {
position: absolute;
- left: 0;
- right: 0;
+ left: 0px;
+ right: 0px;
color: #eee;
background-color: #212121;
padding: 3px 3px 3px 5px;
@@ -702,17 +702,17 @@ ul.lm_tabs::before {
.flexlayout__tab_header_inner {
position: absolute;
- left: 0;
- top: 0;
- bottom: 0;
+ left: 0px;
+ top: 0px;
+ bottom: 0px;
width: 10000px;
}
.flexlayout__tab_header_outer {
background-color: global.$dark-gray;
position: absolute;
- left: 0;
- right: 0;
+ left: 0px;
+ right: 0px;
/*top: 0px;*/
/*height: 100px;*/
overflow: hidden;
@@ -731,23 +731,23 @@ ul.lm_tabs::before {
display: flex;
flex-direction: row-reverse;
align-items: center;
- top: 0;
- bottom: 0;
- right: 0;
+ top: 0px;
+ bottom: 0px;
+ right: 0px;
}
.flexlayout__tab_toolbar_button-min {
width: 20px;
height: 20px;
border: none;
- outline-width: 0;
+ outline-width: 0px;
}
.flexlayout__tab_toolbar_button-max {
width: 20px;
height: 20px;
border: none;
- outline-width: 0;
+ outline-width: 0px;
}
.flexlayout__popup_menu_item {
@@ -870,9 +870,9 @@ ul.lm_tabs::before {
display: flex;
flex-direction: column-reverse;
align-items: center;
- bottom: 0;
- left: 0;
- right: 0;
+ bottom: 0px;
+ left: 0px;
+ right: 0px;
}
.flexlayout__border_toolbar_right {
@@ -880,9 +880,9 @@ ul.lm_tabs::before {
display: flex;
flex-direction: column-reverse;
align-items: center;
- bottom: 0;
- left: 0;
- right: 0;
+ bottom: 0px;
+ left: 0px;
+ right: 0px;
}
.flexlayout__border_toolbar_top {
@@ -890,9 +890,9 @@ ul.lm_tabs::before {
display: flex;
flex-direction: row-reverse;
align-items: center;
- top: 0;
- bottom: 0;
- right: 0;
+ top: 0px;
+ bottom: 0px;
+ right: 0px;
}
.flexlayout__border_toolbar_bottom {
@@ -900,8 +900,8 @@ ul.lm_tabs::before {
display: flex;
flex-direction: row-reverse;
align-items: center;
- top: 0;
- bottom: 0;
- right: 0;
+ top: 0px;
+ bottom: 0px;
+ right: 0px;
}
}
diff --git a/src/client/views/collections/CollectionMasonryViewFieldRow.tsx b/src/client/views/collections/CollectionMasonryViewFieldRow.tsx
index 89ccf5a0f..164c6e831 100644
--- a/src/client/views/collections/CollectionMasonryViewFieldRow.tsx
+++ b/src/client/views/collections/CollectionMasonryViewFieldRow.tsx
@@ -7,6 +7,7 @@ import { emptyFunction, numberRange } from '../../../Utils';
import { Doc } from '../../../fields/Doc';
import { PastelSchemaPalette, SchemaHeaderField } from '../../../fields/SchemaHeaderField';
import { ScriptField } from '../../../fields/ScriptField';
+import { StrCast } from '../../../fields/Types';
import { Docs } from '../../documents/Documents';
import { DragManager } from '../../util/DragManager';
import { CompileScript } from '../../util/Scripting';
@@ -16,6 +17,7 @@ import { undoBatch, undoable } from '../../util/UndoManager';
import { EditableView } from '../EditableView';
import { ObservableReactComponent } from '../ObservableReactComponent';
import { DocumentView } from '../nodes/DocumentView';
+import { ImportElementBox } from '../nodes/importBox/ImportElementBox';
import { CollectionStackingView } from './CollectionStackingView';
import './CollectionStackingView.scss';
@@ -28,12 +30,14 @@ interface CMVFieldRowProps {
headingObject: SchemaHeaderField | undefined;
docList: Doc[];
parent: CollectionStackingView;
+ panelWidth: () => number;
+ columnWidth: () => number;
pivotField: string;
type: 'string' | 'number' | 'bigint' | 'boolean' | 'symbol' | 'undefined' | 'object' | 'function' | undefined;
createDropTarget: (ele: HTMLDivElement) => void;
screenToLocalTransform: () => Transform;
setDocHeight: (key: string, thisHeight: number) => void;
- refList: Element[];
+ sectionRefs: Element[];
showHandle: boolean;
}
@@ -74,7 +78,7 @@ export class CollectionMasonryViewFieldRow extends ObservableReactComponent<CMVF
createRowDropRef = (ele: HTMLDivElement | null) => {
this._dropDisposer?.();
if (ele) this._dropDisposer = DragManager.MakeDropTarget(ele, this.rowDrop.bind(this), this._props.Doc);
- else if (this._ele) this.props.refList.splice(this.props.refList.indexOf(this._ele), 1);
+ else if (this._ele) this.props.sectionRefs.splice(this.props.sectionRefs.indexOf(this._ele), 1);
this._ele = ele;
};
@action
@@ -82,10 +86,10 @@ export class CollectionMasonryViewFieldRow extends ObservableReactComponent<CMVF
this.heading = this._props.headingObject?.heading || '';
this.color = this._props.headingObject?.color || '#f1efeb';
this.collapsed = this._props.headingObject?.collapsed || false;
- this._ele && this.props.refList.push(this._ele);
+ this._ele && this.props.sectionRefs.push(this._ele);
}
componentWillUnmount() {
- this._ele && this.props.refList.splice(this.props.refList.indexOf(this._ele), 1);
+ this._ele && this.props.sectionRefs.splice(this.props.sectionRefs.indexOf(this._ele), 1);
this._ele = null;
}
@@ -128,10 +132,8 @@ export class CollectionMasonryViewFieldRow extends ObservableReactComponent<CMVF
const key = this._props.pivotField;
const castedValue = this.getValue(value);
if (castedValue) {
- if (this._props.parent.colHeaderData) {
- if (this._props.parent.colHeaderData.map(i => i.heading).indexOf(castedValue.toString()) > -1) {
- return false;
- }
+ if (this._props.parent.colHeaderData?.map(i => i.heading).indexOf(castedValue.toString()) || 0 > -1) {
+ return false;
}
key && this._props.docList.forEach(d => Doc.SetInPlace(d, key, castedValue, true));
this._heading = castedValue.toString();
@@ -251,20 +253,11 @@ export class CollectionMasonryViewFieldRow extends ObservableReactComponent<CMVF
textCallback = (/* char: string */) => this.addDocument('', false);
@computed get contentLayout() {
- const rows = Math.max(1, Math.min(this._props.docList.length, Math.floor((this._props.parent._props.PanelWidth() - 2 * this._props.parent.xMargin) / (this._props.parent.columnWidth + this._props.parent.gridGap))));
- const showChrome = !this._props.chromeHidden;
- const stackPad = showChrome ? `0px ${this._props.parent.xMargin}px` : `${this._props.parent.yMargin}px ${this._props.parent.xMargin}px 0px ${this._props.parent.xMargin}px `;
+ const rows = Math.max(1, Math.min(this._props.docList.length, Math.floor(this._props.panelWidth() / this._props.columnWidth())));
return this.collapsed ? null : (
<div style={{ position: 'relative' }}>
- {showChrome ? (
- <div
- className="collectionStackingView-addDocumentButton"
- style={
- {
- // width: style.columnWidth / style.numGroupColumns,
- // padding: `${NumCast(this._props.parent.layoutDoc._yPadding, this._props.parent.yMargin)}px 0px 0px 0px`,
- }
- }>
+ {!this._props.chromeHidden && !StrCast(this._props.Doc.childLayoutString).includes(ImportElementBox.name) ? (
+ <div className="collectionStackingView-addDocumentButton">
<EditableView GetValue={returnEmptyString} SetValue={this.addDocument} textCallback={this.textCallback} contents="+ NEW" />
</div>
) : null}
@@ -272,11 +265,9 @@ export class CollectionMasonryViewFieldRow extends ObservableReactComponent<CMVF
className="collectionStackingView-masonryGrid"
ref={this._contRef}
style={{
- padding: stackPad,
minHeight: this._props.showHandle && this._props.parent._props.isContentActive() ? '10px' : undefined,
- width: this._props.parent.NodeWidth,
gridGap: this._props.parent.gridGap,
- gridTemplateColumns: numberRange(rows).reduce(list => list + ` ${this._props.parent.columnWidth}px`, ''),
+ gridTemplateColumns: numberRange(rows).reduce(list => list + ` ${this._props.columnWidth()}px`, ''),
}}>
{this._props.parent.children(this._props.docList)}
</div>
@@ -339,7 +330,12 @@ export class CollectionMasonryViewFieldRow extends ObservableReactComponent<CMVF
render() {
const background = this._background;
return (
- <div className="collectionStackingView-masonrySection" style={{ width: this._props.parent.NodeWidth, background }} ref={this.createRowDropRef} onPointerEnter={this.pointerEnteredRow} onPointerLeave={this.pointerLeaveRow}>
+ <div
+ className="collectionStackingView-masonrySection"
+ style={{ width: this._props.pivotField ? this._props.panelWidth() : '100%', background }}
+ ref={this.createRowDropRef}
+ onPointerEnter={this.pointerEnteredRow}
+ onPointerLeave={this.pointerLeaveRow}>
{this.headingView}
{this.contentLayout}
</div>
diff --git a/src/client/views/collections/CollectionNoteTakingView.scss b/src/client/views/collections/CollectionNoteTakingView.scss
index 0d24a56b5..231085338 100644
--- a/src/client/views/collections/CollectionNoteTakingView.scss
+++ b/src/client/views/collections/CollectionNoteTakingView.scss
@@ -82,7 +82,7 @@
height: 100%;
width: 100%;
position: absolute;
- top: 0;
+ top: 0px;
overflow-y: auto;
overflow-x: hidden;
transition: top 0.5s;
@@ -130,8 +130,8 @@
display: flex;
flex-direction: column;
align-items: center;
- top: 0;
- left: 0;
+ top: 0px;
+ left: 0px;
width: 100%;
position: absolute;
margin: auto;
@@ -152,20 +152,20 @@
}
.collectionNoteTakingView-columnDragger {
- width: 15;
- height: 15;
+ width: 15px;
+ height: 15px;
position: absolute;
- margin-left: -5;
+ margin-left: -5px;
}
.collectionNoteTakingView-sectionDelete {
display: none;
position: absolute;
- right: 0;
+ right: 0px;
width: max-content;
height: max-content;
- top: 10;
- padding: 2;
+ top: 10px;
+ padding: 2px;
}
// Documents in NoteTaking view
@@ -210,8 +210,8 @@
height: 5px;
&.active {
- margin-left: 0;
- margin-right: 0;
+ margin-left: 0px;
+ margin-right: 0px;
background: red;
}
}
@@ -303,8 +303,8 @@
.collectionNoteTakingView-sectionColor {
position: absolute;
- left: 0;
- top: 0;
+ left: 0px;
+ top: 0px;
height: 100%;
display: none;
@@ -345,8 +345,8 @@
.collectionNoteTakingView-sectionOptions {
position: absolute;
- right: 0;
- top: 0;
+ right: 0px;
+ top: 0px;
height: 100%;
display: none;
diff --git a/src/client/views/collections/CollectionPivotView.tsx b/src/client/views/collections/CollectionPivotView.tsx
index 4736070c3..5487315f0 100644
--- a/src/client/views/collections/CollectionPivotView.tsx
+++ b/src/client/views/collections/CollectionPivotView.tsx
@@ -102,13 +102,7 @@ export class CollectionPivotView extends CollectionSubView() {
<div className="collectionTimeView-pivot" style={{ width: this._props.PanelWidth(), height: '100%' }}>
{this.contents}
<div style={{ right: 0, top: 0, position: 'absolute' }}>
- <FieldsDropdown
- Doc={this.Document}
- selectFunc={fieldKey => {
- this.layoutDoc._pivotField = fieldKey;
- }}
- placeholder={StrCast(this.layoutDoc._pivotField)}
- />
+ <FieldsDropdown Doc={this.Document} isInactive={!this._props.isContentActive()} selectFunc={fieldKey => (this.layoutDoc._pivotField = fieldKey)} placeholder={StrCast(this.layoutDoc._pivotField)} />
</div>
</div>
);
diff --git a/src/client/views/collections/CollectionStackedTimeline.scss b/src/client/views/collections/CollectionStackedTimeline.scss
index d05c0ffde..e71df2164 100644
--- a/src/client/views/collections/CollectionStackedTimeline.scss
+++ b/src/client/views/collections/CollectionStackedTimeline.scss
@@ -38,7 +38,7 @@
height: 100%;
background-color: global.$dark-gray;
opacity: 0.3;
- top: 0;
+ top: 0px;
}
.collectionStackedTimeline-trim-controls {
@@ -49,8 +49,8 @@
display: flex;
justify-content: space-between;
max-width: 100%;
- top: 0;
- left: 0;
+ top: 0px;
+ left: 0px;
.collectionStackedTimeline-trim-handle {
background-color: global.$medium-blue;
@@ -106,18 +106,18 @@
.collectionStackedTimeline-resizer {
background: global.$dark-gray;
position: absolute;
- top: 0;
+ top: 0px;
height: 100%;
width: 10px;
pointer-events: all;
z-index: 100;
}
.collectionStackedTimeline-resizer {
- right: 0;
+ right: 0px;
cursor: e-resize;
}
.collectionStackedTimeline-left-resizer {
- left: 0;
+ left: 0px;
cursor: w-resize;
}
}
@@ -126,8 +126,8 @@
position: absolute;
width: 100%;
height: 100%;
- top: 0;
- left: 0;
+ top: 0px;
+ left: 0px;
pointer-events: none;
}
}
diff --git a/src/client/views/collections/CollectionStackingView.scss b/src/client/views/collections/CollectionStackingView.scss
index 05ac52ff9..2cf361847 100644
--- a/src/client/views/collections/CollectionStackingView.scss
+++ b/src/client/views/collections/CollectionStackingView.scss
@@ -2,10 +2,12 @@
.collectionMasonryView {
display: inline;
+ flex-wrap: wrap;
}
.collectionStackingView {
display: flex;
+ justify-content: space-between;
}
.collectionStackingMasonry-cont {
@@ -14,10 +16,10 @@
width: 100%;
.collectionStackingView-columnDragger {
- width: 28;
- height: 28;
- position: absolute;
- margin-left: -5;
+ width: 28px;
+ height: 28px;
+ position: relative;
+ margin-left: -5px;
z-index: 10;
> svg {
width: 100%;
@@ -53,10 +55,9 @@
height: 100%;
width: 100%;
position: absolute;
- top: 0;
+ top: 0px;
overflow-y: auto;
overflow-x: hidden;
- flex-wrap: wrap;
transition: top 0.5s;
> div {
@@ -92,8 +93,8 @@
.collectionStackingView-masonryGrid {
width: 100%;
display: grid;
- top: 0;
- left: 0;
+ top: 0px;
+ left: 0px;
}
.collectionStackingView-masonrySingle {
@@ -114,8 +115,8 @@
position: absolute;
display: flex;
flex-direction: column;
- top: 0;
- left: 0;
+ top: 0px;
+ left: 0px;
width: 100%;
position: absolute;
}
@@ -158,12 +159,12 @@
width: 100%;
display: none;
position: absolute;
- top: 0;
+ top: 0px;
cursor: default;
&.active {
- margin-left: 0;
- margin-right: 0;
+ margin-left: 0px;
+ margin-right: 0px;
background: red;
}
}
@@ -210,7 +211,6 @@
.collectionStackingView-sectionHeader {
text-align: center;
margin: auto;
- margin-bottom: 10px;
background: global.$medium-gray;
// overflow: hidden; overflow is visible so the color menu isn't hidden -ftong
@@ -262,8 +262,8 @@
.collectionStackingView-sectionColor {
position: absolute;
- left: 0;
- top: 0;
+ left: 0px;
+ top: 0px;
height: 100%;
display: none;
@@ -304,8 +304,8 @@
.collectionStackingView-sectionOptions {
position: absolute;
- right: 0;
- top: 0;
+ right: 0px;
+ top: 0px;
height: 100%;
display: none;
@@ -339,7 +339,7 @@
.collectionStackingView-sectionDelete {
position: absolute;
right: 0px;
- top: 0;
+ top: 0px;
height: 100%;
display: none;
}
@@ -367,7 +367,6 @@
.collectionStackingView-addGroupButton {
display: flex;
overflow: hidden;
- margin: auto;
width: 90%;
overflow: ellipses;
diff --git a/src/client/views/collections/CollectionStackingView.tsx b/src/client/views/collections/CollectionStackingView.tsx
index 25a222cbb..bdeb7d944 100644
--- a/src/client/views/collections/CollectionStackingView.tsx
+++ b/src/client/views/collections/CollectionStackingView.tsx
@@ -4,7 +4,7 @@ import { action, computed, IReactionDisposer, makeObservable, observable, Observ
import { observer } from 'mobx-react';
import * as React from 'react';
import { ClientUtils, DivHeight, returnNone, returnZero, setupMoveUpEvents, smoothScroll } from '../../../ClientUtils';
-import { Doc, Opt } from '../../../fields/Doc';
+import { Doc, Field, Opt } from '../../../fields/Doc';
import { Id } from '../../../fields/FieldSymbols';
import { List } from '../../../fields/List';
import { listSpec } from '../../../fields/Schema';
@@ -35,6 +35,7 @@ import { CollectionStackingViewFieldColumn } from './CollectionStackingViewField
import { CollectionSubView, SubCollectionViewProps } from './CollectionSubView';
import { computedFn } from 'mobx-utils';
import { FormattedTextBox } from '../nodes/formattedText/FormattedTextBox';
+import { FieldsDropdown } from '../FieldsDropdown';
export type collectionStackingViewProps = {
sortFunc?: (a: Doc, b: Doc) => number;
@@ -48,28 +49,43 @@ export type collectionStackingViewProps = {
@observer
export class CollectionStackingView extends CollectionSubView<Partial<collectionStackingViewProps>>() {
_disposers: { [key: string]: IReactionDisposer } = {};
+ _addGroupRef = React.createRef<HTMLDivElement>();
_masonryGridRef: HTMLDivElement | null = null;
// used in a column dragger, likely due for the masonry grid view. We want to use this
_draggerRef = React.createRef<HTMLDivElement>();
// keeping track of documents. Updated on internal and external drops. What's the difference?
_docXfs: { height: () => number; width: () => number; stackedDocTransform: () => Transform }[] = [];
- // Doesn't look like this field is being used anywhere. Obsolete?
- _columnStart: number = 0;
- @observable _refList: HTMLElement[] = [];
+ @observable _colStackRefs: HTMLElement[] = [];
+ @observable _colHdrRefs: HTMLElement[] = [];
// map of node headers to their heights. Used in Masonry
@observable _heightMap = new Map<string, number>();
// Assuming that this is the current css cursor style
@observable _cursor: CSS.Property.Cursor = 'ew-resize';
// gets reset whenever we scroll. Not sure what it is
@observable _scroll = 0; // used to force the document decoration to update when scrolling
- // does this mean whether the browser is hidden? Or is chrome something else entirely?
+ // whether ui/editing controls are shown
@computed get chromeHidden() {
return this._props.chromeHidden || BoolCast(this.layoutDoc.chromeHidden);
}
- // it looks like this gets the column headers that Mehek was showing just now
@computed get colHeaderData() {
- return Cast(this.dataDoc['_' + this.fieldKey + '_columnHeaders'], listSpec(SchemaHeaderField), null);
+ return Cast(this.dataDoc[this.fieldKey + '_columnHeaders'], listSpec(SchemaHeaderField), null);
+ }
+
+ @computed get Sections() {
+ return this.filteredChildren.reduce(
+ (map, d) => {
+ const docHeader = d[this.pivotField] ? d[this.pivotField] : `NO ${this.pivotField.toUpperCase()} VALUE`;
+ const docHeaderString = docHeader !== undefined ? Field.toString(docHeader) : `NO ${this.pivotField.toUpperCase()} VALUE`;
+
+ // find existing header or create
+ const existingHeader = Array.from(map.keys()).find(sh => sh.heading === docHeaderString);
+ if (!existingHeader) map.set(new SchemaHeaderField(docHeaderString), [d]);
+ else map.get(existingHeader)!.push(d);
+ return map;
+ },
+ new ObservableMap<SchemaHeaderField, Doc[]>(this.colHeaderData?.map(hdata => [hdata, []] as [SchemaHeaderField, Doc[]]) ?? [])
+ );
}
// Still not sure what a pivot is, but it appears that we can actually filter docs somehow?
@computed get pivotField() {
@@ -107,9 +123,12 @@ export class CollectionStackingView extends CollectionSubView<Partial<collection
@computed get showAddAGroup() {
return this.pivotField && !this.chromeHidden;
}
+ @computed get availableWidth() {
+ return this._props.PanelWidth() - 2 * this.xMargin - (this.isStackingView ? this.gridGap * ((this.numGroupColumns || 1) - 1) : 0);
+ }
// columnWidth handles the margin on the left and right side of the documents
@computed get columnWidth() {
- const availableWidth = this._props.PanelWidth() - 2 * this.xMargin;
+ const availableWidth = this.availableWidth;
const cwid = availableWidth / (NumCast(this.Document._layout_columnCount) || this._props.PanelWidth() / NumCast(this.Document._layout_columnWidth, this._props.PanelWidth() / 4));
return Math.min(availableWidth, this.isStackingView ? availableWidth / (this.numGroupColumns || 1) : cwid - this.gridGap);
}
@@ -121,28 +140,17 @@ export class CollectionStackingView extends CollectionSubView<Partial<collection
constructor(props: SubCollectionViewProps) {
super(props);
makeObservable(this);
- if (this.colHeaderData === undefined) {
- // TODO: what is a layout doc? Is it literally how this document is supposed to be layed out?
- // here we're making an empty list of column headers (again, what Mehek showed us)
- this.dataDoc['_' + this.fieldKey + '_columnHeaders'] = new List<SchemaHeaderField>();
- }
}
+ availableWidthFn = () => this.availableWidth;
columnWidthFn = () => this.columnWidth;
columnDocHeightFn = (doc: Doc) => () => (this.isStackingView ? this.getDocHeight(doc)() : Math.min(this.getDocHeight(doc)(), this._props.PanelHeight()));
- // TODO: plj - these are the children
children = (docs: Doc[]) => {
- // TODO: can somebody explain me to what exactly TraceMobX is?
TraceMobx();
- // appears that we are going to reset the _docXfs. TODO: what is Xfs?
this._docXfs.length = 0;
- this._renderCount < docs.length &&
- setTimeout(
- action(() => {
- this._renderCount = Math.min(docs.length, this._renderCount + 5);
- })
- );
+ this._renderCount < docs.length &&
+ setTimeout(action(() => (this._renderCount = Math.min(docs.length, this._renderCount + 5)))); // prettier-ignore
return docs.map((d, i) => {
// assuming we need to get rowSpan because we might be dealing with many columns. Grid gap makes sense if multiple columns
const rowSpan = Math.ceil((this.getDocHeight(d)() + this.gridGap) / this.gridGap);
@@ -153,76 +161,28 @@ export class CollectionStackingView extends CollectionSubView<Partial<collection
margin: undefined,
transition: this.getDocTransition(d)(),
width: this.columnWidth,
- marginTop: i ? this.gridGap : 0,
height: this.getDocHeight(d)(),
zIndex: DocumentView.getFirstDocumentView(d)?.IsSelected ? 1000 : 0,
}
: { gridRowEnd: `span ${rowSpan}`, zIndex: DocumentView.getFirstDocumentView(d)?.IsSelected ? 1000 : 0 };
// So we're choosing whether we're going to render a column or a masonry doc
return (
- <div className={`collectionStackingView-${this.isStackingView ? 'columnDoc' : 'masonryDoc'}`} key={d[Id]} style={style}>
+ <div className={`collectionStackingView${this.isStackingView ? '-columnDoc' : '-masonryDoc'}`} key={d[Id]} style={style}>
{this.getDisplayDoc(d, this.getDocTransition(d), i)}
</div>
);
});
};
@action
- setDocHeight = (key: string, sectionHeight: number) => {
- this._heightMap.set(key, sectionHeight);
+ setDocHeight = (key: string, sectionHeight: number) => this._heightMap.set(key, sectionHeight);
+
+ setAutoHeight = () => {
+ const maxHeader = this.isStackingView ? this._colHdrRefs.reduce((p, r) => Math.max(p, DivHeight(r)), 0) + (this._colHdrRefs.length ? this.gridGap : 0) : 0;
+ const maxCol = this.isStackingView
+ ? this._colStackRefs.reduce((p, r) => Math.max(p, DivHeight(r)), 0) + this.gridGap
+ : this._colStackRefs.reduce((p, r) => p + DivHeight(r), this._addGroupRef.current ? DivHeight(this._addGroupRef.current) : 0);
+ this._props.setHeight?.(this.headerMargin + 2 * this.yMargin + maxCol + maxHeader);
};
-
- // is sections that all collections inherit? I think this is how we show the masonry/columns
- // TODO: this seems important
- get Sections() {
- // appears that pivot field IS actually for sorting
- if (!this.pivotField || this.colHeaderData instanceof Promise) return new Map<SchemaHeaderField, Doc[]>();
-
- if (this.colHeaderData === undefined) {
- setTimeout(() => {
- this.dataDoc['_' + this.fieldKey + '_columnHeaders'] = new List<SchemaHeaderField>();
- });
- return new Map<SchemaHeaderField, Doc[]>();
- }
- const colHeaderData = Array.from(this.colHeaderData);
- const fields = new Map<SchemaHeaderField, Doc[]>(colHeaderData.map(sh => [sh, []] as [SchemaHeaderField, []]));
- let changed = false;
- this.filteredChildren.forEach(d => {
- const sectionValue = (d[this.pivotField] ? d[this.pivotField] : `NO ${this.pivotField.toUpperCase()} VALUE`) as object;
- // the next five lines ensures that floating point rounding errors don't create more than one section -syip
- const parsed = parseInt(sectionValue.toString());
- const castedSectionValue = !isNaN(parsed) ? parsed : sectionValue;
-
- // look for if header exists already
- const existingHeader = colHeaderData.find(sh => sh.heading === (castedSectionValue ? castedSectionValue.toString() : `NO ${this.pivotField.toUpperCase()} VALUE`));
- if (existingHeader) {
- fields.get(existingHeader)!.push(d);
- } else {
- const newSchemaHeader = new SchemaHeaderField(castedSectionValue ? castedSectionValue.toString() : `NO ${this.pivotField.toUpperCase()} VALUE`);
- fields.set(newSchemaHeader, [d]);
- colHeaderData.push(newSchemaHeader);
- changed = true;
- }
- });
- // remove all empty columns if hideHeadings is set
- // we will want to have something like this, so that we can hide columns and add them back in
- if (this.layoutDoc._columnsHideIfEmpty) {
- Array.from(fields.keys())
- .filter(key => !fields.get(key)!.length)
- .forEach(header => {
- fields.delete(header);
- colHeaderData.splice(colHeaderData.indexOf(header), 1);
- changed = true;
- });
- }
- changed &&
- setTimeout(
- action(() => this.colHeaderData?.splice(0, this.colHeaderData.length, ...colHeaderData)),
- 0
- );
- return fields;
- }
-
- setAutoHeight = () => this._props.setHeight?.(this.headerMargin + (this.isStackingView ? Math.max(...this._refList.map(DivHeight)) : 2 * this.yMargin + this._refList.reduce((p, r) => p + DivHeight(r), 0)));
observer = new ResizeObserver(this.setAutoHeight);
componentDidMount() {
@@ -232,9 +192,7 @@ export class CollectionStackingView extends CollectionSubView<Partial<collection
// reset section headers when a new filter is inputted
this._disposers.pivotField = reaction(
() => this.pivotField,
- () => {
- this.dataDoc['_' + this.fieldKey + '_columnHeaders'] = new List();
- }
+ () => (this.dataDoc[this.fieldKey + '_columnHeaders'] = new List())
);
// reset section headers when a new filter is inputted
this._disposers.width = reaction(
@@ -252,7 +210,7 @@ export class CollectionStackingView extends CollectionSubView<Partial<collection
);
this._disposers.refList = reaction(
- () => ({ refList: this._refList.slice(), autoHeight: this.layoutDoc._layout_autoHeight && !DocumentView.LightboxContains(this.DocumentView?.()) }),
+ () => ({ refList: this._colStackRefs.slice(), autoHeight: this.layoutDoc._layout_autoHeight && !DocumentView.LightboxContains(this.DocumentView?.()) }),
({ refList, autoHeight }) => {
this.observer.disconnect();
if (autoHeight) refList.forEach(r => this.observer.observe(r));
@@ -409,11 +367,10 @@ export class CollectionStackingView extends CollectionSubView<Partial<collection
getDocWidth = computedFn((d?: Doc) => () => {
if (!d) return 0;
const childLayoutDoc = Doc.LayoutDoc(d, this._props.childLayoutTemplate?.());
- const maxWidth = this.columnWidth / this.numGroupColumns;
if (!this.layoutDoc._columnsFill && !this.childFitWidth(childLayoutDoc)) {
- return Math.min(NumCast(d._width), maxWidth);
+ return Math.min(NumCast(d._width), this.columnWidth);
}
- return maxWidth;
+ return this.columnWidth;
});
getDocTransition = computedFn((d?: Doc) => () => StrCast(d?.dataTransition));
getDocHeight = computedFn((d?: Doc) => () => {
@@ -424,7 +381,7 @@ export class CollectionStackingView extends CollectionSubView<Partial<collection
const nw = Doc.NativeWidth(childLayoutDoc, childDataDoc) || (!this.childFitWidth(childLayoutDoc) ? NumCast(d._width) : 0);
const nh = Doc.NativeHeight(childLayoutDoc, childDataDoc) || (!this.childFitWidth(childLayoutDoc) ? NumCast(d._height) : 0);
if (nw && nh) {
- const colWid = this.columnWidth / (this.isStackingView ? this.numGroupColumns : 1);
+ const colWid = this.columnWidth;
const docWid = this.layoutDoc._columnsFill ? colWid : Math.min(this.getDocWidth(d)(), colWid);
return Math.min(maxHeight, (docWid * nh) / nw);
}
@@ -571,7 +528,8 @@ export class CollectionStackingView extends CollectionSubView<Partial<collection
}
return (
<CollectionStackingViewFieldColumn
- refList={this._refList}
+ colStackRefs={this._colStackRefs}
+ colHeaderRefs={this._colHdrRefs}
addDocument={this.addDocument}
chromeHidden={this.chromeHidden}
colHeaderData={this.colHeaderData}
@@ -608,13 +566,15 @@ export class CollectionStackingView extends CollectionSubView<Partial<collection
return (
<div key={(heading?.heading ?? '') + 'head'}>
{this._props.isContentActive() && !this.isStackingView && !this.chromeHidden ? this.columnDragger : null}
- <div style={{ top: this.yMargin }}>
+ <div style={{ position: 'relative' }}>
<CollectionMasonryViewFieldRow
showHandle={first}
Doc={this.Document}
chromeHidden={this.chromeHidden}
+ panelWidth={this.availableWidthFn}
+ columnWidth={this.columnWidthFn}
pivotField={this.pivotField}
- refList={this._refList}
+ sectionRefs={this._colStackRefs}
key={heading ? heading.heading : ''}
rows={rows}
headings={this.headings}
@@ -635,9 +595,11 @@ export class CollectionStackingView extends CollectionSubView<Partial<collection
/// add a new group category (column) to the active set of note categories. (e.g., if the pivot field is 'transportation', groups might be 'car', 'plane', 'bike', etc)
@action
addGroup = (value: string) => {
+ if (!this.colHeaderData) {
+ this.dataDoc[this.fieldKey + '_columnHeaders'] = new List();
+ }
if (value && this.colHeaderData) {
- const schemaHdrField = new SchemaHeaderField(value);
- this.colHeaderData.push(schemaHdrField);
+ this.colHeaderData.push(new SchemaHeaderField(value));
return true;
}
return false;
@@ -745,22 +707,25 @@ export class CollectionStackingView extends CollectionSubView<Partial<collection
this.fixWheelEvents(ele, this._props.isContentActive);
}}
style={{
- overflowY: this.isContentActive() ? 'auto' : 'hidden',
+ paddingBottom: this.yMargin,
+ paddingTop: this.yMargin,
+ paddingLeft: this.xMargin,
+ paddingRight: this.xMargin,
+ overflowY: this.isContentActive() && !this.layoutDoc._layout_autoHeight ? 'auto' : 'hidden',
background: this._props.styleProvider?.(this.Document, this._props, StyleProp.BackgroundColor) as string,
pointerEvents: this._props.pointerEvents?.() ?? this.backgroundEvents,
}}
- onScroll={action(e => {
- this._scroll = e.currentTarget.scrollTop;
- })}
+ onScroll={action(e => (this._scroll = e.currentTarget.scrollTop))}
onDrop={this.onExternalDrop.bind(this)}
onContextMenu={this.onContextMenu}
onWheel={e => this.isContentActive() && e.stopPropagation()}>
{this.renderedSections}
- {!this.showAddAGroup ? null : (
- <div key={`${this.Document[Id]}-addGroup`} className="collectionStackingView-addGroupButton" style={{ width: !this.isStackingView ? '100%' : this.columnWidth / this.numGroupColumns - 10, marginTop: 10 }}>
- <EditableView {...editableViewProps} />
- </div>
- )}
+ <div className="collectionStackingView-addGroupButton" ref={this._addGroupRef} style={{ width: !this.isStackingView ? '100%' : this.columnWidth, display: this.showAddAGroup ? undefined : 'none' }}>
+ <EditableView {...editableViewProps} />
+ </div>
+ <div style={{ right: 0, top: 0, position: 'absolute', display: !this.layoutDoc._pivotField ? 'none' : undefined }}>
+ <FieldsDropdown Doc={this.Document} isInactive={!this._props.isContentActive()} selectFunc={fieldKey => (this.layoutDoc._pivotField = fieldKey)} placeholder={StrCast(this.layoutDoc._pivotField)} />
+ </div>
</div>
</div>
</>
diff --git a/src/client/views/collections/CollectionStackingViewFieldColumn.tsx b/src/client/views/collections/CollectionStackingViewFieldColumn.tsx
index 345f60e75..8c535534a 100644
--- a/src/client/views/collections/CollectionStackingViewFieldColumn.tsx
+++ b/src/client/views/collections/CollectionStackingViewFieldColumn.tsx
@@ -1,9 +1,10 @@
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
-import { action, computed, IReactionDisposer, makeObservable, observable, reaction } from 'mobx';
+import { action, computed, IReactionDisposer, makeObservable, observable, reaction, runInAction } from 'mobx';
import { observer } from 'mobx-react';
import * as React from 'react';
import { DivHeight, DivWidth, returnEmptyString, returnTrue, setupMoveUpEvents } from '../../../ClientUtils';
import { Doc, DocListCast, Opt } from '../../../fields/Doc';
+import { DocData } from '../../../fields/DocSymbols';
import { RichTextField } from '../../../fields/RichTextField';
import { PastelSchemaPalette, SchemaHeaderField } from '../../../fields/SchemaHeaderField';
import { ScriptField } from '../../../fields/ScriptField';
@@ -26,7 +27,6 @@ import { EditableView } from '../EditableView';
import { DocumentView } from '../nodes/DocumentView';
import { ObservableReactComponent } from '../ObservableReactComponent';
import './CollectionStackingView.scss';
-import { DocData } from '../../../fields/DocSymbols';
// So this is how we are storing a column
interface CSVFieldColumnProps {
@@ -50,14 +50,14 @@ interface CSVFieldColumnProps {
addDocument: (doc: Doc | Doc[]) => boolean;
createDropTarget: (ele: HTMLDivElement) => void;
screenToLocalTransform: () => Transform;
- refList: HTMLElement[];
+ colStackRefs: HTMLElement[];
+ colHeaderRefs: HTMLElement[];
}
@observer
export class CollectionStackingViewFieldColumn extends ObservableReactComponent<CSVFieldColumnProps> {
private dropDisposer?: DragManager.DragDropDisposer;
private _disposers: { [name: string]: IReactionDisposer } = {};
- private _headerRef: React.RefObject<HTMLDivElement> = React.createRef();
@observable _background = 'inherit';
@observable _paletteOn = false;
@observable _heading = '';
@@ -72,6 +72,7 @@ export class CollectionStackingViewFieldColumn extends ObservableReactComponent<
_ele: HTMLElement | null = null;
_eleMasonrySingle = React.createRef<HTMLDivElement>();
+ _headerRef: HTMLDivElement | null = null;
protected onInternalPreDrop = (e: Event, de: DragManager.DropEvent, targetDropAction: dropActionType) => {
const dragData = de.complete.docDragData;
@@ -93,13 +94,13 @@ export class CollectionStackingViewFieldColumn extends ObservableReactComponent<
createColumnDropRef = (ele: HTMLDivElement | null) => {
this.dropDisposer?.();
if (ele) this.dropDisposer = DragManager.MakeDropTarget(ele, this.columnDrop.bind(this), this._props.Doc, this.onInternalPreDrop.bind(this));
- else if (this._eleMasonrySingle.current) this.props.refList.splice(this.props.refList.indexOf(this._eleMasonrySingle.current), 1);
+ else if (this._eleMasonrySingle.current) runInAction(() => this.props.colStackRefs.splice(this.props.colStackRefs.indexOf(this._eleMasonrySingle.current!), 1));
this._ele = ele;
};
@action
componentDidMount() {
- this._eleMasonrySingle.current && this.props.refList.push(this._eleMasonrySingle.current);
+ this._eleMasonrySingle.current && this.props.colStackRefs.push(this._eleMasonrySingle.current);
this._disposers.collapser = reaction(
() => this._props.headingObject?.collapsed,
collapsed => { this.collapsed = collapsed !== undefined ? BoolCast(collapsed) : false; }, // prettier-ignore
@@ -108,7 +109,7 @@ export class CollectionStackingViewFieldColumn extends ObservableReactComponent<
}
componentWillUnmount() {
this._disposers.collapser?.();
- this._ele && this.props.refList.splice(this.props.refList.indexOf(this._ele), 1);
+ this._ele && runInAction(() => this.props.colStackRefs.splice(this.props.colStackRefs.indexOf(this._ele!), 1));
this._ele = null;
}
@@ -192,7 +193,7 @@ export class CollectionStackingViewFieldColumn extends ObservableReactComponent<
value = typeof value === 'string' ? `"${value}"` : value;
embedding.viewSpecScript = ScriptField.MakeFunction(`doc.${this._props.pivotField} === ${value}`, { doc: Doc.name });
if (embedding.viewSpecScript) {
- DragManager.StartDocumentDrag([this._headerRef.current!], new DragManager.DocumentDragData([embedding]), e.clientX, e.clientY);
+ DragManager.StartDocumentDrag([this._headerRef!], new DragManager.DocumentDragData([embedding]), e.clientX, e.clientY);
return true;
}
return false;
@@ -314,9 +315,14 @@ export class CollectionStackingViewFieldColumn extends ObservableReactComponent<
<div
key={heading}
className="collectionStackingView-sectionHeader"
- ref={this._headerRef}
+ ref={r => {
+ if (this._headerRef && this._props.colHeaderRefs.includes(this._headerRef)) this._props.colHeaderRefs.splice(this._props.colStackRefs.indexOf(this._headerRef), 1);
+ r && this._props.colHeaderRefs.push(r);
+ this._headerRef = r;
+ }}
style={{
- marginTop: this._props.yMargin,
+ marginTop: 0,
+ marginBottom: this._props.gridGap,
width: this._props.columnWidth,
}}>
{/* the default bucket (no key value) has a tooltip that describes what it is.
@@ -367,7 +373,7 @@ export class CollectionStackingViewFieldColumn extends ObservableReactComponent<
ref={this._eleMasonrySingle}
className="collectionStackingView-masonrySingle"
style={{
- padding: `${columnYMargin}px ${0}px ${this._props.yMargin}px ${0}px`,
+ padding: `${columnYMargin}px ${0}px ${0}px ${0}px`,
margin: this._props.dontCenter.includes('x') ? undefined : 'auto',
height: 'max-content',
position: 'relative',
@@ -400,15 +406,13 @@ export class CollectionStackingViewFieldColumn extends ObservableReactComponent<
render() {
TraceMobx();
- const headings = this._props.headings();
const heading = this._heading;
- const uniqueHeadings = headings.map((i, idx) => headings.indexOf(i) === idx);
return (
<div
className="collectionStackingViewFieldColumn"
key={heading}
style={{
- width: `${100 / (uniqueHeadings.length + (this._props.chromeHidden ? 0 : 1) || 1)}%`,
+ width: this._props.columnWidth,
height: undefined,
background: this._background,
}}
diff --git a/src/client/views/collections/CollectionTimeView.scss b/src/client/views/collections/CollectionTimeView.scss
index d995cbcd2..d56999974 100644
--- a/src/client/views/collections/CollectionTimeView.scss
+++ b/src/client/views/collections/CollectionTimeView.scss
@@ -27,7 +27,7 @@
transform: rotate(45deg);
display: inline-block;
background: gray;
- bottom: 0;
+ bottom: 0px;
margin-bottom: -17px;
border-radius: 9px;
opacity: 0.25;
@@ -67,9 +67,9 @@
pointer-events: all;
padding: 5px;
border: 1px solid black;
- display:none;
+ display: none;
span {
- margin-left : 10px;
+ margin-left: 10px;
}
}
@@ -86,8 +86,9 @@
}
}
-.collectionTimeView:hover, .collectionTimeView-pivot:hover {
+.collectionTimeView:hover,
+.collectionTimeView-pivot:hover {
.pivotKeyEntry {
- display:unset;
+ display: unset;
}
-} \ No newline at end of file
+}
diff --git a/src/client/views/collections/CollectionTreeView.scss b/src/client/views/collections/CollectionTreeView.scss
index 2a03ea708..95faaa3f0 100644
--- a/src/client/views/collections/CollectionTreeView.scss
+++ b/src/client/views/collections/CollectionTreeView.scss
@@ -11,7 +11,7 @@
height: 100%;
width: 100%;
position: relative;
- top: 0;
+ top: 0px;
// background: global.$light-gray;
font-size: 13px;
overflow: auto;
@@ -33,12 +33,12 @@
}
.no-indent {
- padding-left: 0;
+ padding-left: 0px;
//width: max-content;
}
.no-indent-outline {
- padding-left: 0;
+ padding-left: 0px;
width: 100%;
}
diff --git a/src/client/views/collections/CollectionView.scss b/src/client/views/collections/CollectionView.scss
index 06c324bd0..837219e1d 100644
--- a/src/client/views/collections/CollectionView.scss
+++ b/src/client/views/collections/CollectionView.scss
@@ -1,7 +1,7 @@
@use '../global/globalCssVariables.module.scss' as global;
.collectionView {
- border-width: 0;
+ border-width: 0px;
border-color: global.$light-gray;
border-style: solid;
border-radius: 0 0 global.$border-radius global.$border-radius;
@@ -18,7 +18,7 @@
position: absolute;
top: 55%;
border: 1px black solid;
- border-radius: 0;
+ border-radius: 0px;
border-top-left-radius: 20px;
border-bottom-left-radius: 20px;
border-right: unset;
@@ -31,8 +31,8 @@
width: 200px;
height: 100%;
position: absolute;
- right: 0;
- top: 0;
+ right: 0px;
+ top: 0px;
border-left: solid 1px;
z-index: 1;
diff --git a/src/client/views/collections/CollectionView.tsx b/src/client/views/collections/CollectionView.tsx
index eb9caf29d..72c8c3f8c 100644
--- a/src/client/views/collections/CollectionView.tsx
+++ b/src/client/views/collections/CollectionView.tsx
@@ -113,7 +113,7 @@ export class CollectionView extends ViewBoxAnnotatableComponent<CollectionViewPr
};
setupViewTypes(category: string, func: (type_collection: CollectionViewType) => Doc) {
- if (!Doc.IsSystem(this.Document) && this.Document._type_collection !== CollectionViewType.Docking && !this.dataDoc.isGroup && !this.Document.annotationOn) {
+ if (!Doc.IsSystem(this.Document) && this.Document._type_collection !== CollectionViewType.Docking && !this.Document.annotationOn) {
// prettier-ignore
const subItems: ContextMenuProps[] = [
{ description: 'Freeform', event: () => func(CollectionViewType.Freeform), icon: 'signature' },
diff --git a/src/client/views/collections/FlashcardPracticeUI.scss b/src/client/views/collections/FlashcardPracticeUI.scss
index 210c6798f..0cc4711b3 100644
--- a/src/client/views/collections/FlashcardPracticeUI.scss
+++ b/src/client/views/collections/FlashcardPracticeUI.scss
@@ -8,8 +8,8 @@
.FlashcardPracticeUI-check {
position: absolute;
display: flex;
- width: 30;
- height: 30;
+ width: 30px;
+ height: 30px;
align-items: center;
border-radius: 5px;
justify-content: center;
@@ -39,7 +39,7 @@
display: flex;
top: 0px;
left: 0px;
- width: 30;
+ width: 30px;
transform-origin: top left;
border-radius: 5px;
color: rgba(255, 255, 255, 0.5);
@@ -49,7 +49,7 @@
width: 100%;
display: flex;
flex-direction: column;
- top: 0;
+ top: 0px;
position: relative;
.FlashcardPracticeUI-quiz,
.FlashcardPracticeUI-practice {
diff --git a/src/client/views/collections/FlashcardPracticeUI.tsx b/src/client/views/collections/FlashcardPracticeUI.tsx
index 2f46c00bd..17b65334c 100644
--- a/src/client/views/collections/FlashcardPracticeUI.tsx
+++ b/src/client/views/collections/FlashcardPracticeUI.tsx
@@ -61,7 +61,8 @@ export class FlashcardPracticeUI extends ObservableReactComponent<PracticeUIProp
get practiceField() { return this._props.fieldKey + "_practice"; } // prettier-ignore
@computed get filterDoc() { return DocListCast(Doc.MyContextMenuBtns?.data).find(doc => doc.title === 'Filter'); } // prettier-ignore
- @computed get practiceMode() { return this._props.allChildDocs().some(doc => doc._layout_flashcardType) ? StrCast(this._props.layoutDoc.practiceMode) : ''; } // prettier-ignore
+ @computed get hasFlashcards() { return this._props.allChildDocs().some(doc => doc._layout_flashcardType); } // prettier-ignore
+ @computed get practiceMode() { return this.hasFlashcards ? StrCast(this._props.layoutDoc.practiceMode) : ''; } // prettier-ignore
btnHeight = () => NumCast(this.filterDoc?.height);
btnWidth = () => (!this.filterDoc ? 1 : NumCast(this.filterDoc._width));
@@ -130,7 +131,7 @@ export class FlashcardPracticeUI extends ObservableReactComponent<PracticeUIProp
const setColor = (mode: practiceMode) => (StrCast(this.practiceMode) === mode ? 'white' : 'lightgray');
const togglePracticeMode = (mode: practiceMode) => this.setPracticeMode(mode === this.practiceMode ? undefined : mode);
- return !this._props.allChildDocs().some(doc => doc._layout_flashcardType) ? null : (
+ return !this.hasFlashcards ? null : (
<div
className="FlashcardPracticeUI-practiceModes"
style={{
@@ -141,8 +142,8 @@ export class FlashcardPracticeUI extends ObservableReactComponent<PracticeUIProp
type={Type.PRIM}
color={SnappingManager.userColor}
background={SnappingManager.userVariantColor}
+ showUntilToggle={false}
multiSelect={false}
- toggleStatus={!!this.practiceMode}
label="Practice"
items={[
[practiceMode.QUIZ, 'file-pen', 'Practice flashcards using GPT'],
@@ -160,8 +161,8 @@ export class FlashcardPracticeUI extends ObservableReactComponent<PracticeUIProp
type={Type.PRIM}
color={SnappingManager.userColor}
background={SnappingManager.userVariantColor}
+ showUntilToggle={false}
multiSelect={false}
- toggleStatus={!!this.practiceMode}
label={StrCast(this._props.layoutDoc.revealOp, flashcardRevealOp.FLIP)}
items={[
['reveal', StrCast(this._props.layoutDoc.revealOp) === flashcardRevealOp.SLIDE ? 'expand' : 'question', StrCast(this._props.layoutDoc.revealOp, flashcardRevealOp.FLIP)],
diff --git a/src/client/views/collections/KeyRestrictionRow.tsx b/src/client/views/collections/KeyRestrictionRow.tsx
deleted file mode 100644
index 7dc08389b..000000000
--- a/src/client/views/collections/KeyRestrictionRow.tsx
+++ /dev/null
@@ -1,72 +0,0 @@
-/* eslint-disable react/button-has-type */
-import { observable, runInAction } from 'mobx';
-import { observer } from 'mobx-react';
-import * as React from 'react';
-
-interface IKeyRestrictionProps {
- contains: boolean;
- script: (value: string) => void;
- field: string;
- value: string;
-}
-
-@observer
-export default class KeyRestrictionRow extends React.Component<IKeyRestrictionProps> {
- @observable private _key = this.props.field;
- @observable private _value = this.props.value;
- @observable private _contains = this.props.contains;
-
- render() {
- if (this._key && this._value) {
- let parsedValue: string | number = `"${this._value}"`;
- const parsed = parseInt(this._value);
- let type = 'string';
- if (!isNaN(parsed)) {
- parsedValue = parsed;
- type = 'number';
- }
- const scriptText = `${this._contains ? '' : '!'}(((doc.${this._key} && (doc.${this._key} as ${type})${type === 'string' ? '.includes' : '<='}(${parsedValue}))) ||
- ((doc.data_ext && doc.data_ext.${this._key}) && (doc.data_ext.${this._key} as ${type})${type === 'string' ? '.includes' : '<='}(${parsedValue}))))`;
- // let doc = new Doc();
- // ((doc.data_ext && doc.data_ext!.text) && (doc.data_ext!.text as string).includes("hello"));
- this.props.script(scriptText);
- } else {
- this.props.script('');
- }
-
- return (
- <div className="collectionViewBaseChrome-viewSpecsMenu-row">
- <input
- className="collectionViewBaseChrome-viewSpecsMenu-rowLeft"
- value={this._key}
- onChange={e =>
- runInAction(() => {
- this._key = e.target.value;
- })
- }
- placeholder="KEY"
- />
- <button
- className="collectionViewBaseChrome-viewSpecsMenu-rowMiddle"
- style={{ background: this._contains ? '#77dd77' : '#ff6961' }}
- onClick={() =>
- runInAction(() => {
- this._contains = !this._contains;
- })
- }>
- {this._contains ? 'CONTAINS' : 'DOES NOT CONTAIN'}
- </button>
- <input
- className="collectionViewBaseChrome-viewSpecsMenu-rowRight"
- value={this._value}
- onChange={e =>
- runInAction(() => {
- this._value = e.target.value;
- })
- }
- placeholder="VALUE"
- />
- </div>
- );
- }
-}
diff --git a/src/client/views/collections/TabDocView.scss b/src/client/views/collections/TabDocView.scss
index 931cdac2b..b705d17f3 100644
--- a/src/client/views/collections/TabDocView.scss
+++ b/src/client/views/collections/TabDocView.scss
@@ -92,6 +92,6 @@ input.lm_title {
.miniMap-hidden {
cursor: pointer;
position: absolute;
- bottom: 5;
- right: 5;
+ bottom: 5px;
+ right: 5px;
}
diff --git a/src/client/views/collections/TabDocView.tsx b/src/client/views/collections/TabDocView.tsx
index c4373aaa7..897a86e7f 100644
--- a/src/client/views/collections/TabDocView.tsx
+++ b/src/client/views/collections/TabDocView.tsx
@@ -584,9 +584,7 @@ export class TabDocView extends ObservableReactComponent<TabDocViewProps> {
miniMapColor = () => Colors.MEDIUM_GRAY;
tabView = () => this._view;
disableMinimap = () => !this._document;
- whenChildContentActiveChanges = (isActive: boolean) => {
- this._isAnyChildContentActive = isActive;
- };
+ whenChildContentActiveChanges = (isActive: boolean) => (this._isAnyChildContentActive = isActive);
isContentActiveFunc = () => this.isContentActive;
waitForDoubleClick = () => (SnappingManager.ExploreMode ? 'never' : undefined);
renderDocView = (doc: Doc) => (
diff --git a/src/client/views/collections/TreeView.scss b/src/client/views/collections/TreeView.scss
index 78794d112..542b0cc87 100644
--- a/src/client/views/collections/TreeView.scss
+++ b/src/client/views/collections/TreeView.scss
@@ -136,8 +136,8 @@
width: 100%;
height: 100%;
position: absolute;
- top: 0;
- left: 0;
+ top: 0px;
+ left: 0px;
z-index: 0;
filter: opacity(0);
}
diff --git a/src/client/views/collections/collectionFreeForm/CollectionFreeFormRemoteCursors.scss b/src/client/views/collections/collectionFreeForm/CollectionFreeFormRemoteCursors.scss
index 7951aff65..32cf3586f 100644
--- a/src/client/views/collections/collectionFreeForm/CollectionFreeFormRemoteCursors.scss
+++ b/src/client/views/collections/collectionFreeForm/CollectionFreeFormRemoteCursors.scss
@@ -18,5 +18,5 @@
color: black;
// fontStyle: "italic",
margin-left: -12;
- margin-top: 4;
+ margin-top: 4px;
}
diff --git a/src/client/views/collections/collectionFreeForm/CollectionFreeFormView.scss b/src/client/views/collections/collectionFreeForm/CollectionFreeFormView.scss
index 6c47a71b0..ac1ef7d65 100644
--- a/src/client/views/collections/collectionFreeForm/CollectionFreeFormView.scss
+++ b/src/client/views/collections/collectionFreeForm/CollectionFreeFormView.scss
@@ -2,8 +2,8 @@
.collectionfreeformview-none {
position: inherit;
- top: 0;
- left: 0;
+ top: 0px;
+ left: 0px;
width: 100%;
height: 100%;
transform-origin: left top;
@@ -12,10 +12,10 @@
border-radius: inherit;
}
.collectionFreeForm-groupDropper {
- width: 10000;
- height: 10000;
- left: -5000;
- top: -5000;
+ width: 10000px;
+ height: 10000px;
+ left: -5000px;
+ top: -5000px;
position: absolute;
background: transparent;
pointer-events: all;
@@ -24,8 +24,8 @@
.collectionfreeformview-grid {
transform-origin: top left;
position: absolute;
- top: 0;
- left: 0;
+ top: 0px;
+ left: 0px;
pointer-events: none;
}
@@ -219,8 +219,8 @@
border-radius: inherit;
box-sizing: border-box;
position: absolute;
- top: 0;
- left: 0;
+ top: 0px;
+ left: 0px;
width: 100%;
height: 100%;
align-items: center;
@@ -264,7 +264,7 @@
.collectionFreeform-infoUI {
position: absolute;
display: block;
- top: 0;
+ top: 0px;
color: white;
background-color: #5075ef;
@@ -275,19 +275,19 @@
padding: 10px;
.collectionFreeform-infoUI-close {
position: absolute;
- top: -10;
- left: -10;
+ top: -10px;
+ left: -10px;
}
.collectionFreeform-infoUI-msg {
position: relative;
- max-width: 500;
- margin: 10;
+ max-width: 500px;
+ margin: 10px;
}
.collectionFreeform-infoUI-button {
border-radius: 50px;
font-size: 12px;
- padding: 6;
+ padding: 6px;
position: relative;
}
diff --git a/src/client/views/collections/collectionFreeForm/CollectionFreeFormView.tsx b/src/client/views/collections/collectionFreeForm/CollectionFreeFormView.tsx
index 5bbe93a90..8f9b132e8 100644
--- a/src/client/views/collections/collectionFreeForm/CollectionFreeFormView.tsx
+++ b/src/client/views/collections/collectionFreeForm/CollectionFreeFormView.tsx
@@ -8,7 +8,7 @@ import { computedFn } from 'mobx-utils';
import * as React from 'react';
import { AiOutlineSend } from 'react-icons/ai';
import ReactLoading from 'react-loading';
-import { ClientUtils, DashColor, lightOrDark, OmitKeys, returnFalse, returnZero, setupMoveUpEvents, UpdateIcon } from '../../../../ClientUtils';
+import { ClientUtils, DashColor, lightOrDark, OmitKeys, returnFalse, returnTrue, returnZero, setupMoveUpEvents, UpdateIcon } from '../../../../ClientUtils';
import { DateField } from '../../../../fields/DateField';
import { Doc, DocListCast, Field, FieldType, Opt, StrListCast } from '../../../../fields/Doc';
import { DocData, DocLayout, Height, Width } from '../../../../fields/DocSymbols';
@@ -178,7 +178,7 @@ export class CollectionFreeFormView extends CollectionSubView<Partial<collection
return renderableEles;
}
@computed get fitContentsToBox() {
- return (this._props.fitContentsToBox?.() || this.Document._freeform_fitContentsToBox) && !this.isAnnotationOverlay;
+ return (this._props.fitContentsToBox?.() || this.Document._freeform_fitContentsToBox || this.Document.freeform_isGroup) && !this.isAnnotationOverlay;
}
@computed get nativeWidth() {
return this._props.NativeWidth?.() || Doc.NativeWidth(this.Document);
@@ -344,7 +344,7 @@ export class CollectionFreeFormView extends CollectionSubView<Partial<collection
*/
focusOnPoint = (options: FocusViewOptions) => {
const { pointFocus, zoomTime, didMove } = options;
- if (!this.Document.isGroup && pointFocus && !didMove) {
+ if (!this.Document.freeform_isGroup && pointFocus && !didMove) {
const dfltScale = this.isAnnotationOverlay ? 1 : 0.25;
if (this.layoutDoc[this.scaleFieldKey] !== dfltScale) {
this.zoomSmoothlyAboutPt(this.screenToFreeformContentsXf.transformPoint(pointFocus.X, pointFocus.Y), dfltScale, zoomTime);
@@ -382,7 +382,7 @@ export class CollectionFreeFormView extends CollectionSubView<Partial<collection
* @returns
*/
focus = (anchor: Doc, options: FocusViewOptions) => {
- if (anchor.isGroup && !options.docTransform && options.contextPath?.length) {
+ if (Doc.IsFreeformGroup(anchor) && !options.docTransform && options.contextPath?.length) {
// don't focus on group if there's a context path because we're about to focus on a group item
// which will override any group focus. (If we allowed the group to focus, it would mark didMove even if there were no net movement)
return undefined;
@@ -397,7 +397,7 @@ export class CollectionFreeFormView extends CollectionSubView<Partial<collection
}
const xfToCollection = options?.docTransform ?? Transform.Identity();
const savedState = { panX: NumCast(this.Document[this.panXFieldKey]), panY: NumCast(this.Document[this.panYFieldKey]), scale: options?.willZoomCentered ? this.Document[this.scaleFieldKey] : undefined };
- const cantTransform = this.fitContentsToBox || ((this.Document.isGroup || this.layoutDoc._lockedTransform) && !DocumentView.LightboxDoc());
+ const cantTransform = this.fitContentsToBox || ((this.Document.freeform_isGroup || this.layoutDoc._lockedTransform) && !DocumentView.LightboxDoc());
const { panX, panY, scale } = cantTransform || (!options.willPan && !options.willZoomCentered) ? savedState : this.calculatePanIntoView(anchor, xfToCollection, options?.willZoomCentered ? (options?.zoomScale ?? 0.75) : undefined);
// focus on the document in the collection
@@ -516,7 +516,7 @@ export class CollectionFreeFormView extends CollectionSubView<Partial<collection
this._downTime = Date.now();
const scrollMode = e.altKey ? (Doc.UserDoc().freeformScrollMode === freeformScrollMode.Pan ? freeformScrollMode.Zoom : freeformScrollMode.Pan) : Doc.UserDoc().freeformScrollMode;
if (e.button === 0 && (!(e.ctrlKey && !e.metaKey) || scrollMode !== freeformScrollMode.Pan) && this._props.isContentActive()) {
- if (!this.Document.isGroup) {
+ if (!this.Document.freeform_isGroup) {
// group freeforms don't pan when dragged -- instead let the event go through to allow the group itself to drag
// prettier-ignore
const hit = this._clusters.handlePointerDown(this.screenToFreeformContentsXf.transformPoint(e.clientX, e.clientY));
@@ -1273,7 +1273,7 @@ export class CollectionFreeFormView extends CollectionSubView<Partial<collection
@action
zoom = (pointX: number, pointY: number, deltaY: number): void => {
- if (this.Document.isGroup || this.Document[(this._props.viewField ?? '_') + 'freeform_noZoom']) return;
+ if (this.Document.freeform_isGroup || this.Document[(this._props.viewField ?? '_') + 'freeform_noZoom']) return;
let deltaScale = deltaY > 0 ? 1 / 1.05 : 1.05;
if (deltaScale < 0) deltaScale = -deltaScale;
const [x, y] = this.screenToFreeformContentsXf.transformPoint(pointX, pointY);
@@ -1300,7 +1300,7 @@ export class CollectionFreeFormView extends CollectionSubView<Partial<collection
@action
onPointerWheel = (e: React.WheelEvent): void => {
- if (this.Document.isGroup || !this.isContentActive()) return; // group style collections neither pan nor zoom
+ if (this.Document.freeform_isGroup || !this.isContentActive()) return; // group style collections neither pan nor zoom
SnappingManager.TriggerUserPanned();
if (this.layoutDoc._Transform || this.Document.treeView_OutlineMode === TreeViewType.outline) return;
e.stopPropagation();
@@ -1424,7 +1424,7 @@ export class CollectionFreeFormView extends CollectionSubView<Partial<collection
@action
zoomSmoothlyAboutPt(docpt: number[], scale: number, transitionTime = 500) {
- if (this.Document.isGroup) return;
+ if (this.Document.freeform_isGroup) return;
this.setPanZoomTransition(transitionTime);
const screenXY = this.screenToFreeformContentsXf.inverse().transformPoint(docpt[0], docpt[1]);
this.layoutDoc[this.scaleFieldKey] = scale;
@@ -1507,7 +1507,7 @@ export class CollectionFreeFormView extends CollectionSubView<Partial<collection
removeDocument = (docs: Doc | Doc[], annotationKey?: string | undefined) => {
const ret = !!this._props.removeDocument?.(docs, annotationKey);
// if this is a group and we have fewer than 2 Docs, then just promote what's left to our parent and get rid of the group.
- if (ret && DocListCast(this.dataDoc[annotationKey ?? this.fieldKey]).length < 2 && this.Document.isGroup) {
+ if (ret && DocListCast(this.dataDoc[annotationKey ?? this.fieldKey]).length < 2 && this.Document.freeform_isGroup) {
this.promoteCollection();
}
return ret;
@@ -1550,7 +1550,7 @@ export class CollectionFreeFormView extends CollectionSubView<Partial<collection
searchFilterDocs={this.searchFilterDocs}
isDocumentActive={childLayout.pointerEvents === 'none' ? returnFalse : this._props.childDocumentsActive?.() ? this._props.isDocumentActive : this.isContentActive}
isContentActive={this.childContentsActive}
- focus={this.Document.isGroup ? this.groupFocus : this.isAnnotationOverlay ? this._props.focus : this.focus}
+ focus={this.Document.freeform_isGroup ? this.groupFocus : this.isAnnotationOverlay ? this._props.focus : this.focus}
addDocTab={this.addDocTab}
addDocument={this._props.addDocument}
removeDocument={this.removeDocument}
@@ -1735,15 +1735,16 @@ export class CollectionFreeFormView extends CollectionSubView<Partial<collection
});
PinDocView(
anchor,
- { pinDocLayout: pinProps?.pinDocLayout, pinData: { ...(pinProps?.pinData ? { ...pinProps.pinData, poslayoutview: pinProps.pinData.dataview } : {}), pannable: !this.Document.isGroup, collectionType: true, filters: true } },
+ { pinDocLayout: pinProps?.pinDocLayout, pinData: { ...(pinProps?.pinData ? { ...pinProps.pinData, poslayoutview: pinProps.pinData.dataview } : {}), pannable: !this.Document.freeform_isGroup, collectionType: true, filters: true } },
this.Document
);
if (addAsAnnotation) {
- if (Cast(this.dataDoc[this._props.fieldKey + '_annotations'], listSpec(Doc), null) !== undefined) {
- Cast(this.dataDoc[this._props.fieldKey + '_annotations'], listSpec(Doc), [])?.push(anchor);
+ const fieldKey = this._props.isAnnotationOverlay ? this._props.fieldKey : this._props.fieldKey + '_annotations';
+ if (Cast(this.dataDoc[fieldKey], listSpec(Doc), null) !== undefined) {
+ Cast(this.dataDoc[fieldKey], listSpec(Doc), [])?.push(anchor);
} else {
- this.dataDoc[this._props.fieldKey + '_annotations'] = new List<Doc>([anchor]);
+ this.dataDoc[fieldKey] = new List<Doc>([anchor]);
}
}
return anchor;
@@ -1806,7 +1807,7 @@ export class CollectionFreeFormView extends CollectionSubView<Partial<collection
this._firstRender = false;
this._disposers.groupBounds = reaction(
() => {
- if (this.Document.isGroup && this.childDocs.length === this.childDocList?.length) {
+ if (this.Document.freeform_isGroup && this.childDocs.length === this.childDocList?.length) {
const clist = this.childDocs.map(cd => ({ x: NumCast(cd.x), y: NumCast(cd.y), width: NumCast(cd._width), height: NumCast(cd._height) }));
return aggregateBounds(clist, NumCast(this.layoutDoc._xMargin), NumCast(this.layoutDoc._yMargin));
}
@@ -1968,8 +1969,8 @@ export class CollectionFreeFormView extends CollectionSubView<Partial<collection
const appearance = ContextMenu.Instance.findByDescription('Appearance...');
const appearanceItems = appearance?.subitems ?? [];
- !this.Document.isGroup && appearanceItems.push({ description: 'Reset View', event: this.resetView, icon: 'compress-arrows-alt' });
- !this.Document.isGroup && appearanceItems.push({ description: 'Toggle Auto Reset View', event: this.toggleResetView, icon: 'compress-arrows-alt' });
+ !this.Document.freeform_isGroup && appearanceItems.push({ description: 'Reset View', event: this.resetView, icon: 'compress-arrows-alt' });
+ !this.Document.freeform_isGroup && appearanceItems.push({ description: 'Toggle Auto Reset View', event: this.toggleResetView, icon: 'compress-arrows-alt' });
if (this._props.setContentViewBox === emptyFunction) {
!appearance && ContextMenu.Instance.addItem({ description: 'Appearance...', subitems: appearanceItems, icon: 'eye' });
return;
@@ -1987,7 +1988,7 @@ export class CollectionFreeFormView extends CollectionSubView<Partial<collection
!Doc.noviceMode && appearanceItems.push({ description: `update icon`, event: () => this.updateIcon(), icon: 'compress-arrows-alt' });
this._props.renderDepth && appearanceItems.push({ description: 'Ungroup collection', event: this.promoteCollection, icon: 'table' });
- this.Document.isGroup && this.Document.transcription && appearanceItems.push({ description: 'Ink to text', event: this.transcribeStrokes, icon: 'font' });
+ this.Document.freeform_isGroup && this.Document.transcription && appearanceItems.push({ description: 'Ink to text', event: this.transcribeStrokes, icon: 'font' });
!Doc.noviceMode ? appearanceItems.push({ description: 'Arrange contents in grid', event: this.layoutDocsInGrid, icon: 'table' }) : null;
!Doc.noviceMode ? appearanceItems.push({ description: (this.Document._freeform_useClusters ? 'Hide' : 'Show') + ' Clusters', event: () => this._clusters.updateClusters(!this.Document._freeform_useClusters), icon: 'braille' }) : null;
@@ -2046,7 +2047,7 @@ export class CollectionFreeFormView extends CollectionSubView<Partial<collection
};
transcribeStrokes = undoable(() => {
- if (this.Document.isGroup && this.Document.transcription) {
+ if (this.Document.freeform_isGroup && this.Document.transcription) {
const text = StrCast(this.Document.transcription);
const lines = text.split('\n');
const height = 30 + 15 * lines.length;
@@ -2064,7 +2065,7 @@ export class CollectionFreeFormView extends CollectionSubView<Partial<collection
dragStarting = (snapToDraggedDoc: boolean = false, showGroupDragTarget: boolean = true, visited = new Set<Doc>()) => {
if (visited.has(this.Document)) return;
visited.add(this.Document);
- showGroupDragTarget && (this.GroupChildDrag = BoolCast(this.Document.isGroup));
+ showGroupDragTarget && (this.GroupChildDrag = BoolCast(this.Document.freeform_isGroup));
const activeDocs = this.getActiveDocuments();
const size = this.screenToFreeformContentsXf.transformDirection(this._props.PanelWidth(), this._props.PanelHeight());
const selRect = { left: this.panX() - size[0] / 2, top: this.panY() - size[1] / 2, width: size[0], height: size[1] };
@@ -2072,13 +2073,15 @@ export class CollectionFreeFormView extends CollectionSubView<Partial<collection
const isDocInView = (doc: Doc, rect: { left: number; top: number; width: number; height: number }) => intersectRect(docDims(doc), rect);
const snappableDocs = activeDocs.filter(doc => doc.z === undefined && isDocInView(doc, selRect)); // first see if there are any foreground docs to snap to
- activeDocs.filter(doc => doc.isGroup && SnappingManager.IsResizing !== doc[Id] && !DragManager.docsBeingDragged.includes(doc)).forEach(doc => DocumentView.getDocumentView(doc)?.ComponentView?.dragStarting?.(snapToDraggedDoc, false, visited));
+ activeDocs
+ .filter(doc => Doc.IsFreeformGroup(doc) && SnappingManager.IsResizing !== doc[Id] && !DragManager.docsBeingDragged.includes(doc))
+ .forEach(doc => DocumentView.getDocumentView(doc)?.ComponentView?.dragStarting?.(snapToDraggedDoc, false, visited));
const horizLines: number[] = [];
const vertLines: number[] = [];
const invXf = this.screenToFreeformContentsXf.inverse();
snappableDocs
- .filter(doc => !doc.isGroup && (snapToDraggedDoc || (SnappingManager.IsResizing !== doc[Id] && !DragManager.docsBeingDragged.includes(doc))))
+ .filter(doc => !Doc.IsFreeformGroup(doc) && (snapToDraggedDoc || (SnappingManager.IsResizing !== doc[Id] && !DragManager.docsBeingDragged.includes(doc))))
.forEach(doc => {
const { left, top, width, height } = docDims(doc);
const topLeftInScreen = invXf.transformPoint(left, top);
@@ -2102,6 +2105,7 @@ export class CollectionFreeFormView extends CollectionSubView<Partial<collection
}
this.childDocs.some(doc => !this._renderCutoffData.get(doc[Id])) && setTimeout(this.incrementalRender, 1);
});
+ showBorderRounding = returnTrue;
showPresPaths = () => SnappingManager.ShowPresPaths;
brushedView = () => this._brushedView;
gridColor = () => DashColor(lightOrDark(this.backgroundColor)).fade(0.5).toString(); // prettier-ignore
@@ -2170,7 +2174,7 @@ export class CollectionFreeFormView extends CollectionSubView<Partial<collection
{...this._props}
ref={this._marqueeViewRef}
Doc={this.Document}
- ungroup={this.Document.isGroup ? this.promoteCollection : undefined}
+ ungroup={this.Document.freeform_isGroup ? this.promoteCollection : undefined}
nudge={this.isAnnotationOverlay || this._props.renderDepth > 0 ? undefined : this.nudge}
addDocTab={this.addDocTab}
slowLoadDocuments={this.slowLoadDocuments}
diff --git a/src/client/views/collections/collectionFreeForm/FaceCollectionBox.scss b/src/client/views/collections/collectionFreeForm/FaceCollectionBox.scss
index 0a001d84c..d0685e419 100644
--- a/src/client/views/collections/collectionFreeForm/FaceCollectionBox.scss
+++ b/src/client/views/collections/collectionFreeForm/FaceCollectionBox.scss
@@ -2,7 +2,7 @@
display: flex;
height: max-content;
flex-direction: column;
- top: 0;
+ top: 0px;
position: absolute;
width: 100%;
height: 100%;
@@ -31,9 +31,9 @@
}
.face-document-top {
position: relative;
- top: 0;
+ top: 0px;
width: 100%;
- left: 0;
+ left: 0px;
}
.face-document-image-container {
@@ -69,8 +69,8 @@
.remove-item {
position: absolute;
- bottom: -5;
- right: -5;
+ bottom: -5px;
+ right: -5px;
background-color: rgba(0, 0, 0, 0.5); // Optional: to add a background behind the icon for better visibility
border-radius: 30%;
width: 10px; // Adjust size as needed
@@ -98,7 +98,7 @@
.faceCollectionBox {
width: 100%;
height: 100%;
- top: 0;
- left: 0;
+ top: 0px;
+ left: 0px;
position: absolute;
}
diff --git a/src/client/views/collections/collectionFreeForm/ImageLabelBox.tsx b/src/client/views/collections/collectionFreeForm/ImageLabelBox.tsx
index ff9fb14e7..e3a3f9b05 100644
--- a/src/client/views/collections/collectionFreeForm/ImageLabelBox.tsx
+++ b/src/client/views/collections/collectionFreeForm/ImageLabelBox.tsx
@@ -160,15 +160,16 @@ export class ImageLabelBox extends ViewBoxBaseComponent<FieldViewProps>() {
classifyImagesInBox = async () => {
this.startLoading();
+ const selectedImages = this._selectedImages;
// Converts the images into a Base64 format, afterwhich the information is sent to GPT to label them.
- const imageInfos = this._selectedImages.map(async doc => {
+ const imageInfos = selectedImages.map(async doc => {
if (!doc.$tags_chat) {
const url = ImageCastWithSuffix(doc[Doc.LayoutDataKey(doc)], '_o') ?? '';
return imageUrlToBase64(url).then(hrefBase64 =>
!hrefBase64 ? undefined :
- gptImageLabel(hrefBase64,'Give three labels to describe this image.').then(labels =>
+ gptImageLabel(hrefBase64, 'Give three labels to describe this image.').then(labels =>
({ doc, labels }))) ; // prettier-ignore
}
});
diff --git a/src/client/views/collections/collectionFreeForm/MarqueeOptionsMenu.tsx b/src/client/views/collections/collectionFreeForm/MarqueeOptionsMenu.tsx
index abd828945..2ec59e5d5 100644
--- a/src/client/views/collections/collectionFreeForm/MarqueeOptionsMenu.tsx
+++ b/src/client/views/collections/collectionFreeForm/MarqueeOptionsMenu.tsx
@@ -16,6 +16,7 @@ export class MarqueeOptionsMenu extends AntimodeMenu<AntimodeMenuProps> {
public createCollection: (e: KeyboardEvent | React.PointerEvent | undefined, group?: boolean, selection?: Doc[]) => Doc | void = unimplementedFunction;
public delete: (e: KeyboardEvent | React.PointerEvent | undefined) => void = unimplementedFunction;
public summarize: (e: KeyboardEvent | React.PointerEvent | undefined) => void = unimplementedFunction;
+ public generateScrapbook: (e: KeyboardEvent | React.PointerEvent | undefined) => void = unimplementedFunction;
public showMarquee: () => void = unimplementedFunction;
public hideMarquee: () => void = unimplementedFunction;
public pinWithView: (e: KeyboardEvent | React.PointerEvent | undefined) => void = unimplementedFunction;
@@ -38,6 +39,7 @@ export class MarqueeOptionsMenu extends AntimodeMenu<AntimodeMenuProps> {
<IconButton tooltip="Create a Collection" onPointerDown={this.createCollection} icon={<FontAwesomeIcon icon="object-group" />} color={this.userColor} />
<IconButton tooltip="Create a Grouping" onPointerDown={e => this.createCollection(e, true)} icon={<FontAwesomeIcon icon="layer-group" />} color={this.userColor} />
<IconButton tooltip="Summarize Documents" onPointerDown={this.summarize} icon={<FontAwesomeIcon icon="compress-arrows-alt" />} color={this.userColor} />
+ <IconButton tooltip="Generate Scrapbook" onPointerDown={this.generateScrapbook} icon={<FontAwesomeIcon icon="palette" />} color={this.userColor} />
<IconButton tooltip="Delete Documents" onPointerDown={this.delete} icon={<FontAwesomeIcon icon="trash-alt" />} color={this.userColor} />
<IconButton tooltip="Pin selected region" onPointerDown={this.pinWithView} icon={<FontAwesomeIcon icon="map-pin" />} color={this.userColor} />
<IconButton tooltip="Classify and Sort Images" onPointerDown={this.classifyImages} icon={<FontAwesomeIcon icon="object-group" />} color={this.userColor} />
diff --git a/src/client/views/collections/collectionFreeForm/MarqueeView.scss b/src/client/views/collections/collectionFreeForm/MarqueeView.scss
index 7c9d0f6e1..135f4deac 100644
--- a/src/client/views/collections/collectionFreeForm/MarqueeView.scss
+++ b/src/client/views/collections/collectionFreeForm/MarqueeView.scss
@@ -1,7 +1,7 @@
.marqueeView {
position: inherit;
- top: 0;
- left: 0;
+ top: 0px;
+ left: 0px;
width: 100%;
height: 100%;
overflow: hidden;
@@ -20,7 +20,7 @@
pointer-events: none;
.marquee-legend {
bottom: -18px;
- left: 0;
+ left: 0px;
position: absolute;
font-size: 9;
white-space: nowrap;
@@ -28,4 +28,4 @@
.marquee-legend::after {
content: 'Press <space> for lasso';
}
-}
+} \ No newline at end of file
diff --git a/src/client/views/collections/collectionFreeForm/MarqueeView.tsx b/src/client/views/collections/collectionFreeForm/MarqueeView.tsx
index 3cc7c0f2d..ff78b332a 100644
--- a/src/client/views/collections/collectionFreeForm/MarqueeView.tsx
+++ b/src/client/views/collections/collectionFreeForm/MarqueeView.tsx
@@ -28,6 +28,9 @@ import { FormattedTextBox } from '../../nodes/formattedText/FormattedTextBox';
import { SubCollectionViewProps } from '../CollectionSubView';
import { ImageLabelBoxData } from './ImageLabelBox';
import { MarqueeOptionsMenu } from './MarqueeOptionsMenu';
+import { StrListCast } from '../../../../fields/Doc';
+import { requestAiGeneratedPreset, DocumentDescriptor } from '../../nodes/scrapbook/AIPresetGenerator';
+import { buildPlaceholdersFromConfigs, slotRealDocIntoPlaceholders } from '../../nodes/scrapbook/ScrapbookBox';
import './MarqueeView.scss';
interface MarqueeViewProps {
@@ -76,6 +79,11 @@ export class MarqueeView extends ObservableReactComponent<SubCollectionViewProps
@observable _labelsVisibile: boolean = false;
@observable _lassoPts: [number, number][] = [];
@observable _lassoFreehand: boolean = false;
+ // ─── New Observables for “Pick 1 of N AI Scrapbook” ───
+ @observable aiChoices: Doc[] = []; // temporary hidden Scrapbook docs
+ @observable pickerX = 0; // popup x coordinate
+ @observable pickerY = 0; // popup y coordinate
+ @observable pickerVisible = false; // show/hide ScrapbookPicker
@computed get Transform() {
return this._props.getTransform();
@@ -190,6 +198,7 @@ export class MarqueeView extends ObservableReactComponent<SubCollectionViewProps
FormattedTextBox.SelectOnLoadChar = Doc.UserDoc().defaultTextLayout && !this._props.childLayoutString ? e.key : '';
FormattedTextBox.LiveTextUndo = UndoManager.StartBatch('type new note');
this._props.addLiveTextDocument(DocUtils.GetNewTextDoc('-typed text-', x, y, 200, 100));
+ setTimeout(() => FormattedTextBox.LiveTextUndo?.end(), 100);
e.stopPropagation();
}
};
@@ -275,6 +284,7 @@ export class MarqueeView extends ObservableReactComponent<SubCollectionViewProps
MarqueeOptionsMenu.Instance.createCollection = this.collection;
MarqueeOptionsMenu.Instance.delete = this.delete;
MarqueeOptionsMenu.Instance.summarize = this.summary;
+ MarqueeOptionsMenu.Instance.generateScrapbook = this.generateScrapbook;
MarqueeOptionsMenu.Instance.showMarquee = this.showMarquee;
MarqueeOptionsMenu.Instance.hideMarquee = this.hideMarquee;
MarqueeOptionsMenu.Instance.jumpTo(e.clientX, e.clientY);
@@ -372,7 +382,7 @@ export class MarqueeView extends ObservableReactComponent<SubCollectionViewProps
? creator(selected, { title: 'nested stack' })
: ((doc: Doc) => {
doc.$data = new List<Doc>(selected);
- doc.$isGroup = makeGroup;
+ doc.$freeform_isGroup = makeGroup;
doc.$title = makeGroup ? 'grouping' : 'nested freeform';
doc._freeform_panX = doc._freeform_panY = 0;
return doc;
@@ -508,7 +518,7 @@ export class MarqueeView extends ObservableReactComponent<SubCollectionViewProps
_layout_showSidebar: true,
title: 'overview',
});
- const portal = Docs.Create.FreeformDocument(selected, { title: 'summarized documents', x: this.Bounds.left + 200, y: this.Bounds.top, isGroup: true, backgroundColor: 'transparent' });
+ const portal = Docs.Create.FreeformDocument(selected, { title: 'summarized documents', x: this.Bounds.left + 200, y: this.Bounds.top, freeform_isGroup: true, backgroundColor: 'transparent' });
DocUtils.MakeLink(summary, portal, { link_relationship: 'summary of:summarized by' });
portal.hidden = true;
@@ -517,6 +527,77 @@ export class MarqueeView extends ObservableReactComponent<SubCollectionViewProps
MarqueeOptionsMenu.Instance.fadeOut(true);
});
+ getAiPresetsDescriptors = (): DocumentDescriptor[] =>
+ this.marqueeSelect(false).map(doc => ({
+ type: typeof doc.$type === 'string' ? doc.$type : 'UNKNOWN',
+ tags: Array.from(new Set(StrListCast(doc.$tags_chat))),
+ }));
+
+ generateScrapbook = action(async () => {
+ const selectedDocs = this.marqueeSelect(false);
+ if (!selectedDocs.length) return;
+
+ const descriptors = this.getAiPresetsDescriptors();
+ if (descriptors.length === 0) {
+ alert('No documents selected to generate a scrapbook from!');
+ return;
+ }
+
+ const aiPreset = await requestAiGeneratedPreset(descriptors);
+ if (!aiPreset.length) {
+ alert('Failed to generate preset');
+ return;
+ }
+ const scrapbookPlaceholders: Doc[] = buildPlaceholdersFromConfigs(aiPreset);
+ /*
+ const scrapbookPlaceholders: Doc[] = aiPreset.map(cfg => {
+ const placeholderDoc = Docs.Create.TextDocument(cfg.tag);
+ placeholderDoc.placeholder_docType = cfg.type as DocumentType;
+ placeholderDoc.placeholder_acceptTags = new List<string>(cfg.acceptTags ?? [cfg.tag]);
+
+ const placeholder = new Doc();
+ placeholder.proto = placeholderDoc;
+ placeholder.original = placeholderDoc;
+ placeholder.x = cfg.x;
+ placeholder.y = cfg.y;
+ if (cfg.width != null) placeholder._width = cfg.width;
+ if (cfg.height != null) placeholder._height = cfg.height;
+
+ return placeholder;
+ });*/
+
+ const scrapbook = Docs.Create.ScrapbookDocument(scrapbookPlaceholders, {
+ backgroundColor: '#e2ad32',
+ x: this.Bounds.left,
+ y: this.Bounds.top,
+ _width: 500,
+ _height: 500,
+ title: 'AI-generated Scrapbook',
+ });
+
+ // 3) Now grab that new scrapbook’s flat placeholders
+ const allPlaceholders = DocUtils.unwrapPlaceholders(scrapbookPlaceholders);
+
+ // 4) Slot each selectedDocs[i] into the first matching placeholder
+ selectedDocs.forEach(realDoc => slotRealDocIntoPlaceholders(realDoc, allPlaceholders));
+
+ const selected = selectedDocs.map(d => {
+ this._props.removeDocument?.(d);
+ d.x = NumCast(d.x) - this.Bounds.left;
+ d.y = NumCast(d.y) - this.Bounds.top;
+ return d;
+ });
+
+ this._props.addDocument?.(scrapbook);
+ const portal = Docs.Create.FreeformDocument(selected, { title: 'docs in scrapbook', x: this.Bounds.left + 200, y: this.Bounds.top, isGroup: true, backgroundColor: 'transparent' });
+ DocUtils.MakeLink(scrapbook, portal, { link_relationship: 'scrapbook of:in scrapbook' });
+
+ portal.hidden = true;
+ this._props.addDocument?.(portal);
+ MarqueeOptionsMenu.Instance.fadeOut(true);
+ this.hideMarquee();
+ });
+
@action
marqueeCommand = (e: KeyboardEvent) => {
const ee = e as unknown as KeyboardEvent & { propagationIsStopped?: boolean };
@@ -538,6 +619,7 @@ export class MarqueeView extends ObservableReactComponent<SubCollectionViewProps
if (e.key === 'g') this.collection(e, true);
if (e.key === 'c' || e.key === 't') this.collection(e);
if (e.key === 's' || e.key === 'S') this.summary();
+ if (e.key === 'g' || e.key === 'G') this.generateScrapbook(); // ← scrapbook shortcut
if (e.key === 'p') this.pileup();
this.cleanupInteractions(false);
}
@@ -682,25 +764,27 @@ export class MarqueeView extends ObservableReactComponent<SubCollectionViewProps
};
render() {
return (
- <div
- className="marqueeView"
- ref={r => {
- r?.addEventListener('dashDragMovePause', this.onDragMovePause as EventListenerOrEventListenerObject);
- this.MarqueeRef = r;
- }}
- style={{
- overflow: StrCast(this._props.Document._overflow),
- cursor: Doc.ActiveTool === InkTool.Ink || this._visible ? 'crosshair' : 'pointer',
- }}
- onDragOver={e => e.preventDefault()}
- onScroll={e => {
- e.currentTarget.scrollTop = e.currentTarget.scrollLeft = 0;
- }}
- onClick={this.onClick}
- onPointerDown={this.onPointerDown}>
- {this._visible ? this.marqueeDiv : null}
- {this.props.children}
- </div>
+ <>
+ <div
+ className="marqueeView"
+ ref={r => {
+ r?.addEventListener('dashDragMovePause', this.onDragMovePause as EventListenerOrEventListenerObject);
+ this.MarqueeRef = r;
+ }}
+ style={{
+ overflow: StrCast(this._props.Document._overflow),
+ cursor: Doc.ActiveTool === InkTool.Ink || this._visible ? 'crosshair' : 'pointer',
+ }}
+ onDragOver={e => e.preventDefault()}
+ onScroll={e => {
+ e.currentTarget.scrollTop = e.currentTarget.scrollLeft = 0;
+ }}
+ onClick={this.onClick}
+ onPointerDown={this.onPointerDown}>
+ {this._visible ? this.marqueeDiv : null}
+ {this.props.children}
+ </div>
+ </>
);
}
}
diff --git a/src/client/views/collections/collectionGrid/CollectionGridView.scss b/src/client/views/collections/collectionGrid/CollectionGridView.scss
index 4edaf9745..b95d3ea44 100644
--- a/src/client/views/collections/collectionGrid/CollectionGridView.scss
+++ b/src/client/views/collections/collectionGrid/CollectionGridView.scss
@@ -39,8 +39,8 @@
background: #d3d3d3;
position: absolute;
- height: 3;
- left: 5;
+ height: 3px;
+ left: 5px;
transform-origin: left;
transform: rotate(90deg);
outline: none;
@@ -133,7 +133,7 @@
input::-webkit-outer-spin-button,
input::-webkit-inner-spin-button {
-webkit-appearance: none;
- margin: 0;
+ margin: 0px;
}
/* Firefox */
diff --git a/src/client/views/collections/collectionLinear/CollectionLinearView.scss b/src/client/views/collections/collectionLinear/CollectionLinearView.scss
index 0dfaed38a..0053d3e60 100644
--- a/src/client/views/collections/collectionLinear/CollectionLinearView.scss
+++ b/src/client/views/collections/collectionLinear/CollectionLinearView.scss
@@ -47,7 +47,7 @@
background: global.$medium-blue;
display: flex;
border-radius: 10px;
- height: 35;
+ height: 35px;
transform: translate3d(6px, 0px, 0px);
align-content: center;
justify-content: center;
@@ -95,11 +95,11 @@
pointer-events: all;
cursor: pointer;
background-color: global.$medium-blue;
- padding: 5;
+ padding: 5px;
border-radius: 2px;
height: 100%;
- min-width: 25;
- margin: 0;
+ min-width: 25px;
+ margin: 0px;
color: global.$white;
display: flex;
font-weight: 100;
diff --git a/src/client/views/collections/collectionMulticolumn/CollectionMulticolumnView.scss b/src/client/views/collections/collectionMulticolumn/CollectionMulticolumnView.scss
index 9ed247d50..1dc46102f 100644
--- a/src/client/views/collections/collectionMulticolumn/CollectionMulticolumnView.scss
+++ b/src/client/views/collections/collectionMulticolumn/CollectionMulticolumnView.scss
@@ -1,8 +1,8 @@
.collectionMulticolumnView_drop {
height: 100%;
width: 100%;
- top: 0;
- left: 0;
+ top: 0px;
+ left: 0px;
position: absolute;
.collectionMulticolumnView_contents {
@@ -18,8 +18,8 @@
align-items: center;
position: relative;
> .iconButton-container {
- top: 0;
- left: 0;
+ top: 0px;
+ left: 0px;
position: absolute;
}
diff --git a/src/client/views/collections/collectionMulticolumn/CollectionMultirowView.scss b/src/client/views/collections/collectionMulticolumn/CollectionMultirowView.scss
index 91779065d..eb157d155 100644
--- a/src/client/views/collections/collectionMulticolumn/CollectionMultirowView.scss
+++ b/src/client/views/collections/collectionMulticolumn/CollectionMultirowView.scss
@@ -1,8 +1,8 @@
.collectionMultirowView_drop {
height: 100%;
width: 100%;
- top: 0;
- left: 0;
+ top: 0px;
+ left: 0px;
position: absolute;
.collectionMultirowView_contents {
diff --git a/src/client/views/collections/collectionMulticolumn/MulticolumnResizer.tsx b/src/client/views/collections/collectionMulticolumn/MulticolumnResizer.tsx
index 10a6fa2e9..2ff99f134 100644
--- a/src/client/views/collections/collectionMulticolumn/MulticolumnResizer.tsx
+++ b/src/client/views/collections/collectionMulticolumn/MulticolumnResizer.tsx
@@ -1,4 +1,3 @@
-/* eslint-disable react/require-default-props */
import { action } from 'mobx';
import { observer } from 'mobx-react';
import * as React from 'react';
diff --git a/src/client/views/collections/collectionMulticolumn/MultirowHeightLabel.tsx b/src/client/views/collections/collectionMulticolumn/MultirowHeightLabel.tsx
index 66215f109..4f57e1656 100644
--- a/src/client/views/collections/collectionMulticolumn/MultirowHeightLabel.tsx
+++ b/src/client/views/collections/collectionMulticolumn/MultirowHeightLabel.tsx
@@ -1,4 +1,3 @@
-/* eslint-disable react/require-default-props */
import { computed } from 'mobx';
import { observer } from 'mobx-react';
import * as React from 'react';
diff --git a/src/client/views/collections/collectionMulticolumn/MultirowResizer.tsx b/src/client/views/collections/collectionMulticolumn/MultirowResizer.tsx
index 918365700..1954b4743 100644
--- a/src/client/views/collections/collectionMulticolumn/MultirowResizer.tsx
+++ b/src/client/views/collections/collectionMulticolumn/MultirowResizer.tsx
@@ -1,4 +1,3 @@
-/* eslint-disable react/require-default-props */
import { action } from 'mobx';
import { observer } from 'mobx-react';
import * as React from 'react';
@@ -66,7 +65,7 @@ export default class ResizeBar extends React.Component<ResizerProps> {
style={{
pointerEvents: this.props.isContentActive?.() ? 'all' : 'none',
height: this.props.height,
- backgroundColor: !this.props.isContentActive?.() ? '' : this.props.styleProvider?.(undefined, undefined, StyleProp.WidgetColor) as string,
+ backgroundColor: !this.props.isContentActive?.() ? '' : (this.props.styleProvider?.(undefined, undefined, StyleProp.WidgetColor) as string),
}}>
<div className="multiRowResizer-hdl" onPointerDown={e => this.registerResizing(e)} />
</div>
diff --git a/src/client/views/collections/collectionSchema/CollectionSchemaView.scss b/src/client/views/collections/collectionSchema/CollectionSchemaView.scss
index 53c0823ea..e975ae6f6 100644
--- a/src/client/views/collections/collectionSchema/CollectionSchemaView.scss
+++ b/src/client/views/collections/collectionSchema/CollectionSchemaView.scss
@@ -18,7 +18,7 @@
.schema-add {
position: relative;
- height: 35;
+ height: 35px;
display: flex;
align-items: center;
top: -10px;
@@ -147,7 +147,7 @@
flex-direction: row;
justify-content: space-between;
align-items: center;
- padding: 0;
+ padding: 0px;
z-index: 1;
border: 1px solid global.$medium-gray;
@@ -231,7 +231,7 @@
overflow-x: hidden;
overflow-y: auto;
display: inline-flex;
- padding: 0;
+ padding: 0px;
align-items: center;
input[type='text'] {
border: unset;
@@ -272,8 +272,8 @@
.row-menu-infos {
position: absolute;
- top: 3;
- left: 3;
+ top: 3px;
+ left: 3px;
z-index: 1;
display: flex;
justify-content: flex-end;
diff --git a/src/client/views/global/globalCssVariables.module.scss b/src/client/views/global/globalCssVariables.module.scss
index 82f6caa52..7641d4929 100644
--- a/src/client/views/global/globalCssVariables.module.scss
+++ b/src/client/views/global/globalCssVariables.module.scss
@@ -75,7 +75,7 @@ $CAROUSEL3D_CENTER_SCALE: 1.3;
$CAROUSEL3D_SIDE_SCALE: 0.6;
$CAROUSEL3D_TOP: 15;
-$DATA_VIZ_TABLE_ROW_HEIGHT: 30;
+$DATA_VIZ_TABLE_ROW_HEIGHT: 30px;
:export {
contextMenuZindex: $contextMenu-zindex;
diff --git a/src/client/views/linking/LinkMenuItem.scss b/src/client/views/linking/LinkMenuItem.scss
index 3cd60c87f..cc8c168cf 100644
--- a/src/client/views/linking/LinkMenuItem.scss
+++ b/src/client/views/linking/LinkMenuItem.scss
@@ -114,7 +114,7 @@
.linkMenu-deleteButton {
width: 20px;
height: 20px;
- margin: 0;
+ margin: 0px;
margin-right: 4px;
padding-right: 6px;
border-radius: 50%;
@@ -134,7 +134,7 @@
}
&:last-child {
- margin-right: 0;
+ margin-right: 0px;
}
&:hover {
diff --git a/src/client/views/linking/LinkMenuItem.tsx b/src/client/views/linking/LinkMenuItem.tsx
index c984a7053..6c1ad568d 100644
--- a/src/client/views/linking/LinkMenuItem.tsx
+++ b/src/client/views/linking/LinkMenuItem.tsx
@@ -105,11 +105,7 @@ export class LinkMenuItem extends ObservableReactComponent<LinkMenuItemProps> {
LinkManager.Instance.currentLinkAnchor = LinkManager.Instance.currentLink ? this.sourceAnchor : undefined;
if ((SnappingManager.PropertiesWidth ?? 0) < 100) {
- setTimeout(
- action(() => {
- SnappingManager.SetPropertiesWidth(250);
- })
- );
+ setTimeout(action(() => SnappingManager.SetPropertiesWidth(250)));
}
}
})
@@ -136,14 +132,14 @@ export class LinkMenuItem extends ObservableReactComponent<LinkMenuItemProps> {
this._props.itemHandler?.(this._props.linkDoc);
} else {
const focusDoc =
- Cast(this._props.linkDoc.link_anchor_1, Doc, null)?.annotationOn === this._props.sourceDoc
- ? Cast(this._props.linkDoc.link_anchor_1, Doc, null)
- : Cast(this._props.linkDoc.link_anchor_2, Doc, null)?.annotationOn === this._props.sourceDoc
- ? Cast(this._props.linkDoc.link_anchor_12, Doc, null)
- : undefined;
+ DocCast(this._props.linkDoc.link_anchor_1)?.annotationOn === this._props.sourceDoc
+ ? DocCast(this._props.linkDoc.link_anchor_1)
+ : DocCast(this._props.linkDoc.link_anchor_2)?.annotationOn === this._props.sourceDoc
+ ? DocCast(this._props.linkDoc.link_anchor_2)
+ : undefined; // prettier-ignore
if (focusDoc) this._props.docView._props.focus(focusDoc, { instant: true });
- DocumentView.FollowLink(this._props.linkDoc, this._props.sourceDoc, false);
+ DocumentView.FollowLink(this._props.linkDoc, focusDoc ?? this._props.sourceDoc, false);
}
}
);
diff --git a/src/client/views/linking/LinkPopup.scss b/src/client/views/linking/LinkPopup.scss
index 4bfb4b0b9..f8d724767 100644
--- a/src/client/views/linking/LinkPopup.scss
+++ b/src/client/views/linking/LinkPopup.scss
@@ -1,7 +1,9 @@
.linkPopup-container {
background: white;
- box-shadow: 0 10px 20px rgba(0, 0, 0, 0.19), 0 6px 6px rgba(0, 0, 0, 0.23);
- top: 0;
+ box-shadow:
+ 0 10px 20px rgba(0, 0, 0, 0.19),
+ 0 6px 6px rgba(0, 0, 0, 0.23);
+ top: 0px;
height: 200px;
width: 200px;
// padding: 15px;
diff --git a/src/client/views/linking/LinkPopup.tsx b/src/client/views/linking/LinkPopup.tsx
index b654f9bd0..760850241 100644
--- a/src/client/views/linking/LinkPopup.tsx
+++ b/src/client/views/linking/LinkPopup.tsx
@@ -1,4 +1,3 @@
-/* eslint-disable react/require-default-props */
import { observer } from 'mobx-react';
import * as React from 'react';
import { returnEmptyFilter, returnFalse, returnTrue } from '../../../ClientUtils';
diff --git a/src/client/views/newlightbox/NewLightboxView.scss b/src/client/views/newlightbox/NewLightboxView.scss
index 76c34bcf9..c76a7d60d 100644
--- a/src/client/views/newlightbox/NewLightboxView.scss
+++ b/src/client/views/newlightbox/NewLightboxView.scss
@@ -2,8 +2,8 @@
.newLightboxView-frame {
position: absolute;
- top: 0;
- left: 0;
+ top: 0px;
+ left: 0px;
width: 100%;
height: 100%;
background: #474545bb;
diff --git a/src/client/views/newlightbox/components/Recommendation/Recommendation.scss b/src/client/views/newlightbox/components/Recommendation/Recommendation.scss
index cf6b5ccb1..09d3ccc62 100644
--- a/src/client/views/newlightbox/components/Recommendation/Recommendation.scss
+++ b/src/client/views/newlightbox/components/Recommendation/Recommendation.scss
@@ -135,7 +135,7 @@
font-size: 10px;
width: 100%;
background: newstyles.$blue-l1;
- border-radius: 0;
+ border-radius: 0px;
padding: 10px;
.concepts-container {
diff --git a/src/client/views/nodes/AudioBox.scss b/src/client/views/nodes/AudioBox.scss
index 933a383ea..c25c09af9 100644
--- a/src/client/views/nodes/AudioBox.scss
+++ b/src/client/views/nodes/AudioBox.scss
@@ -138,7 +138,7 @@
input[type='range']::-webkit-slider-thumb {
box-shadow: 0;
- border: 0;
+ border: 0px;
height: 10px;
width: 10px;
border-radius: 10px;
@@ -168,7 +168,7 @@
.audiobox-button {
width: 15px;
height: 15px;
- margin: 0;
+ margin: 0px;
svg {
width: 10px;
diff --git a/src/client/views/nodes/CollectionFreeFormDocumentView.scss b/src/client/views/nodes/CollectionFreeFormDocumentView.scss
index 7f0a39550..300533df8 100644
--- a/src/client/views/nodes/CollectionFreeFormDocumentView.scss
+++ b/src/client/views/nodes/CollectionFreeFormDocumentView.scss
@@ -3,7 +3,7 @@
position: absolute;
background-color: transparent;
touch-action: manipulation;
- top: 0;
- left: 0;
+ top: 0px;
+ left: 0px;
pointer-events: none;
}
diff --git a/src/client/views/nodes/ComparisonBox.scss b/src/client/views/nodes/ComparisonBox.scss
index d2ba9796b..cbbd6bde3 100644
--- a/src/client/views/nodes/ComparisonBox.scss
+++ b/src/client/views/nodes/ComparisonBox.scss
@@ -18,7 +18,7 @@
}
.input-box {
position: absolute;
- top: 50;
+ top: 50px;
padding: 10px;
width: 100%;
height: 70%;
@@ -33,7 +33,7 @@
padding-right: 5px;
border-radius: 2px;
height: 17%;
- bottom: 0;
+ bottom: 0px;
overflow: hidden;
display: flex;
width: 100%;
@@ -101,7 +101,7 @@
position: absolute;
display: inline-block;
margin-top: 150px;
- bottom: 0;
+ bottom: 0px;
}
.dropup-content {
@@ -145,8 +145,8 @@
.clip-div {
position: absolute;
- top: 0;
- left: 0;
+ top: 0px;
+ left: 0px;
height: 100%;
overflow: hidden;
@@ -180,8 +180,8 @@
.afterBox-cont {
position: absolute;
- top: 0;
- right: 0;
+ top: 0px;
+ right: 0px;
height: 100%;
width: 100%;
overflow: hidden;
@@ -331,8 +331,8 @@
justify-content: space-between;
height: max-content;
position: absolute;
- bottom: 0;
- right: 2;
+ bottom: 0px;
+ right: 2px;
flex-direction: row-reverse;
display: flex;
cursor: pointer;
diff --git a/src/client/views/nodes/DataVizBox/DataVizBox.scss b/src/client/views/nodes/DataVizBox/DataVizBox.scss
index 9825d926f..32a01355e 100644
--- a/src/client/views/nodes/DataVizBox/DataVizBox.scss
+++ b/src/client/views/nodes/DataVizBox/DataVizBox.scss
@@ -37,25 +37,25 @@
margin-left: 10px;
margin-bottom: -10px;
}
-
+
.displaySchemaLive {
margin-bottom: 20px;
}
.dataviz-sidebar {
position: absolute;
- right: 0;
- top: 0;
+ right: 0px;
+ top: 0px;
height: 100%;
}
.button-container {
pointer-events: unset;
}
- .dataVizBox-annotationLayer{
+ .dataVizBox-annotationLayer {
position: absolute;
transform-origin: left top;
- top: 0;
+ top: 0px;
width: 100%;
pointer-events: none;
mix-blend-mode: multiply;
diff --git a/src/client/views/nodes/DataVizBox/DocCreatorMenu/Backend/TemplateManager.ts b/src/client/views/nodes/DataVizBox/DocCreatorMenu/Backend/TemplateManager.ts
new file mode 100644
index 000000000..526fcf9c4
--- /dev/null
+++ b/src/client/views/nodes/DataVizBox/DocCreatorMenu/Backend/TemplateManager.ts
@@ -0,0 +1,91 @@
+import { action, makeAutoObservable } from 'mobx';
+import { Col } from '../DocCreatorMenu';
+import { FieldSettings, TemplateField } from '../TemplateFieldTypes/TemplateField';
+import { Template } from '../Template';
+import { NumListCast } from '../../../../../../fields/Doc';
+import { DataVizBox } from '../../DataVizBox';
+import { TemplateFieldType } from '../TemplateBackend';
+import { TemplateMenuAIUtils } from './TemplateMenuAIUtils';
+
+export type Conditional = {
+ field: string;
+ operator: '=' | '>' | '<' | 'contains';
+ condition: string;
+ target: string;
+ attribute: string;
+ value: string;
+};
+
+export class TemplateManager {
+ _templates: Template[] = [];
+
+ _conditionalFieldLogic: Record<string, Conditional[]> = {};
+
+ constructor(templateSettings: FieldSettings[]) {
+ makeAutoObservable(this);
+ this._templates = templateSettings.map(settings => new Template(settings));
+ }
+
+ getValidTemplates = (cols: Col[]) => this._templates.filter(template => template.isValidTemplate(cols));
+
+ addTemplate = (newTemplate: Template) => this._templates.push(newTemplate);
+
+ removeTemplate = (template: Template) => {
+ if (this._templates.includes(template)) {
+ this._templates.splice(this._templates.indexOf(template), 1);
+ }
+ template.cleanup();
+ };
+
+ addFieldCondition = (fieldTitle: string, condition: Conditional) => {
+ if (this._conditionalFieldLogic[fieldTitle] === undefined) {
+ this._conditionalFieldLogic[fieldTitle] = [condition];
+ } else {
+ this._conditionalFieldLogic[fieldTitle].push(condition);
+ }
+ };
+
+ removeFieldCondition = (fieldTitle: string, condition: Conditional) => (this._conditionalFieldLogic[fieldTitle] = this._conditionalFieldLogic[fieldTitle]?.filter(cond => cond !== condition));
+
+ addDataField = (title: string) => this._templates.forEach(template => template.addDataField(title));
+
+ removeDataField = (title: string) => this._templates.forEach(template => template.removeDataField(title));
+
+ createDocsFromTemplate = action((dv: DataVizBox, template: Template, cols: Col[], debug: boolean = false) => {
+ const csvFields = Array.from(Object.keys(dv.records[0]));
+
+ const processContent = (content: { [title: string]: string }) => {
+ const templateCopy = template.clone();
+
+ csvFields
+ .filter(title => title)
+ .forEach(title => {
+ const field = templateCopy.getFieldByTitle(title);
+ field?.setContent(content[title], field.viewType);
+ });
+
+ const gptFunc = (type: TemplateFieldType) => (type === TemplateFieldType.VISUAL ? TemplateMenuAIUtils.renderGPTImageCall : TemplateMenuAIUtils.renderGPTTextCall);
+
+ const generateGptContent = cols
+ .map(field => ({ field, templateField: field?.AIGenerated && templateCopy.getFieldByTitle(field.title) }))
+ .filter(({ templateField }) => templateField instanceof TemplateField)
+ .map(({ field, templateField }) => gptFunc(field.type)(templateCopy, field, (templateField as TemplateField).getID));
+
+ return Promise.all(generateGptContent).then(() => templateCopy.applyConditionalLogic(this._conditionalFieldLogic));
+ };
+
+ const rowContents = debug
+ ? [{}, {}, {}, {}]
+ : NumListCast(dv.layoutDoc.dataViz_selectedRows).map(row =>
+ csvFields.reduce(
+ (values, col) => {
+ values[col] = dv.records[row][col];
+ return values;
+ },
+ {} as { [title: string]: string }
+ )
+ );
+
+ return Promise.all(rowContents.map(processContent));
+ });
+}
diff --git a/src/client/views/nodes/DataVizBox/DocCreatorMenu/Backend/TemplateMenuAIUtils.ts b/src/client/views/nodes/DataVizBox/DocCreatorMenu/Backend/TemplateMenuAIUtils.ts
new file mode 100644
index 000000000..08818dd6c
--- /dev/null
+++ b/src/client/views/nodes/DataVizBox/DocCreatorMenu/Backend/TemplateMenuAIUtils.ts
@@ -0,0 +1,122 @@
+import { ClientUtils } from '../../../../../../ClientUtils';
+import { Networking } from '../../../../../Network';
+import { gptImageCall, gptAPICall, GPTCallType } from '../../../../../apis/gpt/GPT';
+import { Col } from '../DocCreatorMenu';
+import { TemplateFieldSize, TemplateFieldType } from '../TemplateBackend';
+import { ViewType } from '../TemplateFieldTypes/TemplateField';
+import { Template } from '../Template';
+import { Upload } from '../../../../../../server/SharedMediaTypes';
+
+export class TemplateMenuAIUtils {
+ public static generateGPTImage = async (prompt: string): Promise<string | undefined> => {
+ try {
+ const res = await gptImageCall(prompt);
+
+ if (res) {
+ const result = (await Networking.PostToServer('/uploadRemoteImage', { sources: res })) as Upload.FileInformation[];
+ const source = ClientUtils.prepend(result[0].accessPaths.agnostic.client);
+ return source;
+ }
+ } catch (e) {
+ console.log(e);
+ }
+ };
+
+ public static renderGPTImageCall = async (template: Template, col: Col, fieldNumber: number): Promise<boolean> => {
+ const generateAndLoadImage = async (id: number, prompt: string) => {
+ const field = template.getFieldByID(id);
+ const url = await this.generateGPTImage(prompt);
+ field?.setContent(url ?? '', ViewType.IMG);
+ field?.setTitle(col.title);
+ };
+
+ const fieldContent: string = template.compiledContent;
+
+ try {
+ const sysPrompt =
+ `#${Math.random() * 100}: Your job is to create a prompt for an AI image generator to help it generate an image based on existing content in a template and a user prompt. Your prompt should focus heavily on visual elements to help the image generator; avoid unecessary info that might distract it. ONLY INCLUDE THE PROMPT, NO OTHER TEXT OR EXPLANATION. The existing content is as follows: ` +
+ fieldContent +
+ ' **** The user prompt is: ' +
+ col.desc;
+
+ const prompt = await gptAPICall(sysPrompt, GPTCallType.COMPLETEPROMPT);
+
+ await generateAndLoadImage(fieldNumber, prompt);
+ } catch (e) {
+ console.log(e);
+ }
+ return true;
+ };
+
+ public static renderGPTTextCall = async (template: Template, col: Col, fieldNum: number | undefined): Promise<boolean> => {
+ const wordLimit = (size: TemplateFieldSize) => {
+ switch (size) {
+ case TemplateFieldSize.TINY:
+ return 2;
+ case TemplateFieldSize.SMALL:
+ return 5;
+ case TemplateFieldSize.MEDIUM:
+ return 20;
+ case TemplateFieldSize.LARGE:
+ return 50;
+ case TemplateFieldSize.HUGE:
+ return 100;
+ default:
+ return 10;
+ }
+ };
+
+ const textAssignment = `--- title: ${col.title}, prompt: ${col.desc}, word limit: ${wordLimit(col.sizes[0])} words, assigned field: ${fieldNum} ---`;
+
+ const fieldContent: string = template.compiledContent;
+
+ try {
+ const prompt = fieldContent + textAssignment;
+
+ const res = await gptAPICall(`${Math.random() * 100000}: ${prompt}`, GPTCallType.FILL);
+
+ if (res) {
+ const assignments: { [title: string]: { number: string; content: string } } = JSON.parse(res);
+ Object.entries(assignments).forEach(([, /* title */ info]) => {
+ const field = template.getFieldByID(Number(info.number));
+
+ field?.setContent(info.content ?? '', ViewType.TEXT);
+ field?.setTitle(col.title);
+ });
+ }
+ } catch (err) {
+ console.log(err);
+ }
+
+ return true;
+ };
+
+ /**
+ * Populates a preset template framework with content from a datavizbox or any AI-generated content.
+ * @param template the preloaded template framework being filled in
+ * @param assignments a list of template field numbers (from top to bottom) and their assigned columns from the linked dataviz
+ * @returns a doc containing the fully rendered template
+ */
+ public static applyGPTContentToTemplate = async (template: Template, assignments: { [field: string]: Col }): Promise<Template | undefined> => {
+ const GPTTextCalls = Object.entries(assignments).filter(([, col]) => col.type === TemplateFieldType.TEXT && col.AIGenerated);
+ const GPTIMGCalls = Object.entries(assignments).filter(([, col]) => col.type === TemplateFieldType.VISUAL && col.AIGenerated);
+
+ if (GPTTextCalls.length) {
+ const promises = GPTTextCalls.map(([id, col]) => {
+ return TemplateMenuAIUtils.renderGPTTextCall(template, col, Number(id));
+ });
+
+ await Promise.all(promises);
+ }
+
+ if (GPTIMGCalls.length) {
+ const promises = GPTIMGCalls.map(async ([id, col]) => {
+ return TemplateMenuAIUtils.renderGPTImageCall(template, col, Number(id));
+ });
+
+ await Promise.all(promises);
+ }
+
+ return template;
+ };
+}
diff --git a/src/client/views/nodes/DataVizBox/DocCreatorMenu/DocCreatorMenu.scss b/src/client/views/nodes/DataVizBox/DocCreatorMenu/DocCreatorMenu.scss
index 57f4a1e94..e2261b9e2 100644
--- a/src/client/views/nodes/DataVizBox/DocCreatorMenu/DocCreatorMenu.scss
+++ b/src/client/views/nodes/DataVizBox/DocCreatorMenu/DocCreatorMenu.scss
@@ -9,10 +9,10 @@
position: absolute;
z-index: 1000;
// box-shadow: 0px 3px 4px rgba(0, 0, 0, 30%);
- // background: whitesmoke;
+ // background: whitesmoke;
// color: black;
border-radius: 3px;
-}
+}
.docCreatorMenu-menu {
display: flex;
@@ -24,57 +24,39 @@
.docCreatorMenu-menu-button {
width: 25px;
height: 25px;
- background: whitesmoke;
+ background: whitesmoke;
background-color: rgb(50, 50, 50);
border-radius: 5px;
- border: 1px solid rgb(180, 180, 180);
padding: 0px;
font-size: 13px;
//box-shadow: 3px 3px rgb(29, 29, 31);
&:hover {
box-shadow: none;
- }
-
- &.right{
- margin-left: 0px;
- font-size: 12px;
+ background-color: rgb(60, 60, 65);
}
- &.close-menu {
- font-size: 12px;
- width: 18px;
- height: 18px;
- font-size: 12px;
- margin-left: auto;
- margin-right: 5px;
- margin-bottom: 3px;
+ &.no-margin {
+ margin: 0px;
}
- &.options {
- margin-left: 0px;
+ &.border {
+ border: 1px solid rgb(180, 180, 180);
}
- &:hover {
- background-color: rgb(60, 60, 65);
+ &.float-right {
+ float: right;
+ margin-left: auto;
}
- &.top-bar {
- border-bottom: 25px solid #555;
- border-left: 12px solid transparent;
- border-right: 12px solid transparent;
- // border-top-left-radius: 5px;
- // border-top-right-radius: 5px;
- border-radius: 0px;
- height: 0;
- width: 50px;
+ &.absolute-right {
+ position: absolute;
+ right: 0px;
}
- &.preview-toggle {
- margin: 0px;
- border-top-left-radius: 0px;
- border-bottom-left-radius: 0px;
- border-left: 0px;
+ &.right {
+ margin-left: 0px;
+ font-size: 12px;
}
}
@@ -121,31 +103,31 @@
}
}
- &:hover::before{
+ &:hover::before {
border-bottom: 20px solid rgb(82, 82, 82);
}
&::before {
- content: "";
+ content: '';
position: absolute;
- top: 0;
- left: 0;
+ top: 0px;
+ left: 0px;
border-bottom: 20px solid rgb(50, 50, 50);
border-left: 12px solid transparent;
border-right: 12px solid transparent;
- height: 0;
+ height: 0px;
width: 50px;
}
&::after {
- content: "";
+ content: '';
position: absolute;
top: -1px;
left: -1px;
border-bottom: 22px solid rgb(180, 180, 180);
border-left: 12px solid transparent;
border-right: 12px solid transparent;
- height: 0;
+ height: 0px;
width: 52px;
z-index: -1;
}
@@ -161,7 +143,7 @@
color: white;
}
-.docCreatorMenu-menu-hr{
+.docCreatorMenu-menu-hr {
margin-top: 0px;
margin-bottom: 0px;
color: rgb(180, 180, 180);
@@ -191,14 +173,14 @@
align-items: center;
width: 40px;
height: 40px;
- background-color: rgb(99, 148, 238);
+ background-color: rgb(99, 148, 238);
border: 2px solid rgb(80, 107, 152);
border-radius: 5px;
margin-bottom: 20px;
font-size: 25px;
- &:hover{
- background-color: rgb(59, 128, 255);
+ &:hover {
+ background-color: rgb(59, 128, 255);
border: 2px solid rgb(53, 80, 127);
}
}
@@ -206,7 +188,7 @@
.docCreatorMenu-create-docs-button {
width: 40px;
height: 40px;
- background-color: rgb(176, 229, 149);
+ background-color: rgb(176, 229, 149);
border: 2px solid rgb(126, 219, 80);
border-radius: 5px;
padding: 0px;
@@ -217,7 +199,7 @@
&:hover {
background-color: rgb(129, 223, 83);
- border: 2px solid rgb(80, 185, 28);
+ border: 2px solid rgb(80, 185, 28);
}
}
@@ -230,6 +212,14 @@
&.full {
width: 100%;
}
+
+ &.no-margin-bottom {
+ margin-bottom: 0px;
+ }
+
+ &.no-margin-top {
+ margin-top: 0px;
+ }
}
//------------------------------------------------------------------------------------------------------------------------------------------
@@ -240,17 +230,22 @@
position: absolute;
background-color: none;
- &.top, &.bottom {
+ &.top,
+ &.bottom {
height: 10px;
cursor: ns-resize;
}
- &.right, &.left {
+ &.right,
+ &.left {
width: 10px;
cursor: ew-resize;
}
- &.topRight, &.topLeft, &.bottomRight, &.bottomLeft {
+ &.topRight,
+ &.topLeft,
+ &.bottomRight,
+ &.bottomLeft {
height: 15px;
width: 15px;
background-color: none;
@@ -273,22 +268,10 @@
height: calc(100% - 30px);
border: 1px solid rgb(180, 180, 180);
border-radius: 5px;
- -ms-overflow-style: none;
+ -ms-overflow-style: none;
scrollbar-width: none;
}
-.docCreatorMenu-preview-container {
- display: grid;
- grid-template-columns: repeat(2, 140px);
- grid-template-rows: 140px;
- grid-auto-rows: 141px;
- overflow-y: scroll;
- margin: 0px;
- margin-top: 0px;
- width: 100%;
- height: 100%;
-}
-
.docCreatorMenu-expanded-template-preview {
display: flex;
flex-direction: column;
@@ -297,8 +280,9 @@
position: relative;
width: 100%;
height: 100%;
+ flex-grow: 1;
- .top-panel{
+ .top-panel {
width: 100%;
height: 10px;
}
@@ -307,7 +291,7 @@
display: flex;
flex-direction: column;
justify-content: flex-start;
- height: 100%;
+ height: fit-content;
position: absolute;
right: 0px;
top: 0px;
@@ -322,17 +306,15 @@
display: flex;
justify-content: center;
align-items: center;
- width: 113px;
- height: 113px;
- margin-top: 10px;
- margin-left: 10px;
+ height: 100%;
+ width: 100%;
+ aspect-ratio: 1;
color: none;
border: 1px solid rgb(163, 163, 163);
border-radius: 5px;
box-shadow: 5px 5px rgb(29, 29, 31);
- flex: 0 0 auto;
- &:hover{
+ &:hover {
background-color: rgb(72, 72, 73);
}
@@ -377,21 +359,18 @@
&:hover .option-button {
display: block;
}
-
}
-.docCreatorMenu-preview-image{
+.docCreatorMenu-preview-image {
background-color: transparent;
- height: 100px;
- width: 100px;
+ height: 100%;
display: block;
object-fit: contain;
border-radius: 5px;
+}
- &.expanded {
- height: 100%;
- width: 100%;
- }
+.docCreatorMenu-variations-tab {
+ flex-grow: 0.5;
}
.docCreatorMenu-section {
@@ -399,12 +378,12 @@
flex-direction: column;
align-items: center;
position: relative;
+ flex-grow: 1;
+ height: 100%;
+ width: 100%;
margin: 0px;
margin-top: 0px;
margin-bottom: 0px;
- width: 100%;
- height: 200;
- flex: 0 0 auto;
}
.docCreatorMenu-GPT-options-container {
@@ -412,34 +391,35 @@
flex-direction: row;
justify-content: center;
align-items: center;
- position: relative;
- width: auto;
+ position: absolute;
+ left: 50%;
+ bottom: 0px;
margin: 0px;
+ margin-bottom: 10px;
margin-top: 5px;
padding: 0px;
}
.docCreatorMenu-templates-preview-window {
- display: flex;
- flex-direction: row;
- //justify-content: center;
- align-items: center;
- overflow-y: scroll;
- position: relative;
- color: black;
- height: 125px;
+ display: grid;
+ justify-content: space-evenly;
+ row-gap: 2rem;
+ grid-template-columns: repeat(auto-fill, minmax(150px, 50%));
+ margin: 5px;
width: calc(100% - 10px);
- -ms-overflow-style: none;
- scrollbar-width: none;
+ height: 100%;
+ padding-bottom: 40px;
- .loading-spinner {
- justify-self: center;
+ &.scrolling {
+ overflow-y: scroll;
+ max-height: 300px;
+ padding-bottom: 0px;
}
}
-.divvv{
- width: 200;
- height: 200;
+.div {
+ width: 200px;
+ height: 200px;
border: solid 1px white;
}
@@ -447,20 +427,14 @@
position: relative;
display: flex;
flex-direction: row;
+ color: whitesmoke;
width: 100%;
}
-.section-reveal-options {
- margin-top: 0px;
- margin-bottom: 0px;
- margin-right: 0px;
- margin-left: auto;
- border: 0px;
- background: none;
-
- &.float-right {
- float: right;
- }
+.docCreatorMenu-templates-displays {
+ display: flex;
+ flex-direction: column;
+ height: 100%;
}
.docCreatorMenu-section-title {
@@ -478,7 +452,7 @@
.docCreatorMenu-GPT-generate {
height: 30px;
width: 30px;
- background-color: rgb(176, 229, 149);
+ background-color: rgb(176, 229, 149);
border: 1px solid rgb(126, 219, 80);
border-radius: 5px;
padding: 0px;
@@ -489,7 +463,7 @@
&:hover {
background-color: rgb(129, 223, 83);
- border: 2px solid rgb(80, 185, 28);
+ border: 2px solid rgb(80, 185, 28);
}
}
@@ -507,7 +481,7 @@
// DocCreatorMenu options CSS
//--------------------------------------------------------------------------------------------------------------------------------------------
-.docCreatorMenu-option-container{
+.docCreatorMenu-option-container {
display: flex;
width: 180px;
height: 30px;
@@ -517,16 +491,16 @@
margin-top: 10px;
margin-bottom: 10px;
- &.layout{
+ &.layout {
z-index: 5;
}
}
-.docCreatorMenu-option-title{
+.docCreatorMenu-option-title {
display: flex;
width: 140px;
height: 30px;
- background: whitesmoke;
+ background: whitesmoke;
background-color: rgb(34, 34, 37);
border-radius: 5px;
border: 1px solid rgb(180, 180, 180);
@@ -543,7 +517,7 @@
border-radius: 0px;
width: auto;
text-transform: none;
-
+
&.small {
height: 20px;
transform: translateY(-5px);
@@ -614,7 +588,7 @@
}
.docCreatorMenu-configuration-bar {
- width: 200;
+ width: 200px;
gap: 5px;
display: flex;
flex-direction: row;
@@ -637,38 +611,38 @@
height: calc(100% - 30px);
border: 1px solid rgb(180, 180, 180);
border-radius: 5px;
- -ms-overflow-style: none;
+ -ms-overflow-style: none;
scrollbar-width: none;
- .docCreatorMenu-option-container{
+ .docCreatorMenu-option-container {
width: 180px;
height: 30px;
.docCreatorMenu-dropdown-hoverable {
width: 140px;
height: 30px;
-
+
&:hover .docCreatorMenu-dropdown-content {
display: block;
}
-
+
&:hover .docCreatorMenu-option-title {
border-bottom-left-radius: 0px;
border-bottom-right-radius: 0px;
}
-
+
.docCreatorMenu-dropdown-content {
display: none;
min-width: 100px;
height: 75px;
overflow-y: scroll;
- -ms-overflow-style: none;
+ -ms-overflow-style: none;
scrollbar-width: none;
border-bottom: 1px solid rgb(180, 180, 180);
border-bottom-left-radius: 5px;
border-bottom-right-radius: 5px;
-
- .docCreatorMenu-dropdown-option{
+
+ .docCreatorMenu-dropdown-option {
display: flex;
background-color: rgb(42, 42, 46);
border-left: 1px solid rgb(180, 180, 180);
@@ -679,17 +653,30 @@
justify-content: center;
justify-items: center;
padding-top: 3px;
-
+
&:hover {
background-color: rgb(68, 68, 74);
cursor: pointer;
}
}
- }
+ }
}
}
}
+.loading-spinner {
+ position: absolute;
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ height: 100%;
+ width: 100%;
+ z-index: 200;
+ font-size: 20px;
+ font-weight: bold;
+ color: #17175e;
+}
+
.docCreatorMenu-layout-preview-window-wrapper {
flex: 0 0 auto;
display: flex;
@@ -722,17 +709,17 @@
width: 100%;
aspect-ratio: 1;
//height: auto;
- // max-width: 240;
- // max-height: 240;
+ // max-width: 240px;
+ // max-height: 240px;
border: 1px solid rgb(180, 180, 180);
border-radius: 5px;
background-color: rgb(34, 34, 37);
- -ms-overflow-style: none;
+ -ms-overflow-style: none;
scrollbar-width: none;
&.small {
- max-width: 100;
- max-height: 100;
+ max-width: 100px;
+ max-height: 100px;
}
.docCreatorMenu-layout-preview-item {
@@ -759,10 +746,10 @@
z-index: 999;
}
- .docCreatorMenu-zoom-button{
+ .docCreatorMenu-zoom-button {
width: 15px;
height: 15px;
- background: whitesmoke;
+ background: whitesmoke;
background-color: rgb(34, 34, 37);
border-radius: 3px;
border: 1px solid rgb(180, 180, 180);
@@ -793,10 +780,11 @@
height: calc(100% - 30px);
border: 1px solid rgb(180, 180, 180);
border-radius: 5px;
- -ms-overflow-style: none;
+ -ms-overflow-style: none;
scrollbar-width: none;
.panels-container {
+ display: flex;
height: 100%;
width: 100%;
flex-direction: column;
@@ -810,114 +798,12 @@
background-color: rgb(50, 50, 50);
}
-// .field-panel {
-// position: relative;
-// display: flex;
-// // align-items: flex-start;
-// flex-direction: column;
-// gap: 5px;
-// padding: 5px;
-// height: 100px;
-// //width: 100%;
-// border: 1px solid rgb(180, 180, 180);
-// margin: 5px;
-// margin-top: 0px;
-// border-radius: 3px;
-// flex: 0 0 auto;
-
-// .properties-wrapper {
-// display: flex;
-// flex-direction: row;
-// align-items: flex-start;
-// gap: 5px;
-
-// .field-property-container {
-// background-color: rgb(40, 40, 40);
-// border: 1px solid rgb(100, 100, 100);
-// border-radius: 3px;
-// width: 30%;
-// height: 25px;
-// padding-left: 3px;
-// align-items: center;
-// color: whitesmoke;
-// }
-
-// .field-type-selection-container {
-// display: flex;
-// flex-direction: row;
-// align-items: center;
-// background-color: rgb(40, 40, 40);
-// border: 1px solid rgb(100, 100, 100);
-// border-radius: 3px;
-// width: 31%;
-// height: 25px;
-// padding-left: 3px;
-// color: whitesmoke;
-
-// .placeholder {
-// color: gray;
-// }
-
-// &:hover .placeholder {
-// display: none;
-// }
-
-// .bubbles {
-// display: none;
-// }
-
-// .text {
-// margin-top: 5px;
-// margin-bottom: 5px;
-// }
-
-// &:hover .bubbles {
-// display: flex;
-// flex-direction: row;
-// align-items: flex-start;
-// }
-
-// &:hover .type-display {
-// display: none;
-// }
-
-// .bubble {
-// margin: 5px;
-// }
-
-// &:hover .bubble {
-// margin-top: 7px;
-// }
-// }
-// }
-
-// .field-description-container {
-// background-color: rgb(40, 40, 40);
-// border: 1px solid rgb(100, 100, 100);
-// border-radius: 3px;
-// width: 100%;
-// height: 100%;
-// resize: none;
-
-// ::-webkit-scrollbar-track {
-// background: none;
-// }
-// }
-
-// .top-right {
-// position: absolute;
-// top: 0px;
-// right: 0px;
-// }
-// }
-// }
-
.field-panel {
display: flex;
flex-direction: column;
align-items: center;
justify-content: flex-start;
- height: 285px;
+ height: fit-content;
width: calc(100% - 10px);
border: 1px solid rgb(180, 180, 180);
margin: 5px;
@@ -938,15 +824,22 @@
border-top-right-radius: 5px;
border-top-left-radius: 5px;
width: 100%;
- height: 20px;
+ height: fit-content;
background-color: rgb(50, 50, 50);
color: rgb(168, 167, 167);
+ font-size: medium;
.field-title {
color: whitesmoke;
+ font-size: large;
}
- }
-
+
+ &:hover {
+ background-color: rgb(72, 72, 72);
+ cursor: pointer;
+ }
+ }
+
.opts-bar {
display: flex;
flex-direction: row;
@@ -989,11 +882,11 @@
flex-direction: row;
align-items: flex-start;
}
-
+
&:hover .type-display {
display: none;
}
-
+
.bubble {
margin: 3px;
}
@@ -1028,7 +921,7 @@
flex-direction: row;
align-items: center;
}
-
+
.bubble {
margin: 3px;
margin-right: 4px;
@@ -1038,23 +931,255 @@
.desc-box {
width: 88%;
- height: 50px;
+ height: fit-content;
border: 1px solid rgb(180, 180, 180);
border-radius: 5px;
background-color: rgb(50, 50, 50);
box-shadow: 5px 5px rgb(29, 29, 31);
.content {
- height: calc(100% - 20px);
+ height: fit-content;
width: 100%;
background-color: rgb(50, 50, 50);
border-bottom-right-radius: 5px;
border-bottom-left-radius: 5px;
resize: none;
+ }
+ }
+ }
+ .conditionals-section {
+ display: flex;
+ flex-direction: column;
+ justify-content: flex-start;
+ align-items: center;
+ width: 100%;
+
+ .conditionals-title {
+ display: flex;
+ flex-direction: row;
+ width: 100%;
+ justify-content: center;
+ align-items: center;
+ margin: 5px;
+ margin-bottom: 20px;
+ font-size: large;
+ }
+ }
+
+ .form-row {
+ display: flex;
+ flex-direction: row;
+ justify-content: flex-start;
+ align-items: flex-start;
+ color: whitesmoke;
+ width: 100%;
+ height: fit-content;
+ margin-bottom: 15px;
+ flex-wrap: wrap;
+ gap: 5px;
+
+ .form-row-plain-text {
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ height: 100%;
+ width: fit-content;
+ padding-top: 2px;
+ padding-bottom: 2px;
+ }
+
+ .operator-options-dropdown {
+ display: flex;
+ flex-direction: column;
+ height: fit-content;
+
+ .operator-dropdown-option {
+ display: none;
+ }
+
+ .operator-dropdown-current {
+ border-radius: 5px;
+ background-color: rgb(50, 50, 50);
+ border: 1px solid rgb(180, 180, 180);
+ text-align: center;
+ padding: 2.25px;
+ padding-left: 4px;
+ padding-right: 4px;
+ }
+
+ &:hover .operator-dropdown-current {
+ border-bottom-right-radius: 0px;
+ border-bottom-left-radius: 0px;
+ }
+
+ &:hover .operator-dropdown-option {
+ display: flex;
+ height: fit-content;
+ align-items: center;
+ border: 1px solid rgb(180, 180, 180);
+ background-color: rgb(50, 50, 50);
+ padding: 2.25px;
+ padding-left: 8px;
+ padding-right: 8px;
+ text-align: center;
+
+ &:hover {
+ background-color: rgb(70, 70, 70);
+ cursor: pointer;
+ }
}
}
+ .form-row-textarea {
+ height: 24px;
+ width: 110px;
+ border-radius: 5px;
+ background-color: rgb(50, 50, 50);
+ border: 1px solid rgb(180, 180, 180);
+ resize: none;
+ overflow-y: scroll;
+ white-space: nowrap;
+ }
+ }
+
+ .form {
+ display: flex;
+ flex-direction: row;
+ justify-content: space-between;
+ align-items: flex-start;
+ width: 80%;
+
+ .form-action-button {
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ margin: 3px;
+ cursor: pointer;
+ }
}
+}
+
+//------------------------------------------------------------------------------------------------------------------------------------------
+// EditingWindow CSS
+//--------------------------------------------------------------------------------------------------------------------------------------------
+.docCreatorMenu-editing-firefly-section {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ justify-content: center;
+ height: 100%;
+ width: 100%;
+ padding: 5px;
+}
+
+.docCreatorMenu-firefly-options {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ justify-content: flex-end;
+ height: fit-content;
+ width: 100%;
+}
+
+.docCreatorMenu-variation-prompt-row {
+ display: flex;
+ flex-direction: row;
+ justify-content: flex-start;
+ align-items: center;
+ gap: 15px;
+ height: fit-content;
+ width: 100%;
+}
+
+.docCreatorMenu-variation-prompt-input-textbox {
+ height: 40px;
+ width: 80%;
+ color: white;
+ margin-top: 1%;
+ margin-bottom: 1%;
+ margin-left: 5%;
+ background-color: rgb(50, 50, 50);
+ border-radius: 5px;
+ overflow: hidden;
+ resize: none;
+}
+
+.options‑menu {
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ gap: 2rem;
+ padding: 0.5rem 1rem;
+ background: rgb(50, 50, 50);
+ color: whitesmoke;
+ font-family: system-ui, sans-serif;
+ font-size: 0.9rem;
+ flex-wrap: wrap;
+}
+
+.menu‑item {
+ display: flex;
+ align-items: center;
+ gap: 0.5rem;
+ white-space: nowrap;
+}
+
+.menu‑item input[type='range'] {
+ width: 7rem;
+ accent-color: whitesmoke;
+}
+
+.value {
+ min-width: 2ch;
+ text-align: right;
+}
+
+.switch {
+ gap: 0.75rem;
+ margin-bottom: 0px;
+}
+
+.switch .slider {
+ position: relative;
+ width: 2.2rem;
+ height: 1.1rem;
+ background: whitesmoke;
+ border-radius: 1rem;
+ cursor: pointer;
+ transition: background 0.2s;
+}
+
+.switch .slider::before {
+ content: '';
+ position: absolute;
+ top: 0.1rem;
+ left: 0.1rem;
+ width: 0.9rem;
+ height: 0.9rem;
+ background: rgb(50, 50, 50);
+ border-radius: 50%;
+ transition: transform 0.2s;
+}
+
+.switch input {
+ display: none;
+}
+
+.switch input:checked + .slider {
+ background: #78c2f1;
+}
+
+.switch input:checked + .slider::before {
+ transform: translateX(1.1rem);
+}
+
+.firefly-option-label {
+ padding: 0.2em 0.6em 0.3em;
+ font-size: 100%;
+ color: whitesmoke;
+ text-align: center;
+ margin-bottom: 0px;
+ font-weight: 500;
}
diff --git a/src/client/views/nodes/DataVizBox/DocCreatorMenu/DocCreatorMenu.tsx b/src/client/views/nodes/DataVizBox/DocCreatorMenu/DocCreatorMenu.tsx
index 64416c26d..fb083ea75 100644
--- a/src/client/views/nodes/DataVizBox/DocCreatorMenu/DocCreatorMenu.tsx
+++ b/src/client/views/nodes/DataVizBox/DocCreatorMenu/DocCreatorMenu.tsx
@@ -1,36 +1,32 @@
+import { IconProp } from '@fortawesome/fontawesome-svg-core';
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
-import { Colors } from '@dash/components';
import { action, computed, makeObservable, observable, runInAction } from 'mobx';
import { observer } from 'mobx-react';
-import { IDisposer } from 'mobx-utils';
import * as React from 'react';
-import ReactLoading from 'react-loading';
-import { ClientUtils, returnEmptyFilter, returnFalse, setupMoveUpEvents } from '../../../../../ClientUtils';
+import { returnFalse, setupMoveUpEvents } from '../../../../../ClientUtils';
import { emptyFunction } from '../../../../../Utils';
-import { Doc, NumListCast, StrListCast, returnEmptyDoclist } from '../../../../../fields/Doc';
+import { Doc, StrListCast } from '../../../../../fields/Doc';
import { Id } from '../../../../../fields/FieldSymbols';
-import { ImageCast, StrCast } from '../../../../../fields/Types';
-import { ImageField } from '../../../../../fields/URLField';
-import { Networking } from '../../../../Network';
-import { GPTCallType, gptAPICall, gptImageCall } from '../../../../apis/gpt/GPT';
-import { Docs, DocumentOptions } from '../../../../documents/Documents';
+import { GPTCallType, gptAPICall } from '../../../../apis/gpt/GPT';
import { DragManager } from '../../../../util/DragManager';
import { SnappingManager } from '../../../../util/SnappingManager';
import { UndoManager, undoable } from '../../../../util/UndoManager';
import { ObservableReactComponent } from '../../../ObservableReactComponent';
import { CollectionFreeFormView } from '../../../collections/collectionFreeForm/CollectionFreeFormView';
-import { DocumentView, DocumentViewInternal } from '../../DocumentView';
+import { DocumentView } from '../../DocumentView';
import { OpenWhere } from '../../OpenWhere';
import { DataVizBox } from '../DataVizBox';
import './DocCreatorMenu.scss';
-import { DefaultStyleProvider } from '../../../StyleProvider';
-import { Transform } from '../../../../util/Transform';
-import { TemplateFieldSize, TemplateFieldType, TemplateLayouts } from './TemplateBackend';
-import { TemplateManager } from './TemplateManager';
+import { ViewType } from './TemplateFieldTypes/TemplateField';
import { Template } from './Template';
-import { Field, FieldContentType } from './FieldTypes/Field';
-import { IconProp } from '@fortawesome/fontawesome-svg-core';
-import { Upload } from '../../../../../server/SharedMediaTypes';
+import { TemplateFieldSize, TemplateFieldType, TemplateLayouts } from './TemplateBackend';
+import { TemplateManager } from './Backend/TemplateManager';
+import { TemplateMenuAIUtils } from './Backend/TemplateMenuAIUtils';
+import { TemplatePreviewGrid } from './Menu/TemplatePreviewGrid';
+import { FireflyStructureOptions, TemplateEditingWindow } from './Menu/TemplateEditingWindow';
+import { DocCreatorMenuButton } from './Menu/DocCreatorMenuButton';
+import { TemplatesRenderPreviewWindow } from './Menu/TemplateRenderPreviewWindow';
+import { TemplateMenuFieldOptions } from './Menu/TemplateMenuFieldOptions';
export enum LayoutType {
FREEFORM = 'Freeform',
@@ -61,6 +57,7 @@ export type Col = {
title: string;
type: TemplateFieldType;
defaultContent?: string;
+ AIGenerated?: boolean;
};
interface DocCreateMenuProps {
@@ -72,33 +69,20 @@ export class DocCreatorMenu extends ObservableReactComponent<DocCreateMenuProps>
// eslint-disable-next-line no-use-before-define
static Instance: DocCreatorMenu;
- private _disposers: { [name: string]: IDisposer } = {};
-
+ DEBUG_MODE: boolean = false;
private _ref: HTMLDivElement | null = null;
-
private templateManager: TemplateManager;
- @observable _fullyRenderedDocs: Doc[] = [];
- @observable _renderedDocCollectionPreview: Doc | undefined = undefined;
- @observable _renderedDocCollection: Doc | undefined = undefined;
- @observable _docsRendering: boolean = false;
+ @observable _docsRendering: boolean = false; // dictates loading symbol
- @observable _userTemplates: { template: Template; doc: Doc }[] = []; //!!! used to keep track of all templates, should be refactored to work with actual templates and not docs
+ @observable _userTemplates: Template[] = [];
@observable _selectedTemplate: Template | undefined = undefined;
@observable _currEditingTemplate: Template | undefined = undefined;
+ @observable _editedTemplateTrail: Template[] = [];
@observable _userCreatedFields: Col[] = [];
- @observable _selectedCols: { title: string; type: string; desc: string }[] | undefined = [];
-
- @observable _layout: { type: LayoutType; yMargin: number; xMargin: number; columns?: number; repeat: number } = { type: LayoutType.FREEFORM, yMargin: 10, xMargin: 10, columns: 3, repeat: 0 };
- @observable _layoutPreviewScale: number = 1;
- @observable _savedLayouts: DataVizTemplateLayout[] = [];
- @observable _expandedPreview: Doc | undefined = undefined;
@observable _suggestedTemplates: Template[] = [];
- @observable _suggestedTemplatePreviews: { doc: Doc; template: Template }[] = [];
- @observable _GPTOpt: boolean = false;
- @observable _callCount: number = 0;
@observable _GPTLoading: boolean = false;
@observable _pageX: number = 0;
@@ -110,9 +94,8 @@ export class DocCreatorMenu extends ObservableReactComponent<DocCreateMenuProps>
@observable _startPos?: { x: number; y: number };
@observable _shouldDisplay: boolean = false;
- @observable _menuContent: 'templates' | 'options' | 'saved' | 'dashboard' = 'templates';
+ @observable _menuContent: 'templates' | 'renderPreview' | 'saved' | 'dashboard' | 'templateEditing' = 'templates';
@observable _dragging: boolean = false;
- @observable _draggingIndicator: boolean = false;
@observable _dataViz?: DataVizBox;
@observable _interactionLock: boolean | undefined;
@observable _snapPt: { x: number; y: number } = { x: 0, y: 0 };
@@ -122,7 +105,8 @@ export class DocCreatorMenu extends ObservableReactComponent<DocCreateMenuProps>
@observable _resizeUndo: UndoManager.Batch | undefined = undefined;
@observable _initDimensions: { width: number; height: number; x?: number; y?: number } = { width: 300, height: 400, x: undefined, y: undefined };
@observable _menuDimensions: { width: number; height: number } = { width: 400, height: 400 };
- @observable _editing: boolean = false;
+
+ @observable _variations: Template[] = [];
constructor(props: DocCreateMenuProps) {
super(props);
@@ -134,56 +118,13 @@ export class DocCreatorMenu extends ObservableReactComponent<DocCreateMenuProps>
@action setDataViz = (dataViz: DataVizBox) => {
this._dataViz = dataViz;
this._selectedTemplate = undefined;
- this._renderedDocCollection = undefined;
- this._renderedDocCollectionPreview = undefined;
- this._fullyRenderedDocs = [];
- this._suggestedTemplatePreviews = [];
this._suggestedTemplates = [];
this._userCreatedFields = [];
};
- @action addUserTemplate = (template: Template) => {
- this._userTemplates.push({ template: template.cloneBase(), doc: template.getRenderedDoc() });
- };
- @action removeUserTemplate = (template: Template) => {
- this._userTemplates = this._userTemplates.filter(info => info.template !== template);
- };
- @action updateTemplatePreview = (template: Template) => {
- template.renderUpdates();
- const preview = { template: template, doc: template.getRenderedDoc() };
- this._suggestedTemplatePreviews = this._suggestedTemplatePreviews.map(t => { return t.template === preview.template ? preview : t }); //prettier-ignore
- this._userTemplates = this._userTemplates.map(t => { return t.template === preview.template ? preview : t }); //prettier-ignore
- };
@action setSuggestedTemplates = (templates: Template[]) => {
- this._suggestedTemplates = templates;
- this._suggestedTemplatePreviews = templates.map(template => {return {template: template, doc: template.getRenderedDoc()}}); //prettier-ignore
+ this._suggestedTemplates = templates; //prettier-ignore
};
- @computed get docsToRender() {
- return this._selectedTemplate ? NumListCast(this._dataViz?.layoutDoc.dataViz_selectedRows) : [];
- }
-
- @computed get rowsCount() {
- switch (this._layout.type) {
- case LayoutType.FREEFORM:
- return Math.ceil(this.docsToRender.length / (this._layout.columns ?? 1)) ?? 0;
- case LayoutType.CAROUSEL3D:
- return 1.8;
- default:
- return 1;
- }
- }
-
- @computed get columnsCount() {
- switch (this._layout.type) {
- case LayoutType.FREEFORM:
- return this._layout.columns ?? 0;
- case LayoutType.CAROUSEL3D:
- return 3;
- default:
- return 1;
- }
- }
-
@computed get selectedFields() {
return StrListCast(this._dataViz?.layoutDoc._dataViz_axes);
}
@@ -210,10 +151,6 @@ export class DocCreatorMenu extends ObservableReactComponent<DocCreateMenuProps>
.concat(this._userCreatedFields);
}
- @computed get canMakeDocs() {
- return this._selectedTemplate !== undefined && this._layout !== undefined;
- }
-
get bounds(): { t: number; b: number; l: number; r: number } {
const rect = this._ref?.getBoundingClientRect();
const bounds = { t: rect?.top ?? 0, b: rect?.bottom ?? 0, l: rect?.left ?? 0, r: rect?.right ?? 0 };
@@ -221,17 +158,11 @@ export class DocCreatorMenu extends ObservableReactComponent<DocCreateMenuProps>
}
setUpButtonClick = (e: React.PointerEvent, func: () => void) => {
- setupMoveUpEvents(
- this,
- e,
- returnFalse,
- emptyFunction,
- undoable(clickEv => {
- clickEv.stopPropagation();
- clickEv.preventDefault();
- func();
- }, 'create docs')
- );
+ setupMoveUpEvents(this, e, returnFalse, emptyFunction, clickEv => {
+ clickEv.stopPropagation();
+ clickEv.preventDefault();
+ undoable(func, 'create docs')();
+ });
};
@action
@@ -269,7 +200,6 @@ export class DocCreatorMenu extends ObservableReactComponent<DocCreateMenuProps>
}
componentWillUnmount() {
- Object.values(this._disposers).forEach(disposer => disposer?.());
document.removeEventListener('pointerdown', this.onPointerDown, true);
document.removeEventListener('pointerup', this.onPointerUp);
}
@@ -319,10 +249,10 @@ export class DocCreatorMenu extends ObservableReactComponent<DocCreateMenuProps>
const { scale, refPt, transl } = this.getResizeVals(thisPt, dragHdl);
!this._interactionLock && runInAction(async () => { // resize selected docs if we're not in the middle of a resize (ie, throttle input events to frame rate)
- this._interactionLock = true;
- const scaleAspect = {x: scale.x, y: scale.y};
- this.resizeView(refPt, scaleAspect, transl); // prettier-ignore
- await new Promise<boolean | undefined>(res => { setTimeout(() => { res(this._interactionLock = undefined)})});
+ this._interactionLock = true;
+ const scaleAspect = {x: scale.x, y: scale.y};
+ this.resizeView(refPt, scaleAspect, transl); // prettier-ignore
+ await new Promise<boolean | undefined>(res => { setTimeout(() => { res(this._interactionLock = undefined)})});
}); // prettier-ignore
return true;
};
@@ -365,66 +295,29 @@ export class DocCreatorMenu extends ObservableReactComponent<DocCreateMenuProps>
this._pageY = y + translation.y;
};
- async getIcon(doc: Doc) {
- const docView = DocumentView.getDocumentView(doc);
- if (docView) {
- docView.ComponentView?.updateIcon?.();
- return new Promise<ImageField | undefined>(res => setTimeout(() => res(ImageCast(docView.Document.icon)), 500));
- }
- return undefined;
+ async createDocsForPreview() {
+ return this._dataViz && this._selectedTemplate ? ((await this.templateManager.createDocsFromTemplate(this._dataViz, this._selectedTemplate, this.fieldsInfos, this.DEBUG_MODE)).filter(doc => doc).map(doc => doc!) ?? []) : [];
}
- @action updateSelectedTemplate = async (template: Template) => {
- if (this._selectedTemplate === template) {
- this._selectedTemplate = undefined;
- return;
- } else {
- this._selectedTemplate = template;
- template.renderUpdates();
- this._fullyRenderedDocs = (await this.createDocsFromTemplate(template)) ?? [];
- this.updateRenderedDocCollection();
- }
- };
-
- @action updateSelectedSavedLayout = (layout: DataVizTemplateLayout) => {
- this._layout.xMargin = layout.layout.xMargin;
- this._layout.yMargin = layout.layout.yMargin;
- this._layout.type = layout.layout.type;
- this._layout.columns = layout.columns;
- };
-
- isSelectedLayout = (layout: DataVizTemplateLayout) => {
- return this._layout.xMargin === layout.layout.xMargin && this._layout.yMargin === layout.layout.yMargin && this._layout.type === layout.layout.type && this._layout.columns === layout.columns;
+ @action updateSelectedTemplate = (template: Template) => {
+ this._selectedTemplate = this._selectedTemplate === template ? undefined : template; // toggle selection
};
- editTemplate = (doc: Doc) => {
- DocumentViewInternal.addDocTabFunc(doc, OpenWhere.addRight);
- DocumentView.DeselectAll();
- Doc.UnBrushDoc(doc);
- };
+ // testTemplate = async () => {
+ // this._suggestedTemplates = this.templateManager.templates; //prettier-ignore
+ // };
@action addField = () => {
- const newFields: Col[] = this._userCreatedFields.concat([{ title: '', type: TemplateFieldType.UNSET, desc: '', sizes: [] }]);
- this._userCreatedFields = newFields;
+ this._userCreatedFields = this._userCreatedFields.concat([{ title: '', type: TemplateFieldType.UNSET, desc: '', sizes: [], AIGenerated: true }]);
};
@action removeField = (field: { title: string; type: string; desc: string }) => {
if (this._dataViz?.axes.includes(field.title)) {
this._dataViz.selectAxes(this._dataViz.axes.filter(col => col !== field.title));
} else {
- const toRemove = this._userCreatedFields.filter(f => f === field);
- if (!toRemove) return;
-
- if (toRemove.length > 1) {
- while (toRemove.length > 1) {
- toRemove.pop();
- }
- }
-
- if (this._userCreatedFields.length === 1) {
- this._userCreatedFields = [];
- } else {
- this._userCreatedFields.splice(this._userCreatedFields.indexOf(toRemove[0]), 1);
+ const toRemove = this._userCreatedFields.findIndex(f => f === field);
+ if (toRemove !== -1) {
+ this._userCreatedFields.splice(toRemove, 1);
}
}
};
@@ -439,11 +332,18 @@ export class DocCreatorMenu extends ObservableReactComponent<DocCreateMenuProps>
};
@action setColType = (column: Col, type: TemplateFieldType) => {
+ if (type === TemplateFieldType.DATA) {
+ this.templateManager.addDataField(column.title);
+ } else if (column.type === TemplateFieldType.DATA) {
+ this.templateManager.removeDataField(column.title);
+ }
+
if (this.selectedFields.includes(column.title)) {
this._dataViz?.setColumnType(column.title, type);
} else {
column.type = type;
}
+
this.forceUpdate();
};
@@ -469,81 +369,22 @@ export class DocCreatorMenu extends ObservableReactComponent<DocCreateMenuProps>
this.forceUpdate();
};
- generateGPTImage = async (prompt: string): Promise<string | undefined> => {
- try {
- const res = await gptImageCall(prompt);
-
- if (res) {
- const result = (await Networking.PostToServer('/uploadRemoteImage', { sources: res })) as Upload.FileInformation[];
- const source = ClientUtils.prepend(result[0].accessPaths.agnostic.client);
- return source;
- }
- } catch (e) {
- console.log(e);
- }
- };
-
- /**
- * Populates a preset template framework with content from a datavizbox or any AI-generated content.
- * @param template the preloaded template framework being filled in
- * @param assignments a list of template field numbers (from top to bottom) and their assigned columns from the linked dataviz
- * @returns a doc containing the fully rendered template
- */
- applyGPTContentToTemplate = async (template: Template, assignments: { [field: string]: Col }): Promise<Template | undefined> => {
- const GPTTextCalls = Object.entries(assignments).filter(([, col]) => col.type === TemplateFieldType.TEXT && this._userCreatedFields.includes(col));
- const GPTIMGCalls = Object.entries(assignments).filter(([, col]) => col.type === TemplateFieldType.VISUAL && this._userCreatedFields.includes(col));
-
- if (GPTTextCalls.length) {
- const promises = GPTTextCalls.map(([str, col]) => {
- return this.renderGPTTextCall(template, col, Number(str));
- });
-
- await Promise.all(promises);
- }
-
- if (GPTIMGCalls.length) {
- const promises = GPTIMGCalls.map(async ([fieldNum, col]) => {
- return this.renderGPTImageCall(template, col, Number(fieldNum));
- });
-
- await Promise.all(promises);
- }
-
- return template;
- };
-
- compileFieldDescriptions = (templates: Template[]): string => {
- let descriptions: string = '';
- templates.forEach(template => {
- descriptions += `---------- NEW TEMPLATE TO INCLUDE: The title is: ${template.mainField.getTitle()}. Its fields are: `;
- descriptions += template.descriptionSummary;
- });
+ compileFieldDescriptions = (templates: Template[]) =>
+ templates.map(template => `---------- NEW TEMPLATE TO INCLUDE: The title is: ${template.title}. Its fields are: ` + template.descriptionSummary).join(''); // prettier-ignore
- return descriptions;
- };
+ compileColDescriptions = (cols: Col[]) =>
+ ' ------------- COL DESCRIPTIONS START HERE:' + cols.map(col => `{title: ${col.title}, sizes: ${String(col.sizes)}, type: ${col.type}, descreiption: ${col.desc}} `).join(''); // prettier-ignore
- compileColDescriptions = (cols: Col[]): string => {
- let descriptions: string = ' ------------- COL DESCRIPTIONS START HERE:';
- cols.forEach(col => (descriptions += `{title: ${col.title}, sizes: ${String(col.sizes)}, type: ${col.type}, descreiption: ${col.desc}} `));
-
- return descriptions;
- };
-
- getColByTitle = (title: string) => {
- return this.fieldsInfos.filter(col => col.title === title)[0];
- };
+ getColByTitle = (title: string): Col | undefined => this.fieldsInfos.filter(col => col.title === title)[0];
@action
assignColsToFields = async (templates: Template[], cols: Col[]): Promise<[Template, { [field: number]: Col }][]> => {
- const fieldDescriptions: string = this.compileFieldDescriptions(templates);
- const colDescriptions: string = this.compileColDescriptions(cols);
+ const fieldDescriptions = this.compileFieldDescriptions(templates);
+ const colDescriptions = this.compileColDescriptions(cols);
const inputText = fieldDescriptions.concat(colDescriptions);
- ++this._callCount;
- const origCount = this._callCount;
-
- const prompt: string = `(${origCount}) ${inputText}`;
+ const prompt = `(${Math.random() * 100000}) ${inputText}`;
this._GPTLoading = true;
@@ -555,24 +396,26 @@ export class DocCreatorMenu extends ObservableReactComponent<DocCreateMenuProps>
const brokenDownAssignments: [Template, { [fieldID: number]: Col }][] = [];
Object.entries(assignments).forEach(([tempTitle, assignment]) => {
- const template = templates.filter(t => t.mainField.getTitle() === tempTitle)[0];
- if (!template) return;
- const toObj = Object.entries(assignment).reduce(
- (a, [fieldID, colTitle]) => {
- const col = this.getColByTitle(colTitle);
- if (!this._userCreatedFields.includes(col)) {
- // do the following for any fields not added by the user; will change in the future, for now only GPT content works with user-added fields
- const field = template.getFieldByID(Number(fieldID));
- field.setContent(col.defaultContent ?? '', col.type === TemplateFieldType.VISUAL ? FieldContentType.IMAGE : FieldContentType.STRING);
- field.setTitle(col.title);
- } else {
- a[Number(fieldID)] = this.getColByTitle(colTitle);
- }
- return a;
- },
- {} as { [field: number]: Col }
- );
- brokenDownAssignments.push([template, toObj]);
+ const template = templates.filter(temp => temp.title === tempTitle)[0];
+ if (template) {
+ const toObj = Object.entries(assignment).reduce(
+ (a, [fieldID, colTitle]) => {
+ const col = this.getColByTitle(colTitle);
+ if (col) {
+ if (!col.AIGenerated) {
+ const field = template.getFieldByID(Number(fieldID));
+ field?.setContent(col.defaultContent ?? '', col.type === TemplateFieldType.VISUAL ? ViewType.IMG : ViewType.TEXT);
+ field?.setTitle(col.title);
+ } else {
+ a[Number(fieldID)] = col;
+ }
+ }
+ return a;
+ },
+ {} as { [field: number]: Col }
+ );
+ brokenDownAssignments.push([template, toObj]);
+ }
});
return brokenDownAssignments;
@@ -584,777 +427,100 @@ export class DocCreatorMenu extends ObservableReactComponent<DocCreateMenuProps>
return [];
};
- generatePresetTemplates = async () => {
- this._dataViz?.updateColDefaults();
-
- const cols = this.fieldsInfos;
- const templates = this.templateManager.getValidTemplates(cols);
-
- const assignments: [Template, { [field: number]: Col }][] = await this.assignColsToFields(templates, cols);
-
- const renderedTemplatePromises: Promise<Template | undefined>[] = assignments.map(([template, asns]) => this.applyGPTContentToTemplate(template, asns));
-
- await Promise.all(renderedTemplatePromises);
-
- setTimeout(() => {
- this.setSuggestedTemplates(templates);
+ generatePresetTemplates = action(() => {
+ if (this.DEBUG_MODE) {
+ this.setSuggestedTemplates(this.templateManager._templates);
this._GPTLoading = false;
- });
- };
-
- renderGPTImageCall = async (template: Template, col: Col, fieldNumber: number): Promise<boolean> => {
- const generateAndLoadImage = async (fieldNum: string, column: Col, prompt: string) => {
- const url = await this.generateGPTImage(prompt);
- const field: Field = template.getFieldByID(Number(fieldNum));
-
- field.setContent(url ?? '', FieldContentType.IMAGE);
- field.setTitle(column.title);
- };
-
- const fieldContent: string = template.compiledContent;
-
- try {
- const sysPrompt =
- 'Your job is to create a prompt for an AI image generator to help it generate an image based on existing content in a template and a user prompt. Your prompt should focus heavily on visual elements to help the image generator; avoid unecessary info that might distract it. ONLY INCLUDE THE PROMPT, NO OTHER TEXT OR EXPLANATION. The existing content is as follows: ' +
- fieldContent +
- ' **** The user prompt is: ' +
- col.desc;
-
- const prompt = await gptAPICall(sysPrompt, GPTCallType.COMPLETEPROMPT);
-
- await generateAndLoadImage(String(fieldNumber), col, prompt);
- } catch (e) {
- console.log(e);
+ } else {
+ this._dataViz?.updateColDefaults();
+ const contentFields = this.fieldsInfos.filter(field => field.type !== TemplateFieldType.DATA);
+ const templates = this.templateManager.getValidTemplates(contentFields);
+
+ return this.assignColsToFields(templates, contentFields)
+ .then(pairs =>
+ Promise.all(pairs.map(([templ, assgns]) => TemplateMenuAIUtils.applyGPTContentToTemplate(templ, assgns))))
+ .then(action(() => {
+ this.setSuggestedTemplates(templates);
+ this._GPTLoading = false;
+ })); // prettier-ignore
}
- return true;
- };
-
- renderGPTTextCall = async (template: Template, col: Col, fieldNum: number): Promise<boolean> => {
- const wordLimit = (size: TemplateFieldSize) => {
- switch (size) {
- case TemplateFieldSize.TINY:
- return 2;
- case TemplateFieldSize.SMALL:
- return 5;
- case TemplateFieldSize.MEDIUM:
- return 20;
- case TemplateFieldSize.LARGE:
- return 50;
- case TemplateFieldSize.HUGE:
- return 100;
- default:
- return 10;
- }
- };
-
- const textAssignment = `--- title: ${col.title}, prompt: ${col.desc}, word limit: ${wordLimit(col.sizes[0])} words, assigned field: ${fieldNum} ---`;
+ });
- const fieldContent: string = template.compiledContent;
-
- try {
- const prompt = fieldContent + textAssignment;
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
+ generateVariations = async (onDoc: Doc, prompt: string, options: FireflyStructureOptions) => {
+ // const { numVariations, temperature, useStyleRef } = options;
+ this.variations = [];
+ const mainCollection = this._dataViz?.DocumentView?.().containerViewPath?.().lastElement()?.ComponentView as CollectionFreeFormView;
- const res = await gptAPICall(`${++this._callCount}: ${prompt}`, GPTCallType.FILL);
+ const clone = Doc.MakeClone(onDoc).clone;
+ mainCollection.addDocument(clone);
+ clone.x = 10000;
+ clone.y = 10000;
- if (res) {
- const assignments: { [title: string]: { number: string; content: string } } = JSON.parse(res);
- Object.entries(assignments).forEach(([title, info]) => {
- const field: Field = template.getFieldByID(Number(info.number));
- const column = this.getColByTitle(title);
-
- field.setContent(info.content ?? '', FieldContentType.STRING);
- field.setTitle(column.title);
- });
- }
- } catch (err) {
- console.log(err);
- }
+ // await DrawingFillHandler.drawingToImage(clone, 100 - temperature, prompt, useStyleRef ? clone : undefined, this, numVariations)
- return true;
+ return this.variations;
};
- createDocsFromTemplate = async (template: Template) => {
- const dv = this._dataViz;
-
- if (!dv) return;
-
- this._docsRendering = true;
-
- const fields: string[] = Array.from(Object.keys(dv.records[0]));
- const selectedRows = NumListCast(dv.layoutDoc.dataViz_selectedRows);
-
- const rowContents: { [title: string]: string }[] = selectedRows.map(row => {
- const values: { [title: string]: string } = {};
- fields.forEach(col => {
- values[col] = dv.records[row][col];
- });
+ variations: string[] = [];
- return values;
- });
-
- const processContent = async (content: { [title: string]: string }) => {
- const templateCopy = template.cloneBase();
-
- fields
- .filter(title => title)
- .forEach(title => {
- const field = templateCopy.getFieldByTitle(title);
- if (field === undefined) {
- return;
- }
- field.setContent(content[title]);
- });
-
- const gptPromises = this._userCreatedFields
- .filter(field => field.type === TemplateFieldType.TEXT)
- .map(field => {
- const title = field.title;
- const templateField = templateCopy.getFieldByTitle(title);
- if (templateField === undefined) {
- return;
- }
- const templatefieldID = templateField.getID;
-
- return this.renderGPTTextCall(templateCopy, field, templatefieldID);
- });
-
- const imagePromises = this._userCreatedFields
- .filter(field => field.type === TemplateFieldType.VISUAL)
- .map(field => {
- const title = field.title;
- const templateField = templateCopy.getFieldByTitle(title);
- if (templateField === undefined) {
- return;
- }
- const templatefieldID = templateField.getID;
-
- return this.renderGPTImageCall(templateCopy, field, templatefieldID);
- });
-
- await Promise.all(gptPromises);
-
- await Promise.all(imagePromises);
-
- return templateCopy.getRenderedDoc();
- };
-
- const promises = rowContents.map(content => processContent(content));
-
- const renderedDocs = await Promise.all(promises);
-
- this._docsRendering = false;
+ @action addVariation = (url: string) => {
+ this.variations.push(url);
+ };
- return renderedDocs;
+ addRenderedCollectionToMainview = (collection: Doc) => {
+ if (collection) {
+ const mainCollection = this._dataViz?.DocumentView?.().containerViewPath?.().lastElement()?.ComponentView as CollectionFreeFormView;
+ collection.x = this._pageX - this._menuDimensions.width;
+ collection.y = this._pageY - this._menuDimensions.height;
+ mainCollection?.addDocument(collection);
+ this.closeMenu();
+ }
};
- addRenderedCollectionToMainview = () => {
- const collection = this._renderedDocCollection;
- if (!collection) return;
- const mainCollection = this._dataViz?.DocumentView?.().containerViewPath?.().lastElement()?.ComponentView as CollectionFreeFormView;
- collection.x = this._pageX - this._menuDimensions.width;
- collection.y = this._pageY - this._menuDimensions.height;
- mainCollection.addDocument(collection);
- this.closeMenu();
+ @action editLastTemplate = () => {
+ if (this._editedTemplateTrail.length) this._currEditingTemplate = this._editedTemplateTrail.pop();
};
@action setExpandedView = (template: Template | undefined) => {
if (template) {
- this._currEditingTemplate = template;
- this._expandedPreview = template.mainField.renderedDoc(); //Docs.Create.FreeformDocument([doc], { _height: NumListCast(doc._height)[0], _width: NumListCast(doc._width)[0], title: ''});
+ this._menuContent = 'templateEditing';
+ this._currEditingTemplate && this._editedTemplateTrail.push(this._currEditingTemplate);
} else {
- this._currEditingTemplate = undefined;
- this._expandedPreview = undefined;
- }
- };
-
- get editingWindow() {
- const rendered = !this._expandedPreview ? null : (
- <div className="docCreatorMenu-expanded-template-preview">
- <DocumentView
- Document={this._expandedPreview}
- isContentActive={emptyFunction}
- addDocument={returnFalse}
- moveDocument={returnFalse}
- removeDocument={returnFalse}
- PanelWidth={() => this._menuDimensions.width - 10}
- PanelHeight={() => this._menuDimensions.height - 60}
- ScreenToLocalTransform={() => new Transform(-this._pageX - 5, -this._pageY - 35, 1)}
- renderDepth={5}
- whenChildContentsActiveChanged={emptyFunction}
- focus={emptyFunction}
- styleProvider={DefaultStyleProvider}
- addDocTab={DocumentViewInternal.addDocTabFunc}
- pinToPres={() => undefined}
- childFilters={returnEmptyFilter}
- childFiltersByRanges={returnEmptyFilter}
- searchFilterDocs={returnEmptyDoclist}
- fitContentsToBox={returnFalse}
- fitWidth={returnFalse}
- />
- </div>
- );
-
- return (
- <div className="docCreatorMenu-expanded-template-preview">
- <div className="top-panel" />
- {rendered}
- <div className="right-buttons-panel">
- <button
- className="docCreatorMenu-menu-button section-reveal-options top-right"
- onPointerDown={e =>
- this.setUpButtonClick(e, () => {
- this._currEditingTemplate && this.updateTemplatePreview(this._currEditingTemplate);
- this.setExpandedView(undefined);
- })
- }>
- <FontAwesomeIcon icon="minimize" />
- </button>
- <button
- className="docCreatorMenu-menu-button section-reveal-options top-right-lower"
- onPointerDown={e =>
- this.setUpButtonClick(e, () => {
- this._currEditingTemplate?.resetToBase();
- this.setExpandedView(this._currEditingTemplate);
- })
- }>
- <FontAwesomeIcon icon="arrows-rotate" color="white" />
- </button>
- </div>
- </div>
- );
- }
-
- get templatesPreviewContents() {
- const GPTOptions = <div></div>;
-
- return (
- <div className={`docCreatorMenu-templates-view`}>
- {this._expandedPreview ? (
- this.editingWindow
- ) : (
- <div>
- <div className="docCreatorMenu-section" style={{ height: this._GPTOpt ? 200 : 200 }}>
- <div className="docCreatorMenu-section-topbar">
- <div className="docCreatorMenu-section-title">Suggested Templates</div>
- <button className="docCreatorMenu-menu-button section-reveal-options" onPointerDown={e => this.setUpButtonClick(e, () => runInAction(() => (this._menuContent = 'dashboard')))}>
- <FontAwesomeIcon icon="gear" />
- </button>
- </div>
- <div className="docCreatorMenu-templates-preview-window" style={{ justifyContent: this._GPTLoading || this._menuDimensions.width > 400 ? 'center' : '' }}>
- {this._GPTLoading ? (
- <div className="loading-spinner">
- <ReactLoading type="spin" color={StrCast(Doc.UserDoc().userVariantColor)} height={30} width={30} />
- </div>
- ) : (
- this._suggestedTemplatePreviews.map(({ doc, template }) => (
- <div
- className="docCreatorMenu-preview-window"
- key="0"
- style={{
- border: this._selectedTemplate === template ? `solid 3px ${Colors.MEDIUM_BLUE}` : '',
- boxShadow: this._selectedTemplate === template ? `0 0 15px rgba(68, 118, 247, .8)` : '',
- }}
- onPointerDown={e => this.setUpButtonClick(e, () => runInAction(() => this.updateSelectedTemplate(template)))}>
- <button
- className="option-button left"
- onPointerDown={e =>
- this.setUpButtonClick(e, () => {
- this.setExpandedView(template);
- })
- }>
- <FontAwesomeIcon icon="magnifying-glass" color="white" />
- </button>
- <button className="option-button right" onPointerDown={e => this.setUpButtonClick(e, () => this.addUserTemplate(template))}>
- <FontAwesomeIcon icon="plus" color="white" />
- </button>
- <DocumentView
- Document={doc}
- isContentActive={emptyFunction} // !!! should be return false
- addDocument={returnFalse}
- moveDocument={returnFalse}
- removeDocument={returnFalse}
- PanelWidth={() => (this._selectedTemplate === template ? 104 : 111)}
- PanelHeight={() => (this._selectedTemplate === template ? 104 : 111)}
- ScreenToLocalTransform={() => new Transform(-this._pageX - 5, -this._pageY - 35, 1)}
- renderDepth={1}
- whenChildContentsActiveChanged={emptyFunction}
- focus={emptyFunction}
- styleProvider={DefaultStyleProvider}
- addDocTab={this._props.addDocTab}
- pinToPres={() => undefined}
- childFilters={returnEmptyFilter}
- childFiltersByRanges={returnEmptyFilter}
- searchFilterDocs={returnEmptyDoclist}
- fitContentsToBox={returnFalse}
- fitWidth={returnFalse}
- hideDecorations={true}
- />
- </div>
- ))
- )}
- </div>
- <div className="docCreatorMenu-GPT-options">
- <div className="docCreatorMenu-GPT-options-container">
- <button className="docCreatorMenu-menu-button" onPointerDown={e => this.setUpButtonClick(e, () => this.generatePresetTemplates())}>
- <FontAwesomeIcon icon="arrows-rotate" />
- </button>
- </div>
- {this._GPTOpt ? GPTOptions : null}
- </div>
- </div>
- <hr className="docCreatorMenu-option-divider full no-margin" />
- <div className="docCreatorMenu-section">
- <div className="docCreatorMenu-section-topbar">
- <div className="docCreatorMenu-section-title">Your Templates</div>
- <button className="docCreatorMenu-menu-button section-reveal-options" onPointerDown={e => this.setUpButtonClick(e, () => (this._GPTOpt = !this._GPTOpt))}>
- <FontAwesomeIcon icon="gear" />
- </button>
- </div>
- <div className="docCreatorMenu-templates-preview-window" style={{ justifyContent: this._menuDimensions.width > 400 ? 'center' : '' }}>
- <div className="docCreatorMenu-preview-window empty">
- <FontAwesomeIcon icon="plus" color="rgb(160, 160, 160)" />
- </div>
- {this._userTemplates.map(({ template, doc }) => (
- <div
- className="docCreatorMenu-preview-window"
- key="0"
- style={{
- border: this._selectedTemplate === template ? `solid 3px ${Colors.MEDIUM_BLUE}` : '',
- boxShadow: this._selectedTemplate === template ? `0 0 15px rgba(68, 118, 247, .8)` : '',
- }}
- onPointerDown={e => this.setUpButtonClick(e, () => runInAction(() => this.updateSelectedTemplate(template)))}>
- <button
- className="option-button left"
- onPointerDown={e =>
- this.setUpButtonClick(e, () => {
- this.setExpandedView(template);
- })
- }>
- <FontAwesomeIcon icon="magnifying-glass" color="white" />
- </button>
- <button className="option-button right" onPointerDown={e => this.setUpButtonClick(e, () => this.removeUserTemplate(template))}>
- <FontAwesomeIcon icon="minus" color="white" />
- </button>
- <DocumentView
- Document={doc}
- isContentActive={emptyFunction} // !!! should be return false
- addDocument={returnFalse}
- moveDocument={returnFalse}
- removeDocument={returnFalse}
- PanelWidth={() => (this._selectedTemplate === template ? 104 : 111)}
- PanelHeight={() => (this._selectedTemplate === template ? 104 : 111)}
- ScreenToLocalTransform={() => new Transform(-this._pageX - 5, -this._pageY - 35, 1)}
- renderDepth={1}
- whenChildContentsActiveChanged={emptyFunction}
- focus={emptyFunction}
- styleProvider={DefaultStyleProvider}
- addDocTab={this._props.addDocTab}
- pinToPres={() => undefined}
- childFilters={returnEmptyFilter}
- childFiltersByRanges={returnEmptyFilter}
- searchFilterDocs={returnEmptyDoclist}
- fitContentsToBox={returnFalse}
- fitWidth={returnFalse}
- hideDecorations={true}
- />
- </div>
- ))}
- </div>
- </div>
- </div>
- )}
- </div>
- );
- }
-
- @action updateXMargin = (input: string) => {
- this._layout.xMargin = Number(input);
- setTimeout(() => {
- if (!this._renderedDocCollection || !this._fullyRenderedDocs) return;
- this.applyLayout(this._renderedDocCollection, this._fullyRenderedDocs);
- });
- };
- @action updateYMargin = (input: string) => {
- this._layout.yMargin = Number(input);
- setTimeout(() => {
- if (!this._renderedDocCollection || !this._fullyRenderedDocs) return;
- this.applyLayout(this._renderedDocCollection, this._fullyRenderedDocs);
- });
- };
- @action updateColumns = (input: string) => {
- this._layout.columns = Number(input);
- this.updateRenderedDocCollection();
- };
-
- get layoutConfigOptions() {
- const optionInput = (icon: string, func: (input: string) => void, def?: number, key?: string, noMargin?: boolean) => {
- return (
- <div className="docCreatorMenu-option-container small no-margin" key={key} style={{ marginTop: noMargin ? '0px' : '' }}>
- <div className="docCreatorMenu-option-title config layout-config">
- <FontAwesomeIcon icon={icon as IconProp} />
- </div>
- <input defaultValue={def} onInput={e => func(e.currentTarget.value)} className="docCreatorMenu-input config layout-config" />
- </div>
- );
- };
-
- switch (this._layout.type) {
- case LayoutType.FREEFORM:
- return (
- <div className="docCreatorMenu-configuration-bar">
- {optionInput('arrows-up-down', this.updateYMargin, this._layout.xMargin, '2')}
- {optionInput('arrows-left-right', this.updateXMargin, this._layout.xMargin, '3')}
- {optionInput('table-columns', this.updateColumns, this._layout.columns, '4', true)}
- </div>
- );
- default:
- break;
+ this._menuContent = 'templates';
}
- }
- applyLayout = (collection: Doc, docs: Doc[]) => {
- const { horizontalSpan, verticalSpan } = this.previewInfo;
- collection._height = verticalSpan;
- collection._width = horizontalSpan;
-
- const layout = this._layout;
- const columns: number = layout.columns ?? this.columnsCount;
- const xGap: number = layout.xMargin;
- const yGap: number = layout.yMargin;
- // const repeat: number = templateInfo.layout.repeat;
- const startX: number = -Number(collection._width) / 2;
- const startY: number = -Number(collection._height) / 2;
- const docHeight: number = Number(docs[0]._height);
- const docWidth: number = Number(docs[0]._width);
-
- if (columns === 0 || docs.length === 0) {
- return;
- }
+ this._currEditingTemplate = template;
- let i: number = 0;
- let docsChanged: number = 0;
- let curX: number = startX;
- let curY: number = startY;
-
- while (docsChanged < docs.length) {
- while (i < columns && docsChanged < docs.length) {
- docs[docsChanged].x = curX;
- docs[docsChanged].y = curY;
- curX += docWidth + xGap;
- ++docsChanged;
- ++i;
- }
- i = 0;
- curX = startX;
- curY += docHeight + yGap;
- }
+ //Docs.Create.FreeformDocument([doc], { _height: NumListCast(doc._height)[0], _width: NumListCast(doc._width)[0], title: ''});
};
@computed
- get previewInfo() {
- const docHeight: number = Number(this._fullyRenderedDocs[0]._height);
- const docWidth: number = Number(this._fullyRenderedDocs[0]._width);
- const layout = this._layout;
- return {
- docHeight: docHeight,
- docWidth: docWidth,
- horizontalSpan: (docWidth + layout.xMargin) * this.columnsCount - layout.xMargin,
- verticalSpan: (docHeight + layout.yMargin) * this.rowsCount - layout.yMargin,
- };
- }
-
- /**
- * Updates the preview that shows how all docs will be rendered in the chosen collection type.
- @type the type of collection the docs should render to (ie. freeform, carousel, card)
- */
- updateRenderedDocCollection = () => {
- if (!this._fullyRenderedDocs) return;
-
- const { horizontalSpan, verticalSpan } = this.previewInfo;
-
- const collectionFactory = (): ((docs: Doc[], options: DocumentOptions) => Doc) => {
- switch (this._layout.type) {
- case LayoutType.CAROUSEL3D:
- return Docs.Create.Carousel3DDocument;
- case LayoutType.FREEFORM:
- return Docs.Create.FreeformDocument;
- case LayoutType.CARD:
- return Docs.Create.CardDeckDocument;
- case LayoutType.MASONRY:
- return Docs.Create.MasonryDocument;
- case LayoutType.CAROUSEL:
- return Docs.Create.CarouselDocument;
- default:
- return Docs.Create.FreeformDocument;
- }
- };
-
- const collection: Doc = collectionFactory()(this._fullyRenderedDocs, {
- isDefaultTemplateDoc: true,
- _height: verticalSpan,
- _width: horizontalSpan,
- title: 'title',
- backgroundColor: 'gray',
- });
-
- this.applyLayout(collection, this._fullyRenderedDocs);
-
- this._renderedDocCollection = collection;
- };
-
- layoutPreviewContents = () => {
- return this._docsRendering ? (
- <div className="docCreatorMenu-layout-preview-window-wrapper loading">
- <div className="loading-spinner">
- <ReactLoading type="spin" color={StrCast(Doc.UserDoc().userVariantColor)} height={30} width={30} />
- </div>
- </div>
- ) : !this._renderedDocCollection ? null : (
- <div className="docCreatorMenu-layout-preview-window-wrapper">
- <DocumentView
- Document={this._renderedDocCollection}
- isContentActive={emptyFunction}
- addDocument={returnFalse}
- moveDocument={returnFalse}
- removeDocument={returnFalse}
- PanelWidth={() => this._menuDimensions.width - 80}
- PanelHeight={() => this._menuDimensions.height - 105}
- ScreenToLocalTransform={() => new Transform(-this._pageX - 5, -this._pageY - 35, 1)}
- renderDepth={5}
- whenChildContentsActiveChanged={emptyFunction}
- focus={emptyFunction}
- styleProvider={DefaultStyleProvider}
- addDocTab={this._props.addDocTab}
- pinToPres={() => undefined}
- childFilters={returnEmptyFilter}
- childFiltersByRanges={returnEmptyFilter}
- searchFilterDocs={returnEmptyDoclist}
- fitContentsToBox={returnFalse}
- fitWidth={returnFalse}
- hideDecorations={true}
- />
- </div>
- );
- };
-
- get optionsMenuContents() {
- const layoutOption = (option: LayoutType, optStyle?: object, specialFunc?: () => void) => {
- return (
- <div
- className="docCreatorMenu-dropdown-option"
- style={optStyle}
- onPointerDown={e =>
- this.setUpButtonClick(e, () => {
- specialFunc?.();
- runInAction(() => {
- this._layout.type = option;
- this.updateRenderedDocCollection();
- });
- })
- }>
- {option}
- </div>
- );
- };
-
- const selectionBox = (width: number, height: number, icon: string, specClass?: string, options?: JSX.Element[], manual?: boolean): JSX.Element => {
- return (
- <div className="docCreatorMenu-option-container">
- <div className={`docCreatorMenu-option-title config ${specClass}`} style={{ width: width * 0.4, height: height }}>
- <FontAwesomeIcon icon={icon as IconProp} />
- </div>
- {manual ? (
- <input className={`docCreatorMenu-input config ${specClass}`} style={{ width: width * 0.6, height: height }} />
- ) : (
- <select className={`docCreatorMenu-input config ${specClass}`} style={{ width: width * 0.6, height: height }}>
- {options}
- </select>
- )}
- </div>
- );
- };
-
- const repeatOptions = [0, 1, 2, 3, 4, 5];
-
+ get templatesView() {
return (
- <div className="docCreatorMenu-menu-container">
- <div className="docCreatorMenu-option-container layout">
- <div className="docCreatorMenu-dropdown-hoverable">
- <div className="docCreatorMenu-option-title">{this._layout.type ? this._layout.type.toUpperCase() : 'Choose Layout'}</div>
- <div className="docCreatorMenu-dropdown-content">
- {layoutOption(LayoutType.FREEFORM, undefined, () => {
- if (!this._layout.columns) this._layout.columns = Math.ceil(Math.sqrt(this.docsToRender.length));
- })}
- {layoutOption(LayoutType.CAROUSEL)}
- {layoutOption(LayoutType.CAROUSEL3D)}
- {layoutOption(LayoutType.MASONRY)}
+ <div className="docCreatorMenu-templates-view">
+ <div className="docCreatorMenu-templates-displays">
+ <TemplatePreviewGrid title={'Suggested Templates'} menu={this} loading={this._GPTLoading} optionsButtonOpts={this.optionsButtonOpts} templates={this._suggestedTemplates} />
+ <div className="docCreatorMenu-GPT-options">
+ <div className="docCreatorMenu-GPT-options-container">
+ <DocCreatorMenuButton icon={'arrows-rotate'} styles={'border'} function={this.generatePresetTemplates} />
</div>
</div>
</div>
- {this._layout.type ? this.layoutConfigOptions : null}
- {this.layoutPreviewContents()}
- {selectionBox(
- 60,
- 20,
- 'repeat',
- undefined,
- repeatOptions.map(num => <option key={num} onPointerDown={() => (this._layout.repeat = num)}>{`${num}x`}</option>)
- )}
- <hr className="docCreatorMenu-option-divider" />
- <div className="docCreatorMenu-general-options-container">
- <button
- className="docCreatorMenu-save-layout-button"
- onPointerDown={e =>
- setupMoveUpEvents(
- this,
- e,
- returnFalse,
- emptyFunction,
- undoable(clickEv => {
- clickEv.stopPropagation();
- if (!this._selectedTemplate) return;
- const layout: DataVizTemplateLayout = {
- template: this._selectedTemplate.getRenderedDoc(),
- layout: { type: this._layout.type, xMargin: this._layout.xMargin, yMargin: this._layout.yMargin, repeat: 0 },
- columns: this.columnsCount,
- rows: this.rowsCount,
- docsNumList: this.docsToRender,
- };
- if (!this._savedLayouts.includes(layout)) {
- this._savedLayouts.push(layout);
- }
- }, 'make docs')
- )
- }>
- <FontAwesomeIcon icon="floppy-disk" />
- </button>
- <button
- className="docCreatorMenu-create-docs-button"
- style={{ backgroundColor: this.canMakeDocs ? '' : 'rgb(155, 155, 155)', border: this.canMakeDocs ? '' : 'solid 2px rgb(180, 180, 180)' }}
- onPointerDown={e =>
- setupMoveUpEvents(
- this,
- e,
- returnFalse,
- emptyFunction,
- undoable(clickEv => {
- clickEv.stopPropagation();
- if (!this._selectedTemplate) return;
- this.addRenderedCollectionToMainview();
- }, 'make docs')
- )
- }>
- <FontAwesomeIcon icon="plus" />
- </button>
- </div>
</div>
);
}
- get dashboardContents() {
- const sizes: string[] = ['tiny', 'small', 'medium', 'large', 'huge'];
-
- const fieldPanel = (field: Col, id: number) => {
- return (
- <div className="field-panel" key={id}>
- <div className="top-bar">
- <span className="field-title">{`${field.title} Field`}</span>
- <button className="docCreatorMenu-menu-button section-reveal-options no-margin" onPointerDown={e => this.setUpButtonClick(e, () => this.removeField(field))} style={{ position: 'absolute', right: '0px' }}>
- <FontAwesomeIcon icon="minus" />
- </button>
- </div>
- <div className="opts-bar">
- <div className="opt-box">
- <div className="top-bar"> Title </div>
- <textarea className="content" style={{ width: '100%', height: 'calc(100% - 20px)' }} value={field.title} placeholder={'Enter title'} onChange={e => this.setColTitle(field, e.target.value)} />
- </div>
- <div className="opt-box">
- <div className="top-bar"> Type </div>
- <div className="content">
- <span className="type-display">{field.type === TemplateFieldType.TEXT ? 'Text Field' : field.type === TemplateFieldType.VISUAL ? 'File Field' : ''}</span>
- <div className="bubbles">
- <input
- className="bubble"
- type="radio"
- name="type"
- onClick={() => {
- this.setColType(field, TemplateFieldType.TEXT);
- }}
- />
- <div className="text">Text</div>
- <input
- className="bubble"
- type="radio"
- name="type"
- onClick={() => {
- this.setColType(field, TemplateFieldType.VISUAL);
- }}
- />
- <div className="text">File</div>
- </div>
- </div>
- </div>
- </div>
- <div className="sizes-box">
- <div className="top-bar"> Valid Sizes </div>
- <div className="content">
- <div className="bubbles">
- {sizes.map(size => (
- <>
- <input
- className="bubble"
- type="checkbox"
- name="type"
- checked={field.sizes.includes(size as TemplateFieldSize)}
- onChange={e => {
- this.modifyColSizes(field, size as TemplateFieldSize, e.target.checked);
- }}
- />
- <div className="text">{size}</div>
- </>
- ))}
- </div>
- </div>
- </div>
- <div className="desc-box">
- <div className="top-bar"> Prompt </div>
- <textarea
- className="content"
- onChange={e => this.setColDesc(field, e.target.value)}
- defaultValue={field.desc === this._dataViz?.GPTSummary?.get(field.title)?.desc ? '' : field.desc}
- placeholder={this._dataViz?.GPTSummary?.get(field.title)?.desc ?? 'Add a description/prompt to help with template generation.'}
- />
- </div>
- </div>
- );
- };
-
- return (
- <div className="docCreatorMenu-dashboard-view">
- <div className="topbar">
- <button className="docCreatorMenu-menu-button section-reveal-options" onPointerDown={e => this.setUpButtonClick(e, this.addField)}>
- <FontAwesomeIcon icon="plus" />
- </button>
- <button className="docCreatorMenu-menu-button section-reveal-options float-right" onPointerDown={e => this.setUpButtonClick(e, () => runInAction(() => (this._menuContent = 'templates')))}>
- <FontAwesomeIcon icon="arrow-left" />
- </button>
- </div>
- <div className="panels-container">{this.fieldsInfos.map((field, i) => fieldPanel(field, i))}</div>
- </div>
- );
- }
+ private optionsButtonOpts: [IconProp, () => void] = ['gear', () => (this._menuContent = 'dashboard')];
get renderSelectedViewType() {
switch (this._menuContent) {
- case 'templates':
- return this.templatesPreviewContents;
- case 'options':
- return this.optionsMenuContents;
- case 'dashboard':
- return this.dashboardContents;
- default:
- return undefined;
- }
+ case 'templates': return this.templatesView;
+ case 'templateEditing': return <TemplateEditingWindow template={this._currEditingTemplate as Template} menu={this} />;
+ case 'renderPreview': return <TemplatesRenderPreviewWindow menu={this}/>;
+ case 'dashboard': return <TemplateMenuFieldOptions menu={this} templateManager={this.templateManager}/>;
+ } // prettier-ignore
+ return undefined;
}
get resizePanes() {
@@ -1375,34 +541,17 @@ export class DocCreatorMenu extends ObservableReactComponent<DocCreateMenuProps>
}
render() {
- const topButton = (icon: string, opt: string, func: () => void, tag: string) => {
- return (
- <div className={`top-button-container ${tag} ${opt === this._menuContent ? 'selected' : ''}`}>
- <div
- className="top-button-content"
- onPointerDown={e =>
- this.setUpButtonClick(e, () =>
- runInAction(() => {
- func();
- })
- )
- }>
- <FontAwesomeIcon icon={icon as IconProp} />
- </div>
+ const topButton = (icon: string, opt: string, func: () => void, tag: string) => (
+ <div className={`top-button-container ${tag} ${opt === this._menuContent ? 'selected' : ''}`}>
+ <div className="top-button-content" onPointerDown={e => this.setUpButtonClick(e, action(func))}>
+ <FontAwesomeIcon icon={icon as IconProp} />
</div>
- );
- };
+ </div>
+ );
- const onPreviewSelected = () => {
- this._menuContent = 'templates';
- };
- const onSavedSelected = () => {
- this._menuContent = 'dashboard';
- };
- const onOptionsSelected = () => {
- this._menuContent = 'options';
- if (!this._layout.columns) this._layout.columns = Math.ceil(Math.sqrt(this.docsToRender.length));
- };
+ const onPreviewSelected = () => (this._menuContent = 'templates');
+ const onSavedSelected = () => (this._menuContent = 'dashboard');
+ const onOptionsSelected = () => (this._menuContent = 'renderPreview');
return (
<div className="docCreatorMenu">
@@ -1435,9 +584,7 @@ export class DocCreatorMenu extends ObservableReactComponent<DocCreateMenuProps>
return true;
},
emptyFunction,
- undoable(clickEv => {
- clickEv.stopPropagation();
- }, 'drag menu')
+ undoable(clickEv => clickEv.stopPropagation(), 'drag menu')
)
}>
<div className="docCreatorMenu-top-buttons-container">
@@ -1445,9 +592,7 @@ export class DocCreatorMenu extends ObservableReactComponent<DocCreateMenuProps>
{topButton('magnifying-glass', 'options', onOptionsSelected, 'middle')}
{topButton('bars', 'saved', onSavedSelected, 'right')}
</div>
- <button className="docCreatorMenu-menu-button close-menu" onPointerDown={e => this.setUpButtonClick(e, this.closeMenu)}>
- <FontAwesomeIcon icon={'minus'} />
- </button>
+ <DocCreatorMenuButton icon={'minus'} styles={'float-right'} function={this.closeMenu} />
</div>
{this.renderSelectedViewType}
</div>
diff --git a/src/client/views/nodes/DataVizBox/DocCreatorMenu/FieldTypes/DynamicField.tsx b/src/client/views/nodes/DataVizBox/DocCreatorMenu/FieldTypes/DynamicField.tsx
deleted file mode 100644
index c5254c17d..000000000
--- a/src/client/views/nodes/DataVizBox/DocCreatorMenu/FieldTypes/DynamicField.tsx
+++ /dev/null
@@ -1,117 +0,0 @@
-import { Doc } from "../../../../../../fields/Doc";
-import { Docs } from "../../../../../documents/Documents";
-import { Field, FieldDimensions, FieldSettings, ViewType } from "./Field";
-import { FieldUtils } from "./FieldUtils";
-import { StaticField } from "./StaticField";
-
-export class DynamicField implements Field {
- private subfields: Field[] = [];
-
- private id: number;
- private settings: FieldSettings;
- private title: string = '';
-
- private parent: Field;
- private dimensions: FieldDimensions;
-
- constructor(settings: FieldSettings, id: number, parent?: Field) {
- this.id = id;
- this.settings = settings;
- if (settings.title) { this.title = settings.title };
- if (!parent) {
- this.parent = this;
- this.dimensions = {width: this.settings.br[0] - this.settings.tl[0], height: this.settings.br[1] - this.settings.tl[1], coord: {x: this.settings.tl[0], y: this.settings.tl[1]}};
- } else {
- this.parent = parent;
- this.dimensions = FieldUtils.getLocalDimensions({tl: settings.tl, br: settings.br}, this.parent.getDimensions);
- }
- this.subfields = this.setupSubfields();
- }
-
- setContent = () => { return };
- getContent = () => { return '' };
-
- setTitle = (title: string) => { this.title = title };
- getTitle = () => { return this.title };
-
- get getSubfields() { return this.subfields };
- get getAllSubfields() {
- let fields: Field[] = [];
- this.subfields?.forEach(field => {
- fields.push(field);
- fields = fields.concat(field.getAllSubfields)
- });
- return fields;
- };
-
- get getDimensions() { return this.dimensions };
- get getID() { return this.id };
- get getViewType() { return this.settings.viewType };
-
- get getDescription(): string {
- return this.settings.description ?? '';
- }
-
- matches = (): Array<number> => {
- return [];
- }
-
- updateRenderedDoc = () => {
- return new Doc();
- }
-
- setupSubfields = (): Field[] => {
- const fields: Field[] = [];
- this.settings.subfields?.forEach((fieldSettings, index) => {
- let field: Field;
- const type = fieldSettings.viewType;
-
- const id = Number(String(this.id) + String(index));
-
- if (type == ViewType.CAROUSEL3D || type === ViewType.FREEFORM) {
- field = new DynamicField(fieldSettings, id, this);
- } else {
- field = new StaticField(fieldSettings, this, id);
- }
- fields.push(field);
- });
- return fields;
- }
-
- applyAttributes = (field: Field) => {
- field.setTitle(this.title);
- field.updateRenderedDoc(this.renderedDoc());
- }
-
- getChildDimensions = (coords: { tl: [number, number]; br: [number, number] }): FieldDimensions => {
- const l = (coords.tl[0] * this.dimensions.height) / 2;
- const t = coords.tl[1] * this.dimensions.width / 2; //prettier-ignore
- const r = (coords.br[0] * this.dimensions.height) / 2;
- const b = coords.br[1] * this.dimensions.width / 2; //prettier-ignore
- const width = r - l;
- const height = b - t;
- const coord = { x: l, y: t };
- return { width, height, coord };
- };
-
- renderedDoc = (): Doc => {
- let doc: Doc;
- switch (this.settings.viewType) {
- case ViewType.CAROUSEL3D:
- doc = Docs.Create.Carousel3DDocument(this.subfields.map(field => field.renderedDoc()), {
- title: this.title,
- });
- FieldUtils.applyBasicOpts(doc, this.dimensions, this.settings);
- return doc;
- case ViewType.FREEFORM:
- doc = Docs.Create.FreeformDocument(this.subfields.map(field => field.renderedDoc()), {
- title: this.title,
- });
- FieldUtils.applyBasicOpts(doc, this.dimensions, this.settings);
- return doc;
- default:
- return new Doc();
- }
- }
-
-}
diff --git a/src/client/views/nodes/DataVizBox/DocCreatorMenu/FieldTypes/Field.tsx b/src/client/views/nodes/DataVizBox/DocCreatorMenu/FieldTypes/Field.tsx
deleted file mode 100644
index ea9b566b3..000000000
--- a/src/client/views/nodes/DataVizBox/DocCreatorMenu/FieldTypes/Field.tsx
+++ /dev/null
@@ -1,66 +0,0 @@
-import { Doc } from "../../../../../../fields/Doc";
-import { Col } from "../DocCreatorMenu";
-import { TemplateFieldSize, TemplateFieldType } from "../TemplateBackend";
-
-export enum FieldContentType {
- STRING = 'string',
- IMAGE = 'image',
-}
-
-export enum ViewType {
- CAROUSEL3D = 'carousel3d',
- FREEFORM = 'freeform',
- STATIC = 'static',
- DEC = 'decoration'
-}
-
-export type FieldDimensions = {
- width: number;
- height: number;
- coord: {x: number, y: number};
-}
-
-export interface FieldOpts {
- backgroundColor?: string;
- color?: string;
- cornerRounding?: number;
- borderWidth?: string;
- borderColor?: string;
- contentXCentering?: 'h-left' | 'h-center' | 'h-right';
- contentYCentering?: 'top' | 'center' | 'bottom';
- opacity?: number;
- rotation?: number;
- fontBold?: boolean;
- fontTransform?: 'uppercase' | 'lowercase';
- fieldViewType?: 'freeform' | 'stacked';
-}
-
-export type FieldSettings = {
- tl: [number, number];
- br: [number, number];
- opts: FieldOpts;
- viewType: ViewType;
- title?: string;
- subfields?: FieldSettings[];
- types?: TemplateFieldType[];
- sizes?: TemplateFieldSize[];
- description?: string;
-};
-
-export interface Field {
- getContent: () => string;
- setContent: (content: string, type?: FieldContentType) => void;
- getDimensions: FieldDimensions;
- getSubfields: Field[];
- getAllSubfields: Field[];
- getID: number;
- getViewType: ViewType;
- getDescription: string;
- getTitle: () => string;
- setTitle: (title: string) => void;
- setupSubfields: () => Field[];
- applyAttributes: (field: Field) => void;
- renderedDoc: () => Doc;
- matches: (cols: Col[]) => number[];
- updateRenderedDoc: (oldDoc?: Doc) => Doc;
-} \ No newline at end of file
diff --git a/src/client/views/nodes/DataVizBox/DocCreatorMenu/FieldTypes/FieldUtils.tsx b/src/client/views/nodes/DataVizBox/DocCreatorMenu/FieldTypes/FieldUtils.tsx
deleted file mode 100644
index 3886774d2..000000000
--- a/src/client/views/nodes/DataVizBox/DocCreatorMenu/FieldTypes/FieldUtils.tsx
+++ /dev/null
@@ -1,79 +0,0 @@
-import { Doc } from "../../../../../../fields/Doc";
-import { ComputedField, ScriptField } from "../../../../../../fields/ScriptField";
-import { Col } from "../DocCreatorMenu";
-import { TemplateFieldSize, TemplateFieldType, TemplateLayouts } from "../TemplateBackend";
-import { FieldDimensions, FieldSettings } from "./Field";
-
-export class FieldUtils {
- public static getLocalDimensions = (coords: { tl: [number, number]; br: [number, number] }, parentDimensions: FieldDimensions): FieldDimensions => {
- const l = (coords.tl[0] * parentDimensions.width) / 2;
- const t = coords.tl[1] * parentDimensions.height / 2; //prettier-ignore
- const r = (coords.br[0] * parentDimensions.width) / 2;
- const b = coords.br[1] * parentDimensions.height / 2; //prettier-ignore
- const width = r - l;
- const height = b - t;
- const coord = { x: l, y: t };
- return { width, height, coord };
- };
-
- public static applyBasicOpts = (doc: Doc, parentDimensions: FieldDimensions, settings: FieldSettings, oldDoc?: Doc) => {
- const opts = settings.opts;
- doc.isDefaultTemplateDoc = oldDoc ? oldDoc.isDefaultTemplateDoc : true;
- doc._layout_hideScroll = oldDoc ? oldDoc._layout_hideScroll : true;
- doc.x = oldDoc ? oldDoc.x : parentDimensions.coord.x;
- doc.y = oldDoc ? oldDoc.y : parentDimensions.coord.y;
- doc._height = oldDoc ? oldDoc.height : parentDimensions.height;
- doc._width = oldDoc ? oldDoc.width : parentDimensions.width;
- doc.backgroundColor = oldDoc ? oldDoc.backgroundColor : opts.backgroundColor ?? '';
- doc._layout_borderRounding = !opts.cornerRounding ? '0px' : ScriptField.MakeFunction(`${opts.cornerRounding} * this.width + 'px'`);
- doc.borderColor = oldDoc ? oldDoc.borderColor : opts.borderColor;
- doc.borderWidth = oldDoc ? oldDoc.borderWidth : opts.borderWidth;
- doc.opacity = oldDoc ? oldDoc.opacity : opts.opacity;
- doc._rotation = oldDoc ? oldDoc._rotation : opts.rotation;
- doc.hCentering = oldDoc ? oldDoc.hCentering : opts.contentXCentering;
- doc.nativeWidth = parentDimensions.width;
- doc.nativeHeight = parentDimensions.height;
- doc._layout_nativeDimEditable = true;
- };
-
- public static calculateFontSize = (contWidth: number, contHeight: number, text: string, uppercase: boolean): number => {
- const words: string[] = text.split(/\s+/).filter(Boolean);
-
- let currFontSize = 1;
- let rowsCount = 1;
- let currTextHeight = currFontSize * rowsCount * 2;
-
- while (currTextHeight <= contHeight) {
- let wordIndex = 0;
- let currentRowWidth = 0;
- let wordsInCurrRow = 0;
- rowsCount = 1;
-
- while (wordIndex < words.length) {
- const word = words[wordIndex];
- const wordWidth = word.length * currFontSize * 0.7;
-
- if (currentRowWidth + wordWidth <= contWidth) {
- currentRowWidth += wordWidth;
- ++wordsInCurrRow;
- } else {
- if (words.length !== 1 && words.length > wordsInCurrRow) {
- rowsCount++;
- currentRowWidth = wordWidth;
- wordsInCurrRow = 1;
- } else {
- break;
- }
- }
-
- wordIndex++;
- }
-
- currTextHeight = rowsCount * currFontSize * 2;
-
- currFontSize += 1;
- }
-
- return currFontSize - 1;
- };
-} \ No newline at end of file
diff --git a/src/client/views/nodes/DataVizBox/DocCreatorMenu/FieldTypes/StaticField.tsx b/src/client/views/nodes/DataVizBox/DocCreatorMenu/FieldTypes/StaticField.tsx
deleted file mode 100644
index 47b43f051..000000000
--- a/src/client/views/nodes/DataVizBox/DocCreatorMenu/FieldTypes/StaticField.tsx
+++ /dev/null
@@ -1,147 +0,0 @@
-import { Doc } from "../../../../../../fields/Doc";
-import { Docs } from "../../../../../documents/Documents";
-import { Col } from "../DocCreatorMenu";
-import { DynamicField } from "./DynamicField";
-import { FieldUtils } from "./FieldUtils";
-import { Field, FieldContentType, FieldDimensions, FieldSettings, ViewType } from "./Field";
-
-export class StaticField {
- private content: string;
- private contentType: FieldContentType | undefined;
- private subfields: Field[] = [];
- private renderedDocument: Doc;
-
- private id: number;
- private title: string = '';
-
- private settings: FieldSettings;
-
- private parent: Field;
- private dimensions: FieldDimensions;
-
- constructor(settings: FieldSettings, parent: Field, id: number) {
- this.settings = settings;
- if (settings.title) { this.title = settings.title };
- this.id = id;
- this.parent = parent;
- this.dimensions = FieldUtils.getLocalDimensions({tl: settings.tl, br: settings.br}, this.parent.getDimensions);
- this.content = '';
- this.subfields = this.setupSubfields();
- this.renderedDocument = this.updateRenderedDoc();
- };
-
- get getSubfields(): Field[] { return this.subfields ?? []; };
-
- get getAllSubfields(): Field[] {
- let fields: Field[] = [];
- this.subfields?.forEach(field => {
- fields.push(field);
- fields = fields.concat(field.getAllSubfields);
- });
- return fields;
- };
-
- get getDimensions() { return this.dimensions };
- get getID() { return this.id };
- get getViewType() { return this.settings.viewType };
-
- get getDescription(): string {
- return this.settings.description ?? '';
- }
-
- renderedDoc = () => {
- return this.renderedDocument;
- }
-
- setContent = (newContent: string, type?: FieldContentType) => {
- this.content = newContent;
- if (type) this.contentType = type;
- this.updateRenderedDoc(this.renderedDocument);
- };
- getContent() { return this.content };
-
- setTitle = (title: string) => {
- this.title = title;
- this.renderedDocument.title = title;
- this.updateRenderedDoc(this.renderedDocument);
- };
- getTitle = () => { return this.title };
-
- applyAttributes = (field: Field) => { //!!! can be updated later for more robust clonign; this is all ythat's needed now
- field.setTitle(this.title);
- field.setContent('', this.contentType);
- field.updateRenderedDoc(this.renderedDoc());
- }
-
- setupSubfields = (): Field[] => {
- const fields: Field[] = [];
- this.settings.subfields?.forEach((fieldSettings, index) => {
- let field: Field;
- const type = fieldSettings.viewType;
-
- const id = Number(String(this.id) + String(index));
-
- if (type === ViewType.FREEFORM || type === ViewType.CAROUSEL3D) {
- field = new DynamicField(fieldSettings, id, this);
- } else {
- field = new StaticField(fieldSettings, this, id);
- };
-
- fields.push(field);
- });
- return fields;
- };
-
- matches = (cols: Col[]): number[] => {
- const colMatchesField = (col: Col) => {
- const isMatch: boolean = (
- this.settings.sizes?.some(size => col.sizes?.includes(size))
- && this.settings.types?.includes(col.type))
- ?? false;
- return isMatch;
- }
-
- const matches: Array<number> = [];
-
- cols.forEach((col, v) => {
- if (colMatchesField(col)) {
- matches.push(v);
- }
- });
-
- return matches;
- };
-
- updateRenderedDoc = (oldDoc?: Doc): Doc => {
- const opts = this.settings.opts;
-
- if (!this.contentType) { this.contentType = FieldContentType.STRING };
-
- let doc: Doc;
-
- switch (this.contentType) {
- case FieldContentType.STRING:
- doc = Docs.Create.TextDocument(String(this.content), {
- title: this.title,
- text_fontColor: oldDoc ? String(oldDoc.color) : opts.color,
- contentBold: oldDoc ? Boolean(oldDoc.fontBold) : opts.fontBold,
- textTransform: oldDoc ? String(oldDoc.fontTransform) : opts.fontTransform,
- color: oldDoc ? String(oldDoc.color) : opts.color,
- _text_fontSize: `${FieldUtils.calculateFontSize(this.dimensions.width, this.dimensions.height, String(this.content), true)}`
- });
- FieldUtils.applyBasicOpts(doc, this.dimensions, this.settings, oldDoc);
- break;
- case FieldContentType.IMAGE:
- doc = Docs.Create.ImageDocument(String(this.content), {
- title: this.title,
- _layout_fitWidth: false,
- });
- FieldUtils.applyBasicOpts(doc, this.dimensions, this.settings, oldDoc);
- break;
- }
-
- this.renderedDocument = doc;
-
- return doc;
- };
-} \ No newline at end of file
diff --git a/src/client/views/nodes/DataVizBox/DocCreatorMenu/Menu/ConditionalsTextarea.tsx b/src/client/views/nodes/DataVizBox/DocCreatorMenu/Menu/ConditionalsTextarea.tsx
new file mode 100644
index 000000000..89c2e44ff
--- /dev/null
+++ b/src/client/views/nodes/DataVizBox/DocCreatorMenu/Menu/ConditionalsTextarea.tsx
@@ -0,0 +1,65 @@
+import { observer } from "mobx-react";
+import { ObservableReactComponent } from "../../../../ObservableReactComponent";
+import { Conditional } from "../Backend/TemplateManager";
+import { action, makeObservable, observable, runInAction } from "mobx";
+import React from "react";
+
+interface ConditionalsTextAreaProps {
+ conditional: Conditional;
+ property: keyof Conditional;
+}
+
+@observer
+export class ConditionalsTextArea extends ObservableReactComponent<ConditionalsTextAreaProps> {
+
+ private mirrorRef: HTMLSpanElement | null = null;
+
+ @observable private inputWidth: string = '60px';
+
+ constructor(props: ConditionalsTextAreaProps) {
+ super(props);
+ makeObservable(this);
+ }
+
+ setMirrorRef: React.LegacyRef<HTMLSpanElement> = (node) => { this.mirrorRef = node }
+
+ @action updateInputWidth() {
+ const mirror = this.mirrorRef;
+ if (mirror) {
+ const width = mirror.offsetWidth;
+ if ( width + 8 > 60) this.inputWidth = `${width + 8}px`;
+ }
+ }
+
+ render() {
+ return (
+ <div style={{ display: 'inline-block', position: 'relative' }}>
+ <span
+ ref={this.setMirrorRef}
+ style={{
+ position: 'absolute',
+ visibility: 'hidden',
+ whiteSpace: 'pre',
+ font: 'inherit',
+ padding: 0,
+ }}
+ >
+ {this._props.conditional[this._props.property] || ' '}
+ </span>
+ <input
+ className="form-row-input"
+ value={this.props.conditional[this.props.property] ?? ''}
+ onChange={e => {
+ runInAction(() => {
+ this.props.conditional[this.props.property] = e.target.value as "=" | ">" | "<" | "contains";
+ });
+ this.updateInputWidth();
+ }}
+ style={{ width: this.inputWidth }}
+ placeholder={this.props.property}
+ />
+ </div>
+ );
+ }
+
+} \ No newline at end of file
diff --git a/src/client/views/nodes/DataVizBox/DocCreatorMenu/Menu/DocCreatorMenuButton.tsx b/src/client/views/nodes/DataVizBox/DocCreatorMenu/Menu/DocCreatorMenuButton.tsx
new file mode 100644
index 000000000..48d2de4de
--- /dev/null
+++ b/src/client/views/nodes/DataVizBox/DocCreatorMenu/Menu/DocCreatorMenuButton.tsx
@@ -0,0 +1,42 @@
+import { IconProp } from "@fortawesome/fontawesome-svg-core";
+import { ObservableReactComponent } from "../../../../ObservableReactComponent";
+import React from "react";
+import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
+import { setupMoveUpEvents, returnFalse } from "../../../../../../ClientUtils";
+import { emptyFunction } from "../../../../../../Utils";
+import { undoable } from "../../../../../util/UndoManager";
+import { observer } from "mobx-react";
+
+interface DocCreatorMenuButtonProps {
+ icon: IconProp;
+ // eslint-disable-next-line
+ function: () => any;
+ styles?: string;
+}
+
+@observer
+export class DocCreatorMenuButton extends ObservableReactComponent<DocCreatorMenuButtonProps> {
+ // eslint-disable-next-line
+ setupButtonClick = (e: React.PointerEvent, func: (...args: any) => void) => {
+ setupMoveUpEvents(
+ this,
+ e,
+ returnFalse,
+ emptyFunction,
+ undoable(clickEv => {
+ clickEv.stopPropagation();
+ clickEv.preventDefault();
+ func();
+ }, 'create docs')
+ );
+ };
+
+ render() {
+
+ return (
+ <button className={`docCreatorMenu-menu-button ${this._props.styles}`} onPointerDown={e => this.setupButtonClick(e, async () => this._props.function())}>
+ <FontAwesomeIcon icon={this._props.icon} />
+ </button>
+ );
+ }
+} \ No newline at end of file
diff --git a/src/client/views/nodes/DataVizBox/DocCreatorMenu/Menu/TemplateEditingWindow.tsx b/src/client/views/nodes/DataVizBox/DocCreatorMenu/Menu/TemplateEditingWindow.tsx
new file mode 100644
index 000000000..c35099e82
--- /dev/null
+++ b/src/client/views/nodes/DataVizBox/DocCreatorMenu/Menu/TemplateEditingWindow.tsx
@@ -0,0 +1,220 @@
+import { action, makeObservable, observable, reaction } from 'mobx';
+import React from 'react';
+import { returnFalse, returnEmptyFilter } from '../../../../../../ClientUtils';
+import { emptyFunction } from '../../../../../../Utils';
+import { returnEmptyDoclist } from '../../../../../../fields/Doc';
+import { DefaultStyleProvider } from '../../../../StyleProvider';
+import { DocumentView, DocumentViewInternal } from '../../../DocumentView';
+import { DocCreatorMenu } from '../DocCreatorMenu';
+import { TemplatePreviewGrid } from './TemplatePreviewGrid';
+import { observer } from 'mobx-react';
+import { Transform } from '../../../../../util/Transform';
+import { Template } from '../Template';
+import { ObservableReactComponent } from '../../../../ObservableReactComponent';
+import { IDisposer } from 'mobx-utils';
+import { DocCreatorMenuButton } from './DocCreatorMenuButton';
+import { IconProp } from '@fortawesome/fontawesome-svg-core';
+
+export type FireflyStructureOptions = {
+ numVariations: number;
+ temperature: number;
+ useStyleRef: boolean;
+};
+
+interface FireflyVariationsTabProps {
+ menu: DocCreatorMenu;
+ template: Template;
+}
+
+@observer
+export class FireflyVariationsTab extends ObservableReactComponent<FireflyVariationsTabProps> {
+ private _prompt: string = 'Use this template to generate an empty baseball card template.';
+ private _optionsButtonOpts: [IconProp, () => void] = ['gear', emptyFunction];
+ private _previewBoxRightButtonOpts: [IconProp, () => void] = ['gear', () => this.forceUpdate()];
+
+ @observable _fireflyOptions: FireflyStructureOptions = { numVariations: 3, temperature: 0, useStyleRef: false };
+ @observable _promptInput: HTMLTextAreaElement | null = null;
+ @observable _loading: boolean = false;
+ @observable _variationsTabOpen: boolean = false;
+ @observable _variationURLs: string[] = [];
+
+ constructor(props: FireflyVariationsTabProps) {
+ super(props);
+ makeObservable(this);
+ }
+
+ generateVariations = action(async () => {
+ this._props.menu._variations = [];
+ this._loading = true;
+ const cloneTemplate = this._props.template.clone(false);
+ cloneTemplate.setMatteBackground();
+ const doc = cloneTemplate.getRenderedDoc()!;
+ this._props.menu.generateVariations(doc, this._prompt, this._fireflyOptions).then(
+ action((urls: string[]) => {
+ (this._variationURLs = urls).forEach(url => {
+ const template = this._props.template.clone(true);
+ template.setImageAsBackground(url, true);
+ this._props.menu._variations.push(template);
+ });
+ this._loading = false;
+ })
+ );
+ });
+
+ render() {
+ return (
+ <div className="docCreatorMenu-editing-firefly-section">
+ <div className="docCreatorMenu-option-divider full no-margin-bottom" />
+ <TemplatePreviewGrid
+ menu={this._props.menu}
+ title="Generate Variations"
+ loading={this._loading}
+ styles="scrolling"
+ templates={this._props.menu._variations}
+ optionsButtonOpts={this._optionsButtonOpts}
+ previewBoxRightButtonOpts={this._previewBoxRightButtonOpts}
+ />
+ <div className="docCreatorMenu-firefly-options">
+ <div className="docCreatorMenu-variation-prompt-row">
+ <textarea
+ className="docCreatorMenu-variation-prompt-input-textbox"
+ ref={action((node: HTMLTextAreaElement | null) => (this._promptInput = node))}
+ onChange={e => (this._prompt = e.target.value)}
+ onInput={() => {
+ if (this._promptInput !== null) {
+ this._promptInput.style.height = 'auto';
+ this._promptInput.style.height = this._promptInput.scrollHeight + 'px';
+ }
+ }}
+ defaultValue=""
+ placeholder="Enter a custom prompt here (optional)"
+ />
+ <DocCreatorMenuButton icon={'arrows-rotate'} styles={'border'} function={this.generateVariations} />
+ </div>
+ <nav className="options‑menu">
+ <label className="menu‑item switch">
+ <input type="checkbox" checked={this._fireflyOptions.useStyleRef} onChange={action(e => (this._fireflyOptions.useStyleRef = e.target.checked))} />
+ <span className="slider round"></span>
+ <span className="firefly-option-label">Use template as style guide</span>
+ </label>
+ <div className="menu‑item">
+ <span className="firefly-option-label">Variations</span>
+ <input type="range" id="variations" min="1" max="5" value={this._fireflyOptions.numVariations} onChange={action(e => (this._fireflyOptions.numVariations = Number(e.target.value)))} />
+ <span className="value" id="varVal">
+ {this._fireflyOptions.numVariations}
+ </span>
+ </div>
+ <div className="menu‑item">
+ <span className="firefly-option-label">Temperature</span>
+ <input type="range" id="temperature" min="1" max="100" value={this._fireflyOptions.temperature} onChange={action(e => (this._fireflyOptions.temperature = Number(e.target.value)))} />
+ <span className="value" id="tempVal">
+ {this._fireflyOptions.temperature}
+ </span>
+ </div>
+ </nav>
+ </div>
+ </div>
+ );
+ }
+}
+
+interface TemplateEditingWindowProps {
+ menu: DocCreatorMenu;
+ template: Template;
+}
+
+@observer
+export class TemplateEditingWindow extends ObservableReactComponent<TemplateEditingWindowProps> {
+ private disposers: { [name: string]: IDisposer } = {};
+
+ @observable private _previewWindow: HTMLDivElement | null = null;
+ @observable _variationsTabOpen: boolean = false;
+
+ constructor(props: TemplateEditingWindowProps) {
+ super(props);
+ makeObservable(this);
+ }
+
+ componentDidMount(): void {
+ this.disposers.windowDimensions = reaction(
+ () => this._props.menu._resizing,
+ () => this.forceUpdate(),
+ { fireImmediately: true }
+ );
+ }
+
+ componentWillUnmount() {
+ Object.values(this.disposers).forEach(disposer => disposer?.());
+ }
+
+ @action setVariationTab = (open: boolean) => {
+ this._variationsTabOpen = open;
+ if (this._previewWindow && open) {
+ this._previewWindow.style.height = String(Number(this._previewWindow.clientHeight) * 0.6);
+ } else if (this._previewWindow && !open) {
+ this._previewWindow.style.height = String((Number(this._previewWindow.clientHeight) * 5) / 3);
+ }
+ };
+
+ previewPanelWidth = () => this._previewWindow?.clientWidth ?? 500;
+ previewPanelHeight = () => this._previewWindow?.clientHeight ?? 500;
+ previewScreenToLocalXf = () => new Transform(-this._props.menu._pageX - 5, -this._props.menu._pageY - 35, 1);
+ get renderedDocPreview() {
+ const doc = this._props.template.getRenderedDoc();
+ return (
+ <div className="docCreatorMenu-expanded-template-preview" ref={action((node: HTMLDivElement | null) => (this._previewWindow = node))}>
+ {this._previewWindow && doc ? (
+ <DocumentView
+ Document={doc}
+ isContentActive={emptyFunction}
+ addDocument={returnFalse}
+ moveDocument={returnFalse}
+ removeDocument={returnFalse}
+ PanelWidth={this.previewPanelWidth}
+ PanelHeight={this.previewPanelHeight}
+ ScreenToLocalTransform={this.previewScreenToLocalXf}
+ renderDepth={5}
+ whenChildContentsActiveChanged={emptyFunction}
+ focus={emptyFunction}
+ styleProvider={DefaultStyleProvider}
+ addDocTab={DocumentViewInternal.addDocTabFunc}
+ pinToPres={emptyFunction}
+ childFilters={returnEmptyFilter}
+ childFiltersByRanges={returnEmptyFilter}
+ searchFilterDocs={returnEmptyDoclist}
+ // fitContentsToBox={returnFalse}
+ // fitWidth={returnFalse}
+ />
+ ) : null}
+ </div>
+ );
+ }
+
+ expandFunc = () => {
+ // if (this._props.template === this._props.menu._selectedTemplate) {
+ // this._props.menu.updateRenderedPreviewCollection(this._props.template);
+ // }
+ this._props.menu.setExpandedView(undefined);
+ };
+ lastFunc = () => {
+ this._props.menu.editLastTemplate();
+ this.forceUpdate();
+ };
+ variationFunc = () => this.setVariationTab(!this._variationsTabOpen);
+ render() {
+ return (
+ <div className="docCreatorMenu-templates-view">
+ <div className="docCreatorMenu-expanded-template-preview">
+ <div className="top-panel" />
+ {this.renderedDocPreview}
+ {this._variationsTabOpen ? <FireflyVariationsTab menu={this._props.menu} template={this._props.template} /> : null}
+ <div className="right-buttons-panel">
+ <DocCreatorMenuButton icon="minimize" function={this.expandFunc} />
+ <DocCreatorMenuButton icon="lightbulb" function={this.variationFunc} />
+ <DocCreatorMenuButton icon="arrow-rotate-backward" function={this.lastFunc} />
+ </div>
+ </div>
+ </div>
+ );
+ }
+}
diff --git a/src/client/views/nodes/DataVizBox/DocCreatorMenu/Menu/TemplateMenuFieldOptions.tsx b/src/client/views/nodes/DataVizBox/DocCreatorMenu/Menu/TemplateMenuFieldOptions.tsx
new file mode 100644
index 000000000..f0e20837c
--- /dev/null
+++ b/src/client/views/nodes/DataVizBox/DocCreatorMenu/Menu/TemplateMenuFieldOptions.tsx
@@ -0,0 +1,185 @@
+import { action, makeObservable, observable } from 'mobx';
+import { observer } from 'mobx-react';
+import { ObservableReactComponent } from '../../../../ObservableReactComponent';
+import { Col, DocCreatorMenu } from '../DocCreatorMenu';
+import React from 'react';
+import { Conditional, TemplateManager } from '../Backend/TemplateManager';
+import { TemplateFieldType, TemplateFieldSize } from '../TemplateBackend';
+import { DocCreatorMenuButton } from './DocCreatorMenuButton';
+
+interface TemplateMenuFieldOptionsProps {
+ menu: DocCreatorMenu;
+ templateManager: TemplateManager;
+}
+
+@observer
+export class TemplateMenuFieldOptions extends ObservableReactComponent<TemplateMenuFieldOptionsProps> {
+ @observable _collapsedCols: string[] = []; //any columns whose options panels are hidden
+
+ constructor(props: TemplateMenuFieldOptionsProps) {
+ super(props);
+ makeObservable(this);
+ }
+
+ @observable private _newCondCache: Record<string, Conditional> = {};
+
+ getParams = (title: string, parameters?: Conditional): Conditional => {
+ if (parameters) return parameters;
+
+ if (!this._newCondCache[title]) {
+ this._newCondCache[title] = observable<Conditional>({
+ field: title,
+ operator: '=',
+ condition: '',
+ target: 'Own',
+ attribute: '',
+ value: '',
+ });
+ }
+ return this._newCondCache[title];
+ };
+
+ conditionForm = (title: string, parameters?: Conditional, empty: boolean = false) => {
+ const contentFieldTitles = this._props.menu.fieldsInfos
+ .filter(field => field.type !== TemplateFieldType.DATA)
+ .map(field => field.title)
+ .concat('Template');
+ const params: Conditional = this.getParams(title, parameters);
+
+ return (
+ <div className="form">
+ <div className="form-row">
+ <div className="form-row-plain-text">If</div>
+ <div className="form-row-plain-text">{title}</div>
+ <div className="operator-options-dropdown">
+ <span className="operator-dropdown-current">{params.operator ?? '='}</span>
+ <div className="operator-dropdown-option" onPointerDown={() => (params.operator = '=')}>
+ {'='}
+ </div>
+ </div>
+ <input className="form-row-textarea" onChange={action(e => (params.condition = e.target.value))} placeholder="value" value={params.condition} />
+ <div className="form-row-plain-text">then</div>
+ <div className="operator-options-dropdown">
+ <span className="operator-dropdown-current">{params.target ?? 'Own'}</span>
+ {contentFieldTitles.map((fieldTitle, i) => (
+ <div className="operator-dropdown-option" key={i} onPointerDown={() => (params.target = fieldTitle)}>
+ {fieldTitle === title ? 'Own' : fieldTitle}
+ </div>
+ ))}
+ </div>
+ <input className="form-row-textarea" onChange={action(e => (params.attribute = e.target.value))} placeholder="attribute" value={params.attribute} />
+ <div className="form-row-plain-text">{'becomes'}</div>
+ <input className="form-row-textarea" onChange={action(e => (params.value = e.target.value))} placeholder="value" value={params.value} />
+ </div>
+ {empty ? (
+ <DocCreatorMenuButton
+ icon={'plus'}
+ styles={'float-right border'}
+ function={() => {
+ this._newCondCache[title] = observable<Conditional>({
+ field: title,
+ operator: '=',
+ condition: '',
+ target: 'Own',
+ attribute: '',
+ value: '',
+ });
+ this._props.templateManager.addFieldCondition(title, params);
+ }}
+ />
+ ) : (
+ <DocCreatorMenuButton icon={'minus'} styles={'float-right border'} function={() => this._props.templateManager.removeFieldCondition(title, params)} />
+ )}
+ </div>
+ );
+ };
+
+ fieldPanel = (field: Col, id: number) => (
+ <div className="field-panel" key={id}>
+ <div
+ className="top-bar"
+ onPointerDown={e =>
+ this._props.menu.setUpButtonClick(
+ e,
+ action(() => {
+ if (this._collapsedCols.includes(field.title)) {
+ this._collapsedCols = this._collapsedCols.filter(col => col !== field.title);
+ } else {
+ this._collapsedCols.push(field.title);
+ }
+ })
+ )
+ }>
+ <span className="field-title">{`${field.title} Field`}</span>
+ <DocCreatorMenuButton icon={'minus'} styles={'no-margin absolute-right'} function={() => this._props.menu.removeField(field)} />
+ </div>
+ {this._collapsedCols.includes(field.title) ? null : (
+ <>
+ <div className="opts-bar">
+ <div className="opt-box">
+ <div className="top-bar"> Title </div>
+ <textarea className="content" style={{ width: '100%', height: 'calc(100% - 20px)' }} value={field.title} placeholder={'Enter title'} onChange={e => this._props.menu.setColTitle(field, e.target.value)} />
+ </div>
+ <div className="opt-box">
+ <div className="top-bar"> Type </div>
+ <div className="content">
+ <span className="type-display">{field.type === TemplateFieldType.TEXT ? 'Text Field' : field.type === TemplateFieldType.VISUAL ? 'File Field' : field.type === TemplateFieldType.DATA ? 'Data Field' : ''}</span>
+ <div className="bubbles">
+ <input className="bubble" type="radio" name="type" onClick={() => this._props.menu.setColType(field, TemplateFieldType.TEXT)} />
+ <div className="text">Text</div>
+ <input className="bubble" type="radio" name="type" onClick={() => this._props.menu.setColType(field, TemplateFieldType.VISUAL)} />
+ <div className="text">File</div>
+ <input className="bubble" type="radio" name="type" onClick={() => this._props.menu.setColType(field, TemplateFieldType.DATA)} />
+ <div className="text">Data</div>
+ </div>
+ </div>
+ </div>
+ </div>
+ {field.type === TemplateFieldType.DATA ? null : (
+ <>
+ <div className="sizes-box">
+ <div className="top-bar"> Valid Sizes </div>
+ <div className="content">
+ <div className="bubbles">
+ {Object.values(TemplateFieldSize).map(size => (
+ <div key={field + size}>
+ <input className="bubble" type="checkbox" name="type" checked={field.sizes.includes(size)} onChange={e => this._props.menu.modifyColSizes(field, size, e.target.checked)} />
+ <div className="text">{size}</div>
+ </div>
+ ))}
+ </div>
+ </div>
+ </div>
+ <div className="desc-box">
+ <div className="top-bar"> Prompt </div>
+ <textarea
+ className="content"
+ onChange={e => this._props.menu.setColDesc(field, e.target.value)}
+ defaultValue={field.desc === this._props.menu._dataViz?.GPTSummary?.get(field.title)?.desc ? '' : field.desc}
+ placeholder={this._props.menu._dataViz?.GPTSummary?.get(field.title)?.desc ?? 'Add a description/prompt to help with template generation.'}
+ />
+ </div>
+ </>
+ )}
+ <div className="conditionals-section">
+ <span className="conditionals-title">Conditional Logic</span>
+ {this.conditionForm(field.title, undefined, true)}
+ {this._props.templateManager._conditionalFieldLogic[field.title]?.map(condition => this.conditionForm(condition.field, condition))}
+ </div>
+ </>
+ )}
+ </div>
+ );
+
+ render() {
+ return (
+ <div className="docCreatorMenu-dashboard-view">
+ <div className="topbar">
+ <DocCreatorMenuButton icon="plus" function={this._props.menu.addField} />
+ <DocCreatorMenuButton icon="arrow-left" styles="float-right" function={action(() => (this._props.menu._menuContent = 'templates'))} />
+ </div>
+ <div className="panels-container">{this._props.menu.fieldsInfos.map((field, i) => this.fieldPanel(field, i))}</div>
+ </div>
+ );
+ }
+}
diff --git a/src/client/views/nodes/DataVizBox/DocCreatorMenu/Menu/TemplatePreviewBox.tsx b/src/client/views/nodes/DataVizBox/DocCreatorMenu/Menu/TemplatePreviewBox.tsx
new file mode 100644
index 000000000..7d02fff12
--- /dev/null
+++ b/src/client/views/nodes/DataVizBox/DocCreatorMenu/Menu/TemplatePreviewBox.tsx
@@ -0,0 +1,89 @@
+import { Colors } from '@dash/components/src';
+import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
+import { Template } from '../Template';
+import { action, makeObservable, observable } from 'mobx';
+import React from 'react';
+import { ObservableReactComponent } from '../../../../ObservableReactComponent';
+import { DocCreatorMenu } from '../DocCreatorMenu';
+import { IconProp } from '@fortawesome/fontawesome-svg-core';
+import { DocumentView } from '../../../DocumentView';
+import { emptyFunction } from '../../../../../../Utils';
+import { returnEmptyFilter, returnFalse } from '../../../../../../ClientUtils';
+import { Transform } from '../../../../../util/Transform';
+import { DefaultStyleProvider } from '../../../../StyleProvider';
+import { Doc, returnEmptyDoclist } from '../../../../../../fields/Doc';
+import { observer } from 'mobx-react';
+
+export interface TemplatePreviewBoxProps {
+ template: Template;
+ menu: DocCreatorMenu; // eslint-disable-next-line
+ leftButtonOpts?: [icon: IconProp, func: (...args: any) => void]; // eslint-disable-next-line
+ rightButtonOpts?: [icon: IconProp, func: (...args: any) => void];
+}
+
+@observer
+export class TemplatePreviewBox extends ObservableReactComponent<TemplatePreviewBoxProps> {
+ @observable private previewWindow: HTMLDivElement | null = null;
+
+ constructor(props: TemplatePreviewBoxProps) {
+ super(props);
+ makeObservable(this);
+ }
+
+ get doc() {
+ return this._props.template.getRenderedDoc() as Doc;
+ }
+
+ docPanelWidth = () => this.previewWindow?.clientWidth ?? this._props.menu._menuDimensions.height * 0.3;
+ docPanelHeight = () => this.previewWindow?.clientHeight ?? this._props.menu._menuDimensions.height * 0.3;
+ docScreenToLocalXf = () => new Transform(-this._props.menu._pageX - 5, -this._props.menu._pageY - 35, 1);
+
+ render() {
+ const template = this._props.template;
+
+ return (
+ <div
+ key={template.title}
+ className="docCreatorMenu-preview-window"
+ ref={action((node: HTMLDivElement | null) => (this.previewWindow = node))}
+ style={{
+ border: this._props.menu._selectedTemplate === template ? `solid 3px ${Colors.MEDIUM_BLUE}` : '',
+ boxShadow: this._props.menu._selectedTemplate === template ? `0 0 15px rgba(68, 118, 247, .8)` : '',
+ }}
+ onPointerDown={e => this._props.menu.setUpButtonClick(e, () => this._props.menu.updateSelectedTemplate(template))}>
+ {this._props.leftButtonOpts ? (
+ <button className="option-button left" onPointerDown={e => this._props.menu.setUpButtonClick(e, () => this._props.leftButtonOpts![1](template))}>
+ <FontAwesomeIcon icon={this._props.leftButtonOpts![0]} color="white" />
+ </button>
+ ) : null}
+ {this._props.rightButtonOpts ? (
+ <button className="option-button right" onPointerDown={e => this._props.menu.setUpButtonClick(e, () => this._props.rightButtonOpts![1](template))}>
+ <FontAwesomeIcon icon={this._props.rightButtonOpts![0]} color="white" />
+ </button>
+ ) : null}
+ <DocumentView
+ Document={this.doc}
+ isContentActive={emptyFunction} // !!! should be return false
+ addDocument={returnFalse}
+ moveDocument={returnFalse}
+ removeDocument={returnFalse}
+ PanelWidth={this.docPanelWidth}
+ PanelHeight={this.docPanelHeight}
+ ScreenToLocalTransform={this.docScreenToLocalXf}
+ renderDepth={1}
+ whenChildContentsActiveChanged={emptyFunction}
+ focus={emptyFunction}
+ styleProvider={DefaultStyleProvider}
+ addDocTab={this._props.menu._props.addDocTab}
+ pinToPres={emptyFunction}
+ childFilters={returnEmptyFilter}
+ childFiltersByRanges={returnEmptyFilter}
+ searchFilterDocs={returnEmptyDoclist}
+ // fitContentsToBox={returnFalse}
+ // fitWidth={returnFalse}
+ hideDecorations={true}
+ />
+ </div>
+ );
+ }
+}
diff --git a/src/client/views/nodes/DataVizBox/DocCreatorMenu/Menu/TemplatePreviewGrid.tsx b/src/client/views/nodes/DataVizBox/DocCreatorMenu/Menu/TemplatePreviewGrid.tsx
new file mode 100644
index 000000000..da4851f84
--- /dev/null
+++ b/src/client/views/nodes/DataVizBox/DocCreatorMenu/Menu/TemplatePreviewGrid.tsx
@@ -0,0 +1,60 @@
+import { makeObservable, runInAction } from "mobx";
+import React from "react";
+import ReactLoading from "react-loading";
+import { Doc } from "../../../../../../fields/Doc";
+import { StrCast } from "../../../../../../fields/Types";
+import { ObservableReactComponent } from "../../../../ObservableReactComponent";
+import { Template } from "../Template";
+import { observer } from "mobx-react";
+import { DocCreatorMenu } from "../DocCreatorMenu";
+import { TemplatePreviewBox } from "./TemplatePreviewBox";
+import { IconProp } from "@fortawesome/fontawesome-svg-core";
+import { DocCreatorMenuButton } from "./DocCreatorMenuButton";
+
+export interface SuggestedTemplatesProps {
+ menu: DocCreatorMenu;
+ loading?: boolean;
+ templates: Template[];
+ title: string;
+ styles?: string; // eslint-disable-next-line
+ optionsButtonOpts?: [IconProp, (...args: any) => any]; // eslint-disable-next-line
+ previewBoxLeftButtonOpts?: [IconProp, (...args: any) => any]; // eslint-disable-next-line
+ previewBoxRightButtonOpts?: [IconProp, (...args: any) => any];
+}
+
+@observer
+export class TemplatePreviewGrid extends ObservableReactComponent<SuggestedTemplatesProps> {
+
+ constructor(props: SuggestedTemplatesProps) {
+ super(props);
+ makeObservable(this);
+ }
+
+ render() {
+ return (
+ <div className="docCreatorMenu-section">
+ <div className="docCreatorMenu-section-topbar">
+ <div className="docCreatorMenu-section-title">{this.props.title}</div>
+ {this._props.optionsButtonOpts ?
+ <DocCreatorMenuButton icon={this._props.optionsButtonOpts[0] as IconProp} styles={'float-right'} function={() => runInAction(this._props.optionsButtonOpts![1])}/>
+ : null}
+ </div>
+ <div className={"docCreatorMenu-templates-preview-window " + this._props.styles}>
+ {this._props.loading ?
+ (<div className="loading-spinner">
+ <ReactLoading type="spin" color={StrCast(Doc.UserDoc().userVariantColor)} height={30} width={30} />
+ </div>)
+ : this.props.templates.map((template, i) => (
+ <TemplatePreviewBox
+ key={i}
+ template={template}
+ menu={this.props.menu}
+ leftButtonOpts={["magnifying-glass", (template: Template) => { this.props.menu.setExpandedView(template); this.forceUpdate(); }]}
+ rightButtonOpts={this._props.previewBoxRightButtonOpts}
+ />
+ ))}
+ </div>
+ </div>
+ );
+ }
+} \ No newline at end of file
diff --git a/src/client/views/nodes/DataVizBox/DocCreatorMenu/Menu/TemplateRenderPreviewWindow.tsx b/src/client/views/nodes/DataVizBox/DocCreatorMenu/Menu/TemplateRenderPreviewWindow.tsx
new file mode 100644
index 000000000..9222d7349
--- /dev/null
+++ b/src/client/views/nodes/DataVizBox/DocCreatorMenu/Menu/TemplateRenderPreviewWindow.tsx
@@ -0,0 +1,346 @@
+import { action, computed, makeObservable, observable, runInAction } from 'mobx';
+import { observer } from 'mobx-react';
+import { ObservableReactComponent } from '../../../../ObservableReactComponent';
+import { DocCreatorMenu, LayoutType } from '../DocCreatorMenu';
+import React from 'react';
+import { IconProp } from '@fortawesome/fontawesome-svg-core';
+import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
+import { setupMoveUpEvents, returnFalse, returnEmptyFilter } from '../../../../../../ClientUtils';
+import { emptyFunction } from '../../../../../../Utils';
+import { undoable } from '../../../../../util/UndoManager';
+import ReactLoading from 'react-loading';
+import { Doc, NumListCast, returnEmptyDoclist } from '../../../../../../fields/Doc';
+import { NumCast, StrCast } from '../../../../../../fields/Types';
+import { DefaultStyleProvider } from '../../../../StyleProvider';
+import { DocumentView } from '../../../DocumentView';
+import { Transform } from '../../../../../util/Transform';
+import { Docs, DocumentOptions } from '../../../../../documents/Documents';
+
+interface TemplatesRenderPreviewWindowProps {
+ menu: DocCreatorMenu;
+}
+
+@observer
+export class TemplatesRenderPreviewWindow extends ObservableReactComponent<TemplatesRenderPreviewWindowProps> {
+ @observable private _layout: { type: LayoutType; yMargin: number; xMargin: number; columns?: number; repeat: number } = { type: LayoutType.FREEFORM, yMargin: 10, xMargin: 10, columns: 1, repeat: 0 };
+
+ @observable private renderedDocs: Doc[] = [];
+ @observable private renderedDocCollection: Doc | undefined = undefined;
+
+ @observable private loading: boolean = false;
+
+ constructor(props: TemplatesRenderPreviewWindowProps) {
+ super(props);
+ makeObservable(this);
+ this.updateRenderedPreviewCollection();
+ }
+
+ @computed get canMakeDocs() {
+ return this._props.menu._selectedTemplate !== undefined && this._layout !== undefined;
+ }
+
+ @computed get docsToRender() {
+ if (this._props.menu.DEBUG_MODE) {
+ return [1, 2, 3, 4];
+ } else {
+ return NumListCast(this._props.menu._dataViz?.layoutDoc.dataViz_selectedRows);
+ }
+ }
+
+ @computed get rowsCount() {
+ switch (this._layout.type) {
+ case LayoutType.FREEFORM:
+ return Math.ceil(this.docsToRender.length / (this._layout.columns ?? 1)) ?? 0;
+ case LayoutType.CAROUSEL3D:
+ return 1.8;
+ default:
+ return 1;
+ }
+ }
+
+ @computed get columnsCount() {
+ switch (this._layout.type) {
+ case LayoutType.FREEFORM:
+ return this._layout.columns ?? 1;
+ case LayoutType.CAROUSEL3D:
+ return 3;
+ default:
+ return 1;
+ }
+ }
+
+ @action updateRenderedPreviewCollection = async () => {
+ this.loading = true;
+ this.renderedDocs = await this._props.menu.createDocsForPreview();
+ this.updateRenderedDocCollection();
+ };
+
+ /**
+ * Updates the preview that shows how all docs will be rendered in the chosen collection type.
+ @type the type of collection the docs should render to (ie. freeform, carousel, card)
+ */
+ updateRenderedDocCollection = () => {
+ if (!this.renderedDocs) return;
+
+ const collectionFactory = (): ((docs: Doc[], options: DocumentOptions) => Doc) => {
+ switch (this._layout.type) {
+ case LayoutType.CAROUSEL3D: return Docs.Create.Carousel3DDocument;
+ case LayoutType.FREEFORM: return Docs.Create.FreeformDocument;
+ case LayoutType.CARD: return Docs.Create.CardDeckDocument;
+ case LayoutType.MASONRY: return Docs.Create.MasonryDocument;
+ case LayoutType.CAROUSEL: return Docs.Create.CarouselDocument;
+ default: return Docs.Create.FreeformDocument;
+ } // prettier-ignore
+ };
+
+ const collection = collectionFactory()(this.renderedDocs, {
+ isDefaultTemplateDoc: true,
+ title: 'title',
+ backgroundColor: 'gray',
+ x: 200,
+ y: 200,
+ _width: 4000,
+ _height: 4000,
+ });
+
+ this.applyLayout(collection, this.renderedDocs);
+
+ this.renderedDocCollection = collection;
+
+ this.loading = false;
+
+ this.forceUpdate();
+ };
+
+ @action updateMargin = (input: string, xOrY: 'x' | 'y') => {
+ this._layout[`${xOrY}Margin`] = Number(input);
+ setTimeout(() => {
+ if (!this.renderedDocCollection || !this.renderedDocs) return;
+ this.applyLayout(this.renderedDocCollection, this.renderedDocs);
+ });
+ };
+
+ @action updateColumns = (input: string) => {
+ this._layout.columns = Number(input);
+ this.updateRenderedDocCollection();
+ };
+
+ applyLayout = (collection: Doc, docs: Doc[]) => {
+ const { horizontalSpan, verticalSpan } = this.previewInfo;
+ collection._height = verticalSpan;
+ collection._width = horizontalSpan;
+ collection.layout_fitWidth = true;
+ collection.freeform_fitContentsToBox = true;
+
+ const columns = (this._layout.columns ?? this.columnsCount) || 1;
+ const xGap = this._layout.xMargin;
+ const yGap = this._layout.yMargin;
+ const startX = -collection._width / 2;
+ const startY = -collection._height / 2;
+ const docHeight = NumCast(docs[0]?._height);
+ const docWidth = NumCast(docs[0]?._width);
+
+ let i = 0;
+ let docsChanged = 0;
+ let curX = startX;
+ let curY = startY;
+
+ while (docsChanged < docs.length) {
+ while (i < columns && docsChanged < docs.length) {
+ docs[docsChanged].x = curX;
+ docs[docsChanged].y = curY;
+ docs[docsChanged].layout_fitWidth = false;
+ curX += docWidth + xGap;
+ ++docsChanged;
+ ++i;
+ }
+ i = 0;
+ curX = startX;
+ curY += docHeight + yGap;
+ }
+ };
+
+ @computed
+ get previewInfo() {
+ const docHeight = NumCast(this.renderedDocs[0]?._height);
+ const docWidth = NumCast(this.renderedDocs[0]?._width);
+ const layout = this._layout;
+ return {
+ docHeight: docHeight,
+ docWidth: docWidth,
+ horizontalSpan: (docWidth + layout.xMargin) * this.columnsCount - layout.xMargin,
+ verticalSpan: (docHeight + layout.yMargin) * this.rowsCount - layout.yMargin,
+ };
+ }
+
+ get layoutConfigOptions() {
+ const optionInput = (icon: string, func: (input: string) => void, def?: number, key?: string, noMargin?: boolean) => {
+ return (
+ <div className="docCreatorMenu-option-container small no-margin" key={key} style={{ marginTop: noMargin ? '0px' : '' }}>
+ <div className="docCreatorMenu-option-title config layout-config">
+ <FontAwesomeIcon icon={icon as IconProp} />
+ </div>
+ <input defaultValue={def} onInput={e => func(e.currentTarget.value)} className="docCreatorMenu-input config layout-config" />
+ </div>
+ );
+ };
+
+ switch (this._layout.type) {
+ case LayoutType.FREEFORM:
+ return (
+ <div className="docCreatorMenu-configuration-bar">
+ {optionInput('arrows-up-down', (input: string) => this.updateMargin(input, 'y'), this._layout.xMargin, '2')}
+ {optionInput('arrows-left-right', (input: string) => this.updateMargin(input, 'x'), this._layout.xMargin, '3')}
+ {optionInput('table-columns', this.updateColumns, this._layout.columns, '4', true)}
+ </div>
+ );
+ default:
+ break;
+ }
+ }
+
+ layoutPanelWidth = () => this._props.menu._menuDimensions.width - 80;
+ layoutPanelHeight = () => this._props.menu._menuDimensions.height - 105;
+ layoutScreenToLocalXf = () => new Transform(-this._props.menu._pageX - 5, -this._props.menu._pageY - 35, 1);
+
+ layoutPreviewContents = action(() => {
+ return this.loading ? (
+ <div className="docCreatorMenu-layout-preview-window-wrapper loading">
+ <div className="loading-spinner">
+ <ReactLoading type="spin" color={StrCast(Doc.UserDoc().userVariantColor)} height={30} width={30} />
+ </div>
+ </div>
+ ) : !this.renderedDocCollection ? null : (
+ <div className="docCreatorMenu-layout-preview-window-wrapper">
+ <DocumentView
+ Document={this.renderedDocCollection}
+ isContentActive={emptyFunction}
+ addDocument={returnFalse}
+ moveDocument={returnFalse}
+ removeDocument={returnFalse}
+ PanelWidth={this.layoutPanelWidth}
+ PanelHeight={this.layoutPanelHeight}
+ ScreenToLocalTransform={this.layoutScreenToLocalXf}
+ renderDepth={5}
+ whenChildContentsActiveChanged={emptyFunction}
+ focus={emptyFunction}
+ styleProvider={DefaultStyleProvider}
+ addDocTab={this._props.menu._props.addDocTab}
+ pinToPres={emptyFunction}
+ childFilters={returnEmptyFilter}
+ childFiltersByRanges={returnEmptyFilter}
+ searchFilterDocs={returnEmptyDoclist}
+ hideDecorations={true}
+ />
+ </div>
+ );
+ });
+
+ selectionBox = (width: number, height: number, icon: string, specClass?: string, options?: JSX.Element[], manual?: boolean): JSX.Element => {
+ return (
+ <div className="docCreatorMenu-option-container">
+ <div className={`docCreatorMenu-option-title config ${specClass}`} style={{ width: width * 0.4, height: height }}>
+ <FontAwesomeIcon icon={icon as IconProp} />
+ </div>
+ {manual ? (
+ <input className={`docCreatorMenu-input config ${specClass}`} style={{ width: width * 0.6, height: height }} />
+ ) : (
+ <select className={`docCreatorMenu-input config ${specClass}`} style={{ width: width * 0.6, height: height }}>
+ {options}
+ </select>
+ )}
+ </div>
+ );
+ };
+
+ layoutOption = (option: LayoutType, optStyle?: object, specialFunc?: () => void) => {
+ return (
+ <div
+ className="docCreatorMenu-dropdown-option"
+ style={optStyle}
+ onPointerDown={e =>
+ this._props.menu.setUpButtonClick(e, () => {
+ specialFunc?.();
+ runInAction(() => {
+ this._layout.type = option;
+ this.updateRenderedDocCollection();
+ });
+ })
+ }>
+ {option}
+ </div>
+ );
+ };
+
+ get optionsMenuContents() {
+ const repeatOptions = [0, 1, 2, 3, 4, 5];
+
+ return (
+ <div className="docCreatorMenu-menu-container">
+ <div className="docCreatorMenu-option-container layout">
+ <div className="docCreatorMenu-dropdown-hoverable">
+ <div className="docCreatorMenu-option-title">{this._layout.type ? this._layout.type.toUpperCase() : 'Choose Layout'}</div>
+ <div className="docCreatorMenu-dropdown-content">
+ {this.layoutOption(LayoutType.FREEFORM, undefined, () => {
+ if (!this._layout.columns) this._layout.columns = Math.ceil(Math.sqrt(this.docsToRender.length));
+ })}
+ {this.layoutOption(LayoutType.CAROUSEL)}
+ {this.layoutOption(LayoutType.CAROUSEL3D)}
+ {this.layoutOption(LayoutType.MASONRY)}
+ </div>
+ </div>
+ </div>
+ {this._layout.type ? this.layoutConfigOptions : null}
+ {this.layoutPreviewContents()}
+ {this.selectionBox(
+ 60,
+ 20,
+ 'repeat',
+ undefined,
+ repeatOptions.map(num => <option key={num} onPointerDown={() => (this._layout.repeat = num)}>{`${num}x`}</option>)
+ )}
+ <hr className="docCreatorMenu-option-divider" />
+ <div className="docCreatorMenu-general-options-container">
+ <button
+ className="docCreatorMenu-save-layout-button"
+ onPointerDown={e =>
+ setupMoveUpEvents(
+ this,
+ e,
+ returnFalse,
+ emptyFunction,
+ undoable(clickEv => {
+ clickEv.stopPropagation();
+ //previous implementation deprecated; return later to add or scrap
+ return;
+ }, 'save layout')
+ )
+ }>
+ <FontAwesomeIcon icon="floppy-disk" />
+ </button>
+ <button
+ className="docCreatorMenu-create-docs-button"
+ style={{ backgroundColor: this.canMakeDocs ? '' : 'rgb(155, 155, 155)', border: this.canMakeDocs ? '' : 'solid 2px rgb(180, 180, 180)' }}
+ onPointerDown={e =>
+ setupMoveUpEvents(
+ this,
+ e,
+ returnFalse,
+ emptyFunction,
+ undoable(clickEv => {
+ clickEv.stopPropagation();
+ this.renderedDocCollection && this._props.menu.addRenderedCollectionToMainview(this.renderedDocCollection);
+ }, 'make docs')
+ )
+ }>
+ <FontAwesomeIcon icon="plus" />
+ </button>
+ </div>
+ </div>
+ );
+ }
+
+ render() {
+ return this.optionsMenuContents;
+ }
+}
diff --git a/src/client/views/nodes/DataVizBox/DocCreatorMenu/Template.ts b/src/client/views/nodes/DataVizBox/DocCreatorMenu/Template.ts
new file mode 100644
index 000000000..e2a2a3c1c
--- /dev/null
+++ b/src/client/views/nodes/DataVizBox/DocCreatorMenu/Template.ts
@@ -0,0 +1,179 @@
+import { makeAutoObservable } from 'mobx';
+import { Col } from './DocCreatorMenu';
+import { TemplateFieldType, TemplateLayouts } from './TemplateBackend';
+import { DynamicField } from './TemplateFieldTypes/DynamicField';
+import { FieldSettings, TemplateField, ViewType } from './TemplateFieldTypes/TemplateField';
+import { Conditional } from './Backend/TemplateManager';
+import { TemplateDataField } from './TemplateFieldTypes/DataField';
+
+export class Template {
+ _mainField: DynamicField;
+
+ private _dataFields: TemplateDataField[] = [];
+
+ /**
+ * A Template can be created from a description of its fields (FieldSettings) or from a DynamicField
+ * @param definition definition of template as settings or DynamicField
+ */
+ constructor(definition: FieldSettings | DynamicField) {
+ makeAutoObservable(this);
+ this._mainField = definition instanceof DynamicField ? definition : this.setupMainField(definition);
+ }
+
+ get childFields() { return this._mainField?.getSubfields ?? []; } // prettier-ignore
+ get allFields() { return this._mainField?.getAllSubfields ?? []; } // prettier-ignore
+ get contentFields() { return this.allFields.filter(field => field.isContentField); } // prettier-ignore
+ get doc() { return this._mainField?.renderedDoc; } // prettier-ignore
+ get title() { return this._mainField?.getTitle(); } // prettier-ignore
+ get descriptionSummary() { return this.contentFields.map(f => `--- Field #${f.getID} (title: ${f.getTitle()}): ${f.getDescription ?? ''} ---`).join(); } // prettier-ignore
+ get compiledContent() { return this.contentFields.map(f => `--- Field #${f.getID} (title: ${f.getTitle()}): ${f.getContent() ?? ''} ---`).join(); } // prettier-ignore
+
+ cleanup = () => {
+ //dispose each subfields disposers, etc.
+ };
+
+ clone = (withContent: boolean = false) => {
+ const clone = new Template(this._mainField?.makeClone(undefined, withContent) ?? TemplateLayouts.BasicSettings);
+ this._dataFields.forEach(field => clone.addDataField(field.title));
+ return clone;
+ };
+
+ getRenderedDoc = () => this.doc;
+
+ getFieldByID = (id: number): TemplateField | undefined => this.allFields.filter(field => field.getID === id)[0];
+
+ getFieldByTitle = (title: string) => [...this.allFields, ...this._dataFields].filter(field => field.getTitle() === title)[0];
+
+ setupMainField = (templateInfo: FieldSettings) => TemplateField.CreateField(templateInfo, 1, undefined) as DynamicField;
+
+ assignColToField = (fieldID: number, col: Col) => {
+ const field = this.getFieldByID(fieldID);
+ field?.setContent(col.defaultContent ?? '', col.type === TemplateFieldType.VISUAL ? ViewType.IMG : ViewType.TEXT);
+ field?.setTitle(col.title);
+ };
+
+ addDataField = (title: string, content?: string) => this._dataFields.push(new TemplateDataField(title, content));
+
+ removeDataField = (title: string) => (this._dataFields = this._dataFields.filter(field => field.title !== title));
+
+ isValidTemplate = (cols: Col[]) => this.title !== 'template_framework' && this.maxMatches(this.getMatches(cols)) === this.contentFields.length;
+
+ applyConditionalLogicToField = (field: TemplateField | TemplateDataField, logic: Record<string, Conditional[]>) => {
+ if (field instanceof DynamicField) return;
+ const fieldStatements = logic[field.getTitle()];
+ const content = field.getContent();
+ fieldStatements?.forEach(statement => {
+ if (content === statement.condition) {
+ if (statement.target === 'Template') {
+ if (this._mainField.renderedDoc) {
+ this._mainField.renderedDoc[statement.attribute] = statement.value;
+ Object.assign(this._mainField.settings.opts, { [statement.attribute]: statement.value });
+ }
+ } else {
+ const targetField = this.getFieldByTitle(statement.target);
+ if (targetField instanceof TemplateField && targetField.renderedDoc) {
+ targetField.renderedDoc[statement.attribute] = statement.value;
+ Object.assign(targetField.settings.opts, { [statement.attribute]: statement.value });
+ }
+ }
+ }
+ });
+ };
+
+ applyConditionalLogic = (logic: Record<string, Conditional[]>) => {
+ [...this.allFields, ...this._dataFields].forEach(field => this.applyConditionalLogicToField(field, logic));
+ return this.getRenderedDoc();
+ };
+
+ setImageAsBackground(url: string, makeTransparent: boolean = false) {
+ const fieldSettings: FieldSettings = {
+ tl: [-1, -1],
+ br: [1, 1],
+ opts: {},
+ viewType: ViewType.IMG,
+ };
+
+ const field = TemplateField.CreateField(fieldSettings, Math.random() * 100 + 100, this._mainField);
+ field.setContent(url);
+
+ if (makeTransparent) {
+ this.allFields.forEach(aField => {
+ aField.updateDocSetting('backgroundColor', 'transparent');
+ aField.updateDocSetting('borderWidth', '0');
+ });
+ }
+
+ this._mainField.makeBackgroundField(field);
+ }
+
+ /**
+ * This function is just a hack for now to get around weird document icon stuff (specifically it misses the background)
+ */
+ setMatteBackground(makeTransparent: boolean = false) {
+ if (this._mainField.hasBackground) {
+ return;
+ }
+
+ const fieldSettings: FieldSettings = {
+ tl: [-1, -1],
+ br: [1, 1],
+ opts: { backgroundColor: String(this._mainField.renderedDoc!.backgroundColor) },
+ viewType: ViewType.TEXT,
+ };
+
+ const field = TemplateField.CreateField(fieldSettings, Math.random() * 100 + 100, this._mainField);
+
+ makeTransparent &&
+ this.allFields.forEach(aField => {
+ aField.updateDocSetting('backgroundColor', 'transparent');
+ aField.updateDocSetting('borderWidth', '0');
+ });
+
+ this._mainField.makeBackgroundField(field);
+ }
+
+ getMatches = (cols: Col[]): number[][] => {
+ const numFields = this.contentFields.length;
+
+ if (cols.length !== numFields) return [];
+
+ const matches = Array<number[]>(numFields);
+
+ this.contentFields.forEach((field, i) => (matches[i] = field.matches(cols)));
+
+ return matches;
+ };
+
+ maxMatches = (matches: number[][]) => {
+ if (matches.length === 0) return 0;
+
+ const fieldsCt = this.contentFields.length;
+ const used = Array<boolean>(fieldsCt).fill(false);
+ const mt = Array<number>(fieldsCt).fill(-1);
+
+ const augmentingPath = (v: number): boolean => {
+ if (!used[v]) {
+ used[v] = true;
+
+ for (const to of matches[v]) {
+ if (mt[to] === -1 || augmentingPath(mt[to])) {
+ mt[to] = v;
+ return true;
+ }
+ }
+ }
+ return false;
+ };
+
+ for (let v = 0; v < fieldsCt; ++v) {
+ used.fill(false);
+ augmentingPath(v);
+ }
+
+ let count: number = 0;
+ for (let i = 0; i < fieldsCt; ++i) {
+ if (mt[i] !== -1) ++count;
+ }
+ return count;
+ };
+}
diff --git a/src/client/views/nodes/DataVizBox/DocCreatorMenu/Template.tsx b/src/client/views/nodes/DataVizBox/DocCreatorMenu/Template.tsx
deleted file mode 100644
index 0a5097d4a..000000000
--- a/src/client/views/nodes/DataVizBox/DocCreatorMenu/Template.tsx
+++ /dev/null
@@ -1,139 +0,0 @@
-import { Doc, FieldType } from "../../../../../fields/Doc";
-import { Col } from "./DocCreatorMenu";
-import { DynamicField } from "./FieldTypes/DynamicField";
-import { Field, FieldSettings, ViewType } from "./FieldTypes/Field";
-import { } from "./FieldTypes/FieldUtils";
-import { } from "./FieldTypes/StaticField";
-
-export class Template {
-
- mainField: DynamicField;
- settings: FieldSettings;
-
- constructor(templateInfo: FieldSettings) {
- this.mainField = this.setupMainField(templateInfo);
- this.settings = templateInfo;
- }
-
- get childFields(): Field[] { return this.mainField.getSubfields };
- get allFields(): Field[] { return this.mainField.getAllSubfields };
- get contentFields(): Field[] { return this.allFields.filter(field => field.getViewType === ViewType.STATIC) };
- get doc(){ return this.mainField.renderedDoc(); };
-
- cloneBase = () => {
- const clone: Template = new Template(this.settings);
- clone.allFields.forEach(field => {
- const matchingField: Field = this.allFields.filter(f => f.getID === field.getID)[0];
- matchingField.applyAttributes(field);
- })
- return clone;
- }
-
- getRenderedDoc = () => {
- const doc: Doc = this.mainField.renderedDoc();
- this.contentFields.forEach(field => {
- const title: string = field.getTitle();
- const val: FieldType = field.getContent() as FieldType;
- if (!title || !val) return;
- doc[title] = val;
- });
- return doc;
- }
-
- getFieldByID = (id: number): Field => {
- return this.allFields.filter(field => field.getID === id)[0];
- }
-
- getFieldByTitle = (title: string) => {
- return this.allFields.filter(field => field.getTitle() === title)[0];
- }
-
- setupMainField = (templateInfo: FieldSettings) => {
- return new DynamicField(templateInfo, 1);
- }
-
- get descriptionSummary(): string {
- let summary: string = '';
- this.contentFields.forEach(field => {
- summary += `--- Field #${field.getID} (title: ${field.getTitle()}): ${field.getDescription ?? ''} ---`;
- });
- return summary;
- }
-
- get compiledContent(): string {
- let summary: string = '';
- this.contentFields.forEach(field => {
- summary += `--- Field #${field.getID} (title: ${field.getTitle()}): ${field.getContent() ?? ''} ---`;
- });
- return summary;
- }
-
- renderUpdates = () => {
- this.allFields.forEach(field => {
- field.updateRenderedDoc(field.renderedDoc());
- });
- };
-
- resetToBase = () => {
- this.allFields.forEach(field => {
- field.updateRenderedDoc();
- })
- }
-
- isValidTemplate = (cols: Col[]) => {
- const matches: number[][] = this.getMatches(cols);
- const maxMatches: number = this.maxMatches(matches);
- return maxMatches === this.contentFields.length;
- }
-
- getMatches = (cols: Col[]): number[][] => {
- const numFields = this.contentFields.length;
-
- if (cols.length !== numFields) return [];
-
- const matches: number[][] = Array(numFields)
- .fill([])
- .map(() => []);
-
- this.contentFields.forEach((field, i) => {
- matches[i] = (field.matches(cols));
- });
-
- return matches;
- }
-
- maxMatches = (matches: number[][]) => {
- if (matches.length === 0) return 0;
-
- const fieldsCt = this.contentFields.length;
- const used: boolean[] = Array(fieldsCt).fill(false);
- const mt: number[] = Array(fieldsCt).fill(-1);
-
- const augmentingPath = (v: number): boolean => {
- if (used[v]) return false;
- used[v] = true;
-
- for (const to of matches[v]) {
- if (mt[to] === -1 || augmentingPath(mt[to])) {
- mt[to] = v;
- return true;
- }
- }
- return false;
- };
-
- for (let v = 0; v < fieldsCt; ++v) {
- used.fill(false);
- augmentingPath(v);
- }
-
- let count: number = 0;
-
- for (let i = 0; i < fieldsCt; ++i) {
- if (mt[i] !== -1) ++count;
- }
-
- return count;
- };
-
-} \ No newline at end of file
diff --git a/src/client/views/nodes/DataVizBox/DocCreatorMenu/TemplateBackend.tsx b/src/client/views/nodes/DataVizBox/DocCreatorMenu/TemplateBackend.ts
index d3282eda3..26fd3a8fc 100644
--- a/src/client/views/nodes/DataVizBox/DocCreatorMenu/TemplateBackend.tsx
+++ b/src/client/views/nodes/DataVizBox/DocCreatorMenu/TemplateBackend.ts
@@ -1,10 +1,10 @@
-import { FieldSettings, ViewType } from "./FieldTypes/Field";
-import { } from "./FieldTypes/StaticField";
+import { FieldSettings, ViewType } from './TemplateFieldTypes/TemplateField';
export enum TemplateFieldType {
TEXT = 'text',
VISUAL = 'visual',
UNSET = 'unset',
+ DATA = 'data',
}
export enum TemplateFieldSize {
@@ -20,6 +20,14 @@ export class TemplateLayouts {
return Object.values(TemplateLayouts);
}
+ public static BasicSettings: FieldSettings = {
+ title: 'template_framework',
+ tl: [0, 0],
+ br: [400, 700],
+ viewType: ViewType.FREEFORM,
+ opts: {},
+ };
+
public static FourField001: FieldSettings = {
title: 'fourfield001',
tl: [0, 0],
@@ -27,7 +35,7 @@ export class TemplateLayouts {
viewType: ViewType.FREEFORM,
opts: {
backgroundColor: '#C0B887',
- cornerRounding: .05,
+ _layout_borderRounding: '.05',
//borderColor: '#6B461F',
//borderWidth: '12',
},
@@ -41,9 +49,9 @@ export class TemplateLayouts {
description: 'A title field for very short text that contextualizes the content.',
opts: {
backgroundColor: 'transparent',
- color: '#F1F0E9',
- contentXCentering: 'h-center',
- fontBold: true,
+ text_fontColor: '#F1F0E9',
+ hCentering: 'h-center',
+ contentBold: true,
},
},
{
@@ -54,9 +62,9 @@ export class TemplateLayouts {
sizes: [TemplateFieldSize.MEDIUM, TemplateFieldSize.LARGE, TemplateFieldSize.HUGE],
description: 'The main focus of the template; could be an image, long text, etc.',
opts: {
- cornerRounding: .05,
+ _layout_borderRounding: '.05',
borderColor: '#8F5B25',
- borderWidth: '6',
+ borderWidth: 6,
backgroundColor: '#CECAB9',
},
},
@@ -69,8 +77,8 @@ export class TemplateLayouts {
description: 'A caption for field #2, very short text.',
opts: {
backgroundColor: 'transparent',
- contentXCentering: 'h-center',
- color: '#F1F0E9',
+ hCentering: 'h-center',
+ text_fontColor: '#F1F0E9',
},
},
{
@@ -81,9 +89,9 @@ export class TemplateLayouts {
sizes: [TemplateFieldSize.MEDIUM, TemplateFieldSize.LARGE, TemplateFieldSize.HUGE],
description: 'A medium-sized field for medium/long text.',
opts: {
- cornerRounding: .05,
+ _layout_borderRounding: '.05',
borderColor: '#8F5B25',
- borderWidth: '6',
+ borderWidth: 6,
backgroundColor: '#CECAB9',
},
},
@@ -93,7 +101,7 @@ export class TemplateLayouts {
public static FourField002: FieldSettings = {
title: 'fourfield002',
viewType: ViewType.FREEFORM,
- tl: [0,0],
+ tl: [0, 0],
br: [425, 778],
opts: {
backgroundColor: '#242425',
@@ -107,10 +115,10 @@ export class TemplateLayouts {
sizes: [TemplateFieldSize.MEDIUM, TemplateFieldSize.LARGE],
description: 'A medium to large-sized field suitable for an image or longer text that should be the main focus.',
opts: {
- borderWidth: '8',
+ borderWidth: 8,
borderColor: '#F8E71C',
backgroundColor: '#242425',
- color: 'white',
+ text_fontColor: 'white',
},
},
{
@@ -122,9 +130,9 @@ export class TemplateLayouts {
description: 'A tiny field for just a word or two of plain text.',
opts: {
backgroundColor: 'transparent',
- color: 'white',
- contentXCentering: 'h-center',
- fontTransform: 'uppercase',
+ text_fontColor: 'white',
+ hCentering: 'h-center',
+ text_transform: 'uppercase',
},
},
{
@@ -136,9 +144,9 @@ export class TemplateLayouts {
description: 'A tiny field for just a word or two of plain text.',
opts: {
backgroundColor: 'transparent',
- color: 'white',
- contentXCentering: 'h-center',
- fontTransform: 'uppercase',
+ text_fontColor: 'white',
+ hCentering: 'h-center',
+ text_transform: 'uppercase',
},
},
{
@@ -149,9 +157,9 @@ export class TemplateLayouts {
sizes: [TemplateFieldSize.MEDIUM, TemplateFieldSize.LARGE, TemplateFieldSize.HUGE],
description: 'A medium to large-sized field suitable for longer text that should contextualize field 1.',
opts: {
- borderWidth: '8',
+ borderWidth: 8,
borderColor: '#F8E71C',
- color: 'white',
+ text_fontColor: 'white',
backgroundColor: '#242425',
},
},
@@ -161,7 +169,7 @@ export class TemplateLayouts {
br: [-0.525, 0.075],
opts: {
backgroundColor: '#F8E71C',
- rotation: 45,
+ _rotation: 45,
},
},
{
@@ -170,7 +178,7 @@ export class TemplateLayouts {
br: [-0.2175, 0.0245],
opts: {
backgroundColor: '#F8E71C',
- rotation: 45,
+ _rotation: 45,
},
},
{
@@ -179,7 +187,7 @@ export class TemplateLayouts {
br: [0.045, 0.0245],
opts: {
backgroundColor: '#F8E71C',
- rotation: 45,
+ _rotation: 45,
},
},
{
@@ -188,7 +196,7 @@ export class TemplateLayouts {
br: [0.3075, 0.0245],
opts: {
backgroundColor: '#F8E71C',
- rotation: 45,
+ _rotation: 45,
},
},
{
@@ -197,7 +205,7 @@ export class TemplateLayouts {
br: [0.8, 0.075],
opts: {
backgroundColor: '#F8E71C',
- rotation: 45,
+ _rotation: 45,
},
},
],
@@ -266,8 +274,8 @@ export class TemplateLayouts {
public static FourField004: FieldSettings = {
title: 'fourfield04',
viewType: ViewType.FREEFORM,
- tl: [0,0],
- br: [414,583],
+ tl: [0, 0],
+ br: [414, 583],
opts: {
backgroundColor: '#6CCAF0',
//borderColor: '#1088C3',
@@ -283,9 +291,9 @@ export class TemplateLayouts {
description: 'A tiny field for just a word or two of plain text.',
opts: {
backgroundColor: '#E2B4F5',
- borderWidth: '9',
+ borderWidth: 9,
borderColor: '#9222F1',
- contentXCentering: 'h-center',
+ hCentering: 'h-center',
},
},
{
@@ -297,9 +305,9 @@ export class TemplateLayouts {
description: 'A tiny field for just a word or two of plain text.',
opts: {
backgroundColor: '#F5B4DD',
- borderWidth: '9',
+ borderWidth: 9,
borderColor: '#E260F3',
- contentXCentering: 'h-center',
+ hCentering: 'h-center',
},
},
{
@@ -310,7 +318,7 @@ export class TemplateLayouts {
sizes: [TemplateFieldSize.MEDIUM, TemplateFieldSize.LARGE, TemplateFieldSize.HUGE],
description: 'A large to huge field for visual content that is the main content of the template.',
opts: {
- borderWidth: '16',
+ borderWidth: 16,
borderColor: '#A2BD77',
},
},
@@ -322,7 +330,7 @@ export class TemplateLayouts {
sizes: [TemplateFieldSize.MEDIUM, TemplateFieldSize.LARGE],
description: 'A medium to large field for text that describes the visual content above',
opts: {
- borderWidth: '9',
+ borderWidth: 9,
borderColor: '#F0D601',
backgroundColor: '#F3F57D',
},
@@ -334,7 +342,7 @@ export class TemplateLayouts {
opts: {
backgroundColor: 'transparent',
borderColor: '#007C0C',
- borderWidth: '10',
+ borderWidth: 10,
},
},
],
@@ -343,218 +351,229 @@ export class TemplateLayouts {
public static FourField005: FieldSettings = {
title: 'fourfield05',
viewType: ViewType.FREEFORM,
- tl: [0,0],
- br: [400,550],
+ tl: [0, 0],
+ br: [400, 514],
opts: {
backgroundColor: '#95A575',
},
subfields: [
{
viewType: ViewType.STATIC,
- tl: [-0.9, -.925],
- br: [-.075, -.775],
+ tl: [-0.9, -0.925],
+ br: [-0.075, -0.775],
types: [TemplateFieldType.TEXT],
sizes: [TemplateFieldSize.TINY, TemplateFieldSize.SMALL],
description: 'A small text field for a title or word(s) that categorize the rest of the content.',
opts: {
borderColor: '#3B4A2C',
- borderWidth: '8',
- contentXCentering: "h-center",
+ borderWidth: 8,
+ hCentering: 'h-center',
backgroundColor: '#B8DC90',
},
},
{
viewType: ViewType.STATIC,
- tl: [.075, -.925],
- br: [.9, -.775],
+ tl: [0.075, -0.925],
+ br: [0.9, -0.775],
types: [TemplateFieldType.TEXT],
sizes: [TemplateFieldSize.TINY, TemplateFieldSize.SMALL],
description: 'A small text field for a title that categorizes the rest of the content.',
opts: {
borderColor: '#3B4A2C',
- borderWidth: '8',
- contentXCentering: "h-center",
+ borderWidth: 8,
+ hCentering: 'h-center',
backgroundColor: '#B8DC90',
},
},
{
viewType: ViewType.DEC,
- tl: [-.82, -.4],
- br: [-.5, -.2],
+ tl: [-0.82, -0.4],
+ br: [-0.5, -0.2],
opts: {
backgroundColor: '#94B058',
borderColor: '#3B4A2C',
- borderWidth: '8',
+ borderWidth: 8,
},
},
{
viewType: ViewType.STATIC,
- tl: [-0.66, -.65],
- br: [0.66, .25],
+ tl: [-0.66, -0.65],
+ br: [0.66, 0.25],
types: [TemplateFieldType.VISUAL],
sizes: [TemplateFieldSize.MEDIUM, TemplateFieldSize.LARGE],
description: 'A medium to large field in the center of the template, for the main visual content.',
opts: {
borderColor: '#3B4A2C',
- borderWidth: '8',
+ borderWidth: 8,
backgroundColor: '#B8DC90',
},
},
{
viewType: ViewType.STATIC,
- tl: [-.875, .425],
- br: [0.875, .925],
+ tl: [-0.875, 0.425],
+ br: [0.875, 0.925],
types: [TemplateFieldType.TEXT],
sizes: [TemplateFieldSize.MEDIUM, TemplateFieldSize.LARGE],
description: 'A medium to large field at the bottom of the template, for the main text content.',
opts: {
borderColor: '#3B4A2C',
- borderWidth: '8',
- contentXCentering: "h-center",
+ borderWidth: 8,
+ hCentering: 'h-center',
backgroundColor: '#B8DC90',
},
},
{
viewType: ViewType.DEC,
- tl: [-1.1, -.62],
- br: [-.9, -.5],
+ tl: [-1.1, -0.62],
+ br: [-0.9, -0.5],
opts: {
backgroundColor: '#7A9D31',
borderColor: '#3B4A2C',
- borderWidth: '8',
+ borderWidth: 8,
},
},
{
viewType: ViewType.DEC,
tl: [-1.1, 0],
- br: [-.9, .15],
+ br: [-0.9, 0.15],
opts: {
backgroundColor: '#94B058',
borderColor: '#3B4A2C',
- borderWidth: '8',
+ borderWidth: 8,
},
},
{
viewType: ViewType.DEC,
- tl: [-.93, -.265],
- br: [-.715, -.125],
+ tl: [-0.93, -0.265],
+ br: [-0.715, -0.125],
opts: {
backgroundColor: '#728745',
borderColor: '#3B4A2C',
- borderWidth: '8',
+ borderWidth: 8,
},
},
{
viewType: ViewType.DEC,
- tl: [.7, -.45],
- br: [.85, -.3],
+ tl: [0.7, -0.45],
+ br: [0.85, -0.3],
opts: {
backgroundColor: '#7A9D31',
borderColor: '#3B4A2C',
- borderWidth: '8',
+ borderWidth: 8,
},
},
{
viewType: ViewType.DEC,
- tl: [.8, .03],
- br: [1.2, .33],
+ tl: [0.8, 0.03],
+ br: [1.2, 0.33],
opts: {
backgroundColor: '#728745',
borderColor: '#3B4A2C',
- borderWidth: '8',
+ borderWidth: 8,
},
},
{
viewType: ViewType.DEC,
- tl: [.875, -.13],
- br: [1.2, .12],
+ tl: [0.875, -0.13],
+ br: [1.2, 0.12],
opts: {
backgroundColor: '#94B058',
borderColor: '#3B4A2C',
- borderWidth: '8',
+ borderWidth: 8,
},
},
- ]
- }
+ ],
+ };
public static FourFieldCarousel: FieldSettings = {
title: 'title_fourfieldcarousel',
viewType: ViewType.FREEFORM,
- tl:[0,0],
- br:[500, 600],
+ tl: [0, 0],
+ br: [500, 600],
opts: {
- backgroundColor: '#DDD3A9',
+ backgroundColor: '#D7CBAB',
},
subfields: [
{
viewType: ViewType.STATIC,
- tl: [-0.8, -.9],
- br: [0.8, -.5],
+ tl: [-0.8, -0.9],
+ br: [0.8, -0.5],
types: [TemplateFieldType.TEXT],
sizes: [TemplateFieldSize.TINY, TemplateFieldSize.SMALL],
description: 'A small text field for a title that categorizes the rest of the content.',
opts: {
- borderColor: 'yellow',
- borderWidth: '8',
- contentXCentering: "h-center",
+ hCentering: 'h-center',
backgroundColor: 'transparent',
+ text_transform: 'uppercase',
},
},
{
viewType: ViewType.CAROUSEL3D,
- tl: [-0.9, -.3],
- br: [0.9, .9],
+ tl: [-0.9, -0.5],
+ br: [0.9, 0.25],
opts: {
- borderColor: 'yellow',
- borderWidth: '8',
- backgroundColor: 'transparent',
+ borderColor: '#847F69',
+ borderWidth: 8,
+ backgroundColor: '#C8BA94',
},
subfields: [
{
viewType: ViewType.STATIC,
- tl: [-.3, -.6],
- br: [.3, .6],
+ tl: [-0.4, -0.6],
+ br: [0.4, 0.6],
types: [TemplateFieldType.VISUAL, TemplateFieldType.TEXT],
sizes: [TemplateFieldSize.MEDIUM, TemplateFieldSize.LARGE, TemplateFieldSize.HUGE],
description: 'A medium to large field for content that will share central focus with other content in the carousel.',
opts: {
- borderColor: 'yellow',
- borderWidth: '8',
+ //borderColor: 'yellow',
+ //borderWidth: '8',
},
},
{
viewType: ViewType.STATIC,
- tl: [-.3, -.6],
- br: [.3, .6],
+ tl: [-0.4, -0.6],
+ br: [0.4, 0.6],
types: [TemplateFieldType.VISUAL, TemplateFieldType.TEXT],
sizes: [TemplateFieldSize.MEDIUM, TemplateFieldSize.LARGE, TemplateFieldSize.HUGE],
description: 'A medium to large field for content that will share central focus with other content in the carousel.',
opts: {
- borderColor: 'black',
- borderWidth: '8',
+ //borderColor: 'black',
+ //borderWidth: '8',
},
},
{
viewType: ViewType.STATIC,
- tl: [-.3, -.6],
- br: [.3, .6],
+ tl: [-0.4, -0.6],
+ br: [0.4, 0.6],
types: [TemplateFieldType.VISUAL, TemplateFieldType.TEXT],
sizes: [TemplateFieldSize.MEDIUM, TemplateFieldSize.LARGE, TemplateFieldSize.HUGE],
description: 'A medium to large field for content that will share central focus with other content in the carousel.',
opts: {
- borderColor: 'yellow',
- borderWidth: '8',
+ //borderColor: 'yellow',
+ //borderWidth: '8',
},
},
- ]
+ ],
},
- ]
- }
+ {
+ viewType: ViewType.STATIC,
+ tl: [-0.9, 0.35],
+ br: [0.9, 0.9],
+ types: [TemplateFieldType.TEXT],
+ sizes: [TemplateFieldSize.MEDIUM, TemplateFieldSize.LARGE],
+ description: 'A medium text field for a description of the content in the carousel.',
+ opts: {
+ hCentering: 'h-center',
+ backgroundColor: 'transparent',
+ },
+ },
+ ],
+ };
public static ThreeField001: FieldSettings = {
title: 'threefield001',
viewType: ViewType.FREEFORM,
- tl: [0,0],
+ tl: [0, 0],
br: [575, 770],
opts: {
backgroundColor: '#DDD3A9',
@@ -567,23 +586,23 @@ export class TemplateLayouts {
description: 'A medium to large field for visual content that is the central focus.',
opts: {
borderColor: 'yellow',
- borderWidth: '8',
+ borderWidth: 8,
backgroundColor: '#DDD3A9',
- rotation: 45,
+ _rotation: 45,
},
subfields: [
{
- viewType: ViewType.STATIC,
- tl: [-1.25, -1.25],
- br: [1.25, 1.25],
- types: [TemplateFieldType.VISUAL],
- sizes: [TemplateFieldSize.MEDIUM, TemplateFieldSize.LARGE, TemplateFieldSize.HUGE],
- description: 'A medium to large field for visual content that is the central focus.',
- opts: {
- rotation: -45,
+ viewType: ViewType.STATIC,
+ tl: [-1.25, -1.25],
+ br: [1.25, 1.25],
+ types: [TemplateFieldType.VISUAL],
+ sizes: [TemplateFieldSize.MEDIUM, TemplateFieldSize.LARGE, TemplateFieldSize.HUGE],
+ description: 'A medium to large field for visual content that is the central focus.',
+ opts: {
+ _rotation: -45,
+ },
},
- },
- ]
+ ],
},
{
viewType: ViewType.STATIC,
@@ -594,7 +613,7 @@ export class TemplateLayouts {
description: 'A very small text field for one to a few words. A good caption for the image.',
opts: {
backgroundColor: 'transparent',
- contentXCentering: 'h-center',
+ hCentering: 'h-center',
},
},
{
@@ -606,7 +625,7 @@ export class TemplateLayouts {
description: 'A medium to large text field for a thorough description of the image. ',
opts: {
backgroundColor: 'transparent',
- color: 'white',
+ text_fontColor: 'white',
},
},
{
@@ -615,18 +634,18 @@ export class TemplateLayouts {
br: [1.8, -0.66],
opts: {
backgroundColor: '#CEB155',
- rotation: 45,
+ _rotation: 45,
},
subfields: [
{
viewType: ViewType.DEC,
- tl: [-1, -.7],
- br: [1, -.625],
+ tl: [-1, -0.7],
+ br: [1, -0.625],
opts: {
backgroundColor: 'yellow',
},
},
- ]
+ ],
},
{
viewType: ViewType.FREEFORM,
@@ -634,18 +653,18 @@ export class TemplateLayouts {
br: [-0.2, -0.66],
opts: {
backgroundColor: '#CEB155',
- rotation: 135,
+ _rotation: 135,
},
subfields: [
{
viewType: ViewType.DEC,
- tl: [-1, -.7],
- br: [1, -.625],
+ tl: [-1, -0.7],
+ br: [1, -0.625],
opts: {
backgroundColor: 'yellow',
},
},
- ]
+ ],
},
{
viewType: ViewType.FREEFORM,
@@ -653,18 +672,18 @@ export class TemplateLayouts {
br: [1.66, 1.25],
opts: {
backgroundColor: '#CEB155',
- rotation: 135,
+ _rotation: 135,
},
subfields: [
{
viewType: ViewType.DEC,
- tl: [-1, -.7],
- br: [1, -.625],
+ tl: [-1, -0.7],
+ br: [1, -0.625],
opts: {
backgroundColor: 'yellow',
},
},
- ]
+ ],
},
{
viewType: ViewType.FREEFORM,
@@ -672,18 +691,18 @@ export class TemplateLayouts {
br: [-0.33, 1.25],
opts: {
backgroundColor: '#CEB155',
- rotation: 45,
+ _rotation: 45,
},
subfields: [
{
viewType: ViewType.DEC,
- tl: [-1, -.7],
- br: [1, -.625],
+ tl: [-1, -0.7],
+ br: [1, -0.625],
opts: {
backgroundColor: 'yellow',
},
},
- ]
+ ],
},
],
};
@@ -691,7 +710,7 @@ export class TemplateLayouts {
public static ThreeField002: FieldSettings = {
title: 'threefield002',
viewType: ViewType.FREEFORM,
- tl: [0,0],
+ tl: [0, 0],
br: [477, 662],
opts: {
backgroundColor: '#9E9C95',
@@ -705,7 +724,7 @@ export class TemplateLayouts {
sizes: [TemplateFieldSize.MEDIUM, TemplateFieldSize.LARGE, TemplateFieldSize.HUGE],
description: 'A medium to large visual field for the main content of the template',
opts: {
- borderWidth: '15',
+ borderWidth: 15,
borderColor: '#E0E0DA',
},
},
@@ -718,10 +737,10 @@ export class TemplateLayouts {
description: 'A very small text field for one to a few words. The content should represent a general categorization of the image.',
opts: {
backgroundColor: 'transparent',
- color: '#AF0D0D',
- fontTransform: 'uppercase',
- fontBold: true,
- contentXCentering: 'h-left',
+ text_fontColor: '#AF0D0D',
+ text_transform: 'uppercase',
+ contentBold: true,
+ hCentering: 'h-left',
},
},
{
@@ -733,8 +752,8 @@ export class TemplateLayouts {
description: 'A very small text field for one to a few words. The content should contextualize field 2.',
opts: {
backgroundColor: 'transparent',
- color: 'black',
- contentXCentering: 'h-right',
+ text_fontColor: 'black',
+ hCentering: 'h-right',
},
},
{
@@ -747,6 +766,4 @@ export class TemplateLayouts {
},
],
};
-}
-
-
+} \ No newline at end of file
diff --git a/src/client/views/nodes/DataVizBox/DocCreatorMenu/TemplateFieldTypes/DataField.ts b/src/client/views/nodes/DataVizBox/DocCreatorMenu/TemplateFieldTypes/DataField.ts
new file mode 100644
index 000000000..6b4086483
--- /dev/null
+++ b/src/client/views/nodes/DataVizBox/DocCreatorMenu/TemplateFieldTypes/DataField.ts
@@ -0,0 +1,20 @@
+
+import { ViewType } from "./TemplateField";
+
+export class TemplateDataField {
+
+ viewType: ViewType = ViewType.NONE;
+
+ title: string = '';
+ content: string | undefined;
+
+ constructor(title: string, content?: string) {
+ this.title = title;
+ this.content = content;
+ }
+
+ setContent(content: string, viewType?: ViewType) { this.content = content }
+ getContent() { return this.content }
+
+ getTitle() { return this.title }
+} \ No newline at end of file
diff --git a/src/client/views/nodes/DataVizBox/DocCreatorMenu/TemplateFieldTypes/DecorationField.ts b/src/client/views/nodes/DataVizBox/DocCreatorMenu/TemplateFieldTypes/DecorationField.ts
new file mode 100644
index 000000000..98a9dc7a6
--- /dev/null
+++ b/src/client/views/nodes/DataVizBox/DocCreatorMenu/TemplateFieldTypes/DecorationField.ts
@@ -0,0 +1,3 @@
+import { DynamicField } from './DynamicField';
+
+export class DecorationField extends DynamicField {}
diff --git a/src/client/views/nodes/DataVizBox/DocCreatorMenu/TemplateFieldTypes/DynamicField.ts b/src/client/views/nodes/DataVizBox/DocCreatorMenu/TemplateFieldTypes/DynamicField.ts
new file mode 100644
index 000000000..b9042258b
--- /dev/null
+++ b/src/client/views/nodes/DataVizBox/DocCreatorMenu/TemplateFieldTypes/DynamicField.ts
@@ -0,0 +1,131 @@
+import { IDisposer } from 'mobx-utils';
+import { Doc } from '../../../../../../fields/Doc';
+import { DocData } from '../../../../../../fields/DocSymbols';
+import { List } from '../../../../../../fields/List';
+import { NumCast } from '../../../../../../fields/Types';
+import { Docs } from '../../../../../documents/Documents';
+import { DocumentType } from '../../../../../documents/DocumentTypes';
+import { FieldSettings, TemplateField, ViewType } from './TemplateField';
+
+export class DynamicField extends TemplateField {
+ protected _disposers: { [name: string]: IDisposer } = {};
+ protected _subfields: TemplateField[] = [];
+ protected backgroundField: TemplateField | undefined;
+
+ get getSubfields() {
+ return this._subfields;
+ }
+ get getAllSubfields(): TemplateField[] {
+ return this.getSubfields.flatMap(field => [field, ...((field as DynamicField).getAllSubfields ?? [])]);
+ }
+
+ get hasBackground() {
+ return this.backgroundField !== undefined;
+ }
+
+ handleFieldUpdate = (newDocsList: Doc[]) => {
+ const currRenderedDocs = new Set(this.getSubfields.filter(field => field.renderedDoc).map(field => field.renderedDoc!));
+ newDocsList.forEach(doc => !currRenderedDocs.has(doc) && this.addFieldFromDoc(doc));
+ currRenderedDocs.forEach(doc => {
+ if (!newDocsList.includes(doc)) {
+ this._subfields.forEach(field => field.renderedDoc === doc && this.removeField(field));
+ }
+ });
+ };
+
+ addFieldFromDoc = (doc: Doc) => {
+ const par = this._renderDoc;
+ const settings: FieldSettings = {
+ tl: [Number(doc._x) / NumCast(par?._width, 1), Number(doc?._y) / NumCast(par?._height, 1)],
+ br: [(Number(doc._x) + Number(doc._width)) / NumCast(par?._width, 1), (Number(doc._y) + Number(doc._height)) / NumCast(par?._height, 1)],
+ viewType: doc.type === DocumentType.COL ? ViewType.FREEFORM : ViewType.STATIC,
+ opts: {},
+ };
+
+ this._subfields.push(TemplateField.CreateField(settings, this._subfields.length, this));
+ };
+
+ addField = (field: TemplateField, layer: number = 0) => {
+ if (!this._subfields.includes(field)) {
+ this._subfields.splice(layer, 0, field);
+ }
+ };
+
+ dispose = () => Object.values(this._disposers).forEach(disposer => disposer?.());
+
+ removeField = (field: TemplateField) => {
+ // field.renderedDoc && this._renderDoc && Doc.RemoveDocFromList(this._renderDoc, undefined, field.renderedDoc);
+ this._subfields.splice(this._subfields.indexOf(field), 1);
+ (field as DynamicField).dispose?.();
+ };
+
+ // implement Field's abstract method for replacing a subfield with a new one
+ exchangeFields(newField: TemplateField, oldField: TemplateField) {
+ this._subfields.splice(this._subfields.indexOf(oldField), 1, newField);
+ this.refreshRenderedDoc();
+ }
+
+ get isContentField(): boolean {
+ return false;
+ }
+
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
+ setContent(content: string, type: ViewType) {}
+
+ getContent = () => '';
+
+ addChildToDocument = (doc: Doc) => this._renderDoc && Doc.SetContainer(doc, this._renderDoc);
+
+ makeBackgroundField = (field: TemplateField) => {
+ if (this.backgroundField && this.backgroundField !== field) {
+ this.removeField(this.backgroundField);
+ this.backgroundField = undefined;
+ }
+ if (field && field !== this.backgroundField) {
+ this.addField(field);
+ this.backgroundField = field;
+ }
+ this.refreshRenderedDoc();
+ }
+
+ matches = (): Array<number> => [];
+
+ makeClone(parent?: DynamicField, withContent: boolean = false) {
+ const dynClone = super.makeClone(parent) as DynamicField;
+ dynClone._subfields = this.getSubfields.map(field => {
+ if (field === this.backgroundField) {
+ const backgroundField: TemplateField = field.makeClone(dynClone, true);
+ dynClone.makeBackgroundField(backgroundField);
+ return backgroundField;
+ } else {
+ return field.makeClone(dynClone, withContent)
+ }
+ });
+ if (dynClone._renderDoc) {
+ dynClone._renderDoc[DocData].data = new List<Doc>(dynClone.getSubfields.filter(sub => sub.renderedDoc).map(sub => sub.renderedDoc!));
+ }
+ return dynClone;
+ }
+
+ initRenderDoc = (settings: FieldSettings) => {
+ //this._disposers.fieldList = reaction(() => DocListCast(this._renderDoc?.[Doc.LayoutFieldKey(this._renderDoc)]), this.handleFieldUpdate);
+ this._subfields = settings.subfields?.map((fieldSettings, index) => {return TemplateField.CreateField(fieldSettings, index, this)}) || [];
+ const renderedSubfields = this._subfields.filter(field => field.renderedDoc).map(field => field.renderedDoc!);
+ settings.opts.title = settings.title;
+ this._renderDoc = (() => { switch (settings.viewType) {
+ case ViewType.CAROUSEL3D: return Docs.Create.Carousel3DDocument(renderedSubfields, settings.opts);
+ case ViewType.FREEFORM:
+ default: return Docs.Create.FreeformDocument(renderedSubfields, settings.opts);
+ }})(); // prettier-ignore
+ return this;
+ };
+
+ refreshRenderedDoc = () => {
+ const renderedSubfields = this._subfields.filter(field => field.renderedDoc).map(field => field.renderedDoc!);
+ this._renderDoc = (() => { switch (this.settings.viewType) {
+ case ViewType.CAROUSEL3D: return Docs.Create.Carousel3DDocument(renderedSubfields, this.settings.opts);
+ case ViewType.FREEFORM:
+ default: return Docs.Create.FreeformDocument(renderedSubfields, this.settings.opts);
+ }})();
+ }
+}
diff --git a/src/client/views/nodes/DataVizBox/DocCreatorMenu/TemplateFieldTypes/StaticContentField.ts b/src/client/views/nodes/DataVizBox/DocCreatorMenu/TemplateFieldTypes/StaticContentField.ts
new file mode 100644
index 000000000..569c43af4
--- /dev/null
+++ b/src/client/views/nodes/DataVizBox/DocCreatorMenu/TemplateFieldTypes/StaticContentField.ts
@@ -0,0 +1,62 @@
+import { FieldResult } from '../../../../../../fields/Doc';
+import { DocData } from '../../../../../../fields/DocSymbols';
+import { RichTextField } from '../../../../../../fields/RichTextField';
+import { ImageField } from '../../../../../../fields/URLField';
+import { Docs } from '../../../../../documents/Documents';
+import { FieldSettings, TemplateField, ViewType } from './TemplateField';
+import { TemplateFieldUtils } from './TemplateFieldUtils';
+
+export abstract class StaticContentField extends TemplateField {
+ protected _content: string = '';
+
+ getContent = () => this._content ?? 'unset';
+ get isContentField(): boolean {
+ return true;
+ }
+ protected setDataContent(viewType: ViewType, fieldKey: string, data: FieldResult, content: string, type?: ViewType) {
+ super.setContent(content, type);
+
+ if (type === viewType || type === undefined) {
+ this._content = content;
+ this._renderDoc && (this._renderDoc[DocData][fieldKey] = data);
+ } else {
+ this.changeFieldType(type).setContent(content, type);
+ }
+ }
+}
+
+export class ImageTemplateField extends StaticContentField {
+ setContent(url: string, type?: ViewType) {
+ this.setDataContent(ViewType.IMG, 'data', new ImageField(url), url, type);
+ this._renderDoc!['backgroundColor'] = 'white';
+ }
+
+ initRenderDoc(settings: FieldSettings) {
+ settings.opts.title = settings.title ?? '';
+ settings.opts._layout_fitWidth = false;
+ this._renderDoc = Docs.Create.ImageDocument(this._content, settings.opts);
+ return this;
+ }
+
+ updateDocSetting(setting: string, newVal: string) {
+ if (this._renderDoc) this._renderDoc[setting] = newVal;
+ if (setting !== 'backgroundColor') {
+ const settings: {[s: string]: string } = {[setting]: newVal}
+ Object.assign(this.settings.opts, settings);
+ }
+ }
+}
+
+export class TextTemplateField extends StaticContentField {
+ setContent(text: string, type?: ViewType) {
+ const fontSize: number = TemplateFieldUtils.calculateFontSize(this._dimensions?.width ?? 10, this._dimensions?.height ?? 10, text, true);
+ this.setDataContent(ViewType.TEXT, 'text', RichTextField.textToRtf(text, undefined, {fontSize: fontSize}), text, type);
+ }
+
+ initRenderDoc(settings: FieldSettings) {
+ settings.opts.title = settings.title ?? '';
+ settings.opts.text_fontSize = TemplateFieldUtils.calculateFontSize(this._dimensions?.width ?? 10, this._dimensions?.height ?? 10, '', true) + '';
+ this._renderDoc = Docs.Create.TextDocument(this._content, settings.opts);
+ return this;
+ }
+}
diff --git a/src/client/views/nodes/DataVizBox/DocCreatorMenu/TemplateFieldTypes/TemplateField.ts b/src/client/views/nodes/DataVizBox/DocCreatorMenu/TemplateFieldTypes/TemplateField.ts
new file mode 100644
index 000000000..091ef834a
--- /dev/null
+++ b/src/client/views/nodes/DataVizBox/DocCreatorMenu/TemplateFieldTypes/TemplateField.ts
@@ -0,0 +1,172 @@
+/* eslint-disable no-use-before-define */
+import { Doc } from '../../../../../../fields/Doc';
+import { DocumentOptions } from '../../../../../documents/Documents';
+import { Col } from '../DocCreatorMenu';
+import { Template } from '../Template';
+import { TemplateFieldSize, TemplateFieldType } from '../TemplateBackend';
+
+export abstract class TemplateField {
+ /**
+ * Creates and initializes a new TemplateField based on the settings and parameters
+ *
+ * implemented in FieldUtils and assigned in main (to avoid import cycles)
+ *
+ * @param settings - specification of the field type and other parameters
+ * @param index -
+ * @param parent - TemplateField that contains the new field
+ * @param sameId -
+ * @returns TemplateField
+ */
+ static CreateField: (settings: FieldSettings, index: number, parent: TemplateField | undefined, sameId?: boolean) => TemplateField;
+
+ protected _parent?: TemplateField;
+ protected _id: number;
+ protected _title: string = '';
+ protected _settings: FieldSettings;
+ protected _renderDoc: Doc | undefined;
+ protected _dimensions: FieldDimensions | undefined;
+
+ constructor(settings: FieldSettings, id: number = 1, parent?: TemplateField) {
+ this._id = id;
+ this._parent = parent;
+ this._settings = settings;
+ this._title = settings.title ?? '';
+ this._dimensions = this.getLocalDimensions(this._settings, this._parent?.getDimensions);
+ this.applyBasicOpts(this._dimensions, settings);
+ return this;
+ }
+
+ get renderedDoc() {
+ return this._renderDoc;
+ }
+ get getDimensions() {
+ return this._dimensions;
+ }
+ get getID() {
+ return this._id;
+ }
+ get getDescription(): string {
+ return this._settings?.description ?? '';
+ }
+ get viewType(): ViewType | undefined {
+ return this._settings?.viewType;
+ }
+
+ get settings(): FieldSettings {
+ return this._settings;
+ }
+
+ abstract get isContentField(): boolean;
+ abstract initRenderDoc(settings: FieldSettings): TemplateField;
+ abstract getContent(): string;
+
+ setContent(content: string, type?: ViewType) {
+ if (type) this._settings.viewType = type;
+ }
+
+ setTitle = (title: string) => {
+ this._title = title;
+ this.settings.title = title;
+ if (this._renderDoc) this._renderDoc.title = title;
+ };
+ getTitle = () => this._title;
+
+ updateDocSetting(setting: string, newVal: string) {
+ if (this._renderDoc) this._renderDoc[setting] = newVal;
+ const settings: { [s: string]: string } = { [setting]: newVal };
+ Object.assign(this.settings.opts, settings);
+ }
+
+ makeClone(parent?: TemplateField, withContent: boolean = false) {
+ const settings: FieldSettings = structuredClone(this._settings);
+ const cloned = TemplateField.CreateField(settings, this._id, parent, true); // create a value for this.Document/subfields that we want to ignore
+ cloned.renderedDoc!.width = this.renderedDoc!.width;
+ cloned.renderedDoc!.height = this.renderedDoc!.height;
+ cloned.renderedDoc!.x = this.renderedDoc!.x;
+ cloned.renderedDoc!.y = this.renderedDoc!.y;
+ cloned.renderedDoc!.backgroundColor = this.renderedDoc!.backgroundColor;
+ cloned.setTitle(this._title);
+ cloned._dimensions = this._dimensions;
+ withContent && cloned.setContent(this.getContent());
+ return cloned;
+ }
+
+ exchangeFields(newField: TemplateField, oldField: TemplateField) {
+ throw new Error('Only DynamicField can exchange fields.' + newField._title + ' ' + oldField._title);
+ }
+
+ changeFieldType = (newType: ViewType): TemplateField => {
+ this._settings.viewType = newType;
+ const newField = TemplateField.CreateField(this._settings, this._id, this._parent, true);
+ this._parent?.exchangeFields(newField, this);
+ return newField;
+ };
+
+ matches = (cols: Col[]): number[] => {
+ const colMatchesField = (col: Col) => (this._settings?.sizes?.some(size => col.sizes?.includes(size)) && this._settings.types?.includes(col.type)) ?? false;
+
+ const matches: Array<number> = [];
+
+ cols.forEach((col, v) => {
+ if (colMatchesField(col)) {
+ matches.push(v);
+ }
+ });
+
+ return matches;
+ };
+
+ private getLocalDimensions = (coords: { tl: [number, number]; br: [number, number] }, parentDimensions?: FieldDimensions): FieldDimensions => {
+ if (!parentDimensions) {
+ return { width: coords.br[0] - coords.tl[0], height: coords.br[1] - coords.tl[1], coord: { x: coords.tl[0], y: coords.tl[1] } };
+ }
+ const l = (coords.tl[0] * parentDimensions.width) / 2;
+ const t = coords.tl[1] * parentDimensions.height / 2; //prettier-ignore
+ const r = (coords.br[0] * parentDimensions.width) / 2;
+ const b = coords.br[1] * parentDimensions.height / 2; //prettier-ignore
+ return { width: r-l, height: b-t, coord: { x: l, y: t } }; //prettier-ignore
+ };
+
+ private applyBasicOpts = (dimensions: FieldDimensions, settings: FieldSettings | undefined) => {
+ const opts: DocumentOptions = settings?.opts ?? {};
+ opts.isDefaultTemplateDoc ??= true;
+ opts._layout_hideScroll ??= true;
+ opts.x ??= dimensions.coord.x;
+ opts.y ??= dimensions.coord.y;
+ opts._height ??= dimensions.height;
+ opts._width ??= dimensions.width;
+ opts._nativeWidth ??= dimensions.width;
+ opts._nativeHeight ??= dimensions.height;
+ opts._layout_nativeDimEditable ??= true;
+ opts.layout_boxShadow = 'none';
+ };
+}
+
+export type FieldSettings = {
+ tl: [number, number];
+ br: [number, number];
+ opts: DocumentOptions;
+ types?: TemplateFieldType[];
+ sizes?: TemplateFieldSize[];
+ title?: string;
+ viewType: ViewType;
+ template?: Template;
+ subfields?: FieldSettings[];
+ description?: string;
+};
+
+export enum ViewType {
+ CAROUSEL3D = 'carousel3d',
+ FREEFORM = 'freeform',
+ STATIC = 'static',
+ DEC = 'decoration',
+ IMG = 'image',
+ TEXT = 'text',
+ NONE = 'none',
+}
+
+export type FieldDimensions = {
+ width: number;
+ height: number;
+ coord: { x: number; y: number };
+};
diff --git a/src/client/views/nodes/DataVizBox/DocCreatorMenu/TemplateFieldTypes/TemplateFieldUtils.ts b/src/client/views/nodes/DataVizBox/DocCreatorMenu/TemplateFieldTypes/TemplateFieldUtils.ts
new file mode 100644
index 000000000..b0b531b57
--- /dev/null
+++ b/src/client/views/nodes/DataVizBox/DocCreatorMenu/TemplateFieldTypes/TemplateFieldUtils.ts
@@ -0,0 +1,71 @@
+import { DecorationField } from './DecorationField';
+import { DynamicField } from './DynamicField';
+import { ImageTemplateField, TextTemplateField } from './StaticContentField';
+import { FieldSettings, TemplateField, ViewType } from './TemplateField';
+
+export class TemplateFieldUtils {
+ /**
+ * Creates and initializes a new TemplateField based on the settings and parameters
+ *
+ * implements Field.initField ... see main.tsx
+ *
+ * @param settings - specification of the field type and other parameters
+ * @param index -
+ * @param parent - optional TemplateField that contains the new field
+ * @param sameId -
+ * @returns TemplateField
+ */
+ public static CreateField = (settings: FieldSettings, index: number, parent?: TemplateField, sameId: boolean = false): TemplateField =>
+ ((...args) => {
+ switch (settings?.viewType) {
+ case ViewType.FREEFORM:
+ case ViewType.CAROUSEL3D: return new DynamicField(...args).initRenderDoc(settings);
+ case ViewType.IMG: return new ImageTemplateField(...args).initRenderDoc(settings);
+ case ViewType.TEXT: return new TextTemplateField(...args).initRenderDoc(settings);
+ case ViewType.DEC: return new DecorationField(...args).initRenderDoc(settings);
+ default: return new TextTemplateField(...args).initRenderDoc(settings);
+ } // prettier-ignore
+ })(settings, sameId ? index : parent ? Number(`${parent.getID}${index}`) : 1, parent);
+
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
+ public static calculateFontSize = (contWidth: number, contHeight: number, text: string, uppercase: boolean): number => {
+ const words: string[] = text.split(/\s+/).filter(Boolean);
+
+ let currFontSize = 1;
+ let rowsCount = 1;
+ let currTextHeight = currFontSize * rowsCount * 2;
+
+ while (currTextHeight <= contHeight) {
+ let wordIndex = 0;
+ let currentRowWidth = 0;
+ let wordsInCurrRow = 0;
+ rowsCount = 1;
+
+ while (wordIndex < words.length) {
+ const word = words[wordIndex];
+ const wordWidth = word.length * currFontSize * 0.7;
+
+ if (currentRowWidth + wordWidth <= contWidth) {
+ currentRowWidth += wordWidth;
+ ++wordsInCurrRow;
+ } else {
+ if (words.length !== 1 && words.length > wordsInCurrRow) {
+ rowsCount++;
+ currentRowWidth = wordWidth;
+ wordsInCurrRow = 1;
+ } else {
+ break;
+ }
+ }
+
+ wordIndex++;
+ }
+
+ currTextHeight = rowsCount * currFontSize * 2;
+
+ currFontSize += 1;
+ }
+
+ return currFontSize - 1;
+ };
+}
diff --git a/src/client/views/nodes/DataVizBox/DocCreatorMenu/TemplateManager.tsx b/src/client/views/nodes/DataVizBox/DocCreatorMenu/TemplateManager.tsx
deleted file mode 100644
index 50ae4d72a..000000000
--- a/src/client/views/nodes/DataVizBox/DocCreatorMenu/TemplateManager.tsx
+++ /dev/null
@@ -1,22 +0,0 @@
-import { Col } from "./DocCreatorMenu";
-import { FieldSettings } from "./FieldTypes/Field";
-import { Template } from "./Template";
-
-export class TemplateManager {
-
- templates: Template[] = [];
-
- constructor(templateSettings: FieldSettings[]) {
- this.templates = this.initializeTemplates(templateSettings);
- }
-
- initializeTemplates = (templateSettings: FieldSettings[]): Template[] => {
- const initializedTemplates: Template[] = [];
- templateSettings.forEach(settings => initializedTemplates.push(new Template(settings)));
- return initializedTemplates;
- }
-
- getValidTemplates = (cols: Col[]): Template[] => {
- return this.templates.filter(template => template.isValidTemplate(cols));
- }
-} \ No newline at end of file
diff --git a/src/client/views/nodes/DataVizBox/SchemaCSVPopUp.scss b/src/client/views/nodes/DataVizBox/SchemaCSVPopUp.scss
index 63a693918..0acc2c847 100644
--- a/src/client/views/nodes/DataVizBox/SchemaCSVPopUp.scss
+++ b/src/client/views/nodes/DataVizBox/SchemaCSVPopUp.scss
@@ -13,7 +13,7 @@ $highlightedText: #82e0ff;
min-height: 200px;
border-radius: 15px;
padding: 15px;
- padding-bottom: 0;
+ padding-bottom: 0px;
z-index: 999;
display: flex;
flex-direction: column;
@@ -40,7 +40,7 @@ $highlightedText: #82e0ff;
font-size: 12px;
font-weight: 400;
letter-spacing: 1px;
- margin: 0;
+ margin: 0px;
padding-right: 5px;
}
@@ -124,8 +124,8 @@ $highlightedText: #82e0ff;
.img-container::after {
content: '';
position: absolute;
- top: 0;
- left: 0;
+ top: 0px;
+ left: 0px;
width: 100%;
height: 100%;
background-color: rgba(0, 0, 0, 0.5);
diff --git a/src/client/views/nodes/DataVizBox/components/Chart.scss b/src/client/views/nodes/DataVizBox/components/Chart.scss
index ff1fa343d..a22e1153c 100644
--- a/src/client/views/nodes/DataVizBox/components/Chart.scss
+++ b/src/client/views/nodes/DataVizBox/components/Chart.scss
@@ -91,7 +91,7 @@
margin: 5px;
margin-left: 25px;
margin-right: 10px;
- margin-bottom: 0;
+ margin-bottom: 0px;
.tableBox-table {
height: 100%;
width: 100%;
@@ -101,7 +101,7 @@
text-overflow: ellipsis;
width: 100%;
white-space: pre;
- max-width: 150;
+ max-width: 150px;
overflow: hidden;
margin-left: 2px;
}
diff --git a/src/client/views/nodes/DataVizBox/components/TableBox.tsx b/src/client/views/nodes/DataVizBox/components/TableBox.tsx
index ad2731109..cc08cf269 100644
--- a/src/client/views/nodes/DataVizBox/components/TableBox.tsx
+++ b/src/client/views/nodes/DataVizBox/components/TableBox.tsx
@@ -100,7 +100,7 @@ export class TableBox extends ObservableReactComponent<TableBoxProps> {
return this._props.docView?.()?.screenToViewTransform().Scale || 1;
}
@computed get rowHeight() {
- return (this.viewScale * this._tableHeight) / this._tableDataIds.length;
+ return (this.viewScale * this._tableHeight) / (this._tableDataIds.length + 1); // add 1 for header row
}
@computed get startID() {
return this.rowHeight ? Math.max(Math.floor(this._scrollTop / this.rowHeight) - 1, 0) : 0;
@@ -400,12 +400,12 @@ export class TableBox extends ObservableReactComponent<TableBoxProps> {
this._tableHeight = r?.getBoundingClientRect().height ?? 0;
}
})}>
- <div style={{ height: this.startID * Number(DATA_VIZ_TABLE_ROW_HEIGHT) }} />
<thead>
+ <tr style={{ height: this.startID * Number(DATA_VIZ_TABLE_ROW_HEIGHT.replace("px","")) }} />
<tr>
- {this.columns.map(col => (
+ {this.columns.map((col, i) => (
<th
- key={this.columns.indexOf(col)}
+ key={i}
style={{
color:
this._props.axes.slice().reverse().lastElement() === col
@@ -440,7 +440,7 @@ export class TableBox extends ObservableReactComponent<TableBoxProps> {
<tbody>
{this._tableDataIds
.filter((rowId, i) => this.startID - 2 <= i && i <= this.endID + 2)
- ?.map(rowId => (
+ .map(rowId => (
<tr
key={rowId}
className={`tableBox-row ${this.columns[0]}`}
@@ -456,22 +456,22 @@ export class TableBox extends ObservableReactComponent<TableBoxProps> {
: '',
border: rowId === this._props.specHighlightedRow ? `solid 3px ${Colors.MEDIUM_BLUE}` : '',
}}>
- {this.columns.map(col => {
+ {this.columns.map((col, i) => {
let colSelected = false;
if (this._props.axes.length > 2) colSelected = this._props.axes[0] === col || this._props.axes[1] === col || this._props.axes[2] === col;
else if (this._props.axes.length > 1) colSelected = this._props.axes[0] === col || this._props.axes[1] === col;
else if (this._props.axes.length > 0) colSelected = this._props.axes[0] === col;
if (this._props.titleCol === col) colSelected = true;
return (
- <td key={this.columns.indexOf(col)} style={{ border: colSelected ? '3px solid black' : '1px solid black', fontWeight: colSelected ? 'bolder' : 'normal' }}>
+ <td key={i} style={{ border: (colSelected ? '3' : '1') + 'px solid black', fontWeight: colSelected ? 'bolder' : 'normal' }}>
<div className="tableBox-cell">{this._props.records[rowId][col] as string | number}</div>
</td>
);
})}
</tr>
))}
+ <tr style={{ display: this._tableDataIds.length - this.endID ? undefined : 'none', height: (this._tableDataIds.length - this.endID) * Number(DATA_VIZ_TABLE_ROW_HEIGHT.replace("px","")) }} />
</tbody>
- <div style={{ height: (this._tableDataIds.length - this.endID) * Number(DATA_VIZ_TABLE_ROW_HEIGHT) }} />
</table>
</div>
</div>
diff --git a/src/client/views/nodes/DocumentLinksButton.scss b/src/client/views/nodes/DocumentLinksButton.scss
index e1b83dc59..43b1e083f 100644
--- a/src/client/views/nodes/DocumentLinksButton.scss
+++ b/src/client/views/nodes/DocumentLinksButton.scss
@@ -17,8 +17,8 @@
}
.documentLinksButton-cont {
- min-width: 20;
- min-height: 20;
+ min-width: 20px;
+ min-height: 20px;
position: absolute;
}
diff --git a/src/client/views/nodes/DocumentLinksButton.tsx b/src/client/views/nodes/DocumentLinksButton.tsx
index c35a329c9..d30f00829 100644
--- a/src/client/views/nodes/DocumentLinksButton.tsx
+++ b/src/client/views/nodes/DocumentLinksButton.tsx
@@ -38,7 +38,6 @@ export class DocButtonState {
// eslint-disable-next-line no-use-before-define
public static _instance: DocButtonState | undefined;
public static get Instance() {
- // eslint-disable-next-line no-return-assign
return DocButtonState._instance ?? (DocButtonState._instance = new DocButtonState());
}
constructor() {
diff --git a/src/client/views/nodes/DocumentView.scss b/src/client/views/nodes/DocumentView.scss
index c4351a200..98ca76339 100644
--- a/src/client/views/nodes/DocumentView.scss
+++ b/src/client/views/nodes/DocumentView.scss
@@ -1,6 +1,7 @@
@use '../global/globalCssVariables.module.scss' as global;
.documentView-effectsWrapper {
+ height: 100%;
border-radius: inherit;
transition: inherit;
}
@@ -14,13 +15,13 @@
width: 100%;
height: 100%;
position: absolute;
- top: 0;
+ top: 0px;
}
.documentView-node {
position: inherit;
- top: 0;
- left: 0;
+ top: 0px;
+ left: 0px;
width: 100%;
height: 100%;
border-radius: inherit;
@@ -55,7 +56,7 @@
.documentView-htmlOverlay {
position: absolute;
display: flex;
- top: 0;
+ top: 0px;
height: 100%;
width: 100%;
.documentView-htmlOverlayInner {
@@ -79,9 +80,9 @@
.documentView-audioBackground {
display: inline-block;
width: 25px;
- height: 25;
+ height: 25px;
position: absolute;
- top: 0;
+ top: 0px;
left: 50%;
border-radius: 25px;
background: white;
@@ -130,7 +131,7 @@
width: 30px;
border-radius: 50%;
position: absolute;
- right: -15;
+ right: -15px;
opacity: 0.9;
pointer-events: auto;
background-color: #9dca96;
@@ -147,8 +148,8 @@
.documentView-anchorCont {
position: absolute;
- top: 0;
- left: 0;
+ top: 0px;
+ left: 0px;
width: 100%;
height: 100%;
display: inline-block;
@@ -160,8 +161,8 @@
position: absolute;
width: 100%;
height: 100%;
- top: 0;
- left: 0;
+ top: 0px;
+ left: 0px;
}
.documentView-styleWrapper {
@@ -183,9 +184,9 @@
.documentView-titleWrapper-hover {
color: global.$black;
transform-origin: top left;
- top: 0;
+ top: 0px;
width: 100%;
- height: 14;
+ height: 14px;
opacity: 0.5;
text-align: center;
text-overflow: ellipsis;
@@ -211,7 +212,7 @@
.documentView-captionWrapper {
position: absolute;
- bottom: 0;
+ bottom: 0px;
width: 100%;
overflow-y: auto;
transform-origin: bottom left;
@@ -275,20 +276,20 @@
.documentView-noAIWidgets {
transform-origin: top left;
position: absolute;
- bottom: 0;
+ bottom: 0px;
pointer-events: none;
}
.documentView-widgetDecorations {
transform-origin: top right;
position: absolute;
- top: 0;
- right: 0;
+ top: 0px;
+ right: 0px;
}
.documentView-editorView-history {
position: absolute;
transform-origin: top right;
- right: 0;
+ right: 0px;
top: 0;
overflow-y: scroll;
scrollbar-width: thin;
diff --git a/src/client/views/nodes/DocumentView.tsx b/src/client/views/nodes/DocumentView.tsx
index 05706fe6b..fe95f15af 100644
--- a/src/client/views/nodes/DocumentView.tsx
+++ b/src/client/views/nodes/DocumentView.tsx
@@ -720,7 +720,7 @@ export class DocumentViewInternal extends DocComponent<DocumentViewProps & Field
@computed get tagsOverlay() {
return (
<div
- className="documentView-noAiWidgets"
+ className="documentView-noAIWidgets"
style={{
width: `${100 / this.uiBtnScaling}%`, //
transform: `scale(${this.uiBtnScaling})`,
@@ -744,7 +744,7 @@ export class DocumentViewInternal extends DocComponent<DocumentViewProps & Field
@computed get viewBoxContents() {
TraceMobx();
const isInk = this.layoutDoc._layout_isSvg && !this._props.LayoutTemplateString;
- const noBackground = this.Document.isGroup && !this._componentView?.isUnstyledView?.() && (!this.layoutDoc.backgroundColor || this.layoutDoc.backgroundColor === 'transparent');
+ const noBackground = Doc.IsFreeformGroup(this.Document) && !this._componentView?.isUnstyledView?.() && (!this.layoutDoc.backgroundColor || this.layoutDoc.backgroundColor === 'transparent');
return (
<>
<div
@@ -1412,7 +1412,7 @@ export class DocumentView extends DocComponent<DocumentViewProps>() {
}
public static setDefaultImageTemplate(checkResult?: boolean) {
if (checkResult) return Doc.UserDoc().defaultImageLayout;
- const view = DocumentView.Selected()[0]?._props.renderDepth > 0 ? DocumentView.Selected()[0] : undefined;
+ const view = DocumentView.Selected()[0]?._props.renderDepth > 0 || DocumentView.Selected()[0]?.Document.isTemplateDoc ? DocumentView.Selected()[0] : undefined;
undoable(() => {
const tempDoc = DocumentView.getTemplate(view);
Doc.UserDoc().defaultImageLayout = tempDoc ? new PrefetchProxy(tempDoc) : undefined;
diff --git a/src/client/views/nodes/EquationBox.tsx b/src/client/views/nodes/EquationBox.tsx
index 3cacb6692..e0ab04692 100644
--- a/src/client/views/nodes/EquationBox.tsx
+++ b/src/client/views/nodes/EquationBox.tsx
@@ -6,7 +6,7 @@ import { TraceMobx } from '../../../fields/util';
import { DocUtils } from '../../documents/DocUtils';
import { DocumentType } from '../../documents/DocumentTypes';
import { Docs } from '../../documents/Documents';
-import { undoBatch } from '../../util/UndoManager';
+import { undoBatch, UndoManager } from '../../util/UndoManager';
import { ViewBoxBaseComponent } from '../DocComponent';
import { StyleProp } from '../StyleProp';
import { DocumentView } from './DocumentView';
@@ -14,6 +14,7 @@ import './EquationBox.scss';
import { FieldView, FieldViewProps } from './FieldView';
import EquationEditor from './formattedText/EquationEditor';
import { FormattedTextBox } from './formattedText/FormattedTextBox';
+import { Doc } from '../../../fields/Doc';
@observer
export class EquationBox extends ViewBoxBaseComponent<FieldViewProps>() {
@@ -21,6 +22,7 @@ export class EquationBox extends ViewBoxBaseComponent<FieldViewProps>() {
return FieldView.LayoutString(EquationBox, fieldKey);
}
_ref: React.RefObject<EquationEditor> = React.createRef();
+ _liveTextUndo: UndoManager.Batch | undefined; // captured undo batch when typing a new text note into a collection
constructor(props: FieldViewProps) {
super(props);
@@ -29,12 +31,17 @@ export class EquationBox extends ViewBoxBaseComponent<FieldViewProps>() {
componentDidMount() {
this._props.setContentViewBox?.(this);
- if (DocumentView.SelectOnLoad === this.Document && (!DocumentView.LightboxDoc() || DocumentView.LightboxContains(this.DocumentView?.()))) {
+ if (DocumentView.SelectOnLoad === this.rootDoc && (!DocumentView.LightboxDoc() || DocumentView.LightboxContains(this.DocumentView?.()))) {
+ this._liveTextUndo = FormattedTextBox.LiveTextUndo;
+ FormattedTextBox.LiveTextUndo = undefined;
this._props.select(false);
+ this.dataDoc[Doc.LayoutDataKey(this.Document)] = FormattedTextBox.SelectOnLoadChar ?? '';
+
this._ref.current?.mathField.focus();
- this.dataDoc.text === 'x' && this._ref.current?.mathField.select();
+ this.dataDoc[Doc.LayoutDataKey(this.Document)] === 'x' && this._ref.current?.mathField.select();
DocumentView.SetSelectOnLoad(undefined);
+ FormattedTextBox.SelectOnLoadChar = '';
}
reaction(
() => this._props.isSelected(),
@@ -53,7 +60,7 @@ export class EquationBox extends ViewBoxBaseComponent<FieldViewProps>() {
@action
keyPressed = (e: KeyboardEvent) => {
if (e.key === 'Enter') {
- const nextEq = Docs.Create.EquationDocument(e.shiftKey ? StrCast(this.dataDoc.text) : '', {
+ const nextEq = Docs.Create.EquationDocument(e.shiftKey ? StrCast(this.dataDoc[Doc.LayoutDataKey(this.Document)]) : '', {
title: '# math',
_width: NumCast(this.layoutDoc._width),
_height: NumCast(this.layoutDoc._height),
@@ -70,9 +77,10 @@ export class EquationBox extends ViewBoxBaseComponent<FieldViewProps>() {
e.stopPropagation();
}
if (e.key === 'Tab') {
+ const target = this.Document.isTemplateDoc ? this.rootDoc : this.Document;
const graph = Docs.Create.FunctionPlotDocument([this.Document], {
- x: NumCast(this.layoutDoc.x) + NumCast(this.layoutDoc._width),
- y: NumCast(this.layoutDoc.y),
+ x: NumCast(target.x) + NumCast(this.layoutDoc._width),
+ y: NumCast(target.y),
_width: 400,
_height: 300,
backgroundColor: 'white',
@@ -82,11 +90,11 @@ export class EquationBox extends ViewBoxBaseComponent<FieldViewProps>() {
link && this._props.addDocument?.(link);
e.stopPropagation();
}
- if (e.key === 'Backspace' && !this.dataDoc.text) this._props.removeDocument?.(this.Document);
+ if (e.key === 'Backspace' && !this.dataDoc[Doc.LayoutDataKey(this.Document)]) this._props.removeDocument?.(this.Document);
};
@undoBatch
onChange = (str: string) => {
- this.dataDoc.text = str;
+ this.dataDoc[Doc.LayoutDataKey(this.Document)] = str;
};
updateSize = (mathSpan: HTMLSpanElement) => {
@@ -103,6 +111,10 @@ export class EquationBox extends ViewBoxBaseComponent<FieldViewProps>() {
this.layoutDoc._width = mathWidth * nScale;
this.layoutDoc._height = mathHeight * nScale;
+ if (this.layoutDoc._nativeWidth) {
+ this.layoutDoc._nativeWidth = mathWidth;
+ this.layoutDoc._nativeHeight = mathHeight;
+ }
};
render() {
TraceMobx();
@@ -113,9 +125,7 @@ export class EquationBox extends ViewBoxBaseComponent<FieldViewProps>() {
className="equationBox-cont"
onKeyDown={e => e.stopPropagation()}
onPointerDown={e => !e.ctrlKey && e.stopPropagation()}
- onBlur={() => {
- FormattedTextBox.LiveTextUndo?.end();
- }}
+ onBlur={() => this._liveTextUndo?.end()}
style={{
transform: `scale(${scale})`,
minWidth: `${100 / scale}%`,
@@ -128,7 +138,14 @@ export class EquationBox extends ViewBoxBaseComponent<FieldViewProps>() {
paddingTop: NumCast(this.layoutDoc.yMargin),
paddingBottom: NumCast(this.layoutDoc.yMargin),
}}>
- <EquationEditor ref={this._ref} value={StrCast(this.dataDoc.text, '')} spaceBehavesLikeTab onChange={this.onChange} autoCommands="pi theta sqrt sum prod alpha beta gamma rho" autoOperatorNames="sin cos tan" />
+ <EquationEditor
+ ref={this._ref}
+ value={StrCast(this.dataDoc[Doc.LayoutDataKey(this.Document)], '')}
+ spaceBehavesLikeTab
+ onChange={this.onChange}
+ autoCommands="pi theta sqrt sum prod alpha beta gamma rho"
+ autoOperatorNames="sin cos tan"
+ />
</div>
);
}
diff --git a/src/client/views/nodes/FontIconBox/FontIconBadge.scss b/src/client/views/nodes/FontIconBox/FontIconBadge.scss
index 2ff5c651f..e741936db 100644
--- a/src/client/views/nodes/FontIconBox/FontIconBadge.scss
+++ b/src/client/views/nodes/FontIconBox/FontIconBadge.scss
@@ -6,7 +6,7 @@
color: black;
display: block;
position: absolute;
- right: 5;
+ right: 5px;
border-radius: 50%;
text-align: center;
}
diff --git a/src/client/views/nodes/FontIconBox/FontIconBox.scss b/src/client/views/nodes/FontIconBox/FontIconBox.scss
index 8bc68c131..52eebba54 100644
--- a/src/client/views/nodes/FontIconBox/FontIconBox.scss
+++ b/src/client/views/nodes/FontIconBox/FontIconBox.scss
@@ -42,7 +42,7 @@
letter-spacing: normal;
background-color: inherit;
border-radius: 8px;
- padding: 0;
+ padding: 0px;
width: 100%;
font-family: 'system-ui';
text-transform: uppercase;
@@ -96,22 +96,22 @@
display: inline-block;
width: 100%;
height: 25px;
- margin: 0;
+ margin: 0px;
}
.switch input {
opacity: 0;
- width: 0;
- height: 0;
+ width: 0px;
+ height: 0px;
}
.slider {
position: absolute;
cursor: pointer;
- top: 0;
- left: 0;
- right: 0;
- bottom: 0;
+ top: 0px;
+ left: 0px;
+ right: 0px;
+ bottom: 0px;
background-color: lightgrey;
-webkit-transition: 0.4s;
transition: 0.4s;
@@ -223,7 +223,7 @@
height: fit-content;
color: black;
top: 100%;
- left: 0;
+ left: 0px;
z-index: 21;
background-color: #e3e3e3;
box-shadow: 0px 3px 4px rgba(0, 0, 0, 0.3);
@@ -430,7 +430,7 @@
border-radius: 0px 7px 7px 0px;
width: 13px;
height: 100%;
- right: 0;
+ right: 0px;
}
.menuButton-dropdown-header {
diff --git a/src/client/views/nodes/IconTagBox.scss b/src/client/views/nodes/IconTagBox.scss
index d6cf95958..c0977dfc5 100644
--- a/src/client/views/nodes/IconTagBox.scss
+++ b/src/client/views/nodes/IconTagBox.scss
@@ -15,7 +15,7 @@
width: 20px;
height: 20px;
margin: auto;
- padding: 0;
+ padding: 0px;
border-radius: 50%;
background-color: global.$dark-gray;
background-color: transparent;
diff --git a/src/client/views/nodes/ImageBox.scss b/src/client/views/nodes/ImageBox.scss
index 5a6292fab..90ede69dc 100644
--- a/src/client/views/nodes/ImageBox.scss
+++ b/src/client/views/nodes/ImageBox.scss
@@ -3,14 +3,14 @@
width: 100%;
height: 100%;
position: absolute;
- top: 0;
- left: 0;
+ top: 0px;
+ left: 0px;
transform-origin: top left;
.imageBox-annotationLayer {
position: absolute;
transform-origin: left top;
- top: 0;
+ top: 0px;
width: 100%;
pointer-events: none;
mix-blend-mode: multiply; // bcz: makes text fuzzy!
@@ -24,8 +24,8 @@
#upload-icon {
position: absolute;
- bottom: 0;
- right: 0;
+ bottom: 0px;
+ right: 0px;
width: 20px;
height: 20px;
}
@@ -51,8 +51,8 @@
.imageBox-dot {
position: absolute;
- bottom: 10;
- left: 0;
+ bottom: 10px;
+ left: 0px;
border-radius: 10px;
width: 20px;
height: 20px;
@@ -131,8 +131,8 @@
position: absolute;
color: white;
background: black;
- right: 0;
- bottom: 0;
+ right: 0px;
+ bottom: 0px;
z-index: 2;
transform-origin: bottom right;
cursor: default;
@@ -142,13 +142,13 @@
}
}
.imageBox-regenerateDropTarget {
- right: 35;
+ right: 35px;
transform-origin: 70px 35px;
}
.imageBox-fader img {
position: absolute;
- left: 0;
+ left: 0px;
}
.imageBox-fadeBlocker-hover {
@@ -223,7 +223,7 @@
max-width: 90%;
width: 100%;
.imageBox-aiView-similarity {
- max-width: 65;
+ max-width: 65px;
overflow: hidden;
text-overflow: ellipsis;
width: 100%;
@@ -250,7 +250,7 @@
z-index: 10000;
h3 {
- margin-top: 0;
+ margin-top: 0px;
}
input {
diff --git a/src/client/views/nodes/ImageBox.tsx b/src/client/views/nodes/ImageBox.tsx
index f7ad5c7e2..78bacdcac 100644
--- a/src/client/views/nodes/ImageBox.tsx
+++ b/src/client/views/nodes/ImageBox.tsx
@@ -8,7 +8,7 @@ import { extname } from 'path';
import * as React from 'react';
import { AiOutlineSend } from 'react-icons/ai';
import ReactLoading from 'react-loading';
-import { ClientUtils, DashColor, returnEmptyString, returnFalse, returnOne, returnZero, setupMoveUpEvents, UpdateIcon } from '../../../ClientUtils';
+import { ClientUtils, imageUrlToBase64, DashColor, returnEmptyString, returnFalse, returnOne, returnZero, setupMoveUpEvents, UpdateIcon, returnTrue } from '../../../ClientUtils';
import { Doc, DocListCast, Opt } from '../../../fields/Doc';
import { DocData } from '../../../fields/DocSymbols';
import { Id } from '../../../fields/FieldSymbols';
@@ -16,7 +16,7 @@ import { InkTool } from '../../../fields/InkField';
import { List } from '../../../fields/List';
import { ObjectField } from '../../../fields/ObjectField';
import { ComputedField } from '../../../fields/ScriptField';
-import { Cast, DocCast, ImageCast, NumCast, RTFCast, StrCast } from '../../../fields/Types';
+import { Cast, DocCast, ImageCast, NumCast, RTFCast, StrCast, ImageCastWithSuffix } from '../../../fields/Types';
import { ImageField } from '../../../fields/URLField';
import { TraceMobx } from '../../../fields/util';
import { emptyFunction } from '../../../Utils';
@@ -45,6 +45,7 @@ import { FieldView, FieldViewProps } from './FieldView';
import { FocusViewOptions } from './FocusViewOptions';
import './ImageBox.scss';
import { OpenWhere } from './OpenWhere';
+import { gptImageLabel } from '../../apis/gpt/GPT';
const DefaultPath = '/assets/unknown-file-icon-hi.png';
export class ImageEditorData {
@@ -71,7 +72,7 @@ export class ImageEditorData {
public static set AddDoc(addDoc: Opt<(doc: Doc | Doc[], annotationKey?: string) => boolean>) { ImageEditorData.set(this.imageData.open, this.imageData.rootDoc, this.imageData.source, addDoc); } // prettier-ignore
}
-const API_URL = 'https://api.unsplash.com/search/photos';
+const UNSPLASH_API = 'https://api.unsplash.com/search/photos';
@observer
export class ImageBox extends ViewBoxAnnotatableComponent<FieldViewProps>() {
public static LayoutString(fieldKey: string) {
@@ -112,11 +113,69 @@ export class ImageBox extends ViewBoxAnnotatableComponent<FieldViewProps>() {
this._props.setContentViewBox?.(this);
}
+ @computed get outpaintOriginalSize(): { width: number; height: number } {
+ return {
+ width: NumCast(this.Document[this.fieldKey + '_outpaintOriginalWidth']),
+ height: NumCast(this.Document[this.fieldKey + '_outpaintOriginalHeight']),
+ };
+ }
+ set outpaintOriginalSize(prop: { width: number; height: number } | undefined) {
+ this.Document[this.fieldKey + '_outpaintOriginalWidth'] = prop?.width;
+ this.Document[this.fieldKey + '_outpaintOriginalHeight'] = prop?.height;
+ }
+
+ @computed get imgNativeSize() {
+ return {
+ nativeWidth: NumCast(this.dataDoc[this.fieldKey + '_nativeWidth'], NumCast(this.layoutDoc[this.fieldKey + '_nativeWidth'], 500)),
+ nativeHeight: NumCast(this.dataDoc[this.fieldKey + '_nativeHeight'], NumCast(this.layoutDoc[this.fieldKey + '_nativeHeight'], 500)),
+ };
+ }
+ set imgNativeSize(prop: { nativeWidth: number; nativeHeight: number }) {
+ this.dataDoc[this.fieldKey + '_nativeWidth'] = prop.nativeWidth;
+ this.dataDoc[this.fieldKey + '_nativeHeight'] = prop.nativeHeight;
+ }
+
protected createDropTarget = (ele: HTMLDivElement) => {
this._mainCont = ele;
this._dropDisposer?.();
ele && (this._dropDisposer = DragManager.MakeDropTarget(ele, this.drop.bind(this), this.Document));
};
+
+ autoTag = async () => {
+ if (this.Document.$tags_chat) return;
+ try {
+ // 1) grab the full-size URL
+ const layoutKey = Doc.LayoutDataKey(this.Document);
+ const url = ImageCastWithSuffix(this.Document[layoutKey], '_o');
+ if (!url) throw new Error('No image URL found');
+
+ // 2) convert to base64
+ const base64 = await imageUrlToBase64(url);
+ if (!base64) throw new Error('Failed to load image data');
+
+ // 3) ask GPT for labels one label: PERSON or LANDSCAPE
+ const label = await gptImageLabel(
+ base64,
+ `Classify this image as PERSON or LANDSCAPE. You may only respond with one of these two options.
+ Then provide five additional descriptive tags to describe the image for a total of 6 words outputted, delimited by spaces.
+ For example: "LANDSCAPE BUNNY NATURE FOREST PEACEFUL OUTDOORS".
+ Then add one final lengthier summary tag (separated by underscores) that describes the image.`
+ ).then(raw => raw.trim().toUpperCase());
+
+ const { nativeWidth, nativeHeight } = this.nativeSize;
+ const aspectRatio = ((nativeWidth || 1) / (nativeHeight || 1)).toFixed(2);
+
+ // 5) stash it on the Doc
+ // overwrite any old tags so re-runs still work
+ this.Document.$tags_chat = new List<string>([...label.split(/\s+/), `ASPECT_${aspectRatio}`]);
+
+ // 6) flip on “show tags” in the layout
+ this.Document._layout_showTags = true;
+ } catch (err) {
+ console.error('autoTag failed:', err);
+ }
+ };
+
getAnchor = (addAsAnnotation: boolean, pinProps?: PinProps) => {
const visibleAnchor = this._getAnchor?.(this._savedAnnotations, true); // use marquee anchor, otherwise, save zoom/pan as anchor
const anchor =
@@ -153,7 +212,8 @@ export class ImageBox extends ViewBoxAnnotatableComponent<FieldViewProps>() {
() => ({ nativeSize: this.nativeSize, width: NumCast(this.layoutDoc._width), height: this.layoutDoc._height }),
({ nativeSize, width, height }) => {
if (!this.layoutDoc._layout_nativeDimEditable || !height || this.layoutDoc.layout_resetNativeDim) {
- this.layoutDoc.layout_resetNativeDim = undefined; // template images need to reset their dimensions when they are rendered with content. afterwards, remove this flag.
+ if (!this._props.TemplateDataDocument) this.layoutDoc._nativeWidth = this.layoutDoc._nativeHeight = undefined;
+ this.layoutDoc.layout_resetNativeDim = undefined; // reset dimensions of templates rendered with content or if image changes. afterwards, remove this flag.
this.layoutDoc._height = (width * nativeSize.nativeHeight) / nativeSize.nativeWidth;
}
},
@@ -170,7 +230,7 @@ export class ImageBox extends ViewBoxAnnotatableComponent<FieldViewProps>() {
{ fireImmediately: true }
);
this._disposers.outpaint = reaction(
- () => this.Document[this.fieldKey + '_outpaintOriginalWidth'] !== undefined && !SnappingManager.ShiftKey,
+ () => this.outpaintOriginalSize?.width && !SnappingManager.ShiftKey,
complete => complete && this.openOutpaintPrompt(),
{ fireImmediately: true }
);
@@ -185,7 +245,7 @@ export class ImageBox extends ViewBoxAnnotatableComponent<FieldViewProps>() {
*/
fetchImages = async () => {
try {
- const { data } = await axios.get(`${API_URL}?query=${this._searchInput}&page=1&per_page=${1}&client_id=${process.env.VITE_API_KEY}`);
+ const { data } = await axios.get(`${UNSPLASH_API}?query=${this._searchInput}&page=1&per_page=${1}&client_id=${process.env.VITE_API_KEY}`);
const imageSnapshot = Docs.Create.ImageDocument(data.results[0].urls.small, {
_nativeWidth: Doc.NativeWidth(this.layoutDoc),
_nativeHeight: Doc.NativeHeight(this.layoutDoc),
@@ -202,10 +262,6 @@ export class ImageBox extends ViewBoxAnnotatableComponent<FieldViewProps>() {
}
};
- handleSelection = async (selection: string) => {
- this._searchInput = selection;
- };
-
drop = undoable(
action((e: Event, de: DragManager.DropEvent) => {
if (de.complete.docDragData && !this._props.rejectDrop?.(de, this.DocumentView?.())) {
@@ -231,14 +287,15 @@ export class ImageBox extends ViewBoxAnnotatableComponent<FieldViewProps>() {
DrawingFillHandler.drawingToImage(this.Document, 90, newPrompt(descText), drag)?.then(action(() => (this._regenerateLoading = false)));
added = false;
} else if (de.altKey || !this.dataDoc[this.fieldKey]) {
- const layoutDoc = de.complete.docDragData?.draggedDocuments[0];
- const targetField = Doc.LayoutDataKey(layoutDoc);
- const targetDoc = layoutDoc[DocData];
- if (targetDoc[targetField] instanceof ImageField) {
+ const dropDoc = de.complete.docDragData?.draggedDocuments[0];
+ const dropDocFieldKey = Doc.LayoutDataKey(dropDoc);
+ const dropDataDoc = dropDoc[DocData];
+ if (dropDataDoc[dropDocFieldKey] instanceof ImageField) {
added = true;
- this.dataDoc[this.fieldKey] = ObjectField.MakeCopy(targetDoc[targetField] as ImageField);
- Doc.SetNativeWidth(this.dataDoc, Doc.NativeWidth(targetDoc), this.fieldKey);
- Doc.SetNativeHeight(this.dataDoc, Doc.NativeHeight(targetDoc), this.fieldKey);
+ this.dataDoc.layout_resetNativeDim = true;
+ this.dataDoc[this.fieldKey] = ObjectField.MakeCopy(dropDataDoc[dropDocFieldKey] as ImageField);
+ Doc.SetNativeWidth(this.dataDoc, Doc.NativeWidth(dropDataDoc), this.fieldKey);
+ Doc.SetNativeHeight(this.dataDoc, Doc.NativeHeight(dropDataDoc), this.fieldKey);
}
}
added === false && e.preventDefault();
@@ -257,18 +314,17 @@ export class ImageBox extends ViewBoxAnnotatableComponent<FieldViewProps>() {
@undoBatch
setNativeSize = action(() => {
- const oldnativeWidth = NumCast(this.dataDoc[this.fieldKey + '_nativeWidth']);
+ const oldnativeWidth = this.imgNativeSize.nativeWidth;
const nscale = NumCast(this._props.PanelWidth()) * NumCast(this.layoutDoc._freeform_scale, 1);
const nw = nscale / oldnativeWidth;
- this.dataDoc[this.fieldKey + '_nativeHeight'] = NumCast(this.dataDoc[this.fieldKey + '_nativeHeight']) * nw;
- this.dataDoc[this.fieldKey + '_nativeWidth'] = NumCast(this.dataDoc[this.fieldKey + '_nativeWidth']) * nw;
+ this.imgNativeSize = { nativeWidth: this.imgNativeSize.nativeWidth * nw, nativeHeight: this.imgNativeSize.nativeHeight * nw };
this.dataDoc.freeform_panX = nw * NumCast(this.dataDoc.freeform_panX);
this.dataDoc.freeform_panY = nw * NumCast(this.dataDoc.freeform_panY);
this.dataDoc.freeform_panX_max = this.dataDoc.freeform_panX_max ? nw * NumCast(this.dataDoc.freeform_panX_max) : undefined;
this.dataDoc.freeform_panX_min = this.dataDoc.freeform_panX_min ? nw * NumCast(this.dataDoc.freeform_panX_min) : undefined;
this.dataDoc.freeform_panY_max = this.dataDoc.freeform_panY_max ? nw * NumCast(this.dataDoc.freeform_panY_max) : undefined;
this.dataDoc.freeform_panY_min = this.dataDoc.freeform_panY_min ? nw * NumCast(this.dataDoc.freeform_panY_min) : undefined;
- const newnativeWidth = NumCast(this.dataDoc[this.fieldKey + '_nativeWidth']);
+ const newnativeWidth = this.imgNativeSize.nativeWidth;
DocListCast(this.dataDoc[this.annotationKey]).forEach(doc => {
doc.x = (NumCast(doc.x) / oldnativeWidth) * newnativeWidth;
doc.y = (NumCast(doc.y) / oldnativeWidth) * newnativeWidth;
@@ -280,13 +336,11 @@ export class ImageBox extends ViewBoxAnnotatableComponent<FieldViewProps>() {
});
@undoBatch
rotate = action(() => {
- const nw = NumCast(this.dataDoc[this.fieldKey + '_nativeWidth']);
- const nh = NumCast(this.dataDoc[this.fieldKey + '_nativeHeight']);
+ const nativeSize = this.imgNativeSize;
const w = this.layoutDoc._width;
const h = this.layoutDoc._height;
this.dataDoc[this.fieldKey + '_rotation'] = (NumCast(this.dataDoc[this.fieldKey + '_rotation']) + 90) % 360;
- this.dataDoc[this.fieldKey + '_nativeWidth'] = nh;
- this.dataDoc[this.fieldKey + '_nativeHeight'] = nw;
+ this.imgNativeSize = { nativeWidth: nativeSize.nativeHeight, nativeHeight: nativeSize.nativeWidth }; // swap width and height
this.layoutDoc._width = h;
this.layoutDoc._height = w;
});
@@ -302,7 +356,7 @@ export class ImageBox extends ViewBoxAnnotatableComponent<FieldViewProps>() {
const anchy = NumCast(cropping.y);
const anchw = NumCast(cropping._width);
const anchh = NumCast(cropping._height);
- const viewScale = NumCast(this.dataDoc[this.fieldKey + '_nativeWidth']) / anchw;
+ const viewScale = this.nativeSize.nativeWidth / anchw;
cropping.x = NumCast(this.Document.x) + NumCast(this.layoutDoc._width);
cropping.y = NumCast(this.Document.y);
cropping.onClick = undefined;
@@ -364,18 +418,14 @@ export class ImageBox extends ViewBoxAnnotatableComponent<FieldViewProps>() {
@action
cancelOutpaintPrompt = () => {
- const origWidth = NumCast(this.Document[this.fieldKey + '_outpaintOriginalWidth']);
- const origHeight = NumCast(this.Document[this.fieldKey + '_outpaintOriginalHeight']);
- this.Document._width = origWidth;
- this.Document._height = origHeight;
+ [this.Document._width, this.Document._height] = [this.outpaintOriginalSize.width, this.outpaintOriginalSize.height];
this._outpaintingInProgress = false;
+ this.outpaintOriginalSize = undefined;
this.closeOutpaintPrompt();
};
@action
- handlePromptChange = (val: string | number) => {
- this._outpaintPromptInput = '' + val;
- };
+ handlePromptChange = (val: string | number) => (this._outpaintPromptInput = '' + val);
@action
submitOutpaintPrompt = () => {
@@ -416,8 +466,7 @@ export class ImageBox extends ViewBoxAnnotatableComponent<FieldViewProps>() {
loadingOverlay.innerHTML = '<div style="color: white; font-size: 16px;">Generating outpainted image...</div>';
this._mainCont?.appendChild(loadingOverlay);
- const origWidth = NumCast(this.Document[this.fieldKey + '_outpaintOriginalWidth']);
- const origHeight = NumCast(this.Document[this.fieldKey + '_outpaintOriginalHeight']);
+ const { width: origWidth, height: origHeight } = this.outpaintOriginalSize;
const response = await Networking.PostToServer('/outpaintImage', {
imageUrl: currentPath,
prompt: customPrompt,
@@ -454,8 +503,7 @@ export class ImageBox extends ViewBoxAnnotatableComponent<FieldViewProps>() {
this.Document.$ai = true;
this.Document.$ai_outpainted = true;
this.Document.$ai_outpaint_prompt = customPrompt;
- this.Document[this.fieldKey + '_outpaintOriginalWidth'] = undefined;
- this.Document[this.fieldKey + '_outpaintOriginalHeight'] = undefined;
+ this.outpaintOriginalSize = undefined;
} else {
this.cancelOutpaintPrompt();
alert('Failed to receive a valid image URL from server.');
@@ -478,6 +526,8 @@ export class ImageBox extends ViewBoxAnnotatableComponent<FieldViewProps>() {
return this._props.PanelWidth() / this._props.PanelHeight() < this.nativeSize.nativeWidth / this.nativeSize.nativeHeight;
}
+ isOutpaintable = () => true;
+
componentUI = (/* boundsLeft: number, boundsTop: number*/) =>
!this._showOutpaintPrompt ? null : (
<div
@@ -668,8 +718,7 @@ export class ImageBox extends ViewBoxAnnotatableComponent<FieldViewProps>() {
@computed get nativeSize() {
TraceMobx();
if (this.paths.length && this.paths[0].includes(DefaultPath)) return { nativeWidth: NumCast(this.layoutDoc._width), nativeHeight: NumCast(this.layoutDoc._height), nativeOrientation: 0 };
- const nativeWidth = NumCast(this.dataDoc[this.fieldKey + '_nativeWidth'], NumCast(this.layoutDoc[this.fieldKey + '_nativeWidth'], 500));
- const nativeHeight = NumCast(this.dataDoc[this.fieldKey + '_nativeHeight'], NumCast(this.layoutDoc[this.fieldKey + '_nativeHeight'], 500));
+ const { nativeWidth, nativeHeight } = this.imgNativeSize;
const nativeOrientation = NumCast(this.dataDoc[this.fieldKey + '_nativeOrientation'], 1);
return { nativeWidth, nativeHeight, nativeOrientation };
}
@@ -689,7 +738,7 @@ export class ImageBox extends ViewBoxAnnotatableComponent<FieldViewProps>() {
@computed get overlayImageIcon() {
const usePath = this.layoutDoc[`_${this.fieldKey}_usePath`];
- return (
+ return this._regenerateLoading ? null : (
<Tooltip
title={
<div className="dash-tooltip">
@@ -731,7 +780,7 @@ export class ImageBox extends ViewBoxAnnotatableComponent<FieldViewProps>() {
);
}
@computed get regenerateImageIcon() {
- return (
+ return this._regenerateLoading ? null : (
<Tooltip title={'click to show AI generations. Drop an image on to create a new generation'}>
<div
className="imageBox-regenerateDropTarget"
@@ -820,7 +869,7 @@ export class ImageBox extends ViewBoxAnnotatableComponent<FieldViewProps>() {
transform,
transformOrigin,
width: this._outpaintAlign ? 'max-content' : this._outpaintAlign ? '100%' : undefined,
- height: this._outpaintVAlign ? 'max-content' : this.Document[this.fieldKey + '_outpaintOriginalWidth'] !== undefined ? '100%' : undefined,
+ height: this._outpaintVAlign ? 'max-content' : this.outpaintOriginalSize?.width ? '100%' : undefined,
}}
onError={action(e => (this._error = e.toString()))}
draggable={false}
@@ -943,10 +992,11 @@ export class ImageBox extends ViewBoxAnnotatableComponent<FieldViewProps>() {
return { width, height };
};
savedAnnotations = () => this._savedAnnotations;
+ showBorderRounding = returnTrue;
+ rejectDrop = (de: DragManager.DropEvent, subView?: DocumentView | undefined) => (this.dataDoc[this.fieldKey] === undefined ? true : (this._props.rejectDrop?.(de, subView) ?? false));
render() {
TraceMobx();
- const borderRad = this._props.styleProvider?.(this.layoutDoc, this._props, StyleProp.BorderRounding) as string;
- const borderRadius = borderRad?.includes('px') ? `${Number(borderRad.split('px')[0]) / (this._props.NativeDimScaling?.() || 1)}px` : borderRad;
+ const borderRadius = this._props.styleProvider?.(this.layoutDoc, this._props, StyleProp.BorderRounding) as string;
return (
<>
<div
@@ -986,7 +1036,7 @@ export class ImageBox extends ViewBoxAnnotatableComponent<FieldViewProps>() {
ScreenToLocalTransform={this.screenToLocalTransform}
select={emptyFunction}
focus={this.focus}
- rejectDrop={this._props.rejectDrop}
+ rejectDrop={this.rejectDrop}
getScrollHeight={this.getScrollHeight}
NativeDimScaling={returnOne}
isAnyChildContentActive={returnFalse}
@@ -1048,8 +1098,11 @@ export class ImageBox extends ViewBoxAnnotatableComponent<FieldViewProps>() {
if (result instanceof Error) {
alert('Error uploading files - possibly due to unsupported file types');
} else {
- this.dataDoc[this.fieldKey] = new ImageField(result.accessPaths.agnostic.client);
- !(result instanceof Error) && DocUtils.assignUploadInfo(result, this.dataDoc);
+ runInAction(() => {
+ this.dataDoc.layout_resetNativeDim = true;
+ !(result instanceof Error) && DocUtils.assignUploadInfo(result, this.dataDoc, this.fieldKey);
+ this.dataDoc[this.fieldKey] = new ImageField(result.accessPaths.agnostic.client);
+ });
}
disposer();
} else {
diff --git a/src/client/views/nodes/KeyValueBox.scss b/src/client/views/nodes/KeyValueBox.scss
index 441fceba4..80ace6ae0 100644
--- a/src/client/views/nodes/KeyValueBox.scss
+++ b/src/client/views/nodes/KeyValueBox.scss
@@ -93,9 +93,9 @@ $header-height: 30px;
height: 30px;
width: 5px;
z-index: 20;
- right: 0;
- top: 0;
- border-radius: 0;
+ right: 0px;
+ top: 0px;
+ border-radius: 0px;
background: black;
pointer-events: all;
}
@@ -105,8 +105,8 @@ $header-height: 30px;
float: left;
height: 37px;
z-index: 20;
- right: 0;
- top: 0;
+ right: 0px;
+ top: 0px;
background: transparent;
pointer-events: none;
}
diff --git a/src/client/views/nodes/KeyValueBox.tsx b/src/client/views/nodes/KeyValueBox.tsx
index aa66b5ba9..606f63d6d 100644
--- a/src/client/views/nodes/KeyValueBox.tsx
+++ b/src/client/views/nodes/KeyValueBox.tsx
@@ -273,15 +273,15 @@ export class KeyValueBox extends ViewBoxBaseComponent<FieldViewProps>() {
};
createFieldView = (templateDoc: Doc, row: KeyValuePair) => {
- const metaKey = row._props.keyName;
- const fieldTempDoc = Doc.IsDelegateField(templateDoc, metaKey) ? Doc.MakeDelegate(templateDoc) : Doc.MakeEmbedding(templateDoc);
- fieldTempDoc.title = metaKey;
+ const keyName = row._props.keyName;
+ const fieldTempDoc = Doc.IsDelegateField(templateDoc, keyName) ? Doc.MakeDelegate(templateDoc) : Doc.MakeEmbedding(templateDoc);
+ fieldTempDoc.title = keyName;
fieldTempDoc.layout_fitWidth = true;
fieldTempDoc._xMargin = 10;
fieldTempDoc._yMargin = 10;
fieldTempDoc._width = 100;
fieldTempDoc._height = 40;
- fieldTempDoc.layout = this.inferType(templateDoc[metaKey], metaKey);
+ fieldTempDoc.layout = this.inferType(templateDoc[keyName], keyName);
return fieldTempDoc;
};
diff --git a/src/client/views/nodes/KeyValuePair.scss b/src/client/views/nodes/KeyValuePair.scss
index 913ab641c..154fbdcfa 100644
--- a/src/client/views/nodes/KeyValuePair.scss
+++ b/src/client/views/nodes/KeyValuePair.scss
@@ -17,7 +17,7 @@
}
.keyValuePair-td-key-check {
position: relative;
- margin: 0;
+ margin: 0px;
}
.keyValuePair-keyField {
width: 100%;
diff --git a/src/client/views/nodes/LabelBox.scss b/src/client/views/nodes/LabelBox.scss
index 889cdc0ca..e1974d6a0 100644
--- a/src/client/views/nodes/LabelBox.scss
+++ b/src/client/views/nodes/LabelBox.scss
@@ -24,8 +24,8 @@
.answer-icon {
position: absolute;
- right: 8;
- bottom: 5;
+ right: 8px;
+ bottom: 5px;
color: black;
display: inline-block;
font-size: 10px;
@@ -36,8 +36,8 @@
.q-icon {
position: absolute;
- right: 6;
- bottom: 5;
+ right: 6px;
+ bottom: 5px;
color: white;
display: inline-block;
font-size: 10px;
@@ -48,8 +48,8 @@
.edit-icon {
position: absolute;
- right: 20;
- bottom: 5;
+ right: 20px;
+ bottom: 5px;
display: inline-block;
font-size: 10px;
cursor: pointer;
diff --git a/src/client/views/nodes/LabelBox.tsx b/src/client/views/nodes/LabelBox.tsx
index 4cbe01b82..e1ecc2018 100644
--- a/src/client/views/nodes/LabelBox.tsx
+++ b/src/client/views/nodes/LabelBox.tsx
@@ -9,7 +9,7 @@ import { TraceMobx } from '../../../fields/util';
import { DocumentType } from '../../documents/DocumentTypes';
import { Docs } from '../../documents/Documents';
import { DragManager } from '../../util/DragManager';
-import { undoable } from '../../util/UndoManager';
+import { undoable, UndoManager } from '../../util/UndoManager';
import { ViewBoxBaseComponent } from '../DocComponent';
import { PinDocView, PinProps } from '../PinFuncs';
import { StyleProp } from '../StyleProp';
@@ -28,6 +28,7 @@ export class LabelBox extends ViewBoxBaseComponent<FieldViewProps>() {
private _timeout: NodeJS.Timeout | undefined;
private _divRef: HTMLDivElement | null = null;
private _disposers: { [key: string]: IReactionDisposer } = {};
+ private _liveTextUndo: UndoManager.Batch | undefined; // captured undo batch when typing a new text note into a collection
constructor(props: FieldViewProps) {
super(props);
@@ -220,8 +221,7 @@ export class LabelBox extends ViewBoxBaseComponent<FieldViewProps>() {
this.setText(this._divRef?.innerText ?? '');
if (!FormattedTextBox.tryKeepingFocus(e.relatedTarget, () => this._divRef?.focus())) {
RichTextMenu.Instance?.updateMenu(undefined, undefined, undefined, undefined);
- FormattedTextBox.LiveTextUndo?.end();
- FormattedTextBox.LiveTextUndo = undefined;
+ this._liveTextUndo?.end();
}
}}
dangerouslySetInnerHTML={{
@@ -236,6 +236,8 @@ export class LabelBox extends ViewBoxBaseComponent<FieldViewProps>() {
if (DocumentView.SelectOnLoad === this.Document) {
DocumentView.SetSelectOnLoad(undefined);
+ this._liveTextUndo = FormattedTextBox.LiveTextUndo;
+ FormattedTextBox.LiveTextUndo = undefined;
this._divRef.focus();
}
this.fitTextToBox(this._divRef);
diff --git a/src/client/views/nodes/LinkDocPreview.scss b/src/client/views/nodes/LinkDocPreview.scss
index 28216394d..7d99247e7 100644
--- a/src/client/views/nodes/LinkDocPreview.scss
+++ b/src/client/views/nodes/LinkDocPreview.scss
@@ -42,7 +42,7 @@
.linkDocPreview-button {
display: inline-flex;
- margin: 0;
+ margin: 0px;
margin-right: 3px;
border-radius: 50%;
pointer-events: auto;
diff --git a/src/client/views/nodes/LinkDocPreview.tsx b/src/client/views/nodes/LinkDocPreview.tsx
index 5026f52fb..5b07b303a 100644
--- a/src/client/views/nodes/LinkDocPreview.tsx
+++ b/src/client/views/nodes/LinkDocPreview.tsx
@@ -40,7 +40,6 @@ export class LinkInfo {
LinkInfo._instance = this;
makeObservable(this);
}
- // eslint-disable-next-line no-use-before-define
@observable public LinkInfo: Opt<LinkDocPreviewProps> = undefined;
public static get Instance() {
diff --git a/src/client/views/nodes/LoadingBox.scss b/src/client/views/nodes/LoadingBox.scss
index cabd4de05..5a8f49000 100644
--- a/src/client/views/nodes/LoadingBox.scss
+++ b/src/client/views/nodes/LoadingBox.scss
@@ -26,7 +26,7 @@
}
.loadingBox-spinner {
position: absolute;
- top: 0;
- left: 0;
+ top: 0px;
+ left: 0px;
}
}
diff --git a/src/client/views/nodes/LoadingBox.tsx b/src/client/views/nodes/LoadingBox.tsx
index 325ab18b4..4220ce5f1 100644
--- a/src/client/views/nodes/LoadingBox.tsx
+++ b/src/client/views/nodes/LoadingBox.tsx
@@ -43,7 +43,7 @@ export class LoadingBox extends ViewBoxAnnotatableComponent<FieldViewProps>() {
@observable progress = '';
componentDidMount() {
if (!Doc.CurrentlyLoading?.includes(this.Document)) {
- this.Document.loadingError = 'Upload interrupted, please try again';
+ this.Document.loadingError ??= 'Upload interrupted, please try again';
} else {
const updateFunc = async () => {
const result = await Networking.QueryYoutubeProgress(StrCast(this.Document[Id])); // We use the guid of the overwriteDoc to track file uploads.
diff --git a/src/client/views/nodes/MapBox/MapAnchorMenu.scss b/src/client/views/nodes/MapBox/MapAnchorMenu.scss
index c36d98afe..217576203 100644
--- a/src/client/views/nodes/MapBox/MapAnchorMenu.scss
+++ b/src/client/views/nodes/MapBox/MapAnchorMenu.scss
@@ -6,19 +6,19 @@
}
.anchorMenu-highlighter {
padding-right: 5px;
- .antimodeMenu-button {
- padding: 0;
- padding: 0;
+ .antimodeMenu-button {
+ padding: 0px;
+ padding: 0px;
padding-right: 0px;
padding-left: 0px;
width: 5px;
}
}
-.anchor-color-preview-button {
- width: 25px !important;
+.anchor-color-preview-button {
+ width: 25px !important;
.anchor-color-preview {
display: flex;
- flex-direction: column;
+ flex-direction: column;
padding-right: 3px;
width: unset !important;
.color-preview {
@@ -72,12 +72,11 @@
}
}
- .MuiInputBase-input{
+ .MuiInputBase-input {
color: white !important;
}
-
-
- .css-1t8l2tu-MuiInputBase-input-MuiOutlinedInput-input.Mui-disabled{
+
+ .css-1t8l2tu-MuiInputBase-input-MuiOutlinedInput-input.Mui-disabled {
-webkit-text-fill-color: #b3b2b2 !important;
}
@@ -91,7 +90,7 @@
gap: 5px;
}
- .selected-route-details-container{
+ .selected-route-details-container {
display: flex;
flex-direction: column;
gap: 3px;
@@ -99,33 +98,25 @@
align-items: flex-start;
padding: 5px;
}
-
-
}
- .customized-marker-container{
+ .customized-marker-container {
display: flex;
flex-direction: column;
gap: 10px;
- .current-marker-container{
+ .current-marker-container {
display: flex;
align-items: center;
gap: 5px;
}
- .all-markers-container{
+ .all-markers-container {
display: flex;
- align-items: center;
+ align-items: center;
gap: 10px;
flex-wrap: wrap;
max-width: 400px;
}
}
-
-
-
-
}
-
-
diff --git a/src/client/views/nodes/MapBox/MapBox.scss b/src/client/views/nodes/MapBox/MapBox.scss
index bd4b51038..89d381070 100644
--- a/src/client/views/nodes/MapBox/MapBox.scss
+++ b/src/client/views/nodes/MapBox/MapBox.scss
@@ -21,7 +21,7 @@
.mapBox-infoWindow {
background-color: white;
opacity: 0.75;
- padding: 12;
+ padding: 12px;
font-size: 17;
}
.mapBox-searchbar {
@@ -119,7 +119,7 @@
width: 100%;
label {
- margin-bottom: 0;
+ margin-bottom: 0px;
}
.speed-label {
@@ -197,12 +197,12 @@
}
.mapBox-sidebar {
position: absolute;
- right: 0;
+ right: 0px;
height: 100%;
}
.mapBox-sidebar-handle {
- top: 0;
+ top: 0px;
//top: calc(50% - 17.5px); // use this to center vertically -- make sure it looks okay for slide views
width: 10px;
height: 100%;
@@ -215,7 +215,7 @@
left: 50%;
margin-left: 120px;
right: unset !important;
- margin-top: -10;
+ margin-top: -10px;
height: max-content;
}
.searchbox {
diff --git a/src/client/views/nodes/MapBox/MapBox.tsx b/src/client/views/nodes/MapBox/MapBox.tsx
index a563b7c1b..a279ccc48 100644
--- a/src/client/views/nodes/MapBox/MapBox.tsx
+++ b/src/client/views/nodes/MapBox/MapBox.tsx
@@ -13,7 +13,7 @@ import { CirclePicker, ColorResult } from 'react-color';
import { Layer, MapProvider, MapRef, Map as MapboxMap, Marker, Source, ViewState, ViewStateChangeEvent } from 'react-map-gl/mapbox';
import { ClientUtils, setupMoveUpEvents } from '../../../../ClientUtils';
import { emptyFunction } from '../../../../Utils';
-import { Doc, DocListCast, Field, LinkedTo, Opt, StrListCast } from '../../../../fields/Doc';
+import { Doc, DocListCast, Field, LinkedTo, StrListCast } from '../../../../fields/Doc';
import { List } from '../../../../fields/List';
import { RichTextField } from '../../../../fields/RichTextField';
import { DocCast, NumCast, StrCast, toList } from '../../../../fields/Types';
@@ -111,12 +111,12 @@ export class MapBox extends ViewBoxAnnotatableComponent<FieldViewProps>() {
// this list contains pushpins and configs
@computed get allAnnotations() { return DocListCast(this.dataDoc[this.annotationKey]); } // prettier-ignore
- @computed get allSidebarDocs() { return DocListCast(this.dataDoc[this.SidebarKey]); } // prettier-ignore
+ @computed get allSidebarDocs() { return DocListCast(this.dataDoc[this.sidebarKey]); } // prettier-ignore
@computed get allPushpins() { return this.allAnnotations.filter(anno => anno.type === DocumentType.PUSHPIN); } // prettier-ignore
@computed get allRoutes() { return this.allAnnotations.filter(anno => anno.type === DocumentType.MAPROUTE); } // prettier-ignore
@computed get SidebarShown() { return !!this.layoutDoc._layout_showSidebar; } // prettier-ignore
@computed get sidebarWidthPercent() { return StrCast(this.layoutDoc._layout_sidebarWidthPercent, '0%'); } // prettier-ignore
- @computed get SidebarKey() { return this.fieldKey + '_sidebar'; } // prettier-ignore
+ @computed get sidebarKey() { return this.fieldKey + '_sidebar'; } // prettier-ignore
@computed get sidebarColor() {
return StrCast(this.layoutDoc.sidebar_color, StrCast(this.layoutDoc[this._props.fieldKey + '_backgroundColor'], '#e4e4e4'));
}
@@ -260,7 +260,7 @@ export class MapBox extends ViewBoxAnnotatableComponent<FieldViewProps>() {
removeMapDocument = (doc: Doc | Doc[], annotationKey?: string) => {
this.allAnnotations
- .filter(anno => toList(doc).includes(DocCast(anno.mapPin)))
+ .filter(anno => toList(doc).includes(DocCast(anno.mapPin)!))
.forEach(anno => {
anno.mapPin = undefined;
});
@@ -339,27 +339,19 @@ export class MapBox extends ViewBoxAnnotatableComponent<FieldViewProps>() {
startAnchorDrag = (e: PointerEvent, ele: HTMLElement) => {
e.preventDefault();
e.stopPropagation();
-
- const sourceAnchorCreator = action(() => {
- const note = this.getAnchor(true);
- if (note && this._selectedPinOrRoute) {
- note.latitude = this._selectedPinOrRoute.latitude;
- note.longitude = this._selectedPinOrRoute.longitude;
- note.map = this._selectedPinOrRoute.map;
- }
- return note as Doc;
- });
-
const targetCreator = (annotationOn: Doc | undefined) => {
const target = DocUtils.GetNewTextDoc('Note linked to ' + this.Document.title, 0, 0, 100, 100, annotationOn, 'yellow');
+ target.layout_fitWidth = true;
DocumentView.SetSelectOnLoad(target);
return target;
};
+
+ const sourceAnchorCreator = () => this.getAnchor(true);
const docView = this.DocumentView?.();
docView &&
DragManager.StartAnchorAnnoDrag([ele], new DragManager.AnchorAnnoDragData(docView, sourceAnchorCreator, targetCreator), e.pageX, e.pageY, {
dragComplete: dragEv => {
- if (!dragEv.aborted && dragEv.annoDragData && dragEv.annoDragData.linkSourceDoc && dragEv.annoDragData.dropDocument && dragEv.linkDocument) {
+ if (!dragEv.aborted && dragEv.annoDragData?.linkSourceDoc && dragEv.annoDragData.dropDocument && dragEv.linkDocument) {
dragEv.annoDragData.linkSourceDoc.followLinkToggle = dragEv.annoDragData.dropDocument.annotationOn === this.Document;
dragEv.annoDragData.linkSourceDoc.followLinkZoom = false;
}
@@ -368,17 +360,7 @@ export class MapBox extends ViewBoxAnnotatableComponent<FieldViewProps>() {
};
createNoteAnnotation = () => {
- const createFunc = undoable(
- action(() => {
- const note = this._sidebarRef.current?.anchorMenuClick(this.getAnchor(true), ['latitude', 'longitude', LinkedTo]);
- if (note && this._selectedPinOrRoute) {
- note.latitude = this._selectedPinOrRoute.latitude;
- note.longitude = this._selectedPinOrRoute.longitude;
- note.map = this._selectedPinOrRoute.map;
- }
- }),
- 'create note annotation'
- );
+ const createFunc = undoable(() => this._sidebarRef.current?.anchorMenuClick(this.getAnchor(true), ['latitude', 'longitude', LinkedTo]), 'create note annotation');
if (!this.layoutDoc.layout_showSidebar) {
this.toggleSidebar();
setTimeout(createFunc);
@@ -428,14 +410,11 @@ export class MapBox extends ViewBoxAnnotatableComponent<FieldViewProps>() {
}
};
- getView = (doc: Doc, options: FocusViewOptions) => {
- if (this._sidebarRef?.current?.makeDocUnfiltered(doc) && !this.SidebarShown) {
- this.toggleSidebar();
- options.didMove = true;
+ getView = async (doc: Doc, options: FocusViewOptions) => {
+ if (DocListCast(this.dataDoc[this.sidebarKey]).find(anno => Doc.AreProtosEqual(doc.layout_unrendered ? DocCast(doc.annotationOn) : doc, anno))) {
+ SidebarAnnos.getView(this._sidebarRef.current, this.SidebarShown, this.toggleSidebar, doc, options);
}
- return new Promise<Opt<DocumentView>>(res => {
- DocumentView.addViewRenderedCb(doc, dv => res(dv));
- });
+ return undefined;
};
/*
@@ -476,13 +455,14 @@ export class MapBox extends ViewBoxAnnotatableComponent<FieldViewProps>() {
@action
deleteSelectedPinOrRoute = undoable(() => {
- if (this._selectedPinOrRoute) {
+ const selPin = DocCast(this._selectedPinOrRoute);
+ if (selPin) {
// Removes filter
- Doc.setDocFilter(this.Document, 'latitude', NumCast(this._selectedPinOrRoute.latitude), 'remove');
- Doc.setDocFilter(this.Document, 'longitude', NumCast(this._selectedPinOrRoute.longitude), 'remove');
- Doc.setDocFilter(this.Document, LinkedTo, `mapPin=${Field.toScriptString(DocCast(this._selectedPinOrRoute))}`, 'remove');
+ Doc.setDocFilter(this.Document, 'latitude', NumCast(selPin.latitude), 'remove');
+ Doc.setDocFilter(this.Document, 'longitude', NumCast(selPin.longitude), 'remove');
+ Doc.setDocFilter(this.Document, LinkedTo, `mapPin=${Field.toScriptString(selPin)}`, 'remove');
- this.removePushpinOrRoute(this._selectedPinOrRoute);
+ this.removePushpinOrRoute(selPin);
}
MapAnchorMenu.Instance.fadeOut(true);
document.removeEventListener('pointerdown', this.tryHideMapAnchorMenu, true);
@@ -1299,7 +1279,6 @@ export class MapBox extends ViewBoxAnnotatableComponent<FieldViewProps>() {
<SidebarAnnos
ref={this._sidebarRef}
{...this._props}
- fieldKey={this.fieldKey}
Doc={this.Document}
layoutDoc={this.layoutDoc}
dataDoc={this.dataDoc}
diff --git a/src/client/views/nodes/MapboxMapBox/MapboxContainer.tsx b/src/client/views/nodes/MapboxMapBox/MapboxContainer.tsx
index e0efab576..0beefcb67 100644
--- a/src/client/views/nodes/MapboxMapBox/MapboxContainer.tsx
+++ b/src/client/views/nodes/MapboxMapBox/MapboxContainer.tsx
@@ -145,7 +145,7 @@ export class MapBoxContainer extends ViewBoxAnnotatableComponent<FieldViewProps>
removeMapDocument = (docsIn: Doc | Doc[], annotationKey?: string) => {
const docs = toList(docsIn);
this.allAnnotations
- .filter(anno => docs.includes(DocCast(anno.mapPin)))
+ .filter(anno => docs.includes(DocCast(anno.mapPin)!))
.forEach(anno => {
anno.mapPin = undefined;
});
@@ -224,6 +224,12 @@ export class MapBoxContainer extends ViewBoxAnnotatableComponent<FieldViewProps>
startAnchorDrag = (e: PointerEvent, ele: HTMLElement) => {
e.preventDefault();
e.stopPropagation();
+ const targetCreator = (annotationOn: Doc | undefined) => {
+ const target = DocUtils.GetNewTextDoc('Note linked to ' + this.Document.title, 0, 0, 100, 100, annotationOn, 'yellow');
+ target.layout_fitWidth = true;
+ DocumentView.SetSelectOnLoad(target);
+ return target;
+ };
const sourceAnchorCreator = action(() => {
const note = this.getAnchor(true);
@@ -235,11 +241,6 @@ export class MapBoxContainer extends ViewBoxAnnotatableComponent<FieldViewProps>
return note as Doc;
});
- const targetCreator = (annotationOn: Doc | undefined) => {
- const target = DocUtils.GetNewTextDoc('Note linked to ' + this.Document.title, 0, 0, 100, 100, annotationOn, 'yellow');
- DocumentView.SetSelectOnLoad(target);
- return target;
- };
const docView = this.DocumentView?.();
docView &&
DragManager.StartAnchorAnnoDrag([ele], new DragManager.AnchorAnnoDragData(docView, sourceAnchorCreator, targetCreator), e.pageX, e.pageY, {
@@ -362,22 +363,22 @@ export class MapBoxContainer extends ViewBoxAnnotatableComponent<FieldViewProps>
@action
deselectPin = () => {
- if (this.selectedPin) {
+ const selPin = DocCast(this.selectedPin);
+ if (selPin) {
// Removes filter
- Doc.setDocFilter(this.Document, 'latitude', NumCast(this.selectedPin.latitude), 'remove');
- Doc.setDocFilter(this.Document, 'longitude', NumCast(this.selectedPin.longitude), 'remove');
- Doc.setDocFilter(this.Document, LinkedTo, `mapPin=${Field.toScriptString(DocCast(this.selectedPin))}`, 'remove');
+ Doc.setDocFilter(this.Document, 'latitude', NumCast(selPin.latitude), 'remove');
+ Doc.setDocFilter(this.Document, 'longitude', NumCast(selPin.longitude), 'remove');
+ Doc.setDocFilter(this.Document, LinkedTo, `mapPin=${Field.toScriptString(selPin)}`, 'remove');
- const temp = this.selectedPin;
if (!this._unmounting) {
- this._bingMap.current.entities.remove(this.map_docToPinMap.get(temp));
+ this._bingMap.current.entities.remove(this.map_docToPinMap.get(selPin));
}
- const newpin = new this.MicrosoftMaps.Pushpin(new this.MicrosoftMaps.Location(temp.latitude, temp.longitude));
- this.MicrosoftMaps.Events.addHandler(newpin, 'click', () => this.pushpinClicked(temp as Doc));
+ const newpin = new this.MicrosoftMaps.Pushpin(new this.MicrosoftMaps.Location(selPin.latitude, selPin.longitude));
+ this.MicrosoftMaps.Events.addHandler(newpin, 'click', () => this.pushpinClicked(selPin));
if (!this._unmounting) {
this._bingMap.current.entities.push(newpin);
}
- this.map_docToPinMap.set(temp, newpin);
+ this.map_docToPinMap.set(selPin, newpin);
this.selectedPin = undefined;
this.bingSearchBarContents = this.Document.map;
}
@@ -388,9 +389,7 @@ export class MapBoxContainer extends ViewBoxAnnotatableComponent<FieldViewProps>
this.toggleSidebar();
options.didMove = true;
}
- return new Promise<Opt<DocumentView>>(res => {
- DocumentView.addViewRenderedCb(doc, dv => res(dv));
- });
+ return new Promise<Opt<DocumentView>>(res => DocumentView.addViewRenderedCb(doc, res));
};
/*
* Pushpin onclick
@@ -535,13 +534,14 @@ export class MapBoxContainer extends ViewBoxAnnotatableComponent<FieldViewProps>
@action
deleteSelectedPin = undoable(() => {
- if (this.selectedPin) {
+ const selPin = this.selectedPin;
+ if (selPin) {
// Removes filter
- Doc.setDocFilter(this.Document, 'latitude', NumCast(this.selectedPin.latitude), 'remove');
- Doc.setDocFilter(this.Document, 'longitude', NumCast(this.selectedPin.longitude), 'remove');
- Doc.setDocFilter(this.Document, LinkedTo, `mapPin=${Field.toScriptString(DocCast(this.selectedPin))}`, 'remove');
+ Doc.setDocFilter(this.Document, 'latitude', NumCast(selPin.latitude), 'remove');
+ Doc.setDocFilter(this.Document, 'longitude', NumCast(selPin.longitude), 'remove');
+ Doc.setDocFilter(this.Document, LinkedTo, `mapPin=${Field.toScriptString(selPin)}`, 'remove');
- this.removePushpin(this.selectedPin);
+ this.removePushpin(selPin);
}
MapAnchorMenu.Instance.fadeOut(true);
document.removeEventListener('pointerdown', this.tryHideMapAnchorMenu, true);
@@ -638,7 +638,10 @@ export class MapBoxContainer extends ViewBoxAnnotatableComponent<FieldViewProps>
this._disposers.highlight = reaction(
() => this.allAnnotations.map(doc => doc[Highlight]),
() => {
- const allConfigPins = this.allAnnotations.map(doc => ({ doc, pushpin: DocCast(doc.mapPin) })).filter(pair => pair.pushpin);
+ const allConfigPins = this.allAnnotations
+ .map(doc => ({ doc, pushpin: DocCast(doc.mapPin) }))
+ .filter(pair => pair.pushpin)
+ .map(pair => ({ doc: pair.doc, pushpin: pair.pushpin! }));
allConfigPins.forEach(({ pushpin }) => {
if (!pushpin[Highlight] && this.map_pinHighlighted.get(pushpin)) {
this.recolorPin(pushpin);
diff --git a/src/client/views/nodes/PDFBox.scss b/src/client/views/nodes/PDFBox.scss
index 44013a96d..c9edb2180 100644
--- a/src/client/views/nodes/PDFBox.scss
+++ b/src/client/views/nodes/PDFBox.scss
@@ -17,8 +17,8 @@
height: 100%;
z-index: 1;
pointer-events: none;
- top: 0;
- left: 0;
+ top: 0px;
+ left: 0px;
// glr: This should really be the same component as text and PDFs
.pdfBox-sidebarBtn {
@@ -72,16 +72,16 @@
align-items: center;
height: 20px;
background: none;
- padding: 0;
+ padding: 0px;
position: absolute;
pointer-events: all;
color: white;
- bottom: 0;
- right: 0;
+ bottom: 0px;
+ right: 0px;
.pdfBox-overlayButton-arrow {
- width: 0;
- height: 0;
+ width: 0px;
+ height: 0px;
border-top: 10px solid transparent;
border-bottom: 10px solid transparent;
border-right: 15px solid #121721;
@@ -122,8 +122,8 @@
.pdfBox-settingsCont {
position: absolute;
- right: 0;
- top: 3;
+ right: 0px;
+ top: 3px;
pointer-events: all;
.pdfBox-settingsButton {
@@ -133,11 +133,11 @@
align-items: center;
height: 20px;
background: none;
- padding: 0;
+ padding: 0px;
.pdfBox-settingsButton-arrow {
- width: 0;
- height: 0;
+ width: 0px;
+ height: 0px;
border-top: 10px solid transparent;
border-bottom: 10px solid transparent;
border-right: 15px solid #121721;
@@ -189,7 +189,7 @@
width: calc(100% - 40px);
height: 20px;
background: #121721;
- bottom: 0;
+ bottom: 0px;
display: flex;
justify-content: center;
align-items: center;
@@ -198,7 +198,7 @@
pointer-events: all;
.pdfBox-searchBar {
- width: 70%;
+ width: calc(100% - 120px); // less size of search buttons
font-size: 14px;
}
}
@@ -253,13 +253,13 @@
.pdfBox-container {
position: absolute;
transform-origin: top left;
- top: 0;
+ top: 0px;
}
.pdfBox-sidebarContainer {
position: absolute;
height: 100%;
- right: 0;
- top: 0;
+ right: 0px;
+ top: 0px;
}
.pdfBox-interactive {
@@ -290,7 +290,7 @@
}
.pdfBox-settingsButton-arrow {
- height: 60;
+ height: 60px;
border-top: 30px solid transparent;
border-bottom: 30px solid transparent;
border-right: 30px solid #121721;
diff --git a/src/client/views/nodes/PDFBox.tsx b/src/client/views/nodes/PDFBox.tsx
index 4ecbd65b6..34211fa07 100644
--- a/src/client/views/nodes/PDFBox.tsx
+++ b/src/client/views/nodes/PDFBox.tsx
@@ -10,7 +10,7 @@ import { DocData } from '../../../fields/DocSymbols';
import { Id } from '../../../fields/FieldSymbols';
import { InkTool } from '../../../fields/InkField';
import { ComputedField } from '../../../fields/ScriptField';
-import { Cast, FieldValue, NumCast, StrCast, toList } from '../../../fields/Types';
+import { Cast, DocCast, FieldValue, NumCast, StrCast, toList } from '../../../fields/Types';
import { ImageField, PdfField } from '../../../fields/URLField';
import { TraceMobx } from '../../../fields/util';
import { emptyFunction } from '../../../Utils';
@@ -27,13 +27,15 @@ import { Colors } from '../global/globalEnums';
import { PDFViewer } from '../pdf/PDFViewer';
import { PinDocView, PinProps } from '../PinFuncs';
import { SidebarAnnos } from '../SidebarAnnos';
-import { DocumentView } from './DocumentView';
import { FieldView, FieldViewProps } from './FieldView';
import { FocusViewOptions } from './FocusViewOptions';
import { ImageBox } from './ImageBox';
import { OpenWhere } from './OpenWhere';
import './PDFBox.scss';
import { CreateImage } from './WebBoxRenderer';
+import { gptAPICall } from '../../apis/gpt/GPT';
+import { List } from '../../../fields/List';
+import { GPTCallType } from '../../apis/gpt/GPT';
@observer
export class PDFBox extends ViewBoxAnnotatableComponent<FieldViewProps>() {
@@ -57,6 +59,9 @@ export class PDFBox extends ViewBoxAnnotatableComponent<FieldViewProps>() {
@observable private _pdf: Opt<Pdfjs.PDFDocumentProxy> = undefined;
@observable private _pageControls = false;
+ @computed get sidebarKey() {
+ return this.fieldKey + '_sidebar';
+ }
@computed get pdfUrl() {
return Cast(this.dataDoc[this._props.fieldKey], PdfField);
}
@@ -77,6 +82,36 @@ export class PDFBox extends ViewBoxAnnotatableComponent<FieldViewProps>() {
}
}
+ autoTag = async () => {
+ if (!this.Document.$tags_chat && this._pdf) {
+ if (!this.dataDoc.text) {
+ // 1) Extract text from the first few pages (e.g., first 2 pages)
+ const maxPages = Math.min(2, this._pdf.numPages);
+ const promises: Promise<string>[] = [];
+ for (let pageNum = 1; pageNum <= maxPages; pageNum++) {
+ promises.push(
+ this._pdf
+ .getPage(pageNum)
+ .then(page => page.getTextContent())
+ .then(content => content.items.map(item => ('str' in item ? item.str : '')).join(' '))
+ );
+ }
+ this.dataDoc.text = (await Promise.all(promises)).join(' ');
+ }
+
+ const text = StrCast(this.dataDoc.text).trim().slice(0, 2000);
+ if (text) {
+ // 2) Ask GPT to classify and provide descriptive tags, then normalize the results
+ const label = await gptAPICall(`"${text}"`, GPTCallType.CLASSIFYTEXTFULL).then(raw => raw.trim().toUpperCase());
+
+ this.Document.$tags_chat = new List<string>(label.split(/\s+/));
+
+ // 4) Show tags in layout
+ this.Document._layout_showTags = true;
+ }
+ }
+ };
+
replaceCanvases = (oldDiv: HTMLElement, newDiv: HTMLElement) => {
if (oldDiv.childNodes) {
for (let i = 0; i < oldDiv.childNodes.length; i++) {
@@ -233,14 +268,11 @@ export class PDFBox extends ViewBoxAnnotatableComponent<FieldViewProps>() {
return this._pdfViewer?.scrollFocus(anchor, NumCast(anchor.y, NumCast(anchor.config_scrollTop)), options);
};
- getView = (doc: Doc, options: FocusViewOptions) => {
- if (this._sidebarRef?.current?.makeDocUnfiltered(doc) && !this.SidebarShown) {
- options.didMove = true;
- this.toggleSidebar(false);
+ getView = async (doc: Doc, options: FocusViewOptions) => {
+ if (DocListCast(this.dataDoc[this.sidebarKey]).find(anno => Doc.AreProtosEqual(doc.layout_unrendered ? DocCast(doc.annotationOn) : doc, anno))) {
+ SidebarAnnos.getView(this._sidebarRef.current, this.SidebarShown, () => this.toggleSidebar(false), doc, options);
}
- return new Promise<Opt<DocumentView>>(res => {
- DocumentView.addViewRenderedCb(doc, dv => res(dv));
- });
+ return undefined;
};
getAnchor = (addAsAnnotation: boolean, pinProps?: PinProps) => {
@@ -406,7 +438,15 @@ export class PDFBox extends ViewBoxAnnotatableComponent<FieldViewProps>() {
onKeyDown={e => ([KeyCodes.BACKSPACE, KeyCodes.DELETE].includes(e.keyCode) ? e.stopPropagation() : true)}
onPointerDown={e => e.stopPropagation()}
style={{ display: this._props.isContentActive() ? 'flex' : 'none' }}>
- <div className="pdfBox-overlayCont" onPointerDown={e => e.stopPropagation()} style={{ left: `${this._searching ? 0 : 100}%` }}>
+ <div
+ className="pdfBox-overlayCont"
+ onPointerDown={e => e.stopPropagation()}
+ style={{
+ transformOrigin: 'bottom left',
+ transform: `scale(${this._props.DocumentView?.().UIBtnScaling || 1})`,
+ width: `${100 / (this._props.DocumentView?.().UIBtnScaling || 1)}%`,
+ left: `${this._searching ? 0 : 100}%`,
+ }}>
<button type="button" className="pdfBox-overlayButton" title={searchTitle} />
<input
className="pdfBox-searchBar"
@@ -435,17 +475,25 @@ export class PDFBox extends ViewBoxAnnotatableComponent<FieldViewProps>() {
type="button"
className="pdfBox-overlayButton"
title={searchTitle}
+ style={{
+ transformOrigin: 'bottom right',
+ transform: `scale(${this._props.DocumentView?.().UIBtnScaling || 1})`,
+ }}
onClick={action(() => {
this._searching = !this._searching;
this.search('', true, true);
})}>
- <div className="pdfBox-overlayButton-arrow" onPointerDown={e => e.stopPropagation()} />
<div className="pdfBox-overlayButton-iconCont" onPointerDown={e => e.stopPropagation()}>
<FontAwesomeIcon icon={this._searching ? 'times' : 'search'} size="lg" />
</div>
</button>
- <div className="pdfBox-pageNums">
+ <div
+ className="pdfBox-pageNums"
+ style={{
+ transformOrigin: 'top left',
+ transform: `scale(${this._props.DocumentView?.().UIBtnScaling || 1})`,
+ }}>
<input
value={curPage}
style={{ width: `${curPage > 99 ? 4 : 3}ch`, pointerEvents: 'all' }}
@@ -649,19 +697,11 @@ export class PDFBox extends ViewBoxAnnotatableComponent<FieldViewProps>() {
const pdfView = !this._pdf ? null : this.renderPdfView;
const href = this.pdfUrl?.url.href;
if (!pdfView && href) {
- if (PDFBox.pdfcache.get(href))
- setTimeout(
- action(() => {
- this._pdf = PDFBox.pdfcache.get(href);
- })
- );
+ if (PDFBox.pdfcache.get(href)) setTimeout(action(() => (this._pdf = PDFBox.pdfcache.get(href))));
else {
- if (!PDFBox.pdfpromise.get(href)) PDFBox.pdfpromise.set(href, Pdfjs.getDocument(href).promise);
- PDFBox.pdfpromise.get(href)?.then(
- action(pdf => {
- PDFBox.pdfcache.set(href, (this._pdf = pdf));
- })
- );
+ const pdfPromise = PDFBox.pdfpromise.get(href) ?? Pdfjs.getDocument(href).promise;
+ PDFBox.pdfpromise.set(href, pdfPromise);
+ pdfPromise.then(action(pdf => PDFBox.pdfcache.set(href, (this._pdf = pdf))));
}
}
return pdfView ?? this.renderTitleBox;
diff --git a/src/client/views/nodes/PhysicsBox/PhysicsSimulationBox.scss b/src/client/views/nodes/PhysicsBox/PhysicsSimulationBox.scss
index ac2c611c7..78aa526bf 100644
--- a/src/client/views/nodes/PhysicsBox/PhysicsSimulationBox.scss
+++ b/src/client/views/nodes/PhysicsBox/PhysicsSimulationBox.scss
@@ -29,8 +29,8 @@
.wedge {
pointer-events: none;
position: absolute;
- left: 0;
- top: 0;
+ left: 0px;
+ top: 0px;
}
}
diff --git a/src/client/views/nodes/RecordingBox/ProgressBar.scss b/src/client/views/nodes/RecordingBox/ProgressBar.scss
index 28ad25ffa..ec01f0241 100644
--- a/src/client/views/nodes/RecordingBox/ProgressBar.scss
+++ b/src/client/views/nodes/RecordingBox/ProgressBar.scss
@@ -1,36 +1,34 @@
-
.progressbar {
- touch-action: none;
- vertical-align: middle;
- text-align: center;
-
- align-items: center;
- cursor: default;
-
-
- position: absolute;
- display: flex;
- justify-content: flex-start;
- bottom: 2px;
- width: 99%;
- height: 30px;
- background-color: gray;
-
- &.done {
- top: 0;
- width: 0px;
- height: 5px;
- background-color: red;
- z-index: 2;
- }
-
- &.mark {
- top: 0;
- background-color: transparent;
- border-right: 2px solid white;
- z-index: 3;
- pointer-events: none;
- }
+ touch-action: none;
+ vertical-align: middle;
+ text-align: center;
+
+ align-items: center;
+ cursor: default;
+
+ position: absolute;
+ display: flex;
+ justify-content: flex-start;
+ bottom: 2px;
+ width: 99%;
+ height: 30px;
+ background-color: gray;
+
+ &.done {
+ top: 0px;
+ width: 0px;
+ height: 5px;
+ background-color: red;
+ z-index: 2;
+ }
+
+ &.mark {
+ top: 0px;
+ background-color: transparent;
+ border-right: 2px solid white;
+ z-index: 3;
+ pointer-events: none;
+ }
}
.progressbar-disabled {
@@ -43,37 +41,41 @@
// citation: https://codepen.io/_Master_/pen/PRdjmQ
@keyframes blinker {
- from {opacity: 1.0;}
- to {opacity: 0.0;}
+ from {
+ opacity: 1;
+ }
+ to {
+ opacity: 0;
+ }
}
.blink {
- text-decoration: blink;
- animation-name: blinker;
- animation-duration: 0.6s;
- animation-iteration-count:infinite;
- animation-timing-function:ease-in-out;
- animation-direction: alternate;
+ text-decoration: blink;
+ animation-name: blinker;
+ animation-duration: 0.6s;
+ animation-iteration-count: infinite;
+ animation-timing-function: ease-in-out;
+ animation-direction: alternate;
}
.segment {
- border: 3px solid black;
- background-color: red;
- margin: 1px;
- padding: 0;
- cursor: pointer;
- transition-duration: .5s;
- user-select: none;
-
- vertical-align: middle;
- text-align: center;
+ border: 3px solid black;
+ background-color: red;
+ margin: 1px;
+ padding: 0px;
+ cursor: pointer;
+ transition-duration: 0.5s;
+ user-select: none;
+
+ vertical-align: middle;
+ text-align: center;
}
.segment-expanding {
-border-color: red;
- background-color: white;
- transition-duration: 0s;
- opacity: .75;
- pointer-events: none;
+ border-color: red;
+ background-color: white;
+ transition-duration: 0s;
+ opacity: 0.75;
+ pointer-events: none;
}
.segment-expanding:hover {
@@ -82,10 +84,10 @@ border-color: red;
}
.segment-disabled {
- pointer-events: none;
- opacity: 0.5;
- transition-duration: 0s;
- /* Hide the text. */
+ pointer-events: none;
+ opacity: 0.5;
+ transition-duration: 0s;
+ /* Hide the text. */
text-indent: 100%;
white-space: nowrap;
overflow: hidden;
@@ -99,25 +101,26 @@ border-color: red;
}
.segment:first-child {
- margin-left: 2px;
+ margin-left: 2px;
}
.segment:last-child {
- margin-right: 2px;
+ margin-right: 2px;
}
.segment:hover {
background-color: white;
}
-.segment:hover, .segment-selected {
- margin: 0px;
- border: 4px solid red;
- border-radius: 2px;
+.segment:hover,
+.segment-selected {
+ margin: 0px;
+ border: 4px solid red;
+ border-radius: 2px;
}
.segment-selected {
- border: 4px solid #202020;
- background-color: red;
- opacity: .75;
- cursor: grabbing;
+ border: 4px solid #202020;
+ background-color: red;
+ opacity: 0.75;
+ cursor: grabbing;
}
diff --git a/src/client/views/nodes/RecordingBox/RecordingView.scss b/src/client/views/nodes/RecordingBox/RecordingView.scss
index f2d5a980d..15b48c111 100644
--- a/src/client/views/nodes/RecordingBox/RecordingView.scss
+++ b/src/client/views/nodes/RecordingBox/RecordingView.scss
@@ -28,7 +28,7 @@ video {
justify-content: center;
// overflow: hidden;
border-radius: 10px;
- margin: 0;
+ margin: 0px;
}
.video-wrapper:hover .controls {
@@ -108,7 +108,7 @@ video {
.timer {
font-size: 15px;
color: white;
- margin: 0;
+ margin: 0px;
}
.dot {
@@ -148,7 +148,7 @@ video {
height: 80%;
width: 80%;
align-self: center;
- margin: 0;
+ margin: 0px;
&:hover {
height: 85%;
@@ -163,7 +163,7 @@ video {
height: 70%;
width: 70%;
align-self: center;
- margin: 0;
+ margin: 0px;
// &:hover {
// width: 40px;
@@ -178,8 +178,8 @@ video {
flex-direction: row;
align-content: center;
position: relative;
- top: 0;
- bottom: 0;
+ top: 0px;
+ bottom: 0px;
&.video-edit-wrapper {
// right: 50% - 15;
diff --git a/src/client/views/nodes/ScreenshotBox.scss b/src/client/views/nodes/ScreenshotBox.scss
index 1e9b64a0b..1714d87c2 100644
--- a/src/client/views/nodes/ScreenshotBox.scss
+++ b/src/client/views/nodes/ScreenshotBox.scss
@@ -32,10 +32,10 @@
.screenshotBox-uiButtons {
position: absolute;
- right: 25;
- top: 0;
- width: 22;
- height: 25;
+ right: 25px;
+ top: 0px;
+ width: 22px;
+ height: 25px;
.screenshotBox-recorder {
color: white;
diff --git a/src/client/views/nodes/ScriptingBox.scss b/src/client/views/nodes/ScriptingBox.scss
index 9789da55a..de70dbe74 100644
--- a/src/client/views/nodes/ScriptingBox.scss
+++ b/src/client/views/nodes/ScriptingBox.scss
@@ -82,14 +82,14 @@
}
.rta__autocomplete--top {
- margin-top: 0;
+ margin-top: 0px;
margin-bottom: 1em;
max-height: 100px;
}
.rta__list {
- margin: 0;
- padding: 0;
+ margin: 0px;
+ padding: 0px;
background: #fff;
border: 1px solid #dfe2e5;
border-radius: 3px;
diff --git a/src/client/views/nodes/TaskBox.scss b/src/client/views/nodes/TaskBox.scss
new file mode 100644
index 000000000..beee58697
--- /dev/null
+++ b/src/client/views/nodes/TaskBox.scss
@@ -0,0 +1,132 @@
+.task-manager-container {
+ color-scheme: light;
+ display: flex;
+ flex-direction: column;
+ padding: 8px;
+ gap: 10px;
+ width: 100%;
+ height: 100%;
+ box-sizing: border-box;
+}
+
+.task-manager-title {
+ width: 100%;
+ font-size: 1.25rem;
+ font-weight: 600;
+ padding: 6px 10px;
+ border: 1px solid #ccc;
+ border-radius: 6px;
+ box-sizing: border-box;
+}
+
+.task-manager-description {
+ width: 100%;
+ font-size: 1rem;
+ padding: 8px 10px;
+ border: 1px solid #ccc;
+ border-radius: 6px;
+ min-height: 40px;
+ box-sizing: border-box;
+ vertical-align: top;
+ text-align: start;
+ resize: none;
+ line-height: 1.4;
+ resize: none;
+ flex-grow: 1;
+}
+
+.task-manager-checkboxes {
+ display: flex;
+ align-items: center;
+ gap: 16px;
+}
+
+.task-manager-allday,
+.task-manager-complete {
+ display: flex;
+ align-items: center;
+ gap: 6px;
+ font-size: 0.95rem;
+}
+
+.task-manager-times {
+ display: flex;
+ flex-direction: column;
+ gap: 6px;
+ width: 100%;
+}
+
+.task-manager-times label {
+ display: flex;
+ flex-direction: column;
+ font-size: 0.9rem;
+ font-weight: 500;
+ gap: 4px;
+}
+
+input[type='datetime-local'] {
+ width: 100%;
+ font-size: 0.9rem;
+ padding: 6px 8px;
+ border: 1px solid #ccc;
+ border-radius: 6px;
+ box-sizing: border-box;
+}
+
+.task-manager-checkboxes {
+ display: flex;
+ flex-wrap: wrap; /* allows wrapping on small screens */
+ align-items: center;
+ gap: 16px;
+ row-gap: 8px; /* optional: tighter vertical spacing if it wraps */
+}
+
+.task-manager-google {
+ align-self: flex-start;
+ width: auto;
+ font-size: 0.85rem;
+ padding: 6px 12px;
+ border-radius: 6px;
+ background-color: #5e88c8;
+ color: white;
+ border: none;
+ cursor: pointer;
+ white-space: nowrap;
+ transition: background-color 0.2s ease;
+ box-shadow: 0 1px 3px rgba(0, 0, 0, 0.2);
+
+ &:hover {
+ background-color: #4773b0; // darker shade of your base blue
+ color: white;
+ transform: scale(1.01); // subtle hover feel without real size change
+ }
+
+ &:disabled {
+ opacity: 0.5;
+ cursor: not-allowed;
+ pointer-events: none;
+ }
+}
+
+.task-box-blur-wrapper {
+ width: 100%;
+ height: 100%;
+ display: flex;
+ flex-direction: column;
+ min-width: 0;
+}
+
+.task-manager-button-row {
+ display: flex;
+ flex-direction: row;
+ gap: 8px;
+}
+
+.task-manager-delete {
+ @extend .task-manager-google;
+ background-color: #182430;
+
+ &:hover {
+ background-color: #000000;
+ }
+}
diff --git a/src/client/views/nodes/TaskBox.tsx b/src/client/views/nodes/TaskBox.tsx
new file mode 100644
index 000000000..ed5982c55
--- /dev/null
+++ b/src/client/views/nodes/TaskBox.tsx
@@ -0,0 +1,670 @@
+import { action, IReactionDisposer, makeObservable, observable, reaction, runInAction } from 'mobx';
+import { observer } from 'mobx-react';
+import * as React from 'react';
+import { DateField } from '../../../fields/DateField';
+import { BoolCast, DateCast, DocCast, NumCast, StrCast } from '../../../fields/Types';
+import { GoogleAuthenticationManager } from '../../apis/GoogleAuthenticationManager';
+import { Docs } from '../../documents/Documents';
+import { DocumentType } from '../../documents/DocumentTypes';
+import { ViewBoxBaseComponent } from '../DocComponent';
+import { FieldView, FieldViewProps } from './FieldView';
+import './TaskBox.scss';
+import { DocumentDecorations } from '../DocumentDecorations';
+import { Doc } from '../../../fields/Doc';
+import { DocumentView } from './DocumentView';
+
+/**
+ * TaskBox class for adding task information + completing tasks
+ */
+@observer
+export class TaskBox extends ViewBoxBaseComponent<FieldViewProps>() {
+ _googleTaskCreateDisposer?: IReactionDisposer;
+ _heightDisposer?: IReactionDisposer;
+ _widthDisposer?: IReactionDisposer;
+ @observable _needsSync = false; // Whether the task needs to be synced with Google Tasks
+ @observable _syncing = false; // Whether the task is currently syncing with Google Tasks
+ private _isFocused = false; // Whether the task box is currently focused
+
+ // contains the last synced task information
+ private _lastSyncedTask: {
+ title: string;
+ text: string;
+ due?: string;
+ completed: boolean;
+ deleted?: boolean;
+ } = {
+ title: '',
+ text: '',
+ due: '',
+ completed: false,
+ deleted: false,
+ };
+
+ /**
+ * Getter for needsSync
+ */
+ get needsSync() {
+ return this._needsSync;
+ }
+
+ /**
+ * Constructor for the task box
+ * @param props - props containing the document reference
+ */
+ constructor(props: FieldViewProps) {
+ super(props);
+ makeObservable(this);
+ }
+
+ /**
+ * Return the JSX string that will create this component
+ * @param fieldStr the Doc field that contains the primary data for this component
+ * @returns
+ */
+ public static LayoutString(fieldStr: string) {
+ return FieldView.LayoutString(TaskBox, fieldStr);
+ }
+
+ /**
+ * Method to update the task description
+ * @param e - event of changing the description box input
+ */
+ @action
+ updateText = (e: React.ChangeEvent<HTMLInputElement | HTMLTextAreaElement>) => {
+ this.Document[this.fieldKey] = e.target.value;
+ };
+
+ /**
+ * Method to update the task title
+ * @param e - event of changing the title box input
+ */
+ @action
+ updateTitle = (e: React.ChangeEvent<HTMLInputElement>) => {
+ this.Document.title = e.target.value;
+ };
+
+ /**
+ * Method to update the all day status
+ * @param e - event of changing the all day checkbox
+ */
+ @action
+ updateAllDay = (e: React.ChangeEvent<HTMLInputElement>) => {
+ this.Document.$task_allDay = e.target.checked;
+
+ if (e.target.checked) {
+ delete this.Document.$task_startTime;
+ delete this.Document.$task_endTime;
+ }
+
+ this.setTaskDateRange();
+ };
+
+ /**
+ * Method to update the task start time
+ * @param e - event of changing the start time input
+ */
+ @action
+ updateStart = (e: React.ChangeEvent<HTMLInputElement>) => {
+ const newStart = new Date(e.target.value);
+
+ this.Document.$task_startTime = new DateField(newStart);
+
+ const endDate = this.Document.$task_endTime instanceof DateField ? this.Document.$task_endTime.date : undefined;
+ if (endDate && newStart > endDate) {
+ // Alert user
+ alert('Start time cannot be after end time. End time has been adjusted.');
+
+ // Fix end time
+ const adjustedEnd = new Date(newStart.getTime() + 60 * 60 * 1000);
+ this.Document.$task_endTime = new DateField(adjustedEnd);
+ }
+
+ this.setTaskDateRange();
+ };
+
+ /**
+ * Method to update the task end time
+ * @param e - event of changing the end time input
+ */
+ @action
+ updateEnd = (e: React.ChangeEvent<HTMLInputElement>) => {
+ const newEnd = new Date(e.target.value);
+
+ this.Document.$task_endTime = new DateField(newEnd);
+
+ const startDate = this.Document.$task_startTime instanceof DateField ? this.Document.$task_startTime.date : undefined;
+ if (startDate && newEnd < startDate) {
+ // Alert user
+ alert('End time cannot be before start time. Start time has been adjusted.');
+
+ // Fix start time
+ const adjustedStart = new Date(newEnd.getTime() - 60 * 60 * 1000);
+ this.Document.$task_startTime = new DateField(adjustedStart);
+ }
+
+ this.setTaskDateRange();
+ };
+
+ /**
+ * Method to update the task date range
+ */
+ @action
+ setTaskDateRange() {
+ const doc = this.Document;
+
+ if (doc.$task_allDay) {
+ const range = StrCast(doc.$task_dateRange).split('|');
+ const dateStr = range[0] ?? new Date().toISOString().split('T')[0]; // default to today
+
+ doc.$task_dateRange = `${dateStr}|${dateStr}`;
+ doc.$task_allDay = true;
+ } else {
+ const startField = doc.$task_startTime;
+ const endField = doc.$task_endTime;
+ const startDate = startField instanceof DateField ? startField.date : null;
+ const endDate = endField instanceof DateField ? endField.date : null;
+
+ if (startDate && endDate && !isNaN(startDate.getTime()) && !isNaN(endDate.getTime())) {
+ doc.$task_dateRange = `${startDate.toISOString()}|${endDate.toISOString()}`;
+ doc.$task_allDay = false;
+ }
+ }
+ }
+
+ /**
+ * Method to set task's completion status
+ * @param e - event of changing the "completed" input checkbox
+ */
+
+ @action
+ toggleComplete = (e: React.ChangeEvent<HTMLInputElement>) => {
+ this.Document.$task_completed = e.target.checked;
+ };
+
+ /**
+ * Computes due date for the task (for Google Tasks API)
+ * @returns - a string representing the due date in ISO format, or undefined if no valid date is found
+ */
+ private computeDueDate(): string | undefined {
+ const doc = this.Document;
+ let due: string | undefined;
+ const allDay = !!doc.$task_allDay;
+
+ if (allDay) {
+ const rawRange = StrCast(doc.$task_dateRange);
+ const datePart = rawRange.split('|')[0];
+
+ if (datePart && !isNaN(new Date(datePart).getTime())) {
+ // Set time to midnight UTC to represent the start of the all-day event
+ const baseDate = datePart.includes('T') ? datePart : datePart + 'T00:00:00Z';
+ due = new Date(baseDate).toISOString();
+ } else {
+ due = undefined;
+ }
+ } else if (doc.$task_endTime instanceof DateField && doc.$task_endTime.date) {
+ due = doc.$task_endTime.date.toISOString();
+ } else if (doc.$task_startTime instanceof DateField && doc.$task_startTime.date) {
+ due = doc.$task_startTime.date.toISOString();
+ } else {
+ due = undefined;
+ }
+
+ return due;
+ }
+
+ /**
+ * Builds the body for the Google Tasks API request
+ * @returns - an object containing the task details
+ */
+
+ private buildGoogleTaskBody(): Record<string, string | boolean | undefined> {
+ const doc = this.Document;
+ const title = StrCast(doc.title, 'Untitled Task');
+ const notes = StrCast(doc[this.fieldKey]);
+ const due = this.computeDueDate();
+ const completed = !!doc.$task_completed;
+
+ const body: Record<string, string | boolean | undefined> = {
+ title,
+ notes,
+ due,
+ status: completed ? 'completed' : 'needsAction',
+ completed: completed ? new Date().toISOString() : undefined,
+ };
+
+ if (doc.$dashDeleted === true) {
+ body.deleted = true;
+ } else if (doc.$dashDeleted === false) {
+ body.deleted = false;
+ }
+
+ return body;
+ }
+
+ /**
+ * Handles the focus event for the task box (for auto-syncing)
+ */
+
+ handleFocus = () => {
+ if (!this._isFocused) {
+ this._isFocused = true;
+ this.syncWithGoogleTaskBidirectional(true); // silent sync
+ }
+ };
+
+ /**
+ * Handles the blur event for the task box (for auto-syncing)
+ * @param e - the focus event
+ */
+ handleBlur = (e: React.FocusEvent<HTMLDivElement>) => {
+ // Check if focus is moving outside this component
+ if (!e.currentTarget.contains(e.relatedTarget)) {
+ this._isFocused = false;
+ this.syncWithGoogleTaskBidirectional(true);
+ }
+ };
+
+ /**
+ * Method to sync the task with Google Tasks bidirectionally
+ * (update Dash from Google and vice versa, based on which is newer)
+ * @param silent - whether to suppress UI prompts to connect to Google (default: false)
+ * @returns - a promise that resolves to true if sync was successful, false otherwise
+ */
+
+ syncWithGoogleTaskBidirectional = async (silent = false): Promise<boolean> => {
+ const doc = this.Document;
+ let token: string | undefined;
+ try {
+ token = silent ? await GoogleAuthenticationManager.Instance.fetchAccessTokenSilently() : await GoogleAuthenticationManager.Instance.fetchOrGenerateAccessToken();
+ } catch (err) {
+ console.warn('Google auth failed:', err);
+ return false;
+ }
+
+ if (!token) {
+ if (!silent) {
+ const listener = () => {
+ window.removeEventListener('focusin', listener);
+ if (confirm('✅ Authorization complete. Try syncing the task again?')) {
+ // try syncing again
+ this.syncWithGoogleTaskBidirectional();
+ }
+ window.removeEventListener('focusin', listener);
+ };
+ setTimeout(() => window.addEventListener('focusin', listener), 100);
+ }
+ return false;
+ }
+
+ if (!doc.$googleTaskId) return false;
+
+ runInAction(() => {
+ this._syncing = true;
+ });
+
+ try {
+ // Fetch current version of Google Task
+ const response = await fetch(`/googleTasks/${doc.$googleTaskId}`, {
+ method: 'GET',
+ headers: {
+ Authorization: `Bearer ${token}`,
+ },
+ credentials: 'include',
+ });
+
+ const googleTask = await response.json();
+ const googleUpdated = new Date(googleTask.updated);
+ const dashUpdated = new Date(StrCast(doc.$task_lastSyncedAt));
+
+ const dashChanged =
+ StrCast(doc.title) !== this._lastSyncedTask.title ||
+ StrCast(doc[this.fieldKey]) !== this._lastSyncedTask.text ||
+ this.computeDueDate() !== this._lastSyncedTask.due ||
+ !!doc.$task_completed !== this._lastSyncedTask.completed ||
+ !!doc.$dashDeleted !== this._lastSyncedTask.deleted;
+
+ if (googleUpdated > dashUpdated && !dashChanged) {
+ // Google version is newer — update Dash
+ runInAction(() => {
+ doc.title = googleTask.title ?? doc.title;
+ doc[this.fieldKey] = googleTask.notes ?? doc[this.fieldKey];
+ doc.$task_completed = googleTask.status === 'completed';
+
+ if (googleTask.due && googleTask.due.split('T')[0] !== this.computeDueDate()?.split('T')[0]) {
+ const dueDate = new Date(googleTask.due);
+ doc.$task_allDay = true;
+ doc.$task_dateRange = `${dueDate.toISOString().split('T')[0]}|${dueDate.toISOString().split('T')[0]}`;
+ }
+
+ doc.$task_lastSyncedAt = googleTask.updated;
+ this._lastSyncedTask = {
+ title: StrCast(doc.title),
+ text: StrCast(doc[this.fieldKey]),
+ due: this.computeDueDate(),
+ completed: !!doc.$task_completed,
+ deleted: !!doc.$dashDeleted,
+ };
+ this._needsSync = false;
+ });
+
+ console.log('Pulled newer version from Google');
+ return true;
+ } else if (googleUpdated <= dashUpdated && !dashChanged) {
+ console.log('No changes to sync');
+ return true;
+ } else {
+ // Dash version is newer — push update to Google
+ const body = this.buildGoogleTaskBody();
+ const res = await fetch(`/googleTasks/${doc.$googleTaskId}`, {
+ method: 'PATCH',
+ headers: {
+ 'Content-Type': 'application/json',
+ Authorization: `Bearer ${token}`,
+ },
+ credentials: 'include',
+ body: JSON.stringify(body),
+ });
+
+ const result = await res.json();
+ if (result?.id) {
+ doc.$task_lastSyncedAt = new Date().toISOString();
+ this._lastSyncedTask = {
+ title: StrCast(doc.title),
+ text: StrCast(doc[this.fieldKey]),
+ due: this.computeDueDate(),
+ completed: !!doc.$task_completed,
+ deleted: !!doc.$dashDeleted,
+ };
+ this._needsSync = false;
+ console.log('Pushed newer version to Google');
+ return true;
+ } else {
+ console.warn('❌ Push failed:', result);
+ return false;
+ }
+ }
+ } catch (err) {
+ console.error('❌ Sync error:', err);
+ return false;
+ } finally {
+ runInAction(() => {
+ this._syncing = false;
+ });
+ }
+ };
+
+ /**
+ * Method to set up the task box on mount
+ */
+ componentDidMount() {
+ this.setTaskDateRange();
+ const doc = this.Document;
+
+ // adding task on creation to google
+ (async () => {
+ if (!doc.$googleTaskId && doc.title) {
+ try {
+ const token = await GoogleAuthenticationManager.Instance.fetchOrGenerateAccessToken();
+ if (!token) return;
+ const body = this.buildGoogleTaskBody();
+
+ const res = await fetch('/googleTasks/create', {
+ method: 'POST',
+ credentials: 'include',
+ headers: {
+ 'Content-Type': 'application/json',
+ Authorization: `Bearer ${token}`,
+ },
+ body: JSON.stringify(body),
+ });
+
+ const result = await res.json();
+ if (result?.id) {
+ doc.$googleTaskId = result.id;
+ console.log('✅ Google Task created on mount:', result);
+ } else {
+ console.warn('❌ Google Task creation failed:', result);
+ }
+ } catch (err) {
+ console.warn('❌ Error creating Google Task:', err);
+ }
+ } else if (doc.$googleTaskId) {
+ await this.syncWithGoogleTaskBidirectional();
+ }
+ })();
+
+ this._heightDisposer = reaction(
+ () => NumCast(doc._height),
+ height => {
+ const minHeight = NumCast(doc.height_min);
+ if (height < minHeight) {
+ doc._height = minHeight;
+ }
+ }
+ );
+
+ this._widthDisposer = reaction(
+ () => NumCast(doc._width),
+ width => {
+ const minWidth = NumCast(doc.width_min);
+ if (width < minWidth) {
+ doc._width = minWidth;
+ }
+ }
+ );
+
+ runInAction(() => {
+ const completed = BoolCast(doc.$task_completed);
+ const due = this.computeDueDate();
+
+ this._lastSyncedTask = {
+ title: StrCast(doc.title),
+ text: StrCast(doc[this.fieldKey]),
+ due,
+ completed,
+ deleted: !!doc.$dashDeleted,
+ };
+ this._needsSync = false;
+ });
+
+ if (this.Document.$dashDeleted) {
+ runInAction(() => {
+ this.Document.$dashDeleted = false;
+ });
+ }
+
+ this._googleTaskCreateDisposer = reaction(
+ () => {
+ const completed = BoolCast(doc.$task_completed);
+ const due = this.computeDueDate();
+ const dashDeleted = !!doc.$dashDeleted;
+
+ return { title: StrCast(doc.title), text: StrCast(doc[this.fieldKey]), completed, due, dashDeleted };
+ },
+ ({ title, text, completed, due, dashDeleted }) => {
+ this._needsSync = title !== this._lastSyncedTask.title || text !== this._lastSyncedTask.text || due !== this._lastSyncedTask.due || completed !== this._lastSyncedTask.completed || dashDeleted !== this._lastSyncedTask.deleted;
+ },
+ { fireImmediately: true }
+ );
+ }
+
+ /**
+ * Method to clean up the task box on unmount
+ */
+ componentWillUnmount() {
+ const doc = this.Document;
+ this._googleTaskCreateDisposer?.();
+ this._heightDisposer?.();
+ this._widthDisposer?.();
+ }
+
+ /**
+ * Method to handle task deletion
+ * @returns - a promise that resolves when the task is deleted
+ */
+ handleDeleteTask = async () => {
+ const doc = this.Document;
+ if (!doc.$googleTaskId) return;
+ if (!window.confirm('Are you sure you want to delete this task?')) return;
+
+ doc.$dashDeleted = true;
+ this._needsSync = true;
+
+ try {
+ const token = await GoogleAuthenticationManager.Instance.fetchOrGenerateAccessToken();
+ if (!token) return;
+
+ await fetch(`/googleTasks/${doc.$googleTaskId}`, {
+ method: 'DELETE',
+ credentials: 'include',
+ headers: {
+ Authorization: `Bearer ${token}`,
+ },
+ });
+
+ const view = DocumentView.getDocumentView(this.Document);
+ if (view) {
+ DocumentView.SelectView(view, false); // select document
+ DocumentDecorations.Instance?.onCloseClick?.(true); // simulate clicking the close button
+ }
+
+ // Remove the task from the recently closed list
+ Doc.MyRecentlyClosed && Doc.RemoveDocFromList(Doc.MyRecentlyClosed, undefined, this.Document);
+ console.log(`✅ Deleted Google Task ${doc.$googleTaskId}`);
+ } catch (err) {
+ console.warn('❌ Failed to delete Google Task:', err);
+ }
+ };
+
+ /**
+ * Method to render the task box
+ * @returns - HTML with taskbox components
+ */
+
+ render() {
+ function toLocalDateTimeString(date: Date): string {
+ const pad = (n: number) => n.toString().padStart(2, '0');
+ return date.getFullYear() + '-' + pad(date.getMonth() + 1) + '-' + pad(date.getDate()) + 'T' + pad(date.getHours()) + ':' + pad(date.getMinutes());
+ }
+
+ const doc = this.Document;
+
+ const taskDesc = StrCast(doc[this.fieldKey]);
+ const taskTitle = StrCast(doc.title);
+ const allDay = !!doc.$task_allDay;
+ const due = this.computeDueDate();
+ const isCompleted = !!this.Document.$task_completed;
+
+ const startTime = DateCast(doc.$task_startTime) ? toLocalDateTimeString(DateCast(doc.$task_startTime)!.date) : '';
+ const endTime = DateCast(doc.$task_endTime) ? toLocalDateTimeString(DateCast(doc.$task_endTime)!.date) : '';
+
+ const handleGoogleTaskSync = async () => {
+ const success = await this.syncWithGoogleTaskBidirectional();
+
+ if (success) {
+ alert('✅ Task successfully synced!');
+ } else {
+ alert('❌ Task sync failed. Try reloading.');
+ }
+ };
+
+ return (
+ <div className="task-box-blur-wrapper" tabIndex={0} onBlur={this.handleBlur} onFocus={this.handleFocus}>
+ <div className="task-manager-container">
+ <input className="task-manager-title" type="text" placeholder="Task Title" value={taskTitle} onChange={this.updateTitle} disabled={isCompleted} style={{ opacity: isCompleted ? 0.7 : 1 }} />
+
+ <textarea className="task-manager-description" placeholder="What’s your task?" value={taskDesc} onChange={this.updateText} disabled={isCompleted} style={{ opacity: isCompleted ? 0.7 : 1 }} />
+
+ <div className="task-manager-checkboxes">
+ <label className="task-manager-allday" style={{ opacity: isCompleted ? 0.7 : 1 }}>
+ <input type="checkbox" checked={allDay} onChange={this.updateAllDay} disabled={isCompleted} />
+ All day
+ {allDay && (
+ <input
+ type="date"
+ value={(() => {
+ const datePart = StrCast(doc.$task_dateRange).split('|')[0];
+ if (!datePart) return '';
+ const d = new Date(datePart);
+ return !isNaN(d.getTime()) ? d.toISOString().split('T')[0] : '';
+ })()}
+ onChange={e => {
+ const newDate = new Date(e.target.value);
+ if (!isNaN(newDate.getTime())) {
+ const dateStr = e.target.value;
+ if (dateStr) {
+ doc.$task_dateRange = `${dateStr}T00:00:00|${dateStr}T00:00:00`;
+ }
+ }
+ }}
+ disabled={isCompleted}
+ style={{ marginLeft: '8px' }}
+ />
+ )}
+ </label>
+
+ <label className="task-manager-complete">
+ <input type="checkbox" checked={isCompleted} onChange={this.toggleComplete} />
+ Complete
+ </label>
+ </div>
+
+ <div className="task-manager-button-row">
+ <button
+ className="task-manager-google"
+ onClick={event => {
+ event.preventDefault();
+ handleGoogleTaskSync();
+ }}>
+ {this._syncing ? 'Syncing...' : this.needsSync ? 'Push Updates' : 'Sync Task'}
+ </button>
+
+ <button
+ className="task-manager-delete"
+ onClick={event => {
+ event.preventDefault();
+ this.handleDeleteTask();
+ }}>
+ <svg xmlns="http://www.w3.org/2000/svg" x="0px" y="0px" width="12" height="12" viewBox="0 0 24 24" style={{ fill: 'white', marginRight: '6px', verticalAlign: 'middle', marginTop: '-2px' }}>
+ <path d="M 10 2 L 9 3 L 5 3 C 4.4 3 4 3.4 4 4 C 4 4.6 4.4 5 5 5 L 7 5 L 17 5 L 19 5 C 19.6 5 20 4.6 20 4 C 20 3.4 19.6 3 19 3 L 15 3 L 14 2 L 10 2 z M 5 7 L 5 20 C 5 21.1 5.9 22 7 22 L 17 22 C 18.1 22 19 21.1 19 20 L 19 7 L 5 7 z M 9 9 C 9.6 9 10 9.4 10 10 L 10 19 C 10 19.6 9.6 20 9 20 C 8.4 20 8 19.6 8 19 L 8 10 C 8 9.4 8.4 9 9 9 z M 15 9 C 15.6 9 16 9.4 16 10 L 16 19 C 16 19.6 15.6 20 15 20 C 14.4 20 14 19.6 14 19 L 14 10 C 14 9.4 14.4 9 15 9 z"></path>
+ </svg>
+ Delete
+ </button>
+ </div>
+
+ {!allDay && (
+ <div className="task-manager-times" style={{ opacity: isCompleted ? 0.7 : 1 }}>
+ <label>
+ Start:
+ <input type="datetime-local" value={startTime} onChange={this.updateStart} disabled={isCompleted} />
+ </label>
+ <label>
+ End:
+ <input type="datetime-local" value={endTime} onChange={this.updateEnd} disabled={isCompleted} />
+ </label>
+ </div>
+ )}
+ </div>
+ </div>
+ );
+ }
+}
+
+Docs.Prototypes.TemplateMap.set(DocumentType.TASK, {
+ layout: { view: TaskBox, dataField: 'text' },
+ options: {
+ acl: '',
+ _height: 35,
+ _xMargin: 10,
+ _yMargin: 10,
+ _layout_autoHeight: true,
+ _layout_nativeDimEditable: true,
+ _layout_reflowVertical: true,
+ _layout_reflowHorizontal: true,
+ task: '',
+ defaultDoubleClick: 'ignore',
+ systemIcon: 'BsCheckSquare',
+ height_min: 300,
+ width_min: 300,
+ },
+});
diff --git a/src/client/views/nodes/VideoBox.scss b/src/client/views/nodes/VideoBox.scss
index b5405f0fb..27f419198 100644
--- a/src/client/views/nodes/VideoBox.scss
+++ b/src/client/views/nodes/VideoBox.scss
@@ -3,8 +3,8 @@
.mini-viewer {
cursor: grab;
position: absolute;
- right: 10;
- top: 10;
+ right: 10px;
+ top: 10px;
opacity: 0.1;
transition: all 0.4s;
color: white;
@@ -38,7 +38,7 @@
.videoBox-annotationLayer {
position: relative;
transform-origin: left top;
- top: 0;
+ top: 0px;
width: 100%;
pointer-events: none;
mix-blend-mode: multiply; // bcz: makes text fuzzy!
@@ -81,8 +81,8 @@
// }
.videoBox-ui-wrapper {
- width: 0;
- height: 0;
+ width: 0px;
+ height: 0px;
position: relative;
z-index: 2000;
}
diff --git a/src/client/views/nodes/VideoBox.tsx b/src/client/views/nodes/VideoBox.tsx
index fa099178c..f994bdbb5 100644
--- a/src/client/views/nodes/VideoBox.tsx
+++ b/src/client/views/nodes/VideoBox.tsx
@@ -30,6 +30,7 @@ import { StyleProp } from '../StyleProp';
import { DocumentView } from './DocumentView';
import { FieldView, FieldViewProps } from './FieldView';
import { FocusViewOptions } from './FocusViewOptions';
+import { gptImageLabel } from '../../apis/gpt/GPT';
import './VideoBox.scss';
/**
@@ -109,6 +110,52 @@ export class VideoBox extends ViewBoxAnnotatableComponent<FieldViewProps>() {
return this._videoRef;
}
+ autoTag = async () => {
+ if (this.Document.$tags_chat) return;
+ try {
+ if (!this.player) throw new Error('Video element not available.');
+
+ // 1) Extract a frame at the video's midpoint
+ const videoDuration = this.player.duration;
+ const snapshotTime = videoDuration / 2;
+
+ // Seek the video element to the midpoint
+ await new Promise<void>(resolve => {
+ const onSeeked = () => {
+ this.player!.removeEventListener('seeked', onSeeked);
+ resolve();
+ };
+ this.player!.addEventListener('seeked', onSeeked);
+ this.player!.currentTime = snapshotTime;
+ });
+
+ // 2) Draw the frame onto a canvas and get a base64 representation
+ const canvas = document.createElement('canvas');
+ canvas.width = this.player.videoWidth;
+ canvas.height = this.player.videoHeight;
+ const ctx = canvas.getContext('2d');
+ if (!ctx) throw new Error('Failed to create canvas context.');
+ ctx.drawImage(this.player, 0, 0, canvas.width, canvas.height);
+ const base64Image = canvas.toDataURL('image/png');
+
+ // 3) Send the image data to GPT for classification and descriptive tags
+ const label = await gptImageLabel(
+ base64Image,
+ `Classify this video frame as either a PERSON or LANDSCAPE.
+ Then provide five additional descriptive tags (single words) separated by spaces.
+ Finally, add one detailed summary phrase using underscores.`
+ ).then(raw => raw.trim().toUpperCase());
+
+ // 4) Normalize and store labels in the Document's tags
+ const aspect = this.player!.videoWidth / (this.player!.videoHeight || 1);
+ this.Document.$tags_chat = new List<string>([...label.split(/\s+/), `ASPECT_${aspect}`]);
+ // 5) Turn on tag display in layout
+ this.Document._layout_showTags = true;
+ } catch (err) {
+ console.error('Video autoTag failed:', err);
+ }
+ };
+
componentDidMount() {
this.unmounting = false;
this._props.setContentViewBox?.(this); // this tells the DocumentView that this VideoBox is the "content" of the document. this allows the DocumentView to indirectly call getAnchor() on the VideoBox when making a link.
@@ -338,12 +385,17 @@ export class VideoBox extends ViewBoxAnnotatableComponent<FieldViewProps>() {
getAnchor = (addAsAnnotation: boolean, pinProps?: PinProps) => {
const timecode = Cast(this.layoutDoc._layout_currentTimecode, 'number', null);
const marquee = AnchorMenu.Instance.GetAnchor?.(undefined, addAsAnnotation);
+ const docAnchor = () =>
+ Docs.Create.ConfigDocument({
+ title: '#' + timecode,
+ _timecodeToShow: timecode,
+ annotationOn: this.Document,
+ });
if (!addAsAnnotation && marquee) marquee.backgroundColor = 'transparent';
- const anchor =
- addAsAnnotation && marquee
- ? CollectionStackedTimeline.createAnchor(this.Document, this.dataDoc, this.annotationKey, timecode || undefined, undefined, marquee, addAsAnnotation) || this.Document
- : Docs.Create.ConfigDocument({ title: '#' + timecode, _timecodeToShow: timecode, annotationOn: this.Document });
+ const visibleAnchor = () => addAsAnnotation && marquee && (CollectionStackedTimeline.createAnchor(this.Document, this.dataDoc, this.annotationKey, timecode || undefined, undefined, marquee, addAsAnnotation) || this.Document);
+ const anchor = visibleAnchor() || docAnchor();
PinDocView(anchor, { pinDocLayout: pinProps?.pinDocLayout, pinData: { ...(pinProps?.pinData ?? {}), temporal: true, pannable: true } }, this.Document);
+ addAsAnnotation && this.addDocument(anchor);
return anchor;
};
@@ -376,9 +428,7 @@ export class VideoBox extends ViewBoxAnnotatableComponent<FieldViewProps>() {
}
return this._stackedTimeline.getView(doc, options);
}
- return new Promise<Opt<DocumentView>>(res => {
- DocumentView.addViewRenderedCb(doc, dv => res(dv));
- });
+ return new Promise<Opt<DocumentView>>(res => DocumentView.addViewRenderedCb(doc, res));
};
// extracts video thumbnails and saves them as field of doc
diff --git a/src/client/views/nodes/WebBox.scss b/src/client/views/nodes/WebBox.scss
index 77d7716f4..f1c964980 100644
--- a/src/client/views/nodes/WebBox.scss
+++ b/src/client/views/nodes/WebBox.scss
@@ -3,8 +3,8 @@
.webBox {
height: 100%;
width: 100%;
- top: 0;
- left: 0;
+ top: 0px;
+ left: 0px;
position: relative;
display: flex;
overflow: hidden;
@@ -28,8 +28,8 @@
height: 100%;
z-index: 1;
pointer-events: none;
- top: 0;
- left: 0;
+ top: 0px;
+ left: 0px;
overflow: hidden;
.webBox-overlayButton {
@@ -39,16 +39,16 @@
align-items: center;
height: 20px;
background: none;
- padding: 0;
+ padding: 0px;
position: absolute;
pointer-events: all;
color: white;
- bottom: 0;
- right: 0;
+ bottom: 0px;
+ right: 0px;
.webBox-overlayButton-arrow {
- width: 0;
- height: 0;
+ width: 0px;
+ height: 0px;
border-top: 10px solid transparent;
border-bottom: 10px solid transparent;
border-right: 15px solid #121721;
@@ -92,7 +92,7 @@
width: calc(100% - 40px);
height: 20px;
background: #121721;
- bottom: 0;
+ bottom: 0px;
display: flex;
justify-content: center;
align-items: center;
@@ -137,7 +137,7 @@
.webBox-annotationLayer {
position: absolute;
transform-origin: left top;
- top: 0;
+ top: 0px;
width: 100%;
pointer-events: none;
mix-blend-mode: multiply; // bcz: makes text fuzzy!
@@ -156,8 +156,8 @@
.webBox-htmlSpan {
position: absolute;
- top: 0;
- left: 0;
+ top: 0px;
+ left: 0px;
cursor: text;
padding: 15px;
height: 100%;
@@ -171,8 +171,8 @@
.webBox-cont-interactive {
padding: 0vw;
position: absolute;
- top: 0;
- left: 0;
+ top: 0px;
+ left: 0px;
width: 100%;
height: 100%;
transform-origin: top left;
@@ -181,8 +181,8 @@
width: 100%;
height: 100%;
position: absolute;
- top: 0;
- left: 0;
+ top: 0px;
+ left: 0px;
body {
::selection {
color: white;
@@ -203,8 +203,8 @@
height: 100%;
position: absolute;
transform-origin: top left;
- top: 0;
- left: 0;
+ top: 0px;
+ left: 0px;
overflow: auto;
.webBox-innerContent {
@@ -224,7 +224,7 @@
}
.webBox-buttons {
- margin-left: 44;
+ margin-left: 44px;
background: lightGray;
width: 100%;
}
@@ -232,8 +232,8 @@
.webBox-annotationToggle {
z-index: 901;
position: absolute;
- top: 2;
- left: 2;
+ top: 2px;
+ left: 2px;
cursor: pointer;
box-shadow: black 0.3em 0.3em 1em;
border-radius: 5px;
diff --git a/src/client/views/nodes/WebBox.tsx b/src/client/views/nodes/WebBox.tsx
index 1e158f484..881cdae37 100644
--- a/src/client/views/nodes/WebBox.tsx
+++ b/src/client/views/nodes/WebBox.tsx
@@ -13,7 +13,7 @@ import { InkTool } from '../../../fields/InkField';
import { List } from '../../../fields/List';
import { RefField } from '../../../fields/RefField';
import { listSpec } from '../../../fields/Schema';
-import { Cast, NumCast, StrCast, toList, WebCast } from '../../../fields/Types';
+import { Cast, DocCast, NumCast, StrCast, toList, WebCast } from '../../../fields/Types';
import { ImageField, WebField } from '../../../fields/URLField';
import { TraceMobx } from '../../../fields/util';
import { emptyFunction, stringHash } from '../../../Utils';
@@ -104,6 +104,9 @@ export class WebBox extends ViewBoxAnnotatableComponent<FieldViewProps>() {
@computed get webField() {
return Cast(this.Document[this._props.fieldKey], WebField)?.url;
}
+ @computed get sidebarKey() {
+ return this.fieldKey + '_sidebar';
+ }
constructor(props: FieldViewProps) {
super(props);
@@ -308,18 +311,17 @@ export class WebBox extends ViewBoxAnnotatableComponent<FieldViewProps>() {
};
@action
- getView = (doc: Doc /* , options: FocusViewOptions */) => {
- if (Doc.AreProtosEqual(doc, this.Document))
- return new Promise<Opt<DocumentView>>(res => {
- res(this.DocumentView?.());
- });
+ getView = async (doc: Doc, options: FocusViewOptions) => {
+ if (Doc.AreProtosEqual(doc, this.Document)) return new Promise<Opt<DocumentView>>(res => res(this.DocumentView?.()));
+
if (this.Document.layout_fieldKey === 'layout_icon') this.DocumentView?.().iconify();
const webUrl = WebCast(doc.config_data)?.url;
if (this._url && webUrl && webUrl.href !== this._url) this.setData(webUrl.href);
- if (this._sidebarRef?.current?.makeDocUnfiltered(doc) && !this.SidebarShown) this.toggleSidebar(false);
- return new Promise<Opt<DocumentView>>(res => {
- DocumentView.addViewRenderedCb(doc, dv => res(dv));
- });
+
+ if (DocListCast(this.dataDoc[this.sidebarKey]).find(anno => Doc.AreProtosEqual(doc.layout_unrendered ? DocCast(doc.annotationOn) : doc, anno))) {
+ return SidebarAnnos.getView(this._sidebarRef.current, this.SidebarShown, () => this.toggleSidebar(false), doc, options);
+ }
+ return undefined;
};
sidebarAddDocTab = (doc: Doc, where: OpenWhere) => {
@@ -393,7 +395,7 @@ export class WebBox extends ViewBoxAnnotatableComponent<FieldViewProps>() {
.transformPoint(e.clientX, e.clientY - NumCast(this.layoutDoc.layout_scrollTop));
if (!this._marqueeref.current?.isEmpty) this._marqueeref.current?.onEnd(theclick[0], theclick[1]);
else {
- if (!(e.target as HTMLElement)?.tagName?.includes('INPUT')) this.finishMarquee(theclick[0], theclick[1]);
+ if (!(e.target as HTMLElement)?.tagName?.includes('INPUT') && !(e.target as HTMLElement)?.tagName?.includes('TEXTAREA')) this.finishMarquee(theclick[0], theclick[1]);
this._getAnchor = AnchorMenu.Instance?.GetAnchor;
this.marqueeing = undefined;
}
@@ -454,7 +456,7 @@ export class WebBox extends ViewBoxAnnotatableComponent<FieldViewProps>() {
iframeDown = (e: PointerEvent) => {
this._textAnnotationCreator = undefined;
const sel = this._url ? this._iframe?.contentDocument?.getSelection() : window.document.getSelection();
- if (sel?.empty && !(e.target as any).textContent)
+ if (sel?.empty && !(e.target as HTMLElement).textContent)
sel.empty(); // Chrome
else if (sel?.removeAllRanges) sel.removeAllRanges(); // Firefox
@@ -465,6 +467,7 @@ export class WebBox extends ViewBoxAnnotatableComponent<FieldViewProps>() {
.transformPoint(e.clientX, e.clientY - NumCast(this.layoutDoc.layout_scrollTop));
MarqueeAnnotator.clearAnnotations(this._savedAnnotations);
const target = e.target as HTMLElement;
+ if ((target as HTMLElement)?.tagName?.includes('INPUT') || (target as HTMLElement)?.tagName?.includes('TEXTAREA')) e.stopPropagation();
const word = target && getWordAtPoint(target, e.clientX, e.clientY);
if (!word && !target?.className?.includes('rangeslider') && !target?.onclick && !target?.parentElement?.onclick) {
this.marqueeing = theclick;
@@ -657,7 +660,7 @@ export class WebBox extends ViewBoxAnnotatableComponent<FieldViewProps>() {
'click',
undoable(
action((e: MouseEvent) => {
- let eleHref = (e.target as any)?.outerHTML?.split('"="')[1]?.split('"')[0];
+ let eleHref = (e.target as HTMLElement)?.outerHTML?.split('"="')[1]?.split('"')[0];
for (let ele = e.target as HTMLElement | Element | null; ele; ele = ele.parentElement) {
if ('href' in ele) {
eleHref = (typeof ele.href === 'string' ? ele.href : eleHref) || (ele.parentElement && 'href' in ele.parentElement ? (ele.parentElement.href as string) : eleHref);
diff --git a/src/client/views/nodes/audio/AudioWaveform.scss b/src/client/views/nodes/audio/AudioWaveform.scss
index 6cbd1759a..c6b0da9c8 100644
--- a/src/client/views/nodes/audio/AudioWaveform.scss
+++ b/src/client/views/nodes/audio/AudioWaveform.scss
@@ -1,17 +1,17 @@
-.audioWaveform {
+.audioWaveform {
position: relative;
width: 100%;
height: 200%;
overflow: hidden;
z-index: -1000;
- bottom: 0;
+ bottom: 0px;
pointer-events: none;
div {
height: 100% !important;
- width: 100% !important;
+ width: 100% !important;
}
- canvas {
+ canvas {
height: 100% !important;
- width: 100% !important;
+ width: 100% !important;
}
}
diff --git a/src/client/views/nodes/calendarBox/CalendarBox.scss b/src/client/views/nodes/calendarBox/CalendarBox.scss
index f8ac4b2d1..89dc294a5 100644
--- a/src/client/views/nodes/calendarBox/CalendarBox.scss
+++ b/src/client/views/nodes/calendarBox/CalendarBox.scss
@@ -1,9 +1,12 @@
+.calendarBox-interactive,
.calendarBox {
display: flex;
width: 100%;
height: 100%;
transform-origin: top left;
- .calendarBox-wrapper {
+ overflow: auto;
+ > div {
+ pointer-events: none;
width: 100%;
height: 100%;
.fc-timegrid-body {
@@ -23,3 +26,36 @@
}
}
}
+
+// AARAV ADD
+
+/* Existing styles */
+.fc-event.mother {
+ font-weight: 500;
+ border-radius: 4px;
+ padding: 2px 4px;
+ border-width: 2px;
+ }
+
+ /* New styles for completed tasks */
+ .fc-event.completed-task {
+ opacity: 1;
+ filter: grayscale(70%) brightness(90%);
+ text-decoration: line-through;
+ color: #ffffff;
+ }
+
+.calendarBox-interactive {
+ > div {
+ pointer-events: unset;
+ }
+}
+
+.custom-drag-mirror {
+ transition: none !important;
+ transform: none !important;
+}
+
+.fc-event-dragging {
+ opacity: 0 !important;
+}
diff --git a/src/client/views/nodes/calendarBox/CalendarBox.tsx b/src/client/views/nodes/calendarBox/CalendarBox.tsx
index 2b20a666d..a4183a11a 100644
--- a/src/client/views/nodes/calendarBox/CalendarBox.tsx
+++ b/src/client/views/nodes/calendarBox/CalendarBox.tsx
@@ -1,15 +1,17 @@
-import { Calendar, EventClickArg, EventDropArg, EventSourceInput } from '@fullcalendar/core';
+import { Calendar, DateSelectArg, EventClickArg, EventDropArg, EventMountArg, EventSourceInput } from '@fullcalendar/core';
+import { EventResizeDoneArg } from '@fullcalendar/interaction';
import dayGridPlugin from '@fullcalendar/daygrid';
import interactionPlugin from '@fullcalendar/interaction';
import multiMonthPlugin from '@fullcalendar/multimonth';
import timeGrid from '@fullcalendar/timegrid';
-import { IReactionDisposer, action, computed, makeObservable, observable, reaction } from 'mobx';
+import FullCalendar from '@fullcalendar/react';
+import { IReactionDisposer, action, computed, makeObservable, observable, reaction, untracked } from 'mobx';
import { observer } from 'mobx-react';
import * as React from 'react';
import { dateRangeStrToDates } from '../../../../ClientUtils';
import { Doc } from '../../../../fields/Doc';
import { Id } from '../../../../fields/FieldSymbols';
-import { BoolCast, NumCast, StrCast } from '../../../../fields/Types';
+import { BoolCast, StrCast } from '../../../../fields/Types';
import { DocServer } from '../../../DocServer';
import { DragManager } from '../../../util/DragManager';
import { CollectionSubView, SubCollectionViewProps } from '../../collections/CollectionSubView';
@@ -17,26 +19,35 @@ import { ContextMenu } from '../../ContextMenu';
import { DocumentView } from '../DocumentView';
import { OpenWhere } from '../OpenWhere';
import './CalendarBox.scss';
+import { DateField } from '../../../../fields/DateField';
+import { undoable } from '../../../util/UndoManager';
+import { DocumentType } from '../../../documents/DocumentTypes';
+import { truncate } from 'fs/promises';
type CalendarView = 'multiMonth' | 'dayGridMonth' | 'timeGridWeek' | 'timeGridDay';
@observer
export class CalendarBox extends CollectionSubView() {
- _calendarRef: HTMLDivElement | null = null;
+ _calendarRef: FullCalendar | null = null;
_calendar: Calendar | undefined;
_observer: ResizeObserver | undefined;
_eventsDisposer: IReactionDisposer | undefined;
_selectDisposer: IReactionDisposer | undefined;
+ _isMultiMonth: boolean | undefined;
+
+ @observable _multiMonth = 0;
constructor(props: SubCollectionViewProps) {
super(props);
makeObservable(this);
}
- @observable _multiMonth = 0;
- isMultiMonth: boolean | undefined;
+ @computed get calTypeFieldKey() {
+ return this.fieldKey + '_calendarType';
+ }
componentDidMount(): void {
+ this.Document.$calendar = ''; // needed only to make the keyvalue view look nice.
this._props.setContentViewBox?.(this);
this._eventsDisposer = reaction(
() => ({ events: this.calendarEvents }),
@@ -52,7 +63,7 @@ export class CalendarBox extends CollectionSubView() {
type: 'CHANGE_DATE',
dateMarker: state.dateEnv.createMarker(initialDate.start),
});
- setTimeout(() => (initialDate.start.toISOString() !== initialDate.end.toISOString() ? this._calendar?.select(initialDate.start, initialDate.end) : this._calendar?.select(initialDate.start)));
+ setTimeout(() => initialDate.start.toISOString() !== initialDate.end.toISOString() && this._calendar?.select(initialDate.start, initialDate.end));
},
{ fireImmediately: true }
);
@@ -64,7 +75,20 @@ export class CalendarBox extends CollectionSubView() {
@computed get calendarEvents(): EventSourceInput | undefined {
return this.childDocs.map(doc => {
- const { start, end } = dateRangeStrToDates(StrCast(doc.date_range));
+ // const { start, end } = dateRangeStrToDates(StrCast(doc.$task_dateRange));
+ const isCompleted = BoolCast(doc.$task_completed);
+
+ const rangeStr = StrCast(doc.$task_dateRange);
+ const [startStr, endStr] = rangeStr.split('|');
+ let start: string | Date, end: string | Date;
+
+ if (BoolCast(doc.$task_allDay)) {
+ start = startStr;
+ end = endStr;
+ } else {
+ ({ start, end } = dateRangeStrToDates(rangeStr));
+ }
+
return {
title: StrCast(doc.title),
start,
@@ -72,8 +96,8 @@ export class CalendarBox extends CollectionSubView() {
groupId: doc[Id],
startEditable: true,
endEditable: true,
- allDay: BoolCast(doc.allDay),
- classNames: ['mother'], // will determine the style
+ allDay: BoolCast(doc.$task_allDay),
+ classNames: ['mother', isCompleted ? 'completed-task' : ''], // will determine the style
editable: true, // subject to change in the future
backgroundColor: this.eventToColor(doc),
borderColor: this.eventToColor(doc),
@@ -86,16 +110,16 @@ export class CalendarBox extends CollectionSubView() {
}
@computed get dateRangeStrDates() {
- return dateRangeStrToDates(StrCast(this.Document.date_range));
+ return dateRangeStrToDates(StrCast(this.Document._calendar_dateRange));
}
get dateSelect() {
- return dateRangeStrToDates(StrCast(this.Document.date));
+ return dateRangeStrToDates(StrCast(this.Document._calendar_date));
}
// Choose a calendar view based on the date range
@computed get calendarViewType(): CalendarView {
- if (this.dataDoc[this.fieldKey + '_calendarType']) return StrCast(this.dataDoc[this.fieldKey + '_calendarType']) as CalendarView;
- if (this.isMultiMonth) return 'multiMonth';
+ if (this.dataDoc[this.calTypeFieldKey]) return StrCast(this.dataDoc[this.calTypeFieldKey]) as CalendarView;
+ if (this._isMultiMonth) return 'multiMonth';
const { start, end } = this.dateRangeStrDates;
if (start.getFullYear() !== end.getFullYear() || start.getMonth() !== end.getMonth()) return 'multiMonth';
if (Math.abs(start.getDay() - end.getDay()) > 7) return 'dayGridMonth';
@@ -104,7 +128,9 @@ export class CalendarBox extends CollectionSubView() {
// TODO: Return a different color based on the event type
eventToColor = (event: Doc): string => {
- return 'red' + event;
+ return StrCast(event.type) === DocumentType.TASK
+ ? '#20B2AA' // teal for tasks
+ : 'red';
};
// eslint-disable-next-line @typescript-eslint/no-unused-vars
@@ -112,7 +138,7 @@ export class CalendarBox extends CollectionSubView() {
if (!super.onInternalDrop(e, de)) return false;
de.complete.docDragData?.droppedDocuments.forEach(doc => {
const today = new Date().toISOString();
- if (!doc.date_range) doc.$date_range = `${today}|${today}`;
+ if (!doc.$task_dateRange) doc.$task_dateRange = `${today}|${today}`;
});
return true;
};
@@ -122,10 +148,31 @@ export class CalendarBox extends CollectionSubView() {
return false;
};
- handleEventDrop = (arg: EventDropArg) => {
+ handleEventDrop = undoable((arg: EventDropArg | EventResizeDoneArg) => {
const doc = DocServer.GetCachedRefField(arg.event._def.groupId ?? '');
- doc && arg.event.start && (doc.date_range = arg.event.start?.toString() + '|' + (arg.event.end ?? arg.event.start).toString());
- };
+ // doc && arg.event.start && (doc.$task_dateRange = arg.event.start?.toString() + '|' + (arg.event.end ?? arg.event.start).toString());
+ if (!doc || !arg.event.start) return;
+
+ // get the new start and end dates
+ const startDate = new Date(arg.event.start);
+ const endDate = new Date(arg.event.end ?? arg.event.start);
+
+ // update date range, time range, and all day status
+ doc.$task_dateRange = `${startDate.toISOString()}|${endDate.toISOString()}`;
+
+ const allDayStatus = arg.event.allDay ?? false;
+ if (doc.$task_allDay !== allDayStatus) {
+ doc.$task_allDay = allDayStatus;
+ }
+
+ if (doc.$task_allDay) {
+ delete doc.$task_startTime;
+ delete doc.$task_endTime;
+ } else {
+ doc.$task_startTime = new DateField(startDate);
+ doc.$task_endTime = new DateField(endDate);
+ }
+ }, 'change event date');
handleEventClick = (arg: EventClickArg) => {
const doc = DocServer.GetCachedRefField(arg.event._def.groupId ?? '');
@@ -144,90 +191,202 @@ export class CalendarBox extends CollectionSubView() {
};
// https://fullcalendar.io
- renderCalendar = () => {
- const cal = !this._calendarRef
- ? null
- : (this._calendar = new Calendar(this._calendarRef, {
- plugins: [multiMonthPlugin, dayGridPlugin, timeGrid, interactionPlugin],
- headerToolbar: {
- left: 'prev,next today',
- center: 'title',
- right: 'multiMonth dayGridMonth timeGridWeek timeGridDay',
- },
- selectable: true,
- initialView: this.calendarViewType === 'multiMonth' ? undefined : this.calendarViewType,
- initialDate: this.dateSelect.start,
- navLinks: true,
- editable: false,
- displayEventTime: false,
- displayEventEnd: false,
- select: info => {
- const start = dateRangeStrToDates(info.startStr).start.toISOString();
- const end = dateRangeStrToDates(info.endStr).start.toISOString();
- this.dataDoc.date = start + '|' + end;
- },
- aspectRatio: NumCast(this.Document.width) / NumCast(this.Document.height),
- events: this.calendarEvents,
- eventClick: this.handleEventClick,
- eventDrop: this.handleEventDrop,
- eventDidMount: arg => {
- arg.el.addEventListener('pointerdown', ev => {
- ev.button && ev.stopPropagation();
- });
- if (navigator.userAgent.includes('Macintosh')) {
- arg.el.addEventListener('pointerup', ev => {
- ev.button && ev.stopPropagation();
- ev.button && this.handleEventContextMenu(ev.pageX, ev.pageY, arg.event._def.groupId);
- });
- }
- arg.el.addEventListener('contextmenu', ev => {
- if (!navigator.userAgent.includes('Macintosh')) {
- this.handleEventContextMenu(ev.pageX, ev.pageY, arg.event._def.groupId);
+ @computed get renderCalendar() {
+ const availableWidth = this._props.PanelWidth() / (this._props.DocumentView?.().UIBtnScaling ?? 1);
+ const btn = (text: string, view: string | (() => void), hint: string) => ({ text, hint, click: typeof view === 'string' ? () => this._calendarRef?.getApi().changeView(view) : view });
+ return (
+ <FullCalendar
+ ref={(r: unknown) => (this._calendarRef = r as FullCalendar)}
+ customButtons={{
+ nowBtn: btn('Now', () => this._calendarRef?.getApi().gotoDate(new Date()), 'Go to Today'),
+ multiBtn: btn('M+', 'multiMonth', 'Multiple Month View'),
+ monthBtn: btn('M', 'dayGridMonth', 'Month View'),
+ weekBtn: btn('W', 'timeGridWeek', 'Week View'),
+ dayBtn: btn('D', 'timeGridDay', 'Day View'),
+ }}
+ headerToolbar={
+ availableWidth > 450
+ ? {
+ left: 'prev,next nowBtn',
+ center: 'title',
+ right: 'multiBtn monthBtn weekBtn dayBtn',
}
- ev.stopPropagation();
- ev.preventDefault();
- });
- },
- }));
- cal?.render();
- setTimeout(() => cal?.view.calendar.select(this.dateSelect.start, this.dateSelect.end));
- };
+ : availableWidth > 300
+ ? {
+ left: 'prev,next',
+ center: 'title',
+ right: '',
+ }
+ : {
+ left: '',
+ center: 'title',
+ right: '',
+ }
+ }
+ selectable={true}
+ initialView={this.calendarViewType === 'multiMonth' ? undefined : this.calendarViewType}
+ views={{
+ multiMonth: {
+ type: 'multiMonth',
+ duration: { months: 12 },
+ },
+ }}
+ initialDate={untracked(() => this.dateSelect.start)}
+ navLinks={true}
+ editable={true}
+ // expandRows={true}
+ // handleWindowResize={true}
+ displayEventTime={false}
+ displayEventEnd={false}
+ plugins={[multiMonthPlugin, dayGridPlugin, timeGrid, interactionPlugin]}
+ aspectRatio={this._props.PanelWidth() / this._props.PanelHeight()}
+ weekends={true}
+ events={this.calendarEvents}
+ eventClick={this.handleEventClick}
+ eventDrop={this.handleEventDrop}
+ eventResize={this.handleEventDrop}
+ unselectAuto={false}
+ // unselect={() => {}}
+ select={(info: DateSelectArg) => {
+ const start = dateRangeStrToDates(info.startStr).start.toISOString();
+ const end = info.allDay ? start : dateRangeStrToDates(info.endStr).start.toISOString();
+ this.Document._calendar_date = start + '|' + end;
+ }}
+ // eventContent={() => {
+ // return null;
+ // }}
+ eventDidMount={(arg: EventMountArg) => {
+ const doc = DocServer.GetCachedRefField(arg.event._def.groupId ?? '');
+ if (!doc) return;
+
+ if (doc.type === DocumentType.TASK) {
+ const checkButton = document.createElement('button');
+ checkButton.innerText = doc.$task_completed ? '✅' : '⬜';
+ checkButton.style.position = 'absolute';
+ checkButton.style.right = '5px';
+ checkButton.style.top = '50%';
+ checkButton.style.transform = 'translateY(-50%)';
+ checkButton.style.background = 'transparent';
+ checkButton.style.border = 'none';
+ checkButton.style.cursor = 'pointer';
+ checkButton.style.fontSize = '18px';
+ checkButton.style.zIndex = '1000';
+ checkButton.style.padding = '0';
+ checkButton.style.margin = '0';
+
+ checkButton.onclick = ev => {
+ ev.stopPropagation();
+ doc.$task_completed = !doc.$task_completed;
+ this._calendar?.refetchEvents();
+ };
+
+ arg.el.style.position = 'relative';
+ arg.el.appendChild(checkButton);
+ }
+ arg.el.addEventListener('pointerdown', ev => ev.button && ev.stopPropagation());
+ if (navigator.userAgent.includes('Macintosh')) {
+ arg.el.addEventListener('pointerup', ev => {
+ ev.button && ev.stopPropagation();
+ ev.button && this.handleEventContextMenu(ev.pageX, ev.pageY, arg.event._def.groupId);
+ });
+ }
+ arg.el.addEventListener('contextmenu', ev => {
+ if (!navigator.userAgent.includes('Macintosh')) {
+ this.handleEventContextMenu(ev.pageX, ev.pageY, arg.event._def.groupId);
+ }
+ ev.stopPropagation();
+ ev.preventDefault();
+ });
+ }}
+
+ // for dragging and dropping (mirror)
+
+ eventDragStart={(arg) => {
+ const mirror = arg.el.cloneNode(true) as HTMLElement;
+ const rect = arg.el.getBoundingClientRect();
+
+ mirror.style.position = 'fixed';
+ mirror.style.pointerEvents = 'none';
+ mirror.style.opacity = '0.8';
+ mirror.style.zIndex = '10000';
+ mirror.classList.add('custom-drag-mirror');
+ mirror.style.width = `${rect.width}px`;
+ mirror.style.height = `${rect.height}px`;
+
+ document.body.appendChild(mirror);
+
+ const moveListener = (ev: MouseEvent) => {
+ mirror.style.left = `${ev.clientX}px`;
+ mirror.style.top = `${ev.clientY}px`;
+ };
+
+ window.addEventListener('mousemove', moveListener);
+
+ // hide the actual box
+ arg.el.style.visibility = 'hidden';
+ arg.el.style.opacity = '0';
+
+ (arg.el as any)._mirrorElement = mirror;
+ (arg.el as any)._moveListener = moveListener;
+ }}
+
+ eventDragStop={(arg) => {
+ const el = arg.el as any;
+ const mirror = el._mirrorElement;
+ const moveListener = el._moveListener;
+
+ // show the actual box
+ el.style.visibility = 'visible';
+ el.style.opacity = '1';
+
+ if (mirror) document.body.removeChild(mirror);
+ if (moveListener) window.removeEventListener('mousemove', moveListener);
+ }}
+
+ />
+ );
+ }
render() {
+ const scale = this._props.ScreenToLocalTransform().Scale;
+ const scaledWidth = this._props.PanelWidth();
+ const scaledHeight = this._props.PanelHeight();
+
return (
<div
key={this.calendarViewType}
- className="calendarBox"
+ className={`calendarBox${this._props.isContentActive() ? '-interactive' : ''}`}
+ style={{
+ width: scaledWidth,
+ height: scaledHeight,
+ overflow: 'hidden',
+ position: 'relative',
+ }}
+ ref={r => {
+ this.createDashEventsTarget(r);
+ this.fixWheelEvents(r, this._props.isContentActive);
+ }}
onPointerDown={e => {
setTimeout(
action(() => {
const cname = (e.nativeEvent.target as HTMLButtonElement)?.className ?? '';
- if (cname.includes('multiMonth')) this.dataDoc[this.fieldKey + '_calendarType'] = 'multiMonth';
- if (cname.includes('dayGridMonth')) this.dataDoc[this.fieldKey + '_calendarType'] = 'dayGridMonth';
- if (cname.includes('timeGridWeek')) this.dataDoc[this.fieldKey + '_calendarType'] = 'timeGridWeek';
- if (cname.includes('timeGridDay')) this.dataDoc[this.fieldKey + '_calendarType'] = 'timeGridDay';
+ if (cname.includes('multiMonth')) this.dataDoc[this.calTypeFieldKey] = 'multiMonth';
+ if (cname.includes('dayGridMonth')) this.dataDoc[this.calTypeFieldKey] = 'dayGridMonth';
+ if (cname.includes('timeGridWeek')) this.dataDoc[this.calTypeFieldKey] = 'timeGridWeek';
+ if (cname.includes('timeGridDay')) this.dataDoc[this.calTypeFieldKey] = 'timeGridDay';
})
);
- }}
- style={{
- width: this._props.PanelWidth() / this._props.ScreenToLocalTransform().Scale,
- height: this._props.PanelHeight() / this._props.ScreenToLocalTransform().Scale,
- transform: `scale(${this._props.ScreenToLocalTransform().Scale})`,
- }}
- ref={r => {
- this.createDashEventsTarget(r);
- this.fixWheelEvents(r, this._props.isContentActive);
-
- if (r) {
- this._observer?.disconnect();
- (this._observer = new ResizeObserver(() => {
- this._calendar?.setOption('aspectRatio', NumCast(this.Document.width) / NumCast(this.Document.height));
- this._calendar?.updateSize();
- })).observe(r);
- this.renderCalendar();
- }
}}>
- <div className="calendarBox-wrapper" ref={r => (this._calendarRef = r)} />
+ <div
+ style={{
+ transform: `scale(${scale})`,
+ transformOrigin: 'top left',
+ width: scaledWidth / scale,
+ height: scaledHeight / scale,
+ }}
+ >
+ {this.renderCalendar}
+ </div>
</div>
);
}
diff --git a/src/client/views/nodes/chatbot/chatboxcomponents/ChatBox.scss b/src/client/views/nodes/chatbot/chatboxcomponents/ChatBox.scss
index 8e00cbdb7..2d7e5c120 100644
--- a/src/client/views/nodes/chatbot/chatboxcomponents/ChatBox.scss
+++ b/src/client/views/nodes/chatbot/chatboxcomponents/ChatBox.scss
@@ -807,7 +807,7 @@ $font-size-xlarge: 18px;
@media (max-width: 768px) {
.chat-box {
- border-radius: 0;
+ border-radius: 0px;
}
.message {
diff --git a/src/client/views/nodes/chatbot/chatboxcomponents/ProgressBar.scss b/src/client/views/nodes/chatbot/chatboxcomponents/ProgressBar.scss
new file mode 100644
index 000000000..77d452830
--- /dev/null
+++ b/src/client/views/nodes/chatbot/chatboxcomponents/ProgressBar.scss
@@ -0,0 +1,69 @@
+.spinner-container {
+ display: flex;
+ flex-direction: column;
+ justify-content: center;
+ align-items: center;
+ height: 100%;
+}
+
+.spinner {
+ width: 60px;
+ height: 60px;
+ position: relative;
+ margin-bottom: 20px; // Space between spinner and text
+}
+
+.double-bounce1,
+.double-bounce2 {
+ width: 100%;
+ height: 100%;
+ border-radius: 50%;
+ background-color: #4a90e2;
+ opacity: 0.6;
+ position: absolute;
+ top: 0px;
+ left: 0px;
+ animation: bounce 2s infinite ease-in-out;
+}
+
+.double-bounce2 {
+ animation-delay: -1s;
+}
+
+@keyframes bounce {
+ 0%,
+ 100% {
+ transform: scale(0);
+ }
+ 50% {
+ transform: scale(1);
+ }
+}
+
+.uploading-overlay {
+ position: absolute;
+ top: 0px;
+ left: 0px;
+ right: 0px;
+ bottom: 0px;
+ background-color: rgba(255, 255, 255, 0.8);
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ z-index: 1000;
+}
+
+.progress-container {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ text-align: center;
+}
+
+.step-name {
+ font-size: 18px;
+ color: #333;
+ text-align: center;
+ width: 100%;
+ margin-top: -10px; // Adjust to move the text closer to the spinner
+}
diff --git a/src/client/views/nodes/formattedText/DailyJournal.tsx b/src/client/views/nodes/formattedText/DailyJournal.tsx
index 871c556e6..564609494 100644
--- a/src/client/views/nodes/formattedText/DailyJournal.tsx
+++ b/src/client/views/nodes/formattedText/DailyJournal.tsx
@@ -9,14 +9,22 @@ import { gptAPICall, GPTCallType } from '../../../apis/gpt/GPT';
import { RichTextField } from '../../../../fields/RichTextField';
import { Plugin } from 'prosemirror-state';
import { RTFCast } from '../../../../fields/Types';
+import { Mark } from 'prosemirror-model';
+import { observer } from 'mobx-react';
export class DailyJournal extends ViewBoxAnnotatableComponent<FieldViewProps>() {
@observable journalDate: string;
- @observable typingTimeout: NodeJS.Timeout | null = null; // Track typing delay
- @observable lastUserText: string = ''; // Store last user-entered text
+ @observable typingTimeout: NodeJS.Timeout | null = null; // track typing delay
+ @observable lastUserText: string = ''; // store last user-entered text
+ @observable isLoadingPrompts: boolean = false; // track if prompts are loading
+ @observable showPromptMenu = false;
+ @observable inlinePromptsEnabled = true;
+ @observable askPromptsEnabled = true;
+
_ref = React.createRef<FormattedTextBox>(); // reference to the formatted textbox
predictiveTextRange: { from: number; to: number } | null = null; // where predictive text starts and ends
private predictiveText: string | null = ' ... why?';
+ private prePredictiveMarks: Mark[] = [];
public static LayoutString(fieldStr: string) {
return FieldView.LayoutString(DailyJournal, fieldStr);
@@ -40,7 +48,7 @@ export class DailyJournal extends ViewBoxAnnotatableComponent<FieldViewProps>()
month: 'long',
day: 'numeric',
});
- console.log('getFormattedDate():', date);
+ // console.log('getFormattedDate():', date);
return date;
}
@@ -49,15 +57,15 @@ export class DailyJournal extends ViewBoxAnnotatableComponent<FieldViewProps>()
*/
@action
setDailyTitle() {
- console.log('setDailyTitle() called...');
- console.log('Current title before update:', this.dataDoc.title);
+ // console.log('setDailyTitle() called...');
+ // console.log('Current title before update:', this.dataDoc.title);
if (!this.dataDoc.title || this.dataDoc.title !== this.journalDate) {
- console.log('Updating title to:', this.journalDate);
+ // console.log('Updating title to:', this.journalDate);
this.dataDoc.title = this.journalDate;
}
- console.log('New title after update:', this.dataDoc.title);
+ // console.log('New title after update:', this.dataDoc.title);
}
/**
@@ -68,7 +76,7 @@ export class DailyJournal extends ViewBoxAnnotatableComponent<FieldViewProps>()
const placeholderText = 'Start writing here...';
const dateText = `${this.journalDate}\n`;
- console.log('Checking if dataDoc has text field...');
+ // console.log('Checking if dataDoc has text field...');
this.dataDoc[this.fieldKey] = RichTextField.textToRtfFormat(
[
@@ -80,7 +88,63 @@ export class DailyJournal extends ViewBoxAnnotatableComponent<FieldViewProps>()
placeholderText.length
);
- console.log('Current text field:', this.dataDoc[this.fieldKey]);
+ // console.log('Current text field:', this.dataDoc[this.fieldKey]);
+ }
+
+ /**
+ * Method to show/hide the prompts menu
+ */
+ @action.bound togglePromptMenu() {
+ this.showPromptMenu = !this.showPromptMenu;
+ }
+
+ /**
+ * Method to toggle on/off inline predictive prompts
+ */
+ @action.bound toggleInlinePrompts() {
+ this.inlinePromptsEnabled = !this.inlinePromptsEnabled;
+ }
+
+ /**
+ * Method to toggle on/off inline /ask prompts
+ */
+ @action.bound toggleAskPrompts() {
+ this.askPromptsEnabled = !this.askPromptsEnabled;
+ }
+
+ /**
+ * Method to handle click on document (to close prompt menu)
+ * @param e - a click on the document
+ */
+ @action.bound
+ handleDocumentClick(e: MouseEvent) {
+ const menu = document.getElementById('prompts-menu');
+ const button = document.getElementById('prompts-button');
+ if (this.showPromptMenu && menu && !menu.contains(e.target as Node) && button && !button.contains(e.target as Node)) {
+ this.showPromptMenu = false;
+ }
+ }
+
+ /**
+ * Method to set initial date of document in the calendar view
+ */
+
+ @action setInitialDateRange() {
+ if (!this.dataDoc.$task_dateRange && this.journalDate) {
+ const parsedDate = new Date(this.journalDate);
+ if (!isNaN(parsedDate.getTime())) {
+ const localStart = new Date(parsedDate.getFullYear(), parsedDate.getMonth(), parsedDate.getDate());
+ const localEnd = new Date(localStart); // same day
+
+ this.dataDoc.$task_dateRange = `${localStart.toISOString()}|${localEnd.toISOString()}`;
+ this.dataDoc.$task_allDay = true;
+ this.dataDoc.$task = ''; // needed only to make the keyvalue view look good.
+
+ // console.log('Set task_dateRange and task_allDay on journal (from local date):', this.dataDoc.$task_dateRange);
+ } else {
+ // console.log('Could not parse journalDate:', this.journalDate);
+ }
+ }
}
/**
@@ -94,8 +158,26 @@ export class DailyJournal extends ViewBoxAnnotatableComponent<FieldViewProps>()
if (this.typingTimeout) clearTimeout(this.typingTimeout);
- this.typingTimeout = setTimeout(() => {
+ const { state } = editorView;
+ const cursorPos = state.selection.from;
+
+ // characters before cursor
+ const triggerText = state.doc.textBetween(Math.max(0, cursorPos - 4), cursorPos);
+
+ if (triggerText === '/ask' && this.askPromptsEnabled) {
+ // remove /ask text
+ const tr = state.tr.delete(cursorPos - 4, cursorPos);
+ editorView.dispatch(tr);
+
+ // insert predicted question
this.insertPredictiveQuestion();
+ return;
+ }
+
+ this.typingTimeout = setTimeout(() => {
+ if (this.inlinePromptsEnabled) {
+ this.insertPredictiveQuestion();
+ }
}, 3500);
};
@@ -129,28 +211,38 @@ export class DailyJournal extends ViewBoxAnnotatableComponent<FieldViewProps>()
// Only insert if we're at end of node, or there's a newline node after
if (!isAtEndOfParent && !hasNewlineAfter) return;
- const fontSizeMark = schema.marks.pFontSize.create({ fontSize: '14px' });
+ // Save current marks at cursor
+ const currentMarks = state.storedMarks || resolvedPos.marks();
+ this.prePredictiveMarks = [...currentMarks];
+
+ // color and italics are preset for predictive question, font and size are adaptive
const fontColorMark = schema.marks.pFontColor.create({ fontColor: 'lightgray' });
const fontItalicsMark = schema.marks.em.create();
+ const fontSizeMark = this.prePredictiveMarks.find(m => m.type.name === 'pFontSize');
+ const fontFamilyMark = this.prePredictiveMarks.find(m => m.type.name === 'pFontFamily'); // if applicable
- this.predictiveText = ' ...'; // placeholder for now
+ this.predictiveText = ' ...'; // placeholder
const fullTextUpToCursor = state.doc.textBetween(0, state.selection.to, '\n', '\n');
- const gptPrompt = `Given the following incomplete journal entry, generate a single 2-5 word question that continues the user's thought:\n\n"${fullTextUpToCursor}"`;
+ const gptPrompt = `Given the following incomplete journal entry, generate a single 2-5 word reflective question that continues the user's thought:\n\n"${fullTextUpToCursor}"`;
const res = await gptAPICall(gptPrompt, GPTCallType.COMPLETION);
if (!res) return;
// styled text node
const text = ` ... ${res.trim()}`;
- const predictedText = schema.text(text, [fontSizeMark, fontColorMark, fontItalicsMark]);
+ const predictedText = schema.text(text, [fontColorMark, fontItalicsMark, ...(fontSizeMark ? [fontSizeMark] : []), ...(fontFamilyMark ? [fontFamilyMark] : [])]);
// Insert styled text at cursor position
- const transaction = state.tr.insert(insertPos, predictedText).setStoredMarks([state.schema.marks.pFontColor.create({ fontColor: 'gray' })]); // should probably instead inquire marks before predictive prompt
+ const transaction = state.tr.insert(insertPos, predictedText).setStoredMarks(this.prePredictiveMarks);
dispatch(transaction);
this.predictiveText = text;
};
+ /**
+ * Method to remove the predictive question upon type/click
+ * @returns - once predictive text is found, or all text has been checked
+ */
createPredictiveCleanupPlugin = () => {
return new Plugin({
view: () => {
@@ -168,15 +260,20 @@ export class DailyJournal extends ViewBoxAnnotatableComponent<FieldViewProps>()
if (node.isText && node.text === textToRemove) {
const tr = state.tr.delete(pos, pos + node.nodeSize);
- // Set the desired default marks for future input
+ // default marks for input
const fontSizeMark = state.schema.marks.pFontSize.create({ fontSize: '14px' });
const fontColorMark = state.schema.marks.pFontColor.create({ fontColor: 'gray' });
tr.setStoredMarks([]);
- tr.setStoredMarks([fontSizeMark, fontColorMark]);
+ if (this.prePredictiveMarks.length > 0) {
+ tr.setStoredMarks(this.prePredictiveMarks);
+ } else {
+ tr.setStoredMarks([fontSizeMark, fontColorMark]);
+ }
dispatch(tr);
this.predictiveText = null;
+ this.prePredictiveMarks = [];
return false;
}
return true;
@@ -194,8 +291,9 @@ export class DailyJournal extends ViewBoxAnnotatableComponent<FieldViewProps>()
};
componentDidMount(): void {
- console.log('componentDidMount() triggered...');
- console.log('Text: ' + RTFCast(this.Document.text)?.Text);
+ // console.log('componentDidMount() triggered...');
+ document.addEventListener('mousedown', this.handleDocumentClick);
+ // console.log('Text: ' + RTFCast(this.Document.text)?.Text);
const editorView = this._ref.current?.EditorView;
if (editorView) {
@@ -214,15 +312,17 @@ export class DailyJournal extends ViewBoxAnnotatableComponent<FieldViewProps>()
const isDefaultTitle = isTitleString && currentTitle.includes('Untitled DailyJournal');
if (isTextEmpty && isDefaultTitle) {
- console.log('Journal title and text are default. Initializing...');
+ // console.log('Journal title and text are default. Initializing...');
this.setDailyTitle();
this.setDailyText();
+ this.setInitialDateRange();
} else {
- console.log('Journal already has content. Skipping initialization.');
+ // console.log('Journal already has content. Skipping initialization.');
}
}
componentWillUnmount(): void {
+ document.removeEventListener('mousedown', this.handleDocumentClick);
const editorView = this._ref.current?.EditorView;
if (editorView) {
editorView.dom.removeEventListener('input', this.onTextInput);
@@ -230,10 +330,20 @@ export class DailyJournal extends ViewBoxAnnotatableComponent<FieldViewProps>()
if (this.typingTimeout) clearTimeout(this.typingTimeout);
}
+ /**
+ * Method to generate pormpts via GPT
+ * @returns - if failed
+ */
@action handleGeneratePrompts = async () => {
+ if (this.isLoadingPrompts) {
+ return;
+ }
+
+ this.isLoadingPrompts = true;
+
const rawText = RTFCast(this.Document.text)?.Text ?? '';
- console.log('Extracted Journal Text:', rawText);
- console.log('Before Update:', this.Document.text, 'Type:', typeof this.Document.text);
+ // console.log('Extracted Journal Text:', rawText);
+ // console.log('Before Update:', this.Document.text, 'Type:', typeof this.Document.text);
if (!rawText.trim()) {
alert('Journal is empty! Write something first.');
@@ -273,9 +383,15 @@ export class DailyJournal extends ViewBoxAnnotatableComponent<FieldViewProps>()
}
} catch (err) {
console.error('Error calling GPT:', err);
+ } finally {
+ this.isLoadingPrompts = false;
}
};
+ /**
+ * Method to render the styled DailyJournal
+ * @returns - the HTML component for the journal
+ */
render() {
return (
<div
@@ -296,6 +412,7 @@ export class DailyJournal extends ViewBoxAnnotatableComponent<FieldViewProps>()
}}>
{/* GPT Button */}
<button
+ id="prompts-button"
style={{
position: 'absolute',
bottom: '5px',
@@ -308,9 +425,88 @@ export class DailyJournal extends ViewBoxAnnotatableComponent<FieldViewProps>()
cursor: 'pointer',
zIndex: 10,
}}
- onClick={this.handleGeneratePrompts}>
+ onClick={this.togglePromptMenu}>
Prompts
</button>
+ {this.showPromptMenu && (
+ <div
+ id="prompts-menu"
+ style={{
+ position: 'absolute',
+ bottom: '45px',
+ right: '5px',
+ backgroundColor: 'white',
+ border: '1px solid #ccc',
+ borderRadius: '4px',
+ padding: '10px',
+ boxShadow: '0 2px 6px rgba(0,0,0,0.2)',
+ zIndex: 20,
+ minWidth: '170px',
+ maxWidth: 'fit-content',
+ overflow: 'auto',
+ }}>
+ <div
+ style={{
+ display: 'flex',
+ justifyContent: 'flex-end',
+ alignItems: 'center',
+ marginBottom: '10px',
+ }}>
+ <label
+ style={{
+ display: 'flex',
+ alignItems: 'center',
+ gap: '6px',
+ fontSize: '14px',
+ justifyContent: 'flex-end',
+ width: '100%',
+ }}>
+ /ask
+ <input type="checkbox" checked={this.askPromptsEnabled} onChange={this.toggleAskPrompts} style={{ margin: 0 }} />
+ </label>
+ </div>
+
+ <div
+ style={{
+ display: 'flex',
+ justifyContent: 'flex-end',
+ alignItems: 'center',
+ marginBottom: '10px',
+ }}>
+ <label
+ style={{
+ display: 'flex',
+ alignItems: 'center',
+ gap: '6px',
+ fontSize: '14px',
+ justifyContent: 'flex-end',
+ width: '100%',
+ }}>
+ Inline Prompting
+ <input type="checkbox" checked={this.inlinePromptsEnabled} onChange={this.toggleInlinePrompts} style={{ margin: 0 }} />
+ </label>
+ </div>
+
+ <button
+ onClick={() => {
+ this.showPromptMenu = false;
+ this.handleGeneratePrompts();
+ }}
+ disabled={this.isLoadingPrompts}
+ style={{
+ backgroundColor: '#9EAD7C',
+ color: 'white',
+ border: 'none',
+ borderRadius: '4px',
+ cursor: this.isLoadingPrompts ? 'not-allowed' : 'pointer',
+ opacity: this.isLoadingPrompts ? 0.6 : 1,
+ padding: '5px 10px',
+ float: 'right',
+ }}>
+ Generate Prompts
+ </button>
+ </div>
+ )}
<FormattedTextBox ref={this._ref} {...this._props} fieldKey={'text'} Document={this.Document} TemplateDataDocument={undefined} />
</div>
@@ -318,8 +514,10 @@ export class DailyJournal extends ViewBoxAnnotatableComponent<FieldViewProps>()
}
}
+const ObservedDailyJournal = observer(DailyJournal);
+
Docs.Prototypes.TemplateMap.set(DocumentType.JOURNAL, {
- layout: { view: DailyJournal, dataField: 'text' },
+ layout: { view: ObservedDailyJournal, dataField: 'text' },
options: {
acl: '',
_height: 35,
diff --git a/src/client/views/nodes/formattedText/DashFieldView.scss b/src/client/views/nodes/formattedText/DashFieldView.scss
index 3734ad9cc..1b2f76bbe 100644
--- a/src/client/views/nodes/formattedText/DashFieldView.scss
+++ b/src/client/views/nodes/formattedText/DashFieldView.scss
@@ -17,7 +17,7 @@
min-width: 12px;
position: relative;
display: inline-block;
- margin: 0;
+ margin: 0px;
transform: scale(0.7);
background-color: rgba(155, 155, 155, 0.24);
}
diff --git a/src/client/views/nodes/formattedText/DashFieldView.tsx b/src/client/views/nodes/formattedText/DashFieldView.tsx
index 7ea5d1fcf..d700a705a 100644
--- a/src/client/views/nodes/formattedText/DashFieldView.tsx
+++ b/src/client/views/nodes/formattedText/DashFieldView.tsx
@@ -262,7 +262,8 @@ export class DashFieldViewInternal extends ObservableReactComponent<IDashFieldVi
render() {
return (
<div
- className={`dashFieldView${this.isRowActive() ? '-active' : ''}`}
+ // eslint-disable-next-line no-use-before-define
+ className={`${DashFieldView.name}${this.isRowActive() ? '-active' : ''}`}
ref={this._fieldRef}
style={{
// width: this._props.width,
diff --git a/src/client/views/nodes/formattedText/EquationEditor.scss b/src/client/views/nodes/formattedText/EquationEditor.scss
index b0c17e56e..602135a30 100644
--- a/src/client/views/nodes/formattedText/EquationEditor.scss
+++ b/src/client/views/nodes/formattedText/EquationEditor.scss
@@ -32,7 +32,7 @@
margin-left: -1px;
position: relative;
z-index: 1;
- padding: 0;
+ padding: 0px;
display: -moz-inline-box;
display: inline-block;
}
@@ -128,8 +128,8 @@
.mq-math-mode * {
font-size: inherit;
line-height: inherit;
- margin: 0;
- padding: 0;
+ margin: 0px;
+ padding: 0px;
border-color: black;
-webkit-user-select: none;
-moz-user-select: none;
@@ -178,7 +178,7 @@
margin-left: 0.1em;
}
.mq-math-mode .mq-roman var.mq-f {
- margin: 0;
+ margin: 0px;
}
.mq-math-mode big {
font-size: 200%;
@@ -323,7 +323,7 @@
padding: 0.1em;
}
.mq-math-mode .mq-sqrt-prefix {
- padding-top: 0;
+ padding-top: 0px;
position: relative;
top: 0.1em;
vertical-align: top;
diff --git a/src/client/views/nodes/formattedText/EquationEditor.tsx b/src/client/views/nodes/formattedText/EquationEditor.tsx
index 48efa6e63..23d273523 100644
--- a/src/client/views/nodes/formattedText/EquationEditor.tsx
+++ b/src/client/views/nodes/formattedText/EquationEditor.tsx
@@ -72,6 +72,10 @@ class EquationEditor extends Component<EquationEditorProps> {
this.mathField.latex(value || '');
}
+ componentDidUpdate(prevProps: Readonly<EquationEditorProps>): void {
+ !prevProps.value && this.mathField.latex(this.props.value || '');
+ }
+
render() {
return <span ref={this.element} style={{ border: '0px', boxShadow: 'None' }} />;
}
diff --git a/src/client/views/nodes/formattedText/FormattedTextBox.scss b/src/client/views/nodes/formattedText/FormattedTextBox.scss
index 547a2efa8..d5e566226 100644
--- a/src/client/views/nodes/formattedText/FormattedTextBox.scss
+++ b/src/client/views/nodes/formattedText/FormattedTextBox.scss
@@ -46,7 +46,7 @@
}
audiotag {
- left: 0;
+ left: 0px;
position: absolute;
cursor: pointer;
border-radius: 10px;
@@ -62,7 +62,7 @@ audiotag:hover {
.formattedTextBox {
touch-action: none;
background: inherit;
- padding: 0;
+ padding: 0px;
border-width: 0px;
border-color: global.$medium-gray;
box-sizing: border-box;
@@ -77,14 +77,14 @@ audiotag:hover {
width: 100%;
position: relative;
transform-origin: left top;
- top: 0;
- left: 0;
+ top: 0px;
+ left: 0px;
}
.formattedTextBox-cont {
touch-action: none;
background: inherit;
- padding: 0;
+ padding: 0px;
border-width: 0px;
border-radius: inherit;
border-color: global.$medium-gray;
@@ -111,7 +111,7 @@ audiotag:hover {
.answer-tooltip {
font-size: 15px;
padding: 2px;
- max-width: 150;
+ max-width: 150px;
line-height: 150%;
position: relative;
}
@@ -122,10 +122,10 @@ audiotag:hover {
position: absolute;
color: white;
background: black;
- right: 0;
- bottom: 0;
- width: 15;
- height: 22;
+ right: 0px;
+ bottom: 0px;
+ width: 15px;
+ height: 22px;
cursor: default;
}
@@ -139,8 +139,8 @@ audiotag:hover {
.formattedTextBox-sidebar-handle {
position: absolute;
- top: 0;
- right: 0;
+ top: 0px;
+ right: 0px;
width: 20px;
height: 20px;
font-size: 11px;
@@ -168,7 +168,7 @@ audiotag:hover {
height: 100%;
display: inline-block;
position: absolute;
- right: 0;
+ right: 0px;
overflow: hidden;
.collectionfreeformview-container {
@@ -302,8 +302,8 @@ footnote::before {
position: absolute;
top: -0.5em;
content: ' ';
- height: 0;
- width: 0;
+ height: 0px;
+ width: 0px;
}
.formattedTextBox-inlineComment {
@@ -346,7 +346,7 @@ footnote::before {
.prosemirror-linkBtn {
background: unset;
color: unset;
- padding: 0;
+ padding: 0px;
text-transform: unset;
letter-spacing: unset;
font-size: unset;
@@ -357,7 +357,7 @@ footnote::before {
background-color: dimgray;
margin-top: 1.5em;
z-index: 1;
- padding: 5;
+ padding: 5px;
border-radius: 2px;
}
.prosemirror-hrefoptions {
@@ -396,7 +396,7 @@ footnote::before {
blockquote {
padding: 10px 10px;
font-size: smaller;
- margin: 0;
+ margin: 0px;
font-style: italic;
background: lightgray;
border-left: solid 2px dimgray;
@@ -415,7 +415,7 @@ footnote::before {
p {
font-family: inherit;
}
- margin-left: 0;
+ margin-left: 0px;
}
.bullet1 {
p {
@@ -439,7 +439,7 @@ footnote::before {
display: inline-block;
font-family: inherit;
}
- margin-left: 0;
+ margin-left: 0px;
background-color: inherit;
}
.decimal2-ol {
@@ -506,7 +506,7 @@ footnote::before {
display: inline-block;
font-family: inherit;
}
- margin-left: 0;
+ margin-left: 0px;
padding-left: 1.2em;
background-color: inherit;
}
@@ -661,7 +661,7 @@ footnote::before {
.formattedTextBox-cont {
touch-action: none;
background: inherit;
- padding: 0;
+ padding: 0px;
border-width: 0px;
border-radius: inherit;
border-color: global.$medium-gray;
@@ -706,7 +706,7 @@ footnote::before {
height: 100%;
display: inline-block;
position: absolute;
- right: 0;
+ right: 0px;
.collectionfreeformview-container {
position: relative;
@@ -832,8 +832,8 @@ footnote::before {
position: absolute;
top: -0.5em;
content: ' ';
- height: 0;
- width: 0;
+ height: px;
+ width: 0px;
}
.formattedTextBox-inlineComment {
@@ -892,7 +892,7 @@ footnote::before {
display: inline;
font-family: inherit;
}
- margin-left: 0;
+ margin-left: 0px;
}
.decimal2-ol {
counter-reset: deci2;
@@ -952,7 +952,7 @@ footnote::before {
display: inline;
font-family: inherit;
}
- margin-left: 0;
+ margin-left: 0px;
padding-left: 1.2em;
}
.multi2-ol {
diff --git a/src/client/views/nodes/formattedText/FormattedTextBox.tsx b/src/client/views/nodes/formattedText/FormattedTextBox.tsx
index 57720baae..07cb795f1 100644
--- a/src/client/views/nodes/formattedText/FormattedTextBox.tsx
+++ b/src/client/views/nodes/formattedText/FormattedTextBox.tsx
@@ -13,7 +13,7 @@ import { EditorState, NodeSelection, Plugin, Selection, TextSelection, Transacti
import { EditorView, NodeViewConstructor } from 'prosemirror-view';
import * as React from 'react';
import { BsMarkdownFill } from 'react-icons/bs';
-import { addStyleSheet, addStyleSheetRule, clearStyleSheetRules, ClientUtils, DivWidth, removeStyleSheet, returnFalse, returnZero, setupMoveUpEvents, simMouseEvent, smoothScroll, StopEvent } from '../../../../ClientUtils';
+import { addStyleSheet, addStyleSheetRule, clearStyleSheetRules, ClientUtils, DivWidth, removeStyleSheet, returnFalse, returnTrue, returnZero, setupMoveUpEvents, simMouseEvent, smoothScroll, StopEvent } from '../../../../ClientUtils';
import { DateField } from '../../../../fields/DateField';
import { CreateLinkToActiveAudio, Doc, DocListCast, Field, FieldType, Opt, StrListCast } from '../../../../fields/Doc';
import { AclAdmin, AclAugment, AclEdit, AclSelfEdit, DocCss, ForceServerWrite, UpdatingFromServer } from '../../../../fields/DocSymbols';
@@ -98,7 +98,8 @@ export class FormattedTextBox extends ViewBoxAnnotatableComponent<FormattedTextB
public static PasteOnLoad: ClipboardEvent | undefined;
public static SelectOnLoadChar = '';
- public static LiveTextUndo: UndoManager.Batch | undefined; // undo batch when typing a new text note into a collection
+ public static LiveTextUndo: UndoManager.Batch | undefined; // undo batch request when typing a new text note into a collection
+ private _liveTextUndo: UndoManager.Batch | undefined; // captured undo batch when typing a new text note into a collection
private static _nodeViews: (self: FormattedTextBox) => { [key: string]: NodeViewConstructor };
private _curHighlights = new ObservableSet<string>(['Audio Tags']);
@@ -270,13 +271,16 @@ export class FormattedTextBox extends ViewBoxAnnotatableComponent<FormattedTextB
e.preventDefault();
e.stopPropagation();
const targetCreator = (annotationOn?: Doc) => {
- const target = DocUtils.GetNewTextDoc('Note linked to ' + this.Document.title, 0, 0, 100, 100, annotationOn);
+ const target = DocUtils.GetNewTextDoc('Note linked to ' + this.Document.title, 0, 0, 100, 100, annotationOn, 'yellow');
+ target.layout_fitWidth = true;
DocumentView.SetSelectOnLoad(target);
return target;
};
+ const sourceAnchorCreator = () => this.getAnchor(true);
+
const docView = this.DocumentView?.();
- docView && DragManager.StartAnchorAnnoDrag([ele], new DragManager.AnchorAnnoDragData(docView, () => this.getAnchor(true), targetCreator), e.pageX, e.pageY);
+ docView && DragManager.StartAnchorAnnoDrag([ele], new DragManager.AnchorAnnoDragData(docView, sourceAnchorCreator, targetCreator), e.pageX, e.pageY);
});
AnchorMenu.Instance.AddDrawingAnnotation = (drawing: Doc) => {
@@ -304,6 +308,21 @@ export class FormattedTextBox extends ViewBoxAnnotatableComponent<FormattedTextB
}
};
+ autoTag = () => {
+ const rawText = RTFCast(this.Document[this.fieldKey])?.Text ?? StrCast(this.Document[this.fieldKey]);
+ if (rawText && !this.Document.$tags_chat) {
+ const callType = rawText.includes('[placeholder]') ? GPTCallType.CLASSIFYTEXTMINIMAL : GPTCallType.CLASSIFYTEXTFULL;
+
+ gptAPICall(rawText, callType).then(
+ action(desc => {
+ // Split GPT response into tokens and push individually & clear existing tags
+ this.Document.$tags_chat = new List<string>(desc.trim().split(/\s+/));
+ this.Document._layout_showTags = true;
+ })
+ );
+ }
+ };
+
leafText = (node: Node) => {
if (node.type === this.EditorView?.state.schema.nodes.dashField) {
const refDoc = !node.attrs.docId ? this.rootDoc : (DocServer.GetCachedRefField(node.attrs.docId as string) as Doc);
@@ -365,6 +384,7 @@ export class FormattedTextBox extends ViewBoxAnnotatableComponent<FormattedTextB
dataDoc[this.fieldKey] =
numstring !== undefined ? Number(newText) : newText || (DocCast(dataDoc.proto)?.[this.fieldKey] === undefined && this.layoutDoc[this.fieldKey] === undefined) ? new RichTextField(newJson, newText) : undefined;
textChange && ScriptCast(this.layoutDoc.onTextChanged, null)?.script.run({ this: this.Document, text: newText });
+ if (textChange) this.dataDoc.$tags_chat = undefined;
this.ApplyingChange = ''; // turning this off here allows a Doc to retrieve data from template if noTemplate below is changed to false
unchanged = false;
}
@@ -425,10 +445,10 @@ export class FormattedTextBox extends ViewBoxAnnotatableComponent<FormattedTextB
const newAutoLinks = new Set<Doc>();
const oldAutoLinks = Doc.Links(this.Document).filter(
link =>
- ((!Doc.isTemplateForField(this.Document) &&
- ((DocCast(link.link_anchor_1) && !Doc.isTemplateForField(DocCast(link.link_anchor_1)!)) || !Doc.AreProtosEqual(DocCast(link.link_anchor_1), this.Document)) &&
- ((DocCast(link.link_anchor_2) && !Doc.isTemplateForField(DocCast(link.link_anchor_2)!)) || !Doc.AreProtosEqual(DocCast(link.link_anchor_2), this.Document))) ||
- (Doc.isTemplateForField(this.Document) && (link.link_anchor_1 === this.Document || link.link_anchor_2 === this.Document))) &&
+ ((!Doc.IsTemplateForField(this.Document) &&
+ ((DocCast(link.link_anchor_1) && !Doc.IsTemplateForField(DocCast(link.link_anchor_1)!)) || !Doc.AreProtosEqual(DocCast(link.link_anchor_1), this.Document)) &&
+ ((DocCast(link.link_anchor_2) && !Doc.IsTemplateForField(DocCast(link.link_anchor_2)!)) || !Doc.AreProtosEqual(DocCast(link.link_anchor_2), this.Document))) ||
+ (Doc.IsTemplateForField(this.Document) && (link.link_anchor_1 === this.Document || link.link_anchor_2 === this.Document))) &&
link.link_relationship === LinkManager.AutoKeywords
); // prettier-ignore
if (this.EditorView?.state.doc.textContent) {
@@ -1068,17 +1088,12 @@ export class FormattedTextBox extends ViewBoxAnnotatableComponent<FormattedTextB
return anchorDoc ?? this.Document;
}
+ showBorderRounding = returnTrue;
getView = (doc: Doc, options: FocusViewOptions) => {
if (DocListCast(this.dataDoc[this.sidebarKey]).find(anno => Doc.AreProtosEqual(doc.layout_unrendered ? DocCast(doc.annotationOn) : doc, anno))) {
- if (!this.SidebarShown) {
- this.toggleSidebar(false);
- options.didMove = true;
- }
- setTimeout(() => this._sidebarRef?.current?.makeDocUnfiltered(doc));
+ return SidebarAnnos.getView(this._sidebarRef.current, this.SidebarShown, () => this.toggleSidebar(false), doc, options);
}
- return new Promise<Opt<DocumentView>>(res => {
- DocumentView.addViewRenderedCb(doc, dv => res(dv));
- });
+ return new Promise<Opt<DocumentView>>(res => DocumentView.addViewRenderedCb(doc, res));
};
focus = (textAnchor: Doc, options: FocusViewOptions) => {
const focusSpeed = options.zoomTime ?? 500;
@@ -1145,13 +1160,6 @@ export class FormattedTextBox extends ViewBoxAnnotatableComponent<FormattedTextB
return undefined;
};
- // if the scroll height has changed and we're in layout_autoHeight mode, then we need to update the textHeight component of the doc.
- // Since we also monitor all component height changes, this will update the document's height.
- resetNativeHeight = action((scrollHeight: number) => {
- this.layoutDoc['_' + this.fieldKey + '_height'] = scrollHeight;
- if (!this.layoutDoc.isTemplateForField && NumCast(this.layoutDoc._nativeHeight)) this.layoutDoc._nativeHeight = scrollHeight;
- });
-
addPlugin = (plugin: Plugin) => {
const editorView = this.EditorView;
if (editorView) {
@@ -1182,21 +1190,31 @@ export class FormattedTextBox extends ViewBoxAnnotatableComponent<FormattedTextB
this._disposers.width = reaction(this._props.PanelWidth, this.tryUpdateScrollHeight);
this._disposers.scrollHeight = reaction(
() => ({ scrollHeight: this.scrollHeight, layoutAutoHeight: this.layout_autoHeight, width: NumCast(this.layoutDoc._width) }),
- ({ width, scrollHeight, layoutAutoHeight }) => width && layoutAutoHeight && this.resetNativeHeight(scrollHeight),
+ ({ width, scrollHeight, layoutAutoHeight }) => width && layoutAutoHeight && (this.layoutDoc['_' + this.fieldKey + '_height'] = scrollHeight),
{ fireImmediately: true }
);
this._disposers.componentHeights = reaction(
// set the document height when one of the component heights changes and layout_autoHeight is on
- () => ({ border: this._props.PanelHeight(), sidebarHeight: this.sidebarHeight, textHeight: this.textHeight, layoutAutoHeight: this.layout_autoHeight, marginsHeight: this.layout_autoHeightMargins }),
- ({ border, sidebarHeight, textHeight, layoutAutoHeight, marginsHeight }) => {
+ () => ({
+ border: this._props.PanelHeight(),
+ scrollHeight: NumCast(this.layoutDoc['_' + this.fieldKey + '_height']),
+ sidebarHeight: this.sidebarHeight,
+ textHeight: this.textHeight,
+ layoutAutoHeight: this.layout_autoHeight,
+ marginsHeight: this.layout_autoHeightMargins,
+ }),
+ ({ border, sidebarHeight, scrollHeight, textHeight, layoutAutoHeight, marginsHeight }) => {
const newHeight = this.contentScaling * (marginsHeight + Math.max(sidebarHeight, textHeight));
if (
(!Array.from(this._curHighlights).includes('Bold Text') || this._props.isSelected()) && //
layoutAutoHeight &&
newHeight &&
- (newHeight !== this.layoutDoc.height || border < NumCast(this.layoutDoc.height)) &&
+ (newHeight !== this.layoutDoc.height || border < NumCast(this.layoutDoc.height) || this.layoutDoc._nativeHeight !== scrollHeight) &&
!this._props.dontRegisterView
) {
+ if (NumCast(this.layoutDoc.nativeHeight)) {
+ this.layoutDoc._nativeHeight = scrollHeight;
+ }
this._props.setHeight?.(newHeight);
}
},
@@ -1219,7 +1237,7 @@ export class FormattedTextBox extends ViewBoxAnnotatableComponent<FormattedTextB
const protoTime = protoData && this.dataDoc[this.fieldKey + '_autoUpdate'] ? (DateCast(DocCast(this.dataDoc.proto)?.[this.fieldKey + '_modificationDate'])?.date.getTime() ?? 0) : 0;
const recentData = dataTime >= layoutTime ? (protoTime >= dataTime ? protoData : dataData) : layoutTime >= protoTime ? layoutData : protoData;
const whichData = recentData ?? (this.layoutDoc.isTemplateDoc ? layoutData : protoData) ?? protoData;
- return !whichData ? undefined : { data: RTFCast(whichData), str: Field.toString(DocCast(whichData) ?? StrCast(whichData)) };
+ return !whichData ? undefined : { data: RTFCast(whichData), str: Field.toString(DocCast(whichData) ?? NumCast(whichData)?.toString() ?? StrCast(whichData)) };
},
incomingValue => {
if (this.EditorView && this.ApplyingChange !== this.fieldKey) {
@@ -1525,7 +1543,7 @@ export class FormattedTextBox extends ViewBoxAnnotatableComponent<FormattedTextB
}
if (this.EditorView && selectOnLoad && !this._props.dontRegisterView && !this._props.dontSelectOnLoad && this.isActiveTab(this.ProseRef)) {
const { $from } = this.EditorView.state.selection;
- const mark = schema.marks.user_mark.create({ userid: ClientUtils.CurrentUserEmail(), modified: Math.floor(Date.now() / 1000) });
+ const mark = schema.marks.user_mark.create({ userid: ClientUtils.CurrentUserEmail() });
const curMarks = this.EditorView.state.storedMarks ?? $from?.marksAcross(this.EditorView.state.selection.$head) ?? [];
const storedMarks = [...curMarks.filter(m => m.type !== mark.type), mark];
if (selLoadChar === 'Enter') {
@@ -1536,6 +1554,8 @@ export class FormattedTextBox extends ViewBoxAnnotatableComponent<FormattedTextB
this.tryUpdateDoc(true); // calling select() above will make isContentActive() true only after a render .. which means the selectAll() above won't write to the Document and the incomingValue will overwrite the selection with the non-updated data
}
if (selectOnLoad) {
+ this._liveTextUndo = FormattedTextBox.LiveTextUndo;
+ FormattedTextBox.LiveTextUndo = undefined;
this.EditorView!.focus();
}
if (this._props.isContentActive()) this.prepareForTyping();
@@ -1552,7 +1572,7 @@ export class FormattedTextBox extends ViewBoxAnnotatableComponent<FormattedTextB
const { text, paragraph } = schema.nodes;
const selNode = this.EditorView.state.selection.$anchor.node();
if (this.EditorView.state.selection.from === 1 && this.EditorView.state.selection.empty && [undefined, text, paragraph].includes(selNode?.type)) {
- const docDefaultMarks = [schema.marks.user_mark.create({ userid: ClientUtils.CurrentUserEmail(), modified: Math.floor(Date.now() / 1000) })];
+ const docDefaultMarks = [schema.marks.user_mark.create({ userid: ClientUtils.CurrentUserEmail() })];
this.EditorView.state.selection.empty && this.EditorView.state.selection.from === 1 && this.EditorView?.dispatch(this.EditorView?.state.tr.setStoredMarks(docDefaultMarks).removeStoredMark(schema.marks.pFontColor));
}
}
@@ -1565,8 +1585,7 @@ export class FormattedTextBox extends ViewBoxAnnotatableComponent<FormattedTextB
removeStyleSheet(this._userStyleSheetElement);
Object.values(this._disposers).forEach(disposer => disposer?.());
this.endUndoTypingBatch();
- FormattedTextBox.LiveTextUndo?.end();
- FormattedTextBox.LiveTextUndo = undefined;
+ this._liveTextUndo?.end();
this.unhighlightSearchTerms();
this.EditorView?.destroy();
RichTextMenu.Instance?.TextView === this && RichTextMenu.Instance.updateMenu(undefined, undefined, undefined, undefined);
@@ -1688,7 +1707,7 @@ export class FormattedTextBox extends ViewBoxAnnotatableComponent<FormattedTextB
if (e.clientX > boundsRect.left && e.clientX < boundsRect.right && e.clientY > boundsRect.bottom) {
// if we clicked below the last prosemirror div, then set the selection to be the end of the document
editorView.focus();
- editorView.dispatch(editorView.state.tr.setSelection(TextSelection.create(editorView.state.doc, editorView.state.doc.content.size)));
+ // editorView.dispatch(editorView.state.tr.setSelection(TextSelection.create(editorView.state.doc, editorView.state.doc.content.size)));
}
} else if (node && [editorView.state.schema.nodes.ordered_list, editorView.state.schema.nodes.listItem].includes(node.type) && node !== (editorView.state.selection as NodeSelection)?.node && pcords) {
editorView.dispatch(editorView.state.tr.setSelection(NodeSelection.create(editorView.state.doc, pcords.pos)));
@@ -1770,7 +1789,7 @@ export class FormattedTextBox extends ViewBoxAnnotatableComponent<FormattedTextB
if (this.ProseRef?.children[0] !== e.nativeEvent.target) return;
if (!(this.EditorView?.state.selection instanceof NodeSelection) || this.EditorView.state.selection.node.type !== this.EditorView.state.schema.nodes.footnote) {
const stordMarks = this.EditorView?.state.storedMarks?.slice();
- if (!(this.EditorView?.state.selection instanceof NodeSelection)) {
+ if (!(this.EditorView?.state.selection instanceof NodeSelection) && typeof this.dataDoc[this.fieldKey] !== 'number') {
this.autoLink();
if (this.EditorView?.state.tr) {
const tr = stordMarks?.reduce((tr2, m) => {
@@ -1795,8 +1814,7 @@ export class FormattedTextBox extends ViewBoxAnnotatableComponent<FormattedTextB
this.endUndoTypingBatch();
- FormattedTextBox.LiveTextUndo?.end();
- FormattedTextBox.LiveTextUndo = undefined;
+ this._liveTextUndo?.end();
// if the text box blurs and none of its contents are focused(), then pass the blur along
setTimeout(() => !this.ProseRef?.contains(document.activeElement) && this._props.onBlur?.());
@@ -1817,7 +1835,6 @@ export class FormattedTextBox extends ViewBoxAnnotatableComponent<FormattedTextB
return;
}
if (this._enteringStyle && 'tix!'.includes(e.key)) {
- const tag = e.key === 't' ? 'todo' : e.key === 'i' ? 'ignore' : e.key === 'x' ? 'disagree' : e.key === '!' ? 'important' : '??';
const node = state.selection.$from.nodeAfter;
const start = state.selection.from;
const end = state.selection.to;
@@ -1826,9 +1843,8 @@ export class FormattedTextBox extends ViewBoxAnnotatableComponent<FormattedTextB
StopEvent(e);
_editorView.dispatch(
state.tr
- .removeMark(start, end, schema.marks.user_mark)
- .addMark(start, end, schema.marks.user_mark.create({ userid: ClientUtils.CurrentUserEmail(), modified: Math.floor(Date.now() / 1000) }))
- .addMark(start, end, schema.marks.user_tag.create({ userid: ClientUtils.CurrentUserEmail(), tag, modified: Math.round(Date.now() / 1000 / 60) }))
+ .removeMark(start, end, schema.marks.user_mark) //
+ .addMark(start, end, schema.marks.user_mark.create({ userid: ClientUtils.CurrentUserEmail() }))
);
return;
}
@@ -1861,9 +1877,12 @@ export class FormattedTextBox extends ViewBoxAnnotatableComponent<FormattedTextB
break;
default:
if ([AclEdit, AclAugment, AclAdmin].includes(GetEffectiveAcl(this.Document))) {
- const modified = Math.floor(Date.now() / 1000);
- const mark = state.selection.$to.marks().find(m => m.type === schema.marks.user_mark && m.attrs.modified === modified);
- _editorView.dispatch(state.tr.removeStoredMark(schema.marks.user_mark).addStoredMark(mark ?? schema.marks.user_mark.create({ userid: ClientUtils.CurrentUserEmail(), modified })));
+ const mark = state.selection.$to.marks().find(m => m.type === schema.marks.user_mark);
+ _editorView.dispatch(
+ state.tr
+ .removeStoredMark(schema.marks.user_mark) //
+ .addStoredMark(mark ?? schema.marks.user_mark.create({ userid: ClientUtils.CurrentUserEmail() }))
+ );
}
break;
}
@@ -1887,14 +1906,14 @@ export class FormattedTextBox extends ViewBoxAnnotatableComponent<FormattedTextB
const margins = 2 * NumCast(this.layoutDoc._yMargin, this._props.yMargin || 0);
const children = this.ProseRef?.children.length ? Array.from(this.ProseRef.children[0].children) : undefined;
if (this.EditorView && children && !SnappingManager.IsDragging) {
- const getChildrenHeights = (kids: Element[] | undefined) => kids?.reduce((p, child) => p + toHgt(child), margins) ?? 0;
+ const getChildrenHeights = (kids: Element[] | undefined) => kids?.reduce((p, child) => p + toHgt(child), 0) ?? 0;
const toNum = (val: string) => Number(val.replace('px', ''));
const toHgt = (node: Element): number => {
const { height, marginTop, marginBottom } = getComputedStyle(node);
const childHeight = height === 'auto' ? getChildrenHeights(Array.from(node.children)) : toNum(height);
return childHeight + Math.max(0, toNum(marginTop)) + Math.max(0, toNum(marginBottom));
};
- const proseHeight = !this.ProseRef ? 0 : getChildrenHeights(children);
+ const proseHeight = !this.ProseRef ? 0 : getChildrenHeights(children) + margins;
const scrollHeight = this.ProseRef && proseHeight;
if (this._props.setHeight && !this._props.suppressSetHeight && scrollHeight && !this._props.dontRegisterView) {
// if top === 0, then the text box is growing upward (as the overlay caption) which doesn't contribute to the height computation
diff --git a/src/client/views/nodes/formattedText/FormattedTextBoxComment.scss b/src/client/views/nodes/formattedText/FormattedTextBoxComment.scss
index bc0810f22..92f3e3290 100644
--- a/src/client/views/nodes/formattedText/FormattedTextBoxComment.scss
+++ b/src/client/views/nodes/formattedText/FormattedTextBoxComment.scss
@@ -11,8 +11,8 @@
-webkit-transform: translateX(-50%);
transform: translateX(-50%);
box-shadow: 3px 3px 1.5px grey;
- max-width: 400;
- max-height: 235;
+ max-width: 400px;
+ max-height: 235px;
height: max-content;
.formattedTextBox-tooltipText {
height: max-content;
@@ -22,26 +22,26 @@
.formattedTextBox-tooltip:before {
content: '';
- height: 0;
- width: 0;
+ height: 0px;
+ width: 0px;
position: absolute;
left: 50%;
margin-left: -5px;
bottom: -6px;
border: 5px solid transparent;
- border-bottom-width: 0;
+ border-bottom-width: 0px;
border-top-color: silver;
}
.formattedTextBox-tooltip:after {
content: '';
- height: 0;
- width: 0;
+ height: 0px;
+ width: 0px;
position: absolute;
left: 50%;
margin-left: -5px;
bottom: -4.5px;
border: 5px solid transparent;
- border-bottom-width: 0;
+ border-bottom-width: 0px;
border-top-color: white;
}
diff --git a/src/client/views/nodes/formattedText/RichTextMenu.scss b/src/client/views/nodes/formattedText/RichTextMenu.scss
index fcc816447..7c747de1e 100644
--- a/src/client/views/nodes/formattedText/RichTextMenu.scss
+++ b/src/client/views/nodes/formattedText/RichTextMenu.scss
@@ -23,7 +23,7 @@
.dropdown {
position: absolute;
top: 35px;
- left: 0;
+ left: 0px;
background-color: #323232;
color: global.$light-gray;
border: 1px solid #4d4d4d;
@@ -47,7 +47,7 @@
}
&:last-child {
- margin-bottom: 0;
+ margin-bottom: 0px;
}
}
}
diff --git a/src/client/views/nodes/formattedText/TooltipTextMenu.scss b/src/client/views/nodes/formattedText/TooltipTextMenu.scss
index 87320943d..8980a93a2 100644
--- a/src/client/views/nodes/formattedText/TooltipTextMenu.scss
+++ b/src/client/views/nodes/formattedText/TooltipTextMenu.scss
@@ -195,7 +195,7 @@
left: 1px;
width: 24px;
height: 4px;
- margin-top: 0;
+ margin-top: 0px;
}
}
@@ -221,7 +221,7 @@
display: inline-block;
width: 1em;
height: 1em;
- stroke-width: 0;
+ stroke-width: 0px;
stroke: currentColor;
fill: currentColor;
margin-right: 15px;
@@ -231,7 +231,7 @@
display: inline-block;
width: 1em;
height: 1em;
- stroke-width: 3;
+ stroke-width: 3px;
fill: greenyellow;
margin-right: 15px;
}
@@ -270,7 +270,7 @@
&.ProseMirror-menu-dropdown {
width: 10px;
height: 25px;
- margin: 0;
+ margin: 0px;
padding: 0 2px;
background-color: #323232;
text-align: center;
diff --git a/src/client/views/nodes/formattedText/marks_rts.ts b/src/client/views/nodes/formattedText/marks_rts.ts
index b7dae1ca3..333ee6be8 100644
--- a/src/client/views/nodes/formattedText/marks_rts.ts
+++ b/src/client/views/nodes/formattedText/marks_rts.ts
@@ -330,20 +330,6 @@ export const marks: { [index: string]: MarkSpec } = {
return ['span', { class: 'UM-' + uid + remote + ' UM-min-' + min + ' UM-hr-' + hr + ' UM-day-' + day }, 0];
},
},
- // the id of the user who entered the text
- user_tag: {
- attrs: {
- userid: { default: '' },
- modified: { default: 'when?' }, // 1 second intervals since 1970
- tag: { default: '' },
- },
- group: 'inline',
- inclusive: false,
- toDOM: node => {
- const uid = node.attrs.userid.replace('.', '').replace('@', '');
- return ['span', { class: 'UT-' + uid + ' UT-' + node.attrs.tag }, 0];
- },
- },
// :: MarkSpec Code font mark. Represented as a `<code>` element.
code: {
diff --git a/src/client/views/nodes/imageEditor/ImageEditor.scss b/src/client/views/nodes/imageEditor/ImageEditor.scss
index c691e6a18..942a7d4c6 100644
--- a/src/client/views/nodes/imageEditor/ImageEditor.scss
+++ b/src/client/views/nodes/imageEditor/ImageEditor.scss
@@ -4,8 +4,8 @@ $scale: 0.5;
.imageEditorContainer {
position: absolute;
- top: 0;
- left: 0;
+ top: 0px;
+ left: 0px;
z-index: 9999;
height: 100vh;
width: 100vw;
@@ -78,7 +78,7 @@ $scale: 0.5;
.sideControlsContainer {
width: 160px;
position: absolute;
- left: 0;
+ left: 0px;
height: 100%;
.sideControls {
@@ -129,8 +129,8 @@ $scale: 0.5;
.originalImageLabel {
position: absolute;
- bottom: 10;
- left: 10;
+ bottom: 10px;
+ left: 10px;
color: #ffffff;
font-size: 0.8rem;
letter-spacing: 1px;
diff --git a/src/client/views/nodes/scrapbook/AIPresetGenerator.ts b/src/client/views/nodes/scrapbook/AIPresetGenerator.ts
new file mode 100644
index 000000000..1f159222b
--- /dev/null
+++ b/src/client/views/nodes/scrapbook/AIPresetGenerator.ts
@@ -0,0 +1,31 @@
+import { ScrapbookItemConfig } from './ScrapbookPreset';
+import { GPTCallType, gptAPICall } from '../../../apis/gpt/GPT';
+
+// Represents the descriptor for each document
+export interface DocumentDescriptor {
+ type: string;
+ tags: string[];
+}
+
+// Main function to request AI-generated presets
+export async function requestAiGeneratedPreset(descriptors: DocumentDescriptor[]): Promise<ScrapbookItemConfig[]> {
+ const prompt = createPrompt(descriptors);
+ let aiResponse = await gptAPICall(prompt, GPTCallType.GENERATESCRAPBOOK);
+ // Strip out ```json and ``` if the model wrapped its answer in fences
+ aiResponse = aiResponse
+ .trim()
+ .replace(/^```(?:json)?\s*/, "") // remove leading ``` or ```json
+ .replace(/\s*```$/, ""); // remove trailing ```
+ const parsedPreset = JSON.parse(aiResponse) as ScrapbookItemConfig[];
+ return parsedPreset;
+}
+
+// Helper to generate prompt text for AI
+function createPrompt(descriptors: DocumentDescriptor[]): string {
+ let prompt = "";
+ descriptors.forEach((desc, index) => {
+ prompt += `${index + 1}. Type: ${desc.type}, Tags: ${desc.tags.join(', ')}\n`;
+ });
+
+ return prompt;
+}
diff --git a/src/client/views/nodes/scrapbook/EmbeddedDocView.tsx b/src/client/views/nodes/scrapbook/EmbeddedDocView.tsx
deleted file mode 100644
index e99bf67c7..000000000
--- a/src/client/views/nodes/scrapbook/EmbeddedDocView.tsx
+++ /dev/null
@@ -1,52 +0,0 @@
-//IGNORE FOR NOW, CURRENTLY NOT USED IN SCRAPBOOK IMPLEMENTATION
-import * as React from "react";
-import { observer } from "mobx-react";
-import { Doc } from "../../../../fields/Doc";
-import { DocumentView } from "../DocumentView";
-import { Transform } from "../../../util/Transform";
-
-interface EmbeddedDocViewProps {
- doc: Doc;
- width?: number;
- height?: number;
- slotId?: string;
-}
-
-@observer
-export class EmbeddedDocView extends React.Component<EmbeddedDocViewProps> {
- render() {
- const { doc, width = 300, height = 200, slotId } = this.props;
-
- // Use either an existing embedding or create one
- let docToDisplay = doc;
-
- // If we need an embedding, create or use one
- if (!docToDisplay.isEmbedding) {
- docToDisplay = Doc.BestEmbedding(doc) || Doc.MakeEmbedding(doc);
- // Set the container to the slot's ID so we can track it
- if (slotId) {
- docToDisplay.embedContainer = `scrapbook-slot-${slotId}`;
- }
- }
-
- return (
- <DocumentView
- Document={docToDisplay}
- renderDepth={0}
- // Required sizing functions
- NativeWidth={() => width}
- NativeHeight={() => height}
- PanelWidth={() => width}
- PanelHeight={() => height}
- // Required state functions
- isContentActive={() => true}
- childFilters={() => []}
- ScreenToLocalTransform={() => new Transform()}
- // Display options
- hideDeleteButton={true}
- hideDecorations={true}
- hideResizeHandles={true}
- />
- );
- }
-} \ No newline at end of file
diff --git a/src/client/views/nodes/scrapbook/ScrapbookBox.scss b/src/client/views/nodes/scrapbook/ScrapbookBox.scss
new file mode 100644
index 000000000..6ac2220f9
--- /dev/null
+++ b/src/client/views/nodes/scrapbook/ScrapbookBox.scss
@@ -0,0 +1,66 @@
+.scrapbook-box {
+ /* Make sure the container fills its parent, and set a base background */
+ position: relative; /* so that absolute children (loading overlay, etc.) are positioned relative to this */
+ width: 100%;
+ height: 100%;
+ background: beige;
+ overflow: hidden; /* prevent scrollbars if children overflow */
+}
+
+/* Loading overlay that covers the entire scrapbook while AI-generation is in progress */
+.scrapbook-box-loading-overlay {
+ position: absolute;
+ top: 0;
+ left: 0;
+ width: 100%;
+ height: 100%;
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ background: rgba(255, 255, 255, 0.8);
+ z-index: 10; /* sits above the ImageBox and other content */
+}
+
+/* The <select> dropdown for choosing presets */
+.scrapbook-box-preset-select {
+ position: relative;
+ top: 8px;
+ left: 8px;
+ z-index: 20;
+ padding: 4px 8px;
+ font-size: 14px;
+ border: 1px solid #ccc;
+ border-radius: 4px;
+ background: white;
+}
+
+/* Container for the “Regenerate Background” button */
+.scrapbook-box-ui {
+ position: relative;
+ top: 8px;
+ right: 8px;
+ z-index: 20;
+ background: white;
+ width: 40px;
+ display: flex;
+ justify-content: center;
+}
+
+/* The button itself */
+.scrapbook-box-ui-button {
+ display: flex;
+ align-items: center;
+ gap: 6px;
+ padding: 4px 8px;
+ font-size: 14px;
+ color: black;
+ background: white;
+ border: 1px solid #ccc;
+ border-radius: 4px;
+ cursor: pointer;
+ white-space: nowrap;
+}
+
+.scrapbook-box-ui-button:hover {
+ background: #f5f5f5;
+}
diff --git a/src/client/views/nodes/scrapbook/ScrapbookBox.tsx b/src/client/views/nodes/scrapbook/ScrapbookBox.tsx
index 6cfe9a62c..d0ae6194f 100644
--- a/src/client/views/nodes/scrapbook/ScrapbookBox.tsx
+++ b/src/client/views/nodes/scrapbook/ScrapbookBox.tsx
@@ -1,130 +1,260 @@
-import { action, makeObservable, observable } from 'mobx';
+import { IconButton, Size } from '@dash/components';
+import { action, computed, IReactionDisposer, makeObservable, observable, reaction } from 'mobx';
+import { observer } from 'mobx-react';
import * as React from 'react';
-import { Doc, DocListCast } from '../../../../fields/Doc';
+import ReactLoading from 'react-loading';
+import { Doc, DocListCast, Opt, StrListCast } from '../../../../fields/Doc';
import { List } from '../../../../fields/List';
+import { DateCast, DocCast, NumCast, toList } from '../../../../fields/Types';
import { emptyFunction } from '../../../../Utils';
import { Docs } from '../../../documents/Documents';
import { DocumentType } from '../../../documents/DocumentTypes';
+import { DragManager } from '../../../util/DragManager';
+import { SnappingManager } from '../../../util/SnappingManager';
+import { undoable } from '../../../util/UndoManager';
import { CollectionView } from '../../collections/CollectionView';
import { ViewBoxAnnotatableComponent } from '../../DocComponent';
+import { AspectRatioLimits, FireflyImageDimensions } from '../../smartdraw/FireflyConstants';
+import { SmartDrawHandler } from '../../smartdraw/SmartDrawHandler';
import { DocumentView } from '../DocumentView';
import { FieldView, FieldViewProps } from '../FieldView';
-import { DragManager } from '../../../util/DragManager';
-import { RTFCast, StrCast, toList } from '../../../../fields/Types';
-import { undoable } from '../../../util/UndoManager';
-// Scrapbook view: a container that lays out its child items in a grid/template
-export class ScrapbookBox extends ViewBoxAnnotatableComponent<FieldViewProps>() {
- @observable createdDate: string;
+import { ImageBox } from '../ImageBox';
+import './ScrapbookBox.scss';
+import { ScrapbookItemConfig } from './ScrapbookPreset';
+import { createPreset, getPresetNames } from './ScrapbookPresetRegistry';
+import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
+import { DocUtils } from '../../../documents/DocUtils';
+import { returnTrue } from '../../../../ClientUtils';
- constructor(props: FieldViewProps) {
- super(props);
- makeObservable(this);
- this.createdDate = this.getFormattedDate();
+function createPlaceholder(cfg: ScrapbookItemConfig, doc: Doc) {
+ const placeholder = new Doc();
+ placeholder.proto = doc;
+ placeholder.original = doc;
+ placeholder.x = cfg.x;
+ placeholder.y = cfg.y;
+ if (cfg.width !== null) placeholder._width = cfg.width;
+ if (cfg.height !== null) placeholder._height = cfg.height;
+ return placeholder;
+}
- // ensure we always have a List<Doc> in dataDoc['items']
- if (!this.dataDoc[this.fieldKey]) {
- this.dataDoc[this.fieldKey] = new List<Doc>();
+function createMessagePlaceholder(cfg: ScrapbookItemConfig) {
+ return createPlaceholder(cfg,
+ Docs.Create.TextDocument(cfg.message ?? ('[placeholder] ' + cfg.acceptTags?.[0]), { placeholder: "", placeholder_docType: cfg.type, placeholder_acceptTags: new List<string>(cfg.acceptTags) })
+ ); // prettier-ignore
+}
+export function buildPlaceholdersFromConfigs(configs: ScrapbookItemConfig[]) {
+ return configs.map(cfg => {
+ if (cfg.children?.length) {
+ const childDocs = cfg.children.map(createMessagePlaceholder);
+ const protoW = cfg.containerWidth ?? cfg.width;
+ const protoH = cfg.containerHeight ?? cfg.height;
+ // Create a stacking document with the child placeholders
+ const containerProto = Docs.Create.StackingDocument(childDocs, {
+ ...(protoW !== null ? { _width: protoW } : {}),
+ ...(protoH !== null ? { _height: protoH } : {}),
+ title: cfg.message,
+ });
+ return createPlaceholder(cfg, containerProto);
}
- this.createdDate = this.getFormattedDate();
- this.setTitle();
+ return createMessagePlaceholder(cfg);
+ });
+}
+export async function slotRealDocIntoPlaceholders(realDoc: Doc, placeholders: Doc[]) {
+ if (!realDoc.$tags_chart) {
+ await DocumentView.getFirstDocumentView(realDoc)?.ComponentView?.autoTag?.();
}
+ const realTags = new Set<string>(StrListCast(realDoc.$tags_chat).map(t => t.toLowerCase?.() ?? ''));
+ // Find placeholder with most matching tags
+ let bestMatch: Doc | null = null;
+ let maxMatches = 0;
+
+ // match fields based on type, or by analyzing content .. simple example of matching text in placeholder to dropped doc's type
+ placeholders
+ .filter(ph => ph.placeholder_docType === realDoc.$type) // Skip this placeholder entirely if types do not match.
+ .forEach(ph => {
+ const matches = StrListCast(ph.placeholder_acceptTags)
+ .map(t => t.toLowerCase?.())
+ .filter(tag => realTags.has(tag));
+
+ if (matches.length > maxMatches) {
+ maxMatches = matches.length;
+ bestMatch = ph;
+ }
+ });
+
+ if (bestMatch && maxMatches > 0) {
+ setTimeout(undoable(() => (bestMatch!.proto = realDoc), 'Scrapbook add'));
+ return true;
+ }
+
+ return false;
+}
+
+// Scrapbook view: a container that lays out its child items in a template
+@observer
+export class ScrapbookBox extends ViewBoxAnnotatableComponent<FieldViewProps>() {
public static LayoutString(fieldStr: string) {
return FieldView.LayoutString(ScrapbookBox, fieldStr);
}
+ private _disposers: { [name: string]: IReactionDisposer } = {};
+ private _imageBoxRef = React.createRef<ImageBox>();
+
+ constructor(props: FieldViewProps) {
+ super(props);
+ makeObservable(this);
+ }
+
+ @observable _selectedPreset = getPresetNames()[0];
+ @observable _loading = false;
- getFormattedDate(): string {
- return new Date().toLocaleDateString(undefined, {
+ @computed get createdDate() {
+ return DateCast(this.dataDoc.$author_date)?.date.toLocaleDateString(undefined, {
year: 'numeric',
month: 'short',
day: 'numeric',
});
}
+ @computed get ScrapbookLayoutDocs() { return DocListCast(this.dataDoc[this.fieldKey]); } // prettier-ignore
+ @computed get BackgroundDoc() { return DocCast(this.dataDoc[this.fieldKey + '_background']); } // prettier-ignore
+ set ScrapbookLayoutDocs(doc: Doc[]) { this.dataDoc[this.fieldKey] = new List(doc); } // prettier-ignore
+ set BackgroundDoc(doc: Opt<Doc>) { this.dataDoc[this.fieldKey + '_background'] = doc; } // prettier-ignore
@action
- setTitle() {
- const title = `Scrapbook - ${this.createdDate}`;
- if (this.dataDoc.title !== title) {
- this.dataDoc.title = title;
-
- const image = Docs.Create.TextDocument('image');
- image.accepts_docType = DocumentType.IMG;
- const placeholder = new Doc();
- placeholder.proto = image;
- placeholder.original = image;
- placeholder._width = 250;
- placeholder._height = 200;
- placeholder.x = 0;
- placeholder.y = -100;
- //placeholder.overrideFields = new List<string>(['x', 'y']); // shouldn't need to do this for layout fields since the placeholder already overrides its protos
-
- const summary = Docs.Create.TextDocument('summary');
- summary.accepts_docType = DocumentType.RTF;
- summary.accepts_textType = 'one line';
- const placeholder2 = new Doc();
- placeholder2.proto = summary;
- placeholder2.original = summary;
- placeholder2.x = 0;
- placeholder2.y = 200;
- placeholder2._width = 250;
- //placeholder2.overrideFields = new List<string>(['x', 'y', '_width']); // shouldn't need to do this for layout fields since the placeholder already overrides its protos
- this.dataDoc[this.fieldKey] = new List<Doc>([placeholder, placeholder2]);
- }
- }
+ setDefaultPlaceholder = () => {
+ this.ScrapbookLayoutDocs = [
+ createMessagePlaceholder({
+ message: 'To create a scrapbook from existing documents, marquee select. For existing scrapbook arrangements, select a preset from the dropdown.',
+ type: DocumentType.RTF,
+ width: 250,
+ height: 200,
+ x: 0,
+ y: 0,
+ }),
+ ];
+
+ const placeholder1 = createMessagePlaceholder({ acceptTags: ['PERSON'], type: DocumentType.IMG, width: 250, height: 200, x: 0, y: -100 });
+ const placeholder2 = createMessagePlaceholder({ acceptTags: ['lengthy description'], type: DocumentType.RTF, width: 250, height: undefined, x: 0, y: 200 });
+ const placeholder3 = createMessagePlaceholder({ acceptTags: ['title'], type: DocumentType.RTF, width: 50, height: 200, x: 280, y: -50 });
+ const placeholder4 = createPlaceholder( { width: 100, height: 200, x: -200, y: -100 }, Docs.Create.StackingDocument([
+ createMessagePlaceholder({ acceptTags: ['LANDSCAPE'], type: DocumentType.IMG, width: 50, height: 100, x: 0, y: -100 })
+ ], { _width: 300, _height: 300, title: 'internal coll' })); // prettier-ignore
+ console.log('UNUSED', placeholder4, placeholder3, placeholder2, placeholder1);
+ /* note-to-self
+ would doing:
+ const collection = Docs.Create.ScrapbookDocument([placeholder, placeholder2, placeholder3]);
+ create issues with references to the same object? */
+
+ /*note-to-self
+ Should we consider that there are more collections than just COL type collections?
+ when spreading */
+
+ /*note-to-self
+ difference between passing a new List<Doc> versus just the raw array? */
+ };
+
+ selectPreset = action((presetName: string) => (this.ScrapbookLayoutDocs = buildPlaceholdersFromConfigs(createPreset(presetName))));
componentDidMount() {
- this.setTitle();
+ const title = `Scrapbook - ${this.createdDate}`;
+ if (!this.ScrapbookLayoutDocs.length) this.setDefaultPlaceholder();
+ if (!this.BackgroundDoc) this.generateAiImage(this.regenPrompt);
+ if (this.dataDoc.title !== title) this.dataDoc.title = title; // ensure title is set
+
+ this._disposers.propagateResize = reaction(
+ () => ({ w: this.layoutDoc._width, h: this.layoutDoc._height }),
+ (dims, prev) => {
+ const imageBox = this._imageBoxRef.current;
+ // prev is undefined on the first run
+ if (prev && SnappingManager.ShiftKey && this.BackgroundDoc && imageBox) {
+ this.BackgroundDoc[imageBox.fieldKey + '_outpaintOriginalWidth'] = prev.w;
+ this.BackgroundDoc[imageBox.fieldKey + '_outpaintOriginalHeight'] = prev.h;
+ imageBox.layoutDoc._width = dims.w;
+ imageBox.layoutDoc._height = dims.h;
+ }
+ }
+ );
}
- childRejectDrop = (de: DragManager.DropEvent, subView?: DocumentView) => {
- return true; // disable dropping documents onto any child of the scrapbook.
- };
- rejectDrop = (de: DragManager.DropEvent, subView?: DocumentView) => {
- // Test to see if the dropped doc is dropped on an acceptable location (anywerhe? on a specific box).
- // const draggedDocs = de.complete.docDragData?.draggedDocuments;
- return false; // allow all Docs to be dropped onto scrapbook -- let filterAddDocument make the final decision.
+ isOutpaintable = returnTrue;
+ showBorderRounding = returnTrue;
+
+ @action
+ generateAiImage = (prompt: string) => {
+ this._loading = true;
+
+ const ratio = NumCast(this.layoutDoc._width, 1) / NumCast(this.layoutDoc._height, 1); // Measure the scrapbook’s current aspect
+ const choosePresetForDimensions = (() => { // Pick the Firefly preset that best matches the aspect ratio
+ if (ratio > AspectRatioLimits[FireflyImageDimensions.Widescreen]) return FireflyImageDimensions.Widescreen;
+ if (ratio > AspectRatioLimits[FireflyImageDimensions.Landscape]) return FireflyImageDimensions.Landscape;
+ if (ratio < AspectRatioLimits[FireflyImageDimensions.Portrait]) return FireflyImageDimensions.Portrait;
+ return FireflyImageDimensions.Square;
+ })(); // prettier-ignore
+
+ SmartDrawHandler.CreateWithFirefly(prompt, choosePresetForDimensions) // Call exactly the same CreateWithFirefly that ImageBox uses
+ .then(action(doc => {
+ if (doc instanceof Doc) {
+ this.BackgroundDoc = doc; // set the background image directly on the scrapbook
+ } else {
+ alert('Failed to generate document.');
+ }
+ }))
+ .catch(e => alert(`Generation error: ${e}`))
+ .finally(action(() => (this._loading = false))); // prettier-ignore
};
- filterAddDocument = (docIn: Doc | Doc[]) => {
- const docs = toList(docIn);
- if (docs?.length === 1) {
- const placeholder = DocListCast(this.dataDoc[this.fieldKey]).find(d =>
- (d.accepts_docType === docs[0].$type || // match fields based on type, or by analyzing content .. simple example of matching text in placeholder to dropped doc's type
- RTFCast(d[Doc.LayoutDataKey(d)])?.Text.includes(StrCast(docs[0].$type)))
- ); // prettier-ignore
-
- if (placeholder) {
- // ugh. we have to tell the underlying view not to add the Doc so that we can add it where we want it.
- // However, returning 'false' triggers an undo. so this settimeout is needed to make the assignment happen after the undo.
- setTimeout(
- undoable(() => {
- //StrListCast(placeholder.overrideFields).map(field => (docs[0][field] = placeholder[field])); // // shouldn't need to do this for layout fields since the placeholder already overrides its protos
- placeholder.proto = docs[0];
- }, 'Scrapbook add')
- );
- return false;
- }
- }
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
+ childRejectDrop = (de: DragManager.DropEvent, subView?: DocumentView) => true; // disable dropping documents onto any child of the scrapbook.
+
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
+ rejectDrop = (de: DragManager.DropEvent, subView?: DocumentView) => false; // allow all Docs to be dropped onto scrapbook -- let filterAddDocument make the final decision.
+
+ /**
+ * Filter function to determine if a document can be added to the scrapbook.
+ * This checks if the document matches any of the placeholder slots in the scrapbook.
+ * @param docs - The document(s) being added to the scrapbook.
+ * @returns true if the document can be added, false otherwise.
+ */
+ filterAddDocument = (docs: Doc | Doc[]) => {
+ toList(docs).forEach(doc => slotRealDocIntoPlaceholders(doc, DocUtils.unwrapPlaceholders(this.ScrapbookLayoutDocs)));
return false;
};
+ @computed get regenPrompt() {
+ const allDocs = DocUtils.unwrapPlaceholders(this.ScrapbookLayoutDocs); // find all non-collections in scrapbook (e.g., placeholder content docs)
+ const internalTagsSet = new Set<string>(allDocs.flatMap(doc => StrListCast(doc.$tags_chat).filter(tag => !tag.startsWith?.('ASPECT_'))));
+ const internalTags = Array.from(internalTagsSet).join(', ');
+
+ return internalTags ? `Create a new scrapbook background featuring: ${internalTags}` : 'A serene mountain landscape at sunrise, ultra-wide, pastel sky, abstract, scrapbook background';
+ }
+
render() {
return (
- <div style={{ background: 'beige', width: '100%', height: '100%' }}>
- <CollectionView
- {...this._props} //
- setContentViewBox={emptyFunction}
- rejectDrop={this.rejectDrop}
- childRejectDrop={this.childRejectDrop}
- filterAddDocument={this.filterAddDocument}
- />
- {/* <div style={{ border: '1px black', borderStyle: 'dotted', position: 'absolute', top: '50%', width: '100%', textAlign: 'center' }}>Drop an image here</div> */}
+ <div className="scrapbook-box">
+ <div style={{ display: this._loading ? undefined : 'none' }} className="scrapbook-box-loading-overlay">
+ <ReactLoading type="spin" width={50} height={50} />
+ </div>
+
+ {this.BackgroundDoc && <ImageBox ref={this._imageBoxRef} {...this._props} Document={this.BackgroundDoc} fieldKey="data" />}
+ <div style={{ display: this._props.isContentActive() ? 'flex' : 'none', alignItems: 'center', justifyContent: 'space-between', padding: '0 10px' }}>
+ <select className="scrapbook-box-preset-select" value={this._selectedPreset} onChange={action(e => this.selectPreset((this._selectedPreset = e.currentTarget.value)))}>
+ {getPresetNames().map(name => (
+ <option key={name} value={name}>
+ {name}
+ </option>
+ ))}
+ </select>
+ <div className="scrapbook-box-ui" style={{ opacity: this._loading ? 0.5 : 1 }}>
+ <IconButton size={Size.SMALL} tooltip="regenerate a new background" label="back-ground" icon={<FontAwesomeIcon icon="redo-alt" size="sm" />} onClick={() => !this._loading && this.generateAiImage(this.regenPrompt)} />
+ </div>
+ </div>
+
+ <CollectionView {...this._props} setContentViewBox={emptyFunction} rejectDrop={this.rejectDrop} childRejectDrop={this.childRejectDrop} filterAddDocument={this.filterAddDocument} />
</div>
);
}
}
-// Register scrapbook
Docs.Prototypes.TemplateMap.set(DocumentType.SCRAPBOOK, {
layout: { view: ScrapbookBox, dataField: 'items' },
options: {
diff --git a/src/client/views/nodes/scrapbook/ScrapbookContent.tsx b/src/client/views/nodes/scrapbook/ScrapbookContent.tsx
deleted file mode 100644
index ad1d308e8..000000000
--- a/src/client/views/nodes/scrapbook/ScrapbookContent.tsx
+++ /dev/null
@@ -1,23 +0,0 @@
-import React from "react";
-import { observer } from "mobx-react-lite";
-// Import the Doc type from your actual module.
-import { Doc } from "../../../../fields/Doc";
-
-export interface ScrapbookContentProps {
- doc: Doc;
-}
-
-// A simple view that displays a document's title and content.
-// Adjust how you extract the text if your Doc fields are objects.
-export const ScrapbookContent: React.FC<ScrapbookContentProps> = observer(({ doc }) => {
- // If doc.title or doc.content are not plain strings, convert them.
- const titleText = doc.title ? doc.title.toString() : "Untitled";
- const contentText = doc.content ? doc.content.toString() : "No content available.";
-
- return (
- <div className="scrapbook-content">
- <h3>{titleText}</h3>
- <p>{contentText}</p>
- </div>
- );
-});
diff --git a/src/client/views/nodes/scrapbook/ScrapbookPreset.tsx b/src/client/views/nodes/scrapbook/ScrapbookPreset.tsx
new file mode 100644
index 000000000..a3405083b
--- /dev/null
+++ b/src/client/views/nodes/scrapbook/ScrapbookPreset.tsx
@@ -0,0 +1,94 @@
+import { DocumentType } from '../../../documents/DocumentTypes';
+
+export enum ScrapbookPresetType {
+ None = 'None',
+ Collage = 'Collage',
+ Spotlight = 'Spotlight',
+ Gallery = 'Gallery',
+ Default = 'Default',
+ Classic = 'Classic',
+}
+
+export interface ScrapbookItemConfig {
+ x: number;
+ y: number;
+
+ message?: string; // optional text to display instead of [placeholder] + acceptTags[0]
+ type?: DocumentType;
+ /** what this slot actually accepts (defaults to `tag`) */
+ acceptTags?: string[];
+ /** the frame this placeholder occupies */
+ width?: number;
+ height?: number;
+ /** if this is a container with children, use these for the proto’s own size */
+ containerWidth?: number;
+ containerHeight?: number;
+ children?: ScrapbookItemConfig[];
+}
+
+export class ScrapbookPreset {
+ static createPreset(presetType: ScrapbookPresetType): ScrapbookItemConfig[] {
+ switch (presetType) {
+ case ScrapbookPresetType.None: return ScrapbookPreset.createNonePreset();
+ case ScrapbookPresetType.Classic: return ScrapbookPreset.createClassicPreset();
+ case ScrapbookPresetType.Collage: return ScrapbookPreset.createCollagePreset();
+ case ScrapbookPresetType.Spotlight: return ScrapbookPreset.createSpotlightPreset();
+ case ScrapbookPresetType.Default: return ScrapbookPreset.createDefaultPreset();
+ case ScrapbookPresetType.Gallery: return ScrapbookPreset.createGalleryPreset();
+ default:
+ throw new Error(`Unknown preset type: ${presetType}`);
+ } // prettier-ignore
+ }
+
+ private static createNonePreset(): ScrapbookItemConfig[] {
+ return [{ message: 'To create a scrapbook from existing documents, marquee select. For existing scrapbook arrangements, select a preset from the dropdown.', type: DocumentType.RTF, acceptTags: [], x: 0, y: 0, width: 250, height: 200 }];
+ }
+
+ private static createClassicPreset(): ScrapbookItemConfig[] {
+ return [
+ { type: DocumentType.IMG, message: '[placeholder] landscape', acceptTags: ['LANDSCAPE'], x: 0, y: -100, width: 250, height: 200 },
+ { type: DocumentType.RTF, message: '[placeholder] lengthy caption', acceptTags: ['paragraphs'], x: 0, y: 138, width: 250, height: 172 },
+ { type: DocumentType.RTF, message: '[placeholder] brief description', acceptTags: ['sentence'], x: 280, y: -50, width: 50, height: 200 },
+ { type: DocumentType.IMG, message: '[placeholder] person', acceptTags: ['PERSON'], x: -200, y: -100, width: 167, height: 200 },
+ ];
+ }
+
+ private static createGalleryPreset(): ScrapbookItemConfig[] {
+ return [
+ { type: DocumentType.IMG, message: 'Gallery 1 <drop person images into the gallery!>', acceptTags: ['PERSON'], x: -150, y: -150, width: 150, height: 150 },
+ { type: DocumentType.IMG, message: 'Gallery 2', acceptTags: ['PERSON'], x: 0, y: -150, width: 150, height: 150 },
+ { type: DocumentType.IMG, message: 'Gallery 3', acceptTags: ['PERSON'], x: 150, y: -150, width: 150, height: 150 },
+ { type: DocumentType.IMG, message: 'Gallery 4', acceptTags: ['PERSON'], x: -150, y: 0, width: 150, height: 150 },
+ { type: DocumentType.IMG, message: 'Gallery 5', acceptTags: ['PERSON'], x: 0, y: 0, width: 150, height: 150 },
+ { type: DocumentType.IMG, message: 'Gallery 6', acceptTags: ['PERSON'], x: 150, y: 0, width: 150, height: 150 },
+ ];
+ }
+
+ private static createDefaultPreset(): ScrapbookItemConfig[] {
+ return [
+ { type: DocumentType.IMG, message: 'drop a landscape image', acceptTags: ['LANDSCAPE'], x: 44, y: -50, width: 200, height: 120 },
+ { type: DocumentType.PDF, message: 'summary pdf', acceptTags: ['word', 'sentence', 'paragraphs'], x: 45, y: 93, width: 184, height: 273 },
+ { type: DocumentType.RTF, message: 'sidebar text', acceptTags: ['paragraphs'], x: 250, y: -50, width: 100, height: 200 },
+ { containerWidth: 200, containerHeight: 425, x: -171, y: -54, width: 200, height: 425,
+ children: [{ type: DocumentType.IMG, message: 'drop a person image', acceptTags: ['PERSON'], x: -350, y: 200, width: 162, height: 137 }], },
+ ]; // prettier-ignore
+ }
+
+ private static createCollagePreset(): ScrapbookItemConfig[] {
+ return [
+ { type: DocumentType.IMG, message: 'landscape image', acceptTags: ['LANDSCAPE'], x: -174, y: 100, width: 160, height: 150 },
+ { type: DocumentType.IMG, message: 'person image', acceptTags: ['PERSON'], x: 0, y: 100, width: 150, height: 150 },
+ { type: DocumentType.RTF, message: 'caption', acceptTags: ['sentence'], x: -174, y: 50, width: 150, height: 40 },
+ { type: DocumentType.RTF, message: 'caption', acceptTags: ['sentence'], x: 0, y: 50, width: 150, height: 40 },
+ { type: DocumentType.RTF, message: 'lengthy description', acceptTags: ['paragraphs'], x: -180, y: -60, width: 350, height: 100 },
+ ]; // prettier-ignore
+ }
+
+ private static createSpotlightPreset(): ScrapbookItemConfig[] {
+ return [
+ { type: DocumentType.RTF, message: 'title text', acceptTags: ['word'], x: 0, y: -30, width: 300, height: 40 },
+ { type: DocumentType.IMG, message: 'drop a landscape image', acceptTags: ['LANDSCAPE'], x: 0, y: 20, width: 300, height: 200 },
+ { type: DocumentType.RTF, message: 'caption text', acceptTags: ['sentence'], x: 0, y: 230, width: 300, height: 50 },
+ ];
+ }
+}
diff --git a/src/client/views/nodes/scrapbook/ScrapbookPresetRegistry.ts b/src/client/views/nodes/scrapbook/ScrapbookPresetRegistry.ts
new file mode 100644
index 000000000..3a2189d00
--- /dev/null
+++ b/src/client/views/nodes/scrapbook/ScrapbookPresetRegistry.ts
@@ -0,0 +1,36 @@
+import { ScrapbookItemConfig } from './ScrapbookPreset';
+import { ScrapbookPresetType } from './ScrapbookPreset';
+
+type PresetGenerator = () => ScrapbookItemConfig[];
+
+// Internal map of preset name to generator
+const presetRegistry = new Map<string, PresetGenerator>();
+
+/**
+ * Register a new scrapbook preset under the given name.
+ */
+export function registerPreset(name: string, gen: PresetGenerator) {
+ presetRegistry.set(name, gen);
+}
+
+/**
+ * List all registered preset names.
+ */
+export function getPresetNames(): string[] {
+ return Array.from(presetRegistry.keys());
+}
+
+/**
+ * Create the config array for the named preset.
+ */
+export function createPreset(name: string): ScrapbookItemConfig[] {
+ const gen = presetRegistry.get(name);
+ if (!gen) throw new Error(`Unknown scrapbook preset: ${name}`);
+ return gen();
+}
+
+// ------------------------
+// Register built-in presets
+import { ScrapbookPreset } from './ScrapbookPreset';
+
+Object.keys(ScrapbookPresetType).forEach(key => registerPreset(key, () => ScrapbookPreset.createPreset(key as ScrapbookPresetType))); // pretter-ignore
diff --git a/src/client/views/nodes/scrapbook/ScrapbookSlot.scss b/src/client/views/nodes/scrapbook/ScrapbookSlot.scss
deleted file mode 100644
index ae647ad36..000000000
--- a/src/client/views/nodes/scrapbook/ScrapbookSlot.scss
+++ /dev/null
@@ -1,85 +0,0 @@
-//IGNORE FOR NOW, CURRENTLY NOT USED IN SCRAPBOOK IMPLEMENTATION
-.scrapbook-slot {
- position: absolute;
- background-color: rgba(245, 245, 245, 0.7);
- border: 2px dashed #ccc;
- border-radius: 5px;
- box-sizing: border-box;
- transition: all 0.2s ease;
- overflow: hidden;
-
- &.scrapbook-slot-over {
- border-color: #4a90e2;
- background-color: rgba(74, 144, 226, 0.1);
- }
-
- &.scrapbook-slot-filled {
- border-style: solid;
- border-color: rgba(0, 0, 0, 0.1);
- background-color: transparent;
-
- &.scrapbook-slot-over {
- border-color: #4a90e2;
- background-color: rgba(74, 144, 226, 0.1);
- }
- }
-
- .scrapbook-slot-empty {
- display: flex;
- align-items: center;
- justify-content: center;
- width: 100%;
- height: 100%;
- }
-
- .scrapbook-slot-placeholder {
- text-align: center;
- color: #888;
- }
-
- .scrapbook-slot-title {
- font-weight: bold;
- margin-bottom: 5px;
- }
-
- .scrapbook-slot-instruction {
- font-size: 0.9em;
- font-style: italic;
- }
-
- .scrapbook-slot-content {
- width: 100%;
- height: 100%;
- position: relative;
- }
-
- .scrapbook-slot-controls {
- position: absolute;
- top: 5px;
- right: 5px;
- z-index: 10;
- opacity: 0;
- transition: opacity 0.2s ease;
-
- .scrapbook-slot-remove-btn {
- background-color: rgba(255, 255, 255, 0.8);
- border: 1px solid #ccc;
- border-radius: 50%;
- width: 20px;
- height: 20px;
- display: flex;
- align-items: center;
- justify-content: center;
- cursor: pointer;
- font-size: 10px;
-
- &:hover {
- background-color: rgba(255, 0, 0, 0.1);
- }
- }
- }
-
- &:hover .scrapbook-slot-controls {
- opacity: 1;
- }
-} \ No newline at end of file
diff --git a/src/client/views/nodes/scrapbook/ScrapbookSlot.tsx b/src/client/views/nodes/scrapbook/ScrapbookSlot.tsx
deleted file mode 100644
index 2c8f93778..000000000
--- a/src/client/views/nodes/scrapbook/ScrapbookSlot.tsx
+++ /dev/null
@@ -1,28 +0,0 @@
-
-//IGNORE FOR NOW, CURRENTLY NOT USED IN SCRAPBOOK IMPLEMENTATION
-export interface SlotDefinition {
- id: string;
- x: number; y: number;
- defaultWidth: number;
- defaultHeight: number;
- }
-
- export interface SlotContentMap {
- slotId: string;
- docId?: string;
- }
-
- export interface ScrapbookConfig {
- slots: SlotDefinition[];
- contents?: SlotContentMap[];
- }
-
- export const DEFAULT_SCRAPBOOK_CONFIG: ScrapbookConfig = {
- slots: [
- { id: "slot1", x: 10, y: 10, defaultWidth: 180, defaultHeight: 120 },
- { id: "slot2", x: 200, y: 10, defaultWidth: 180, defaultHeight: 120 },
- // …etc
- ],
- contents: []
- };
- \ No newline at end of file
diff --git a/src/client/views/nodes/scrapbook/ScrapbookSlotTypes.ts b/src/client/views/nodes/scrapbook/ScrapbookSlotTypes.ts
deleted file mode 100644
index 686917d9a..000000000
--- a/src/client/views/nodes/scrapbook/ScrapbookSlotTypes.ts
+++ /dev/null
@@ -1,25 +0,0 @@
-// ScrapbookSlotTypes.ts
-export interface SlotDefinition {
- id: string;
- title: string;
- x: number;
- y: number;
- defaultWidth: number;
- defaultHeight: number;
- }
-
- export interface ScrapbookConfig {
- slots: SlotDefinition[];
- contents?: { slotId: string; docId: string }[];
- }
-
- // give it three slots by default:
- export const DEFAULT_SCRAPBOOK_CONFIG: ScrapbookConfig = {
- slots: [
- { id: "main", title: "Main Content", x: 20, y: 20, defaultWidth: 360, defaultHeight: 200 },
- { id: "notes", title: "Notes", x: 20, y: 240, defaultWidth: 360, defaultHeight: 160 },
- { id: "resources", title: "Resources", x: 400, y: 20, defaultWidth: 320, defaultHeight: 380 },
- ],
- contents: [],
- };
- \ No newline at end of file
diff --git a/src/client/views/nodes/trails/PresBox.scss b/src/client/views/nodes/trails/PresBox.scss
index e24b47bd1..8875f7012 100644
--- a/src/client/views/nodes/trails/PresBox.scss
+++ b/src/client/views/nodes/trails/PresBox.scss
@@ -229,7 +229,7 @@
.toolbar-transition {
display: flex;
font-size: 10;
- width: 100;
+ width: 100px;
background-color: rgba(0, 0, 0, 0);
min-width: max-content;
@@ -358,7 +358,7 @@
font-weight: 200;
padding: 8px;
border-radius: 4px;
- // height: 20;
+ // height: 20px;
// display: flex;
// margin-left: 5px;
// margin-top: 5px;
@@ -371,8 +371,8 @@
}
.ribbon-propertyUpDown {
- height: 20;
- width: 20;
+ height: 20px;
+ width: 20px;
margin-top: 5px;
display: grid;
grid-template-rows: 10px 10px;
@@ -486,7 +486,7 @@
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
- margin: 0;
+ margin: 0px;
margin-right: 3px;
border-radius: 100%;
height: 15px;
@@ -658,9 +658,9 @@
height: 25px;
color: white;
width: 100%;
- max-width: 120;
- padding-left: 10;
- padding-right: 10;
+ max-width: 120px;
+ padding-left: 10px;
+ padding-right: 10px;
border-radius: 10px;
background-color: global.$medium-gray;
}
@@ -683,9 +683,9 @@
height: 25px;
color: global.$light-gray;
width: 100%;
- max-width: 120;
- padding-left: 10;
- padding-right: 10;
+ max-width: 120px;
+ padding-left: 10px;
+ padding-right: 10px;
border-radius: 10px;
background-color: global.$black;
}
@@ -745,9 +745,9 @@
.selectedList {
display: block;
- min-width: 50;
- max-width: 120;
- height: 70;
+ min-width: 50px;
+ max-width: 120px;
+ height: 70px;
overflow-y: scroll;
.selectedList-items {
@@ -760,7 +760,7 @@
cursor: pointer;
font-size: 10.5;
font-weight: 300;
- height: 20;
+ height: 20px;
background-color: global.$medium-gray;
color: white;
display: flex;
@@ -788,7 +788,7 @@
cursor: pointer;
font-size: 10.5;
font-weight: 200;
- height: 20;
+ height: 20px;
background-color: global.$white;
display: inline-flex;
color: global.$black;
@@ -813,7 +813,7 @@
}
svg.svg-inline--fa.fa-thumbtack.fa-w-12.toolbar-thumbtack {
- right: 40;
+ right: 40px;
position: absolute;
transform: rotate(45deg);
}
@@ -850,7 +850,7 @@
background-color: global.$light-gray;
border-radius: 5px;
font-size: 10;
- height: 25;
+ height: 25px;
color: global.$black;
padding-left: 5px;
align-items: center;
@@ -868,8 +868,8 @@
display: block;
padding-left: 10px;
padding-right: 5px;
- padding-top: 3;
- padding-bottom: 3;
+ padding-top: 3px;
+ padding-bottom: 3px;
opacity: 0.8;
}
@@ -959,8 +959,8 @@
border-radius: 4px;
padding-left: 7px;
padding-right: 7px;
- border-bottom-right-radius: 0;
- border-top-right-radius: 0;
+ border-bottom-right-radius: 0px;
+ border-top-right-radius: 0px;
}
.presBox-button-right {
@@ -976,8 +976,8 @@
border-radius: 4px;
padding-left: 7px;
padding-right: 7px;
- border-bottom-left-radius: 0;
- border-top-left-radius: 0;
+ border-bottom-left-radius: 0px;
+ border-top-left-radius: 0px;
}
.presBox-button-right.active {
@@ -1043,8 +1043,8 @@
cursor: pointer;
align-self: center;
justify-self: center;
- margin-top: 5;
- margin-bottom: 5;
+ margin-top: 5px;
+ margin-bottom: 5px;
position: relative;
height: 55px;
min-width: 90px;
@@ -1063,7 +1063,7 @@
padding-left: 3px;
margin-left: 3px;
margin-right: 3px;
- height: 13;
+ height: 13px;
font-size: 12;
display: flex;
background-color: global.$white;
@@ -1076,7 +1076,7 @@
margin-left: 3px;
margin-right: 3px;
font-weight: 400;
- height: 13;
+ height: 13px;
font-size: 9;
display: flex;
background-color: global.$white;
@@ -1089,11 +1089,11 @@
padding-left: 3px;
margin-left: 3px;
margin-right: 3px;
- height: 13;
+ height: 13px;
font-size: 10;
display: flex;
background-color: global.$white;
- height: 33;
+ height: 33px;
text-align: left;
font-size: 8px;
}
@@ -1112,7 +1112,7 @@
.presBox-viewPicker {
cursor: pointer;
- height: 25;
+ height: 25px;
position: relative;
display: inline-block;
grid-column: 1;
@@ -1184,9 +1184,9 @@
}
.collectionViewBaseChrome-viewPicker {
- min-width: 50;
+ min-width: 50px;
width: 5%;
- height: 25;
+ height: 25px;
position: relative;
display: inline-block;
left: 8px;
@@ -1210,11 +1210,11 @@
}
.presBox-backward {
- left: 5;
+ left: 5px;
}
.presBox-forward {
- right: 5;
+ right: 5px;
}
// CSS adjusted for mobile devices
@@ -1233,8 +1233,8 @@
.presBox-button {
margin-top: 5%;
- height: 250;
- width: 300;
+ height: 250px;
+ width: 300px;
font-size: 100;
display: flex;
align-items: center;
@@ -1256,7 +1256,7 @@
}
.presBox-cont .presBox-listCont {
- top: 50;
+ top: 50px;
height: calc(100% - 80px);
}
@@ -1269,8 +1269,8 @@
.miniPres {
cursor: grab;
position: absolute;
- top: 0;
- left: 0;
+ top: 0px;
+ left: 0px;
opacity: 0.5;
transition: all 0.4s;
color: global.$white;
@@ -1298,7 +1298,7 @@
.presPanel-button-text {
cursor: pointer;
display: flex;
- height: 20;
+ height: 20px;
width: max-content;
font-family: Roboto;
font-weight: 400;
@@ -1327,8 +1327,8 @@
grid-template-columns: auto auto auto;
justify-content: space-around;
font-size: 11;
- margin-left: 7;
- width: 30;
+ margin-left: 7px;
+ width: 30px;
height: 85%;
background-color: rgba(91, 157, 221, 0.4);
border-radius: 5px;
@@ -1337,8 +1337,8 @@
.presPanel-button {
cursor: pointer;
display: flex;
- height: 20;
- min-width: 20;
+ height: 20px;
+ min-width: 20px;
margin-left: 3px;
margin-right: 3px;
border-radius: 100%;
@@ -1361,8 +1361,8 @@
// cursor: grab;
// position: absolute;
// overflow: hidden;
-// right: 10;
-// top: 10;
+// right: 10px;
+// top: 10px;
// opacity: 0.1;
// transition: all 0.4s;
// /* border: solid 1px; */
@@ -1380,7 +1380,7 @@
// .miniPres-button-text {
// cursor: pointer;
// display: flex;
-// height: 20;
+// height: 20px;
// font-weight: 400;
// min-width: 100%;
// border-radius: 5px;
@@ -1397,8 +1397,8 @@
// grid-template-columns: auto auto auto;
// justify-content: space-around;
// font-size: 11;
-// margin-left: 7;
-// width: 30;
+// margin-left: 7px;
+// width: 30px;
// height: 85%;
// background-color: rgba(91, 157, 221, 0.4);
// border-radius: 5px;
@@ -1413,8 +1413,8 @@
// .miniPres-button {
// cursor: pointer;
// display: flex;
-// height: 20;
-// min-width: 20;
+// height: 20px;
+// min-width: 20px;
// border-radius: 100%;
// align-items: center;
// justify-content: center;
diff --git a/src/client/views/nodes/trails/PresBox.tsx b/src/client/views/nodes/trails/PresBox.tsx
index 11f35b8ef..cb2a1f13f 100644
--- a/src/client/views/nodes/trails/PresBox.tsx
+++ b/src/client/views/nodes/trails/PresBox.tsx
@@ -702,7 +702,7 @@ export class PresBox extends ViewBoxBaseComponent<FieldViewProps>() {
transTime + 10
);
}
- if ((pinDataTypes?.pannable || (!pinDataTypes && (activeItem.config_viewBounds !== undefined || activeItem.config_panX !== undefined || activeItem.config_viewScale !== undefined))) && !bestTarget.isGroup) {
+ if ((pinDataTypes?.pannable || (!pinDataTypes && (activeItem.config_viewBounds !== undefined || activeItem.config_panX !== undefined || activeItem.config_viewScale !== undefined))) && !Doc.IsFreeformGroup(bestTarget)) {
const contentBounds = Cast(activeItem.config_viewBounds, listSpec('number'));
if (contentBounds) {
const viewport = { panX: (contentBounds[0] + contentBounds[2]) / 2, panY: (contentBounds[1] + contentBounds[3]) / 2, width: contentBounds[2] - contentBounds[0], height: contentBounds[3] - contentBounds[1] };
diff --git a/src/client/views/nodes/trails/PresSlideBox.scss b/src/client/views/nodes/trails/PresSlideBox.scss
index 9ac2b5a94..740bcae5f 100644
--- a/src/client/views/nodes/trails/PresSlideBox.scss
+++ b/src/client/views/nodes/trails/PresSlideBox.scss
@@ -117,8 +117,8 @@ $slide-active: #5b9fdd;
height: 100%;
position: absolute;
border-radius: 3px;
- top: 0;
- left: 0;
+ top: 0px;
+ left: 0px;
z-index: 1;
overflow: hidden;
}
@@ -209,7 +209,7 @@ $slide-active: #5b9fdd;
position: absolute;
/* grid-row: 3; */
/* grid-column: 1/8; */
- top: 28;
+ top: 28px;
display: block;
background: #92adb9;
width: 100%;
@@ -276,7 +276,7 @@ $slide-active: #5b9fdd;
cursor: pointer;
position: absolute;
border-radius: 100px;
- bottom: 0;
+ bottom: 0px;
left: -18;
z-index: 300;
width: 15px;
@@ -302,7 +302,7 @@ $slide-active: #5b9fdd;
color: #d5dce2;
position: absolute;
left: -15px;
- top: 1;
+ top: 1px;
font-weight: 600;
font-size: 12;
}
diff --git a/src/client/views/pdf/AnchorMenu.scss b/src/client/views/pdf/AnchorMenu.scss
index 6990bdcf1..98eeaf80e 100644
--- a/src/client/views/pdf/AnchorMenu.scss
+++ b/src/client/views/pdf/AnchorMenu.scss
@@ -6,19 +6,19 @@
}
.anchorMenu-highlighter {
padding-right: 5px;
- .antimodeMenu-button {
- padding: 0;
- padding: 0;
+ .antimodeMenu-button {
+ padding: 0px;
+ padding: 0px;
padding-right: 0px;
padding-left: 0px;
width: 5px;
}
}
-.anchor-color-preview-button {
- width: 25px !important;
+.anchor-color-preview-button {
+ width: 25px !important;
.anchor-color-preview {
display: flex;
- flex-direction: column;
+ flex-direction: column;
padding-right: 3px;
width: unset !important;
.color-preview {
@@ -51,4 +51,4 @@
border: 2px solid white;
}
}
-} \ No newline at end of file
+}
diff --git a/src/client/views/pdf/GPTPopup/GPTPopup.scss b/src/client/views/pdf/GPTPopup/GPTPopup.scss
index f6fa45221..85c1f6759 100644
--- a/src/client/views/pdf/GPTPopup/GPTPopup.scss
+++ b/src/client/views/pdf/GPTPopup/GPTPopup.scss
@@ -20,8 +20,8 @@ $headingHeight: 32px;
left: 75px;
width: 100%;
height: 100%;
- top: 0;
- left: 0;
+ top: 0px;
+ left: 0px;
border-top: solid gray 20px;
border-radius: 16px;
z-index: 999;
@@ -58,7 +58,7 @@ $headingHeight: 32px;
font-size: 12px;
font-weight: 400;
letter-spacing: 1px;
- margin: 0;
+ margin: 0px;
padding-right: 5px;
}
@@ -214,8 +214,8 @@ $headingHeight: 32px;
.img-container::after {
content: '';
position: absolute;
- top: 0;
- left: 0;
+ top: 0px;
+ left: 0px;
width: 100%;
height: 100%;
background-color: rgba(0, 0, 0, 0.5);
diff --git a/src/client/views/pdf/PDFViewer.scss b/src/client/views/pdf/PDFViewer.scss
index 1aab2b853..dafa908a2 100644
--- a/src/client/views/pdf/PDFViewer.scss
+++ b/src/client/views/pdf/PDFViewer.scss
@@ -3,8 +3,8 @@
width: 100%;
position: absolute;
display: inline-block;
- top: 0;
- left: 0;
+ top: 0px;
+ left: 0px;
}
:root {
@@ -16,8 +16,8 @@
position: absolute;
width: 100%;
height: 100%;
- top: 0;
- left: 0;
+ top: 0px;
+ left: 0px;
position: absolute;
overflow-y: auto;
overflow-x: hidden;
@@ -99,7 +99,7 @@
.pdfViewerDash-annotationLayer {
position: absolute;
transform-origin: left top;
- top: 0;
+ top: 0px;
width: 100%;
pointer-events: none;
mix-blend-mode: multiply; // bcz: makes text fuzzy!
@@ -118,6 +118,9 @@
.pdfViewerDash-interactive {
pointer-events: all;
+ &::-webkit-scrollbar {
+ width: 40px;
+ }
}
.loading-spinner {
diff --git a/src/client/views/pdf/PDFViewer.tsx b/src/client/views/pdf/PDFViewer.tsx
index a88d8b282..616e2119f 100644
--- a/src/client/views/pdf/PDFViewer.tsx
+++ b/src/client/views/pdf/PDFViewer.tsx
@@ -901,12 +901,6 @@ export class PDFViewer extends ObservableReactComponent<IViewerProps> {
@action
onPointerDown = (e: React.PointerEvent): void => {
- // const hit = document.elementFromPoint(e.clientX, e.clientY);
- // bcz: Change. drag selecting requires that preventDefault is NOT called. This used to happen in DocumentView,
- // but that's changed, so this shouldn't be needed.
- // if (hit && hit.localName === "span" && this.annotationsActive(true)) { // drag selecting text stops propagation
- // e.button === 0 && e.stopPropagation();
- // }
// if alt+left click, drag and annotate
this._downX = e.clientX;
this._downY = e.clientY;
diff --git a/src/client/views/search/FaceRecognitionHandler.tsx b/src/client/views/search/FaceRecognitionHandler.tsx
index 3ad5bc844..84404d65a 100644
--- a/src/client/views/search/FaceRecognitionHandler.tsx
+++ b/src/client/views/search/FaceRecognitionHandler.tsx
@@ -9,6 +9,7 @@ import { ImageField } from '../../../fields/URLField';
import { DocumentType } from '../../documents/DocumentTypes';
import { Docs } from '../../documents/Documents';
import { DocumentManager } from '../../util/DocumentManager';
+import { DocumentView } from '../nodes/DocumentView';
/**
* A singleton class that handles face recognition and manages face Doc collections for each face found.
@@ -33,7 +34,7 @@ export class FaceRecognitionHandler {
// eslint-disable-next-line no-use-before-define
static _instance: FaceRecognitionHandler;
private _apiModelReady = false;
- private _pendingAPIModelReadyDocs: Doc[] = [];
+ private _pendingAPIModelReadyDocs: DocumentView[] = [];
public static get Instance() {
return FaceRecognitionHandler._instance ?? new FaceRecognitionHandler();
@@ -126,7 +127,7 @@ export class FaceRecognitionHandler {
constructor() {
FaceRecognitionHandler._instance = this;
this.loadAPIModels().then(() => this._pendingAPIModelReadyDocs.forEach(this.classifyFacesInImage));
- DocumentManager.Instance.AddAnyViewRenderedCB(dv => FaceRecognitionHandler.Instance.classifyFacesInImage(dv.Document));
+ DocumentManager.Instance.AddAnyViewRenderedCB(dv => FaceRecognitionHandler.Instance.classifyFacesInImage(dv));
}
/**
@@ -199,16 +200,18 @@ export class FaceRecognitionHandler {
* match them to existing unique faces, otherwise new unique face(s) are created.
* @param imgDoc The document being analyzed.
*/
- private classifyFacesInImage = async (imgDoc: Doc) => {
+ private classifyFacesInImage = async (imgDocView: DocumentView) => {
+ const imgDoc = imgDocView.Document;
if (!Doc.UserDoc().recognizeFaceImages) return;
const activeDashboard = Doc.ActiveDashboard;
if (!this._apiModelReady || !activeDashboard) {
- this._pendingAPIModelReadyDocs.push(imgDoc);
+ this._pendingAPIModelReadyDocs.push(imgDocView);
} else if (imgDoc.type === DocumentType.LOADING && !imgDoc.loadingError) {
- setTimeout(() => this.classifyFacesInImage(imgDoc), 1000);
+ setTimeout(() => this.classifyFacesInImage(imgDocView), 1000);
} else {
const imgUrl = ImageCast(imgDoc[Doc.LayoutDataKey(imgDoc)]);
if (imgUrl && !DocListCast(Doc.MyFaceCollection?.examinedFaceDocs).includes(imgDoc[DocData])) {
+ imgDocView.ComponentView?.autoTag?.();
// only examine Docs that have an image and that haven't already been examined.
Doc.MyFaceCollection && Doc.AddDocToList(Doc.MyFaceCollection, 'examinedFaceDocs', imgDoc[DocData]);
FaceRecognitionHandler.loadImage(imgUrl).then(
diff --git a/src/client/views/smartdraw/SmartDrawHandler.tsx b/src/client/views/smartdraw/SmartDrawHandler.tsx
index 3976ec39e..b7ff5fff7 100644
--- a/src/client/views/smartdraw/SmartDrawHandler.tsx
+++ b/src/client/views/smartdraw/SmartDrawHandler.tsx
@@ -330,8 +330,9 @@ export class SmartDrawHandler extends ObservableReactComponent<object> {
switch (doc.type) {
case DocumentType.IMG: {
const func = changeInPlace ? this.recreateImageWithFirefly : this.createImageWithFirefly;
- const newPrompt = doc.ai_prompt && doc.ai_prompt !== this._regenInput ? `${doc.ai_prompt} ~~~ ${this._regenInput}` : this._regenInput;
- return this._regenInput ? func(newPrompt, NumCast(doc?.ai_prompt_seed)) : func(this._lastInput.text || StrCast(doc.ai_prompt));
+ const promptChange = doc.ai_prompt && doc.ai_prompt !== this._regenInput;
+ const newPrompt = promptChange ? `${doc.ai_prompt} ~~~ ${this._regenInput}` : this._regenInput;
+ return this._regenInput ? func(newPrompt, promptChange ? NumCast(doc?.ai_prompt_seed) : undefined) : func(this._lastInput.text || StrCast(doc.ai_prompt));
}
case DocumentType.COL: {
try {
diff --git a/src/client/views/topbar/TopBar.scss b/src/client/views/topbar/TopBar.scss
index 2200d11d5..9bae92586 100644
--- a/src/client/views/topbar/TopBar.scss
+++ b/src/client/views/topbar/TopBar.scss
@@ -125,7 +125,7 @@
.topbar-lozenge-user,
.topbar-lozenge {
- height: 23;
+ height: 23px;
font-size: 12;
color: white;
font-family: 'Roboto';
diff --git a/src/debug/Viewer.tsx b/src/debug/Viewer.tsx
index f3295a6c6..354ed11d6 100644
--- a/src/debug/Viewer.tsx
+++ b/src/debug/Viewer.tsx
@@ -1,8 +1,5 @@
/* eslint-disable react/no-unescaped-entities */
-/* eslint-disable react/button-has-type */
/* eslint-disable no-use-before-define */
-/* eslint-disable react/no-array-index-key */
-/* eslint-disable no-redeclare */
import { action, configure, observable } from 'mobx';
import { observer } from 'mobx-react';
import * as React from 'react';
diff --git a/src/fields/Doc.ts b/src/fields/Doc.ts
index 0d11b9743..6e0c3d112 100644
--- a/src/fields/Doc.ts
+++ b/src/fields/Doc.ts
@@ -536,23 +536,35 @@ export namespace Doc {
export function GetT<T extends FieldType>(doc: Doc, key: string, ctor: ToConstructor<T>, ignoreProto: boolean = false): FieldResult<T> {
return Cast(Get(doc, key, ignoreProto), ctor) as FieldResult<T>;
}
- export function isTemplateDoc(doc: Doc) {
- return GetT(doc, 'isTemplateDoc', 'boolean', true);
- }
- export function isTemplateForField(doc: Doc) {
- return GetT(doc, 'isTemplateForField', 'string', true);
- }
- export function IsDataProto(doc: Doc) {
- return GetT(doc, 'isDataDoc', 'boolean', true);
- }
- export function IsBaseProto(doc: Doc) {
- return GetT(doc, 'isBaseProto', 'boolean', true);
- }
- export function IsSystem(doc: Doc) {
- return GetT(doc, 'isSystem', 'boolean', true);
- }
- export function IsDelegateField(doc: Doc, fieldKey: string) {
- return doc && Get(doc, fieldKey, true) !== undefined;
+ /**
+ * Tests whether the Doc is flagged as being a template.
+ * Templates can be set as a layout for another target Doc. When rendered by the target Doc, the template
+ * creates an instance of itself that holds rendering data specific to the target
+ * @param doc
+ */
+ export function IsTemplateDoc(doc: Doc) { return GetT(doc, 'isTemplateDoc', 'boolean', true); } // prettier-ignore
+ /**
+ * Tests whether the Doc is flagged as being a template for rendering a specific field of a Doc
+ * When flagged as field template and rendered, the template will redirect its componentView to write to the
+ * specified template field. In general, a compound Doc template will contain multiple field templates, one for each of the
+ * data fields rendered by the compound template.
+ * @param doc
+ * @returns
+ */
+ export function IsTemplateForField(doc: Doc) { return GetT(doc, 'isTemplateForField', 'string', true); } // prettier-ignore
+ export function IsDataProto(doc: Doc) { return GetT(doc, 'isDataDoc', 'boolean', true); } // prettier-ignore
+ export function IsBaseProto(doc: Doc) { return GetT(doc, 'isBaseProto', 'boolean', true); } // prettier-ignore
+ export function IsSystem(doc: Doc) { return GetT(doc, 'isSystem', 'boolean', true); } // prettier-ignore
+ export function IsDelegateField(doc: Doc, fieldKey: string) { return doc && Get(doc, fieldKey, true) !== undefined; } // prettier-ignore
+ /**
+ * Tests whether a doc is a freeform collection that renders as a group.
+ * The group variant of a collection automatically resizes so that none of its contents
+ * are ever hidden.
+ * @param doc doc to test for being a freeform group
+ * @returns boolean
+ */
+ export function IsFreeformGroup(doc: Doc) {
+ return doc.freeform_isGroup && doc.type_collection === CollectionViewType.Freeform;
}
//
// this will write the value to the key on either the data doc or the embedding doc. The choice
@@ -596,9 +608,6 @@ export namespace Doc {
const value = (fields as { [key: string]: Opt<FieldType> })[key];
if (!skipUndefineds || value !== undefined) {
// Do we want to filter out undefineds?
- if (typeof value === 'object' && 'values' in value) {
- console.log(value);
- }
doc[key] = value;
}
});
@@ -734,7 +743,7 @@ export namespace Doc {
const FindDocsInRTF = new RegExp(/(audioId|textId|anchorId|docId)"\s*:\s*"(.*?)"/g);
export function makeClone(doc: Doc, cloneMap: Map<string, Doc>, linkMap: Map<string, Doc>, rtfs: { copy: Doc; key: string; field: RichTextField }[], exclusions: string[], pruneDocs: Doc[], cloneLinks: boolean, cloneTemplates: boolean): Doc {
- if (Doc.IsBaseProto(doc) || ((Doc.isTemplateDoc(doc) || Doc.isTemplateForField(doc)) && !cloneTemplates)) {
+ if (Doc.IsBaseProto(doc) || ((Doc.IsTemplateDoc(doc) || Doc.IsTemplateForField(doc)) && !cloneTemplates)) {
return doc;
}
if (cloneMap.get(doc[Id])) return cloneMap.get(doc[Id])!;
@@ -808,7 +817,7 @@ export namespace Doc {
const docAtKey = DocCast(clone[key]);
if (docAtKey && !Doc.IsSystem(docAtKey)) {
if (!Array.from(cloneMap.values()).includes(docAtKey)) {
- clone[key] = !cloneTemplates && (Doc.isTemplateDoc(docAtKey) || Doc.isTemplateForField(docAtKey)) ? docAtKey : cloneMap.get(docAtKey[Id]);
+ clone[key] = !cloneTemplates && (Doc.IsTemplateDoc(docAtKey) || Doc.IsTemplateForField(docAtKey)) ? docAtKey : cloneMap.get(docAtKey[Id]);
} else {
repairClone(docAtKey, cloneMap, cloneTemplates, visited);
}
@@ -859,7 +868,7 @@ export namespace Doc {
*/
export function expandTemplateLayout(templateLayoutDoc: Doc, targetDoc?: Doc, layoutFieldKey?: string) {
// nothing to do if the layout isn't a template or we don't have a target that's different than the template
- if (!targetDoc || templateLayoutDoc === targetDoc || (!Doc.isTemplateForField(templateLayoutDoc) && !Doc.isTemplateDoc(templateLayoutDoc))) {
+ if (!targetDoc || templateLayoutDoc === targetDoc || (!Doc.IsTemplateForField(templateLayoutDoc) && !Doc.IsTemplateDoc(templateLayoutDoc))) {
return templateLayoutDoc;
}
@@ -922,7 +931,7 @@ export namespace Doc {
console.log('Warning: GetLayoutDataDocPair childDoc not defined');
return { layout: childDoc, data: childDoc };
}
- const data = Doc.AreProtosEqual(containerDataDoc, containerDoc) || (!Doc.isTemplateDoc(childDoc) && !Doc.isTemplateForField(childDoc)) ? undefined : containerDataDoc;
+ const data = Doc.AreProtosEqual(containerDataDoc, containerDoc) || (!Doc.IsTemplateDoc(childDoc) && !Doc.IsTemplateForField(childDoc)) ? undefined : containerDataDoc;
const templateRoot = DocCast(containerDoc?.rootDocument);
return { layout: Doc.expandTemplateLayout(childDoc, templateRoot, layoutFieldKey), data };
}
@@ -1190,14 +1199,14 @@ export namespace Doc {
}
export function NativeWidth(doc?: Doc, dataDoc?: Doc, useWidth?: boolean) {
// if this is a field template, then don't use the doc's nativeWidth/height
- return !doc ? 0 : NumCast(doc.isTemplateForField ? undefined : doc._nativeWidth, NumCast((dataDoc || doc)[Doc.LayoutDataKey(doc) + '_nativeWidth'], !doc.isTemplateForField && useWidth ? NumCast(doc._width) : 0));
+ return !doc ? 0 : NumCast(doc._nativeWidth, doc[DocLayout].isTemplateDoc ? 0 : NumCast((dataDoc || doc)[Doc.LayoutDataKey(doc) + '_nativeWidth'], useWidth ? NumCast(doc._width) : 0));
}
export function NativeHeight(doc?: Doc, dataDoc?: Doc, useHeight?: boolean) {
if (!doc) return 0;
const nheight = (Doc.NativeWidth(doc, dataDoc, useHeight) / NumCast(doc._width)) * NumCast(doc._height); // divide before multiply to avoid floating point errrorin case nativewidth = width
- const dheight = NumCast((dataDoc || doc)[Doc.LayoutDataKey(doc) + '_nativeHeight'], useHeight ? NumCast(doc._height) : 0);
+ const dheight = doc[DocLayout].isTemplateDoc ? 0 : NumCast((dataDoc || doc)[Doc.LayoutDataKey(doc) + '_nativeHeight'], useHeight ? NumCast(doc._height) : 0);
// if this is a field template, then don't use the doc's nativeWidth/height
- return NumCast(doc.isTemplateForField ? undefined : doc._nativeHeight, nheight || dheight);
+ return NumCast(doc._nativeHeight, nheight || dheight);
}
export function OutpaintingWidth(doc?: Doc, dataDoc?: Doc, useWidth?: boolean) {
@@ -1467,7 +1476,6 @@ export namespace Doc {
layoutDoc._nativeWidth = undefined;
layoutDoc._nativeHeight = undefined;
} else {
- layoutDoc._layout_autoHeight = false;
if (!Doc.NativeWidth(layoutDoc)) {
layoutDoc._nativeWidth = NumCast(layoutDoc._width, panelWidth);
layoutDoc._nativeHeight = NumCast(layoutDoc._height, panelHeight);
diff --git a/src/fields/FieldLoader.scss b/src/fields/FieldLoader.scss
index 9a23c3e4f..62d85a763 100644
--- a/src/fields/FieldLoader.scss
+++ b/src/fields/FieldLoader.scss
@@ -1,7 +1,7 @@
.fieldLoader {
z-index: 10000;
width: 200px;
- height: 30;
+ height: 30px;
background: lightblue;
position: absolute;
left: calc(50% - 99px);
diff --git a/src/server/ApiManagers/FireflyManager.ts b/src/server/ApiManagers/FireflyManager.ts
index e934e635b..6393a1f74 100644
--- a/src/server/ApiManagers/FireflyManager.ts
+++ b/src/server/ApiManagers/FireflyManager.ts
@@ -23,7 +23,16 @@ export default class FireflyManager extends ApiManager {
return undefined;
});
- generateImageFromStructure = (prompt: string = 'a realistic illustration of a cat coding', width: number = 2048, height: number = 2048, structureUrl: string, strength: number = 50, styles: string[], styleUrl: string | undefined) =>
+ generateImageFromStructure = (
+ prompt: string = 'a realistic illustration of a cat coding',
+ width: number = 2048,
+ height: number = 2048,
+ structureUrl: string,
+ strength: number = 50,
+ styles: string[],
+ styleUrl: string | undefined,
+ variations: number = 4
+ ) =>
this.getBearerToken().then(response =>
response?.json().then((data: { access_token: string }) =>
//prettier-ignore
@@ -37,7 +46,7 @@ export default class FireflyManager extends ApiManager {
],
body: JSON.stringify({
prompt,
- numVariations: 4,
+ numVariations: variations,
detailLevel: 'preview',
modelVersion: 'image3_fast',
size: { width, height },
@@ -107,10 +116,7 @@ export default class FireflyManager extends ApiManager {
});
generateImage = (prompt: string = 'a realistic illustration of a cat coding', width: number = 2048, height: number = 2048, seed?: number) => {
- let body = `{ "prompt": "${prompt}", "size": { "width": ${width}, "height": ${height}} }`;
- if (seed) {
- body = `{ "prompt": "${prompt}", "size": { "width": ${width}, "height": ${height}}, "seeds": [${seed}]}`;
- }
+ const body = `{ "prompt": "${prompt}", "size": { "width": ${width}, "height": ${height}} ${seed ? ', "seeds": [' + seed + ']' : ''}}`;
const fetched = this.getBearerToken().then(response =>
response?.json().then((data: { access_token: string }) =>
fetch('https://firefly-api.adobe.io/v3/images/generate', {
diff --git a/src/server/ApiManagers/GeneralGoogleManager.ts b/src/server/ApiManagers/GeneralGoogleManager.ts
index 12913b1ef..110701418 100644
--- a/src/server/ApiManagers/GeneralGoogleManager.ts
+++ b/src/server/ApiManagers/GeneralGoogleManager.ts
@@ -3,6 +3,7 @@ import { Method } from '../RouteManager';
import { GoogleApiServerUtils } from '../apis/google/GoogleApiServerUtils';
import RouteSubscriber from '../RouteSubscriber';
import { Database } from '../database';
+import { google } from 'googleapis';
const EndpointHandlerMap = new Map<GoogleApiServerUtils.Action, GoogleApiServerUtils.ApiRouter>([
['create', (api, params) => api.create(params)],
@@ -61,5 +62,139 @@ export default class GeneralGoogleManager extends ApiManager {
res.send(undefined);
},
});
+
+ // Task Creation
+ register({
+ method: Method.POST,
+ subscription: new RouteSubscriber('googleTasks').add('create'),
+ secureHandler: async ({ req, res, user }) => {
+ try {
+ const auth = await GoogleApiServerUtils.retrieveOAuthClient(user.id);
+
+ if (!auth) {
+ return res.status(401).send('Google credentials missing or invalid.');
+ }
+
+ const tasks = google.tasks({ version: 'v1', auth });
+
+ const { title, notes, due, status, completed, deleted } = req.body;
+ const result = await tasks.tasks.insert({
+ tasklist: '@default',
+ requestBody: { title, notes, due, status, completed, deleted },
+ });
+
+ res.status(200).send(result.data);
+ } catch (err) {
+ console.error('Google Tasks error:', err);
+ res.status(500).send('Failed to create task.');
+ }
+ },
+ });
+
+ // Task Update
+ register({
+ method: Method.PATCH,
+ subscription: new RouteSubscriber('googleTasks').add('taskId'),
+ // any way to add static params? like /update (this is not very descriptive)
+ secureHandler: async ({ req, res, user }) => {
+ try {
+ const auth = await GoogleApiServerUtils.retrieveOAuthClient(user.id);
+
+ if (!auth) {
+ return res.status(401).send('Google credentials missing or invalid.');
+ }
+
+ const tasks = google.tasks({ version: 'v1', auth });
+
+ const { taskId } = req.params;
+ const { title, notes, due, status, completed, deleted } = req.body;
+
+ const result = await tasks.tasks.patch({
+ tasklist: '@default',
+ task: taskId,
+ requestBody: { title, notes, due, status, completed, deleted},
+ });
+
+ res.status(200).send(result.data);
+ } catch (err) {
+ console.error('Google Tasks update error:', err);
+ res.status(500).send('Failed to update task.');
+ }
+ },
+ });
+
+ // Task Deletion
+ register({
+ method: Method.DELETE,
+ subscription: new RouteSubscriber('googleTasks').add('taskId'),
+ secureHandler: async ({ req, res, user }) => {
+ try {
+ const auth = await GoogleApiServerUtils.retrieveOAuthClient(user.id);
+
+ if (!auth) {
+ return res.status(401).send('Google credentials missing or invalid.');
+ }
+
+ const tasks = google.tasks({ version: 'v1', auth });
+ const { taskId } = req.params;
+
+ await tasks.tasks.delete({
+ tasklist: '@default',
+ task: taskId,
+ });
+
+ res.status(200).send({ success: true });
+ } catch (err) {
+ console.error('Google Tasks delete error:', err);
+ res.status(500).send('Failed to delete task.');
+ }
+ },
+ });
+
+ // Google Account Linking
+
+ register({
+ method: Method.GET,
+ subscription: '/refreshGoogle',
+ secureHandler: async ({ user, req, res }) =>
+ new Promise<void>(resolve =>
+ GoogleApiServerUtils.processNewUser(user.id, req.query.code as string)
+ .then(() => res.status(200).send('Google account linked successfully!'))
+ .catch(err => {
+ console.error('Failed to process Google code:', err);
+ res.status(500).send('Error linking Google account');
+ })
+ .finally(resolve)
+ ),
+ });
+
+ // Task Retrieval
+ register({
+ method: Method.GET,
+ subscription: new RouteSubscriber('googleTasks').add('taskId'),
+ secureHandler: async ({ req, res, user }) => {
+ try {
+ const auth = await GoogleApiServerUtils.retrieveOAuthClient(user.id);
+
+ if (!auth) {
+ return res.status(401).send('Google credentials missing or invalid.');
+ }
+
+ const tasks = google.tasks({ version: 'v1', auth });
+ const { taskId } = req.params;
+
+ const result = await tasks.tasks.get({
+ tasklist: '@default',
+ task: taskId,
+ });
+
+ res.status(200).send(result.data);
+ } catch (err) {
+ console.error('Google Tasks retrieval error:', err);
+ res.status(500).send('Failed to retrieve task.');
+ }
+ },
+ });
}
+
}
diff --git a/src/server/ApiManagers/UploadManager.ts b/src/server/ApiManagers/UploadManager.ts
index 7c55e4a42..1e68a4e30 100644
--- a/src/server/ApiManagers/UploadManager.ts
+++ b/src/server/ApiManagers/UploadManager.ts
@@ -18,7 +18,7 @@ export default class UploadManager extends ApiManager {
protected initialize(register: Registration): void {
register({
method: Method.POST,
- subscription: '/ping',
+ subscription: '/DashPing',
secureHandler: async ({ /* req, */ res }) => {
_success(res, { message: DashVersion, date: new Date() });
},
diff --git a/src/server/PdfTypes.ts b/src/server/PdfTypes.ts
index fb435a677..458df7b26 100644
--- a/src/server/PdfTypes.ts
+++ b/src/server/PdfTypes.ts
@@ -2,7 +2,7 @@ export interface PDFInfo {
PDFFormatVersion: string;
IsAcroFormPresent: boolean;
IsXFAPresent: boolean;
- [key: string]: any;
+ [key: string]: unknown;
}
export interface PDFMetadata {
parse(): void;
diff --git a/src/server/RouteManager.ts b/src/server/RouteManager.ts
index 2f6cf80b5..c5d70da3d 100644
--- a/src/server/RouteManager.ts
+++ b/src/server/RouteManager.ts
@@ -8,6 +8,8 @@ import { DashUserModel } from './authentication/DashUserModel';
export enum Method {
GET,
POST,
+ PATCH,
+ DELETE,
}
export interface CoreArguments {
@@ -207,6 +209,12 @@ export default class RouteManager {
case Method.POST:
this.server.post(route, supervised);
break;
+ case Method.PATCH:
+ this.server.patch(route, supervised);
+ break;
+ case Method.DELETE:
+ this.server.delete(route, supervised);
+ break;
default:
}
}
diff --git a/src/server/apis/google/GoogleApiServerUtils.ts b/src/server/apis/google/GoogleApiServerUtils.ts
index 7373df473..ad0f0e580 100644
--- a/src/server/apis/google/GoogleApiServerUtils.ts
+++ b/src/server/apis/google/GoogleApiServerUtils.ts
@@ -13,7 +13,7 @@ import { GoogleCredentialsLoader } from './CredentialsLoader';
* This is the somewhat overkill list of what Dash requests
* from the user.
*/
-const scope = ['documents.readonly', 'documents', 'presentations', 'presentations.readonly', 'drive', 'drive.file', 'photoslibrary', 'photoslibrary.appendonly', 'photoslibrary.sharing', 'userinfo.profile'].map(
+const scope = ['tasks', 'documents.readonly', 'documents', 'presentations', 'presentations.readonly', 'drive', 'drive.file', 'photoslibrary', 'photoslibrary.appendonly', 'photoslibrary.sharing', 'userinfo.profile'].map(
relative => `https://www.googleapis.com/auth/${relative}`
);
@@ -181,7 +181,7 @@ export namespace GoogleApiServerUtils {
* @returns the newly generated url to the authentication landing page
*/
export function generateAuthenticationUrl(): string {
- return worker.generateAuthUrl({ scope, access_type: 'offline' });
+ return worker.generateAuthUrl({ scope, access_type: 'offline', prompt: 'consent' });
}
/**
@@ -203,12 +203,12 @@ export namespace GoogleApiServerUtils {
*/
export async function processNewUser(userId: string, authenticationCode: string): Promise<EnrichedCredentials> {
const credentials = await new Promise<Credentials>((resolve, reject) => {
- worker.getToken(authenticationCode, (err, credentials) => {
- if (err || !credentials) {
+ worker.getToken(authenticationCode, (err, creds) => {
+ if (err || !creds) {
reject(err);
return;
}
- resolve(credentials);
+ resolve(creds);
});
});
const enriched = injectUserInfo(credentials);
@@ -304,6 +304,7 @@ export namespace GoogleApiServerUtils {
const { access_token, expires_in } = await new Promise<{ access_token: string; expires_in: number }>(resolve => {
request.post(url, headerParameters).then(response => resolve(JSON.parse(response)));
});
+
// expires_in is in seconds, but we're building the new expiry date in milliseconds
const expiry_date = new Date().getTime() + expires_in * 1000;
await Database.Auxiliary.GoogleAccessToken.Update(userId, access_token, expiry_date);
diff --git a/src/server/apis/google/google_project_credentials.json b/src/server/apis/google/google_project_credentials.json
index 955c5a3c1..438e5157e 100644
--- a/src/server/apis/google/google_project_credentials.json
+++ b/src/server/apis/google/google_project_credentials.json
@@ -1,11 +1,11 @@
{
"installed": {
- "client_id": "343179513178-ud6tvmh275r2fq93u9eesrnc66t6akh9.apps.googleusercontent.com",
- "project_id": "quickstart-1565056383187",
+ "client_id": "740987818053-dtflji3hfkn5r9t8ad6jb8740pls8moh.apps.googleusercontent.com",
+ "project_id": "dash-web-461920",
"auth_uri": "https://accounts.google.com/o/oauth2/auth",
"token_uri": "https://oauth2.googleapis.com/token",
"auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs",
- "client_secret": "w8KIFSc0MQpmUYHed4qEzn8b",
- "redirect_uris": ["urn:ietf:wg:oauth:2.0:oob", "http://localhost"]
+ "client_secret": "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",
+ "redirect_uris": ["http://localhost:1050/refreshGoogle"]
}
} \ No newline at end of file
diff --git a/src/server/authentication/DashUserModel.ts b/src/server/authentication/DashUserModel.ts
index debeef60c..6fd8dd593 100644
--- a/src/server/authentication/DashUserModel.ts
+++ b/src/server/authentication/DashUserModel.ts
@@ -2,9 +2,10 @@ import * as bcrypt from 'bcrypt-nodejs';
import * as mongoose from 'mongoose';
import { Utils } from '../../Utils';
-type comparePasswordFunction = (candidatePassword: string, cb: (err: any, isMatch: any) => void) => void;
-export type DashUserModel = mongoose.Document & {
- email: String;
+type comparePasswordFunction = (candidatePassword: string, cb: (err: Error, isMatch: boolean) => void) => void;
+type mongooseDocument = { id: string }; // & mongoose.Document;
+export type DashUserModel = mongooseDocument & {
+ email: string;
password: string;
passwordResetToken?: string;
passwordResetExpires?: Date;
@@ -65,12 +66,13 @@ const userSchema = new mongoose.Schema(
/**
* Password hash middleware.
*/
-userSchema.pre('save', function save(next) {
+// eslint-disable-next-line @typescript-eslint/no-explicit-any
+userSchema.pre('save', function save(next: any) {
const user = this;
if (!user.isModified('password')) {
return next();
}
- bcrypt.genSalt(10, (err: any, salt: string) => {
+ bcrypt.genSalt(10, (err: Error, salt: string) => {
if (err) {
return next(err);
}
@@ -102,7 +104,7 @@ const comparePassword: comparePasswordFunction = function (this: DashUserModel,
userSchema.methods.comparePassword = comparePassword;
-const User: any = mongoose.model('User', userSchema);
+const User = mongoose.model('User', userSchema);
export function initializeGuest() {
new User({
email: 'guest',
diff --git a/src/server/authentication/Passport.ts b/src/server/authentication/Passport.ts
index ca9e3058e..a62d38e3e 100644
--- a/src/server/authentication/Passport.ts
+++ b/src/server/authentication/Passport.ts
@@ -5,13 +5,13 @@ import User, { DashUserModel } from './DashUserModel';
const LocalStrategy = passportLocal.Strategy;
passport.serializeUser<any, any>((req, user, done) => {
- done(undefined, (user as any)?.id);
+ done(undefined, (user as DashUserModel)?.id);
});
passport.deserializeUser<any, any>((id, done) => {
User.findById(id)
.exec()
- .then((user: any) => done(undefined, user));
+ .then((user: DashUserModel) => done(undefined, user));
});
// AUTHENTICATE JUST WITH EMAIL AND PASSWORD
@@ -30,6 +30,6 @@ passport.use(
});
}
})
- .catch((error: any) => done(error));
+ .catch((error: Error) => done(error));
})
);
diff --git a/src/server/server_Initialization.ts b/src/server/server_Initialization.ts
index 80cf977ee..5deb66caf 100644
--- a/src/server/server_Initialization.ts
+++ b/src/server/server_Initialization.ts
@@ -126,10 +126,13 @@ function registerCorsProxy(server: express.Express) {
//res.status(400).json({ error: 'Invalid URL format' });
return;
}
+
+ const isBinary = /\.(gif|png|jpe?g|bmp|webp|ico|pdf|zip|mp3|mp4|wav|ogg)$/i.test(targetUrl as string);
+ const responseType = isBinary ? 'arraybuffer' : 'text';
const response = await axios.get(targetUrl as string, {
headers: { 'User-Agent': req.headers['user-agent'] || 'Mozilla/5.0' },
- responseType: 'text',
+ responseType: responseType
});
const baseUrl = new URL(targetUrl as string);
diff --git a/views/stylesheets/authentication.css b/views/stylesheets/authentication.css
index ff1f4aace..dbd1043a4 100644
--- a/views/stylesheets/authentication.css
+++ b/views/stylesheets/authentication.css
@@ -110,10 +110,10 @@ body {
text-align: center;
position: absolute;
margin: auto;
- top: 0;
- bottom: 0;
- left: 0;
- right: 0;
+ top: 0px;
+ bottom: 0px;
+ left: 0px;
+ right: 0px;
width: 400px;
background-color: white;
border-radius: 8px;
@@ -122,10 +122,10 @@ body {
.inner {
position: absolute;
- top: 0;
- bottom: 0;
- left: 0;
- right: 0;
+ top: 0px;
+ bottom: 0px;
+ left: 0px;
+ right: 0px;
width: 230px;
margin: auto;
}
@@ -141,7 +141,8 @@ body {
font-size: 16px;
}
-.outermost, .online-container {
+.outermost,
+.online-container {
display: flex;
flex-direction: row;
height: 98vh;
@@ -220,4 +221,4 @@ span.user-type {
#inactive-inner {
border-bottom-right-radius: 8px;
-} \ No newline at end of file
+}